我一直在尝试所有可能的选择,但没有结果。我的Bucket Policy适用于aws:Referer,但它根本不能用Source Ip作为条件。
我的服务器托管EC2,我使用此格式的公共IP xxx.xxx.xxx.xxx/32(Public_Ip / 32)作为源Ip参数。
谁能告诉我我做错了什么?
目前我的政策如下
{
"Version": "2008-10-17",
"Id": "S3PolicyId1",
"Statement": [
{
"Sid": "IPDeny",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my_bucket/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "xx.xx.xxx.xxx/32"
}
}
}
]
}
我阅读了所有示例和案例研究,但它似乎不允许基于源IP进行访问...
非常感谢!!!
答案 0 :(得分:2)
虽然我不会不同意政策在可能的情况下优于IP地址,但接受的答案实际上并没有实现原始问题的目标。我需要这样做(我需要从非EC2的机器访问,因此没有策略)。
这是一项仅允许某个(或多个IP)访问存储桶对象的策略。这假设没有其他策略允许访问存储桶(默认情况下,存储桶不授予公共访问权限。)
此政策也不允许列名。只有当你知道你需要的对象的完整url时。如果您需要更多权限,只需将它们添加到Action位。
{
"Id": "Policy123456789",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::mybucket/*",
"Condition" : {
"IpAddress" : {
"aws:SourceIp": [
"xx.xx.xx.xx/32"
]
}
}
}
]
}
答案 1 :(得分:1)
从对问题评论的讨论来看,您的情况可以改写如下:
如何为特定的EC2实例提供对S3存储桶的完全访问权限,并拒绝其他所有来源的访问?
通常,最好的方法是创建 IAM角色并启动与该IAM角色关联的EC2实例。正如我要解释的那样,使用IAM角色来定义访问策略通常比指定源IP地址要好得多。
IAM或身份和访问管理是一种服务,可用于创建用户,组和角色,管理与这三种实体关联的访问策略,管理凭据等。
创建IAM角色后,您就可以在该角色“内”启动EC2实例。简单来说,这意味着EC2实例将继承与该角色关联的访问策略。请注意,在启动实例后,无法更改与实例关联的IAM角色。但是,您可以随时修改与IAM角色关联的访问策略。
IAM服务是免费的,当您将EC2实例与IAM角色相关联时,您不需要支付任何额外费用。
在您的情况下,您应该做的是创建一个IAM角色以在EC2中使用并附加一个策略,该策略将提供您需要的权限,即,将“允许”它将需要的所有“s3:xxx”操作在特定资源上执行“arn:aws:s3 ::: my_bucket /*”。
然后启动具有此角色的新实例(在当前AWS管理控制台上,在EC2启动实例向导上,您在选择实例类型后立即执行此操作)。
当您将IAM角色与EC2实例关联时,该实例可以获取一组临时AWS凭证(让我们关注结果和好处,而不是关注此过程的工作原理) )。如果您使用的是AWS CLI或任何AWS软件开发工具包,那么您根本就不指定任何凭据,CLI或SDK会发现它必须在某处查找临时凭证实例。
这样,您就不必使用硬编码凭据,也不必以某种方式将凭据注入实例。实例和CLI或SDK将为您管理此操作。作为额外的好处,您可以获得更高的安全性:凭据是临时的并自动轮换。
如果您使用的是AWS CLI,则只需运行命令而无需指定任何凭据。您将被允许运行您在IAM角色访问策略中指定的API。例如,您可以将文件上传到该存储桶:
aws s3 cp my_file.txt s3://my_bucket/
如果您使用的是SDK,比如Java SDK,您可以通过创建客户端对象而不指定任何凭据来与S3交互:
AmazonS3 s3 = new AmazonS3Client(); // no credentials on the constructor!
s3.putObject("my_bucket", ........);
我希望这可以帮助您解决问题。如果您有任何其他相关问题,请发表评论,我将尝试在此答案中解决这些问题。