拒绝除特定范围之外的所有 IP 访问 AWS S3

Posted

技术标签:

【中文标题】拒绝除特定范围之外的所有 IP 访问 AWS S3【英文标题】:Deny access to AWS S3 to all IPs except specific ranges 【发布时间】:2019-02-08 15:47:47 【问题描述】:

我有一个 S3 存储桶(“myBucket”),只有用户可以访问,我们称之为“s3user”。我为此用户附加了一个 IAM 策略,如下所示:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::myBucket"
        ,
        
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetObjectVersion"
            ],
            "Resource": "*"
        
    ]

我将此 IAM 策略附加到用户“s3User”,授予对“myBucket”的只读访问权限。到目前为止一切顺利。

现在,我添加了第二个策略,但现在不是 IAM 策略而是 S3 存储桶策略,如下所示:


    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        
            "Sid": "IPAllow",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::myBucket/*",
            "Condition": 
                "NotIpAddress": 
                    "aws:SourceIp": [
                        "1.2.3.4/27",
                        "2.3.4.1/28",
                        "5.6.7.8/29"
                    ]
                
            
        
    ]

我预计此显式拒绝将拒绝所有不来自指定源 IP 范围的请求。但是,它仍然让我列出来自其他 IP 的存储桶的内容。似乎桶策略根本没有效果。

根据this AWS S3 article,当您有多个策略时,它们都会被应用并且显式拒绝优先于显式允许,所以我认为这应该有效,但事实并非如此。

知道为什么我不能根据源 IP 地址拒绝对存储桶的请求吗?

谢谢!

【问题讨论】:

“让我从其他 IP 访问存储桶”是什么意思?具体是哪些命令? Deny 策略指的是 mybucket/*,可能不适用于单独的 mybucket,因此仍可能允许 ListBucket 我的意思是我仍然可以列出存储桶的内容(编辑问题以澄清这一点) 【参考方案1】:

您应该更新您的 Deny 政策,以包括在存储桶本身而不是其内容 (/*) 上执行的操作:


    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        
            "Sid": "DenyOutsideIPfromBucket",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetObjectVersion"
            ],
            "Resource": ["arn:aws:s3:::myBucket/*", "arn:aws:s3:::myBucket"],
            "Condition": 
                "NotIpAddress": 
                    "aws:SourceIp": [
                        "1.2.3.4/27",
                        "2.3.4.1/28",
                        "5.6.7.8/29"
                    ]
                
            
        
    ]

当然,如果唯一有权访问存储桶的用户是具有 IAM 策略的用户,您可以简单地在原始 IAM 策略上添加一个IpAddress 条件,这样他们就只能使用给定集合中的存储桶IP 地址。这将避免需要 Deny 策略。

【讨论】:

谢谢,周一会检查这是否有效并通知您。 更新:成功了。我编辑了您的答案,在同一个声明中声明了两个资源(存储桶及其内容),以避免重复 IP 地址。 你好@John,我们也有类似的要求。用户需要对 S3 存储桶的只读访问权限,并且我们已将以下 IAM 策略应用于用户,正如您建议的那样,我们没有应用任何存储桶策略,因为这是唯一具有特定 IP 地址的用户。还是不行。请建议 "Version": "2012-10-17", "Statement": [ "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::marketplace-logs", "arn:aws:s3:::marketplace-logs/*", ], "Condition": "IpAddress": "aws:SourceIp": "13.xxx.xxx.xxx/32" ] @nitin194 请创建一个新问题,而不是通过对旧问题的评论提出问题。

以上是关于拒绝除特定范围之外的所有 IP 访问 AWS S3的主要内容,如果未能解决你的问题,请参考以下文章

拒绝除一个之外的所有存储桶的 AWS IAM 策略

S3 拒绝管理员访问

在 AWS 上拒绝除 cloudwatch 之外的所有出站流量

无需凭据即可从特定 IP 授予对 AWS S3 存储桶的访问权限

拒绝访问除索引文件之外的所有文件 - Apache2

Spring Boot Amazon AWS S3 存储桶文件下载 - 拒绝访问