我需要在AWS上构建授权系统。 DynamoDB中存储了一些客户记录。客户可能对S3资源具有不同的权限。那么,我该如何实现呢?我正在尝试使用API网关代理S3并使用Lambda授权程序检查记录并控制访问,这是正确的方法吗?苦苦挣扎,苦苦挣扎......
答案 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 /等)联合之外的选项,您可以使用此选项。
当用户对您的应用程序进行身份验证时,身份验证流程为:
您的用户现在拥有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。