Amazon s3 AWS S3存储桶策略源IP不工作
我尝试了所有可能的选择,但没有结果。我的Bucket策略在aws:Referer上运行良好,但在以源Ip为条件的情况下根本不起作用 我的服务器由EC2托管,我使用这种格式的公共IP xxx.xxx.xxx/32(Public_IP/32)作为源IP参数 谁能告诉我我做错了什么 目前我的政策如下Amazon s3 AWS S3存储桶策略源IP不工作,amazon-s3,bucket,Amazon S3,Bucket,我尝试了所有可能的选择,但没有结果。我的Bucket策略在aws:Referer上运行良好,但在以源Ip为条件的情况下根本不起作用 我的服务器由EC2托管,我使用这种格式的公共IP xxx.xxx.xxx/32(Public_IP/32)作为源IP参数 谁能告诉我我做错了什么 目前我的政策如下 { "Version": "2008-10-17", "Id": "S3PolicyId1", "Statement": [ {
{
"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的访问
非常感谢 根据对该问题评论的讨论,您的情况可以重新表述如下: 如何授予特定EC2实例对S3存储桶的完全访问权限,并拒绝来自其他所有源的访问 通常,最好的方法是创建一个IAM角色,并启动与该IAM角色关联的EC2实例。正如我将要解释的,使用IAM角色来定义访问策略通常比指定源IP地址要好得多 IAM角色 IAM或身份和访问管理是一项服务,可用于创建用户、组和角色、管理与这三种实体关联的访问策略、管理凭据等 一旦创建了IAM角色,就可以在该角色中启动EC2实例。简单来说,这意味着EC2实例将继承您与该角色关联的访问策略。请注意,启动实例后,无法更改与实例关联的IAM角色。但是,您可以随时修改与IAM角色关联的访问策略 IAM服务是免费的,当您将EC2实例与IAM角色关联时,您不需要支付任何额外费用 在你的情况下 在您的情况下,您应该创建一个IAM角色以在EC2中使用,并附加一个策略,该策略将授予您所需的权限,即“允许”它需要在特定资源“arn:aws:s3:::my_bucket/*”上执行的所有“s3:xxx”操作 然后使用此角色启动一个新实例(在当前AWS管理控制台上,在EC2启动实例向导中,您在选择实例类型后的第3步执行此操作) 临时证书 当您将IAM角色与EC2实例关联时,该实例能够获得一组临时AWS凭据(让我们关注结果和好处,而不是这个过程的工作方式)。如果您使用的是AWS CLI或任何AWS SDK,那么您根本不需要指定任何凭据,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", ........);
我希望这能帮助你解决你的问题。如果您有任何其他相关问题,请留下评论,我将尝试在这个答案上解决这些问题。虽然我不反对政策比IP地址更好,但接受的答案实际上并没有达到原始问题的目标。我需要这样做(我需要从不是EC2的机器上访问,因此没有策略) 这里有一个只允许某个(或多个)IP访问bucket对象的策略。这假设没有其他策略允许访问bucket(默认情况下,bucket不允许公共访问) 此策略也不允许列出。只有当你知道你需要的对象的完整url。如果需要更多权限,只需将其添加到操作位
{
"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"
]
}
}
}
]
}
你想要达到的效果到底是什么?您是否希望特定EC2实例能够完全访问该bucket,而其他任何东西都无法访问该bucket?还是别的什么?ThanksHi@BrunoReis,是的,没错,我希望源Ip地址能够访问S3存储桶,而不是其他任何东西。让我更具体一点:您的要求听起来像“我希望这个特定的源Ip地址能够访问这个存储桶”,但如果我们将其重新表述为“我希望此特定EC2实例能够访问此存储桶”?请注意区别:您将源称为IP地址,我将源称为EC2实例。很抱歉这么坚持,但如果您的要求是“此EC2实例”而不是“此IP地址”,您可能会有一个更好、更安全的解决方案“.Yep,你是对的,是需要访问bucket的EC2实例。谢谢@bruno,这很有意义。我(新手)的错误是:)认为源IP地址是EC2实例的IP地址。在这种情况下,源Ip是客户机的Ip…如果使用我上面描述的方法(IAM角色),您甚至不需要指定Bucket策略。没有bucket策略的bucket是“私有”bucket,除非使用具有适当策略的凭据发出请求,否则所有访问都将被拒绝。在这种情况下,凭据将是IAM角色(临时)凭据,策略将是IAM角色策略。在这里不需要考虑IPs,只要你能避免考虑IPs,你就是在创建一个更“云友好”的架构:当你说“不允许列表”时。你的意思是它不支持使用CIDR集团的列表吗