拒绝除特定范围外的所有 IP 访问 AWS S3
Deny access to AWS S3 to all IPs except specific ranges
我有一个 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 的存储桶的内容。好像bucket policy一点效果都没有。
根据 this AWS S3 article,当你有多个策略时,它们都会被应用并且显式拒绝优先于显式允许,所以我认为这个 应该 有效,但事实并非如此。
知道为什么我无法拒绝基于源 IP 地址的存储桶请求吗?
谢谢!
您应该更新 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
政策。
我有一个 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 的存储桶的内容。好像bucket policy一点效果都没有。
根据 this AWS S3 article,当你有多个策略时,它们都会被应用并且显式拒绝优先于显式允许,所以我认为这个 应该 有效,但事实并非如此。
知道为什么我无法拒绝基于源 IP 地址的存储桶请求吗?
谢谢!
您应该更新 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
政策。