AWS S3访问控制

时间:2018-04-10 08:46:40

标签: python amazon-web-services lambda

我需要在AWS上构建授权系统。 DynamoDB中存储了一些客户记录。客户可能对S3资源具有不同的权限。那么,我该如何实现呢?我正在尝试使用API​​网关代理S3并使用Lambda授权程序检查记录并控制访问,这是正确的方法吗?苦苦挣扎,苦苦挣扎......

2 个答案:

答案 0 :(得分:0)

为什么不使用IAM polices?您可以轻松地将对特定用户的访问权限限制为S3资源! 不需要代理和lambdas ......

使用以下政策创建AWS用户:

[()#$@-\w]

使用此政策,此用户只能访问以下所有内容:

我桶/生产/ some_internal_folder /用户名/

答案 1 :(得分:0)

您的问题确实是:如何让我的用户以安全的方式访问我的AWS资源?

答案很复杂,涉及许多活动部分。最好的方法是使用Amazon Cognito。这项服务有两种,您需要Cognito Federated Identities,也可能需要Cognito用户池:

  • Cognito联合身份(身份池) 允许您从登录提供商(如Google / Facebook / etc)获取身份,并为他们提供访问AWS资源(如S3,DynamoDB,API网关等)的临时权限。

  • Cognito用户池 是所有用户的托管目录。 Cognito Federated Identities可以将其用作登录提供程序。如果您想提供除(或与Google / Facebook /等)联合之外的选项,您可以使用此选项。

当用户对您的应用程序进行身份验证时,身份验证流程为

  • 用户向登录提供商(例如Google / Facebook / Cognito用户池)进行身份验证
  • 然后,用户从Cognito Federated Identities
  • 请求其身份
  • 用户从Cognito Federated Identities
  • 获取其身份凭证
  • Cognito Federated Identities对AWS Security Token Service进行AssumeRoleWithWebIdentity调用。这就是魔术发生的地方,会话是从IAM角色生成的。在此阶段,将解析角色的访问策略中的任何变量。 (更多内容见下文)

您的用户现在拥有AWS凭证,即可用于进行身份验证的访问密钥,密钥和会话令牌。授权调用AWS服务。

可以找到更详细的身份验证流程视图here in the AWS documentation

Cognito Federated Identities假定的策略可以包含变量。这允许包含用户的Cognito Id的访问策略语句。例如,允许用户在S3中将文件上传到他们自己的上传文件夹:

    {
        "Action": [
            "s3:PutObject",
            "s3:PutObjectTagging"
        ],
        "Resource": [
            "arn:aws:s3:::my-s3-bucket/users/${cognito-identity.amazonaws.com:sub}/*",
            "arn:aws:s3:::my-s3-bucket/users/${cognito-identity.amazonaws.com:sub}/*"
        ],
        "Effect": "Allow",
        "Sid": "a1d39796d4604228aa7cf9aa0655555"
    }

上面的重要部分是变量 $ {cognito-identity.amazonaws.com:sub} 。这将替换为Cognito Federated Identities用户ID。因此,用户可以将文件上传到S3存储桶中的自己的文件夹,但不能将文件上传到任何人。您可以使用相同的原则来允许下载,或限制对DynamoDB中特定键的访问。

值得一提的是,您还可以拥有不涉及基于用户ID的任何限制的普通访问策略语句。这些在允许用户通过API网关调用API的情况下更有用。

亚马逊为此提供了大量文档,最简单的起点是Getting Started with Amazon Cognito