如何将 S3 存储桶保护到实例的角色?

How to secure an S3 bucket to an Instance's Role?

我使用 cloudformation 启动了一个 EC2 实例,其角色具有如下所示的 S3 策略

{"Statement":[{"Action":"s3:*","Resource":"*","Effect":"Allow"}]}

S3 中的 bucket 策略是这样的

{
"Version": "2012-10-17",
"Id": "MyPolicy",
"Statement": [
    {
        "Sid": "ReadAccess",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::123456678:role/Production-WebRole-1G48DN4VC8840"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::web-deploy/*"
    }
]
}

当我登录到实例并尝试将我上传到存储桶中的任何对象卷曲(没有修改 acl)时,我收到 Unauthorized 403 错误。

这是将对存储桶的访问限制为仅以特定角色启动的实例的正确方法吗?

可通过三种方式授予对 Amazon S3 中对象的访问权限:

  • 对象 ACL: 可以将特定对象标记为 "Public",这样任何人都可以访问它们。
  • 存储桶策略: 存储桶上的策略,用于确定对 Allow/Deny 的访问权限,公开或特定用户。
  • IAM 策略: 为用户、组或角色设置的策略,授予他们访问 AWS 资源(如 Amazon S3 存储桶)的权限。

如果这些策略中的任何 授予访问权限,则用户可以访问 Amazon S3 中的对象。一种例外情况是存在 Deny 政策,该政策会覆盖 Allow 政策。

Amazon EC2 实例上的角色

您已将此角色授予 Amazon EC2 实例:

{"Statement":[{"Action":"s3:*","Resource":"*","Effect":"Allow"}]}

这将为 AWS Command-Line Interface (CLI) 或任何使用 AWS SDK 的应用程序可以访问的实例提供凭据。他们将无限制地访问 Amazon S3,除非还有 拒绝策略 否则会限制访问。

如果有的话,该政策授予太多权限。它允许该实例上的应用程序对您的 Amazon S3 存储做任何它想做的事情,包括全部删除!最好分配 最小权限 ,只授予应用程序 需要执行的操作 .

的权限

Amazon S3 存储桶策略

您还创建了一个存储桶策略,它允许任何承担 Production-WebRole-1G48DN4VC8840 角色的对象检索 web-deploy 存储桶的内容。

角色本身拥有什么特定权限并不重要——此策略意味着仅使用角色访问 web-deploy 存储桶将允许它读取所有文件。因此,仅此策略就足以满足您使用角色授予对实例的存储桶访问权限的要求——您不需要角色本身内的策略。

那么,为什么您无法访问内容?这是因为使用直接的 CURL 不能识别您的 role/user。 Amazon S3 收到请求并将其视为匿名,因此不授予访问权限。

尝试通过 CLI 或通过 SDK 调用以编程方式访问数据。例如,此 CLI 命令将下载一个对象:

aws s3 cp s3://web-deploy/foo.txt foo.txt

CLI 将自动获取与您的角色相关的凭据,允许访问对象。

EC2 实例角色足以 put/read 您的任何 S3 存储桶,但您需要使用实例角色,curl 不会自动完成。

您应该使用例如 aws s3 cp <local source> s3://<bucket>/<key>,它将自动使用实例角色。