[英]How to limit access to an S3 bucket to a specific VPC while allowing console access
我正在设置一系列 S3 存储桶,并希望将它们的访问权限限制在 VPC 上,同时仍允许从 AWS 控制台访问存储桶。
正如此处所建议的,我创建了一个 S3 端点并将其添加到主路由表中。 端点上的策略允许完全访问所有资源。
我创建了一个 S3 策略(见下文)并将其添加到存储桶中。 一旦我保存了策略,就无法再从控制台访问存储桶。
我还尝试以“aws:username”:“user1”的形式将用户专门添加到条件“StringNotEquals”中,但无济于事。
{
"Version": "2012-10-17",
"Id": "Policy-S3-Bucket-myBucket",
"Statement": [
{
"Sid": "Access-via-VPC-only",
"Principal": "*",
"Action": "s3:*",
"Effect": "Deny",
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpc": "vpc-01c9d66c12345"
}
}
},
{
"Sid": "Allow-console-access",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
],
"Principal": {
"AWS": [
"arn:aws:iam::<account-id>:user/user1", "arn:aws:iam::<account-id>:user/user2"
]
}
}
]
}
预期的结果是 S3 存储桶只能由上述 VPC 和 AWS 控制台访问。
实际结果是:
存储桶概览显示“错误:拒绝访问”,权限页面(公共访问设置)显示:“您无权查看此配置。请联系您的帐户管理员请求访问。”
我必须使用 root 用户登录并删除策略以重新获得对存储桶的访问权限。
我找到了一个似乎有效的解决方案。 我已经在策略模拟器中对其进行了测试,它似乎在实时环境中也能正常工作。 以下策略可以解决问题:
{
"Version": "2012-10-17",
"Id": "Policy-S3-Bucket-myBucket",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListAllMyBuckets"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:username": ["user1", "user2"]
}
}
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::myBucket"],
"Condition": {
"StringEquals": {
"aws:sourceVpc": "vpc-01c9d66c12345"
}
}
},
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::myBucket"],
"Condition": {
"StringEquals": {
"aws:username": ["user1", "user2"]
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": ["arn:aws:s3:::myBucket/*"],
"Condition": {
"StringEquals": {
"aws:sourceVpc": "vpc-01c9d66c12345"
}
}
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": ["arn:aws:s3:::myBucket/*"],
"Condition": {
"StringEquals": {
"aws:username": ["user1", "user2"]
}
}
}
]
}
该策略要求 sourceVpc 字符串或用户名与条件中列出的一样。
诚然,该策略是冗长的,并且有大量的复制。 如果有人有更有效地解决这个问题的想法,我会全力以赴。
该政策已经过测试,可准确满足您的需求:
Statement": {
"Sid": "Allow-anonymous-access-from-specific-VPC",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucket_name/*",
"Condition": {
"StringEquals": {
"aws:SourceVpc": "some-vpc-id"
}
}
}
这将允许来自“some-vpc-id”的请求匿名访问,同时允许从 AWS 控制台访问。
您的 VPC 必须配置 S3 端点才能工作。
诀窍似乎是拒绝一切,除非它来自用户或来自 VPC,但它必须处于相同的条件。 策略的工作方式是拒绝规则优先于其他所有规则,因此如果您拒绝,则不能允许后续规则; 它已经被拒绝了,就是这样。
顺便说一下,root 用户的 aws:userid 是 Account Id。 使用此用户可能是一种不好的做法,但是很好:P
所以我的存储桶现在只接受来自 VPC 和我通过 AWS Web 控制台登录的用户的流量(所以我不会在 Web 控制台中收到拒绝访问的错误)
{
"Version": "2012-10-17",
"Id": "Policy154336817545456388",
"Statement": [
{
"Sid": "Block-if-not-from-VPC-or-Me",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name",
"arn:aws:s3:::bucket-name/*"
],
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": "vpce-4598ujfjrhc",
"aws:userid": "576767373466"
}
}
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.