通过IP限制对S3存储桶的访问,而不会影响IAM凭据

the*_*ite 8 amazon-s3 amazon-ec2 amazon-web-services

我在AWS上有以下用例:

  • 一个存储桶,用于"托管"AngularJS中内置的Web应用程序
  • 自动扩展组中的服务器池,可以修改存储桶的内容

为了确保只在内部提供存储桶内容,我使用了以下存储桶策略来限制对静态IP的访问:

{
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::mybucket.myhost.com/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "x.x.x.x/32"
                    ]
                }
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

这非常适合阻止我们办公室以外的任何人通过HTTP访问存储桶.完善.

但是,自动扩展组中的服务器(使用IAM角色对存储区具有完全权限)无法访问存储区.似乎S3存储桶策略优先.我无法将其IP添加到存储桶策略,因为它是一个扩展组,它们的IP将定期更改.

我尝试了一些解决方案但没有任何乐趣:

  • 使用我的IAM角色的ARN作为原则指定带有"允许"的第二个语句
  • 尝试寻找允许EC2安全组完全访问但无法找到该选项的方法
  • 尝试寻找使IAM角色优先于存储桶策略的方法

我觉得这应该很简单,但我现在感到沮丧:(

the*_*ite 4

我意识到我的存储桶中的所有对象都具有公共读取 ACL。我删除了公共读取 ACL,因此对象默认为“拒绝”。然后,我能够使用这样的策略来允许访问我们的办公室 IP 和自动扩展 EC2 服务器,这些服务器由其 IAM 角色标识:

{
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::mybucket.myhost.com/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "x.x.x.x/32"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxxxxxxxxxxx:role/xxxxxx"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::mybucket.myhost.com/*"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)