我正在尝试应用以下政策,以限制my_bucket
对特定VPC的访问权限。
Policy has an invalid condition key - ec2:Vpc
。我该如何纠正?
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Deny",
"Principal": {
"AWS": "*"
},
"Action":"*",
"Resource":"arn:aws:s3:::my_bucket/*",
"Condition":{
"StringNotEquals":{
"ec2:Vpc":"arn:aws:ec2:region:account:vpc/vpc-ccccccc"
}
}
}
]
}
答案 0 :(得分:33)
我刚开始工作了。我不得不做两件事。 1)在S3存储桶上创建存储桶策略,2)创建“VPC端点”
我的S3存储桶策略看起来像这样(当然放在您的存储桶名称和VPC标识符中):
{
"Version": "2012-10-17",
"Id": "Policy1234567890123",
"Statement": [
{
"Sid": "Stmt1234567890123",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::my_bucket/*",
"Condition": {
"StringEquals": {
"aws:sourceVpc": "vpc-12345678"
}
}
}
]
}
S3存储桶还具有存储桶策略之外的一些权限,以允许从AWS控制台进行访问。执行上述操作无法访问。要获得访问权限,我还必须转到AWS控制台 - > VPC - >端点,然后创建端点。我将新创建的端点附加到该帐户目前唯一的路由策略(其中包含所有子网),并使用了默认策略
{
"Statement": [
{
"Action": "*",
"Effect": "Allow",
"Resource": "*",
"Principal": "*"
}
]
}
创建端点后,我能够使用正确的URL wget
从我的VPC中的任何EC2实例读取S3存储桶。我仍然可以从AWS控制台访问存储桶。但是如果我尝试从VPC外部访问URL,我会被禁止403。因此,对S3存储桶的访问仅限于单个VPC,就像您正在寻找的那样。
这显然是一项新功能。有关详细信息,请参阅此AWS blog entry。
答案 1 :(得分:2)
有两件事让我感到困惑,并且可能有助于添加到Eddie的好答案:
首先,您将无法在S3 AWS控制台中查看您的存储桶(甚至在您设置上述策略后修改其策略),除非您还授予您的AWS用户操作存储桶的权限。 / strong>为此,请找到您的AWS账号(显示在右上角here),并将此语句添加到存储桶策略语句列表中:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::YOUR_AWS_ACCOUNT_NUMBER:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"
]
},
其次,如果你有多个VPC,比如说vpc-XXXXXX和vpc-YYYYYY可以访问,那么Eddie的回答中的语句需要调整为类似下面的内容(注意“Allow”“StringEquals”和sourceVpc值列表:
...
"Effect": "Allow",
...
"Condition": {
"StringEquals": {
"aws:sourceVpc": [
"vpc-XXXXXXXX",
"vpc-YYYYYYYY"
]
}
答案 2 :(得分:-1)
不,你做不到。
这是另一个人问同样的问题:https://forums.aws.amazon.com/thread.jspa?threadID=102387
有些人因尝试通过网络解决问题而过于富有创意:https://pete.wtf/2012/05/01/how-to-setup-aws-s3-access-from-specific-ips/
我更喜欢更简单的路线,S3允许您签署网址以解决此问题,但在您的VPC内部您可能不希望考虑签名 - 或者您只是无法签名,例如您可能使用wget等等。所以我写这个小微服务就是出于这个原因:https://github.com/rmmeans/S3-Private-Downloader
希望有所帮助!
更新:
AWS现在有一个VPC端点功能:https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/,你应该使用它,而不是我之前建议的那样。