AWS S3 访问控制



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

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

答案很复杂,涉及许多活动部件。最好的方法是使用Amazon Cognito。此服务有两种类型,您需要 Cognito 联合身份,并且可能还需要 Cognito 用户池:

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

  • 认知用户池是所有用户的托管目录。Cognito 联合身份可以将其用作登录提供程序。如果您想提供与谷歌/脸书/等联合(或以及)以外的选项,则可以使用它。

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

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

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

有关身份验证流程的更详细视图,请参阅此处的 AWS 文档。

Cognito 联合身份假定的策略可以包含变量。这允许包含用户 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 联合身份用户 ID。因此,用户可以将文件上传到 S3 存储桶中自己的文件夹,但不能上传到其他任何人。您可以使用相同的原则来允许下载,或限制对 DynamoDB 中特定密钥的访问。

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

亚马逊有很多这方面的文档,最简单的起点是开始使用Amazon Cognito。

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

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

{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket",
"s3:PutObject",
"s3:HeadObject",
"s3:GetObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket"
]
},
{
"Action": [
"s3:DeleteObject",
"s3:GetObject",
"s3:HeadObject",
"s3:PutObject",
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket/production/some_internal_folder/${aws:username}/*"
]
}
]
}

使用此策略,此用户将只能访问以下位置的所有内容:

我的存储桶/生产/some_internal_folder/用户名/

最新更新