我获得了客户端中间件-但是我不希望出现用户意外或恶意删除其他用户资源的情况。
如何在S3上保护资源,以便用户只能删除其资源,而不能删除任何其他用户的资源?
非常感谢
答案 0 :(得分:6)
我不希望出现用户意外或恶意删除其他用户资源的情况
设置S3存储桶时,您可以配置任何人对存储桶资源的权限。如果我没看错,则默认情况下,所有内容都被视为“私有”。
您还需要做的是配置IAM User并授予他访问权限(通过Policy),以允许他读取和写入存储桶中的数据。如果正确执行此操作,则只有此user
才能完成重要的事情:编写。所有这些“写”资源(创建/更新/删除)都需要使用用户密钥/秘密凭证代表该“ IAM用户”在服务器上完成。
这使您成为更改S3的唯一方法。使用此设置,即使您的恶意用户知道您的存储桶的路径,您的资源也可以得到保护,因为这些用户最多仅具有“读取”访问权限。
我建议您遵循this article(或this,如果您理解西班牙语的话)作为设置S3存储桶的指南。
作为对其他问题的回应:
如何在S3上保护资源,以便用户只能删除其资源,而不能删除任何其他用户的资源?
所有这些操作都需要在服务器中处理,以确保完整性/安全性。您的用户无需直接访问您的资源即可对其进行修改。
也许您的问题朝这个方向发展:
如果系统的端点看起来像这样,巨魔用户想要更改其他人的个人资料图片怎么办?:
POST /users/{id}/update-photo
在这种情况下,您可以让恶意用户(假设用户id
等于10
)可以访问其他人的资源:
/**
* he/she could do this:
*/
POST /users/23/update-photo // <-- id=23
/**
* instead of:
*/
POST /users/10/update-photo // <-- id=10
如何避免这种情况?进行身份验证和路由“屏蔽”。
/**
* Instead of this:
*/
POST /users/23/update-photo // <-- user id=23
/**
* Try this kind of endpoint:
*/
POST /profile/update-photo // <-- note that we disabled the ability to specify a user id
如何识别用户?如果是通过令牌的API,则是通过会话的网络调用。在此示例中,要标识用户,您可以执行以下操作:
public function updatePhoto(Request $request)
{
$user = auth()->user(); // <-- now we ensure the user is id=10
// the rest of the code..
}
当然,我只是假设这是您的关注点之一,但这只是如何在服务器端实施这种验证以确保保护资源的简单示例。
答案 1 :(得分:1)
您可能可以使用Amazon S3访问控制列表(ACL)进行此操作。使用ACL,您可以管理对存储桶和对象的访问。每个存储桶和对象都有一个作为子资源附加到其上的ACL。它定义了哪些AWS账户或组被授予访问权限以及访问类型。当收到针对资源的请求时,Amazon S3将检查相应的ACL以验证请求者是否具有必要的访问权限。
创建存储桶或对象时,Amazon S3将创建默认ACL,该默认ACL授予资源所有者对资源的完全控制权。
Amazon S3 API使您可以在创建存储桶或对象时设置ACL。 S3还提供API来在现有存储桶或对象上设置ACL。可以使用以下API方法:
示例ACL:
<?xml version="1.0" encoding="UTF-8"?>
<AccessControlPolicy xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>Owner-canonical-user-ID</ID>
<DisplayName>display-name</DisplayName>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
<ID>Owner-canonical-user-ID</ID>
<DisplayName>display-name</DisplayName>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
<ID>user1-canonical-user-ID</ID>
<DisplayName>display-name</DisplayName>
</Grantee>
<Permission>WRITE</Permission>
</Grant>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
<ID>user2-canonical-user-ID</ID>
<DisplayName>display-name</DisplayName>
</Grantee>
<Permission>READ</Permission>
</Grant>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
<URI>http://acs.amazonaws.com/groups/global/AllUsers</URI>
</Grantee>
<Permission>READ</Permission>
</Grant>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Group">
<URI>http://acs.amazonaws.com/groups/s3/LogDelivery</URI>
</Grantee>
<Permission>WRITE</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
参考:https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html