我获得了客户端中间件,但是如何在S3上保护用户资源呢?

时间:2018-10-06 21:26:49

标签: laravel amazon-web-services amazon-s3

我获得了客户端中间件-但是我不希望出现用户意外或恶意删除其他用户资源的情况。

如何在S3上保护资源,以便用户只能删除其资源,而不能删除任何其他用户的资源?

非常感谢

2 个答案:

答案 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-发送请求以创建请求时 资源(存储桶或对象),则可以使用请求标头设置ACL。使用这些标头,您既可以指定罐头ACL,也可以显式地指定授予(显式地标识被授予者和权限)。
  • 使用请求正文设置ACL-当您发送请求以设置ACL时 现有资源,您可以在请求中设置ACL 标题或正文。

示例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