亚马逊S3存储桶策略:如何限制访问仅限于您的EC2实例

11

我希望将S3存储桶锁定以提高安全性 - 我在存储桶中存储部署图像。

我想要做的是创建一个支持匿名下载(仅限于我的账户中的EC2实例)的存储桶策略,可以通过http访问。

有没有方法可以做到这一点?

以下是我正在尝试使用的策略示例(它不能被应用):

{
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::[my bucket name]",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:ec2:us-east-1:[my account id]:instance/*"
        }
      }
    }
  ]
}

为什么只允许匿名访问? - Frederick Cheung
因为在PowerShell或批处理脚本中实现这个要简单得多。我已经通过在请求中使用非常长的UserAgent并以此方式进行锁定来解决了这个问题。 - Doug
你能否请发布一下你是如何做到这个的? - David
1
请查看我的答案,了解如何使用角色允许您的实例在无需身份验证的情况下从存储桶中下载。角色会装饰您的实例,因此您不必在实例中拥有密钥/凭据。 - Atif
2个回答

3

为了澄清通常的做法,您需要创建一个IAM策略,将其附加到新角色或现有角色,并使用该角色装饰ec2实例。您还可以通过存储桶策略提供访问权限,但这不够精确。

以下是详细信息:

  1. S3存储桶默认拒绝访问,除非是所有者。因此,您创建自己的存储桶并上传数据。您可以使用浏览器验证文件是否不可访问,尝试https://s3.amazonaws.com/MyBucketName/file.ext。应该返回xml中的“Access Denied”错误代码。如果出现“NoSuchBucket”错误代码,则URL有误。

  2. 基于arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess创建IAM策略。开始时看起来像下面的片段。查看“Resource”键,并注意它设置为通配符。您只需将其修改为桶的arn。您必须为存储桶及其内容创建一个策略,因此它变成了:"Resource": ["arn:aws:s3:::MyBucketName", "arn:aws:s3:::MyBucketName/*"]

  3. 现在您有了策略,要做的就是为实例添加IAM角色,该角色会自动授予此策略,而无需在实例中使用任何身份验证密钥。因此,转到Role,创建新角色,创建Amazon EC2角色,找到刚刚创建的策略,然后您的角色就准备好了。

  4. 最后,创建实例并添加您刚刚创建的IAM角色。如果该机器已经拥有自己的角色,则只需将两个角色合并为新角色以供该机器使用。如果该机器已经运行,则必须重新启动才能获取新角色。

  5. 现在您应该可以正常工作了。该机器具有访问s3共享的权限。现在,您可以使用以下命令将文件复制到实例中。请注意,您必须指定区域

    aws s3 cp --region us-east-1 s3://MyBucketName/MyFileName.tgz /home/ubuntu

请注意,“安全靠混淆”这个术语只存在于电影中。任何东西要么是可证明安全的,要么就是不安全的。

1

我使用了类似以下的代码:

{
    "Version": "2012-10-17",
    "Id": "Allow only My VPC",
    "Statement": [
        {
            "Sid": "Allow only My VPC",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject", "s3:ListBucket",
            "Resource": [
                "arn::s3:::{BUCKET_NAME}",
                "arn::s3:::{BUCKET_NAME}/*"
            ],
            "Condition": {
                "StringLike": {
                    "aws:sourceVpc": "{VPC_ID}" OR "aws:sourceVpce": "{VPCe_ENDPOINT}"
                }
            }
        }
    ]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接