【发布时间】:2018-01-18 18:03:48
【问题描述】:
我已经使用这样的存储桶策略设置了 S3 存储桶:
{
"Version": "2012-10-17",
"Id": "NginxProxy",
"Statement": [
{
"Sid": "AllowByVpc",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::test/*",
"Condition": {
"StringEquals": {
"aws:sourceVpc": "vpc-cf53cba8"
}
}
},
{
"Sid": "DenyByVpc",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::test/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"185.24.222.124"
]
},
"StringNotEquals": {
"aws:sourceVpc": "vpc-cf53cba8"
}
}
}
]
}
当我在同一 VPC (vpc-cf53cba8) 下的 EC2 实例上尝试命令 curl -k -v --key client.key --cert client.crt -T abc.jpg http://test.s3.us-east-1.amazonaws.com/abc.jpg 时,我得到 AccessDenied。
不幸的是,我不知道应该关注什么。有什么想法吗?
【问题讨论】:
-
好的,但是当我设置公共访问时,curl 请求正确上传文件。那么?
-
不确定您的问题是什么。如果您使用 curl,那么您将向 S3 发出未经身份验证的请求,并且需要公共访问权限。如果您想限制对特定 VPC 的访问,请使用经过身份验证的访问和存储桶策略,在 sourceVpc 上设置允许条件(或在非 sourceVpc 上设置拒绝条件)。
-
但之前的存储桶策略允许我在同一 vpc 下的 EC2 实例上执行此操作。我认为“Principal”:“*”表示任何未经身份验证的访问。
-
我认为(但不是 100% 肯定)这里的问题是您正在通过公共 Internet 访问 S3。这意味着您的 S3 策略看不到有关您的 AWS 网络的任何信息。为 S3 添加 VPC 终端节点。然后您的 EC2 实例将使用 AWS 私有网络与 S3 进行通信。
-
Bucket 策略不会接受该请求,因为它与任何 VPC 无关,它只是来自客户端的请求(如浏览器请求),而不是来自 AWS 服务、开发工具包或 CLI 的请求。
标签: amazon-web-services amazon-s3