无需凭据即可从特定 IP 授予对 AWS S3 存储桶的访问权限

Posted

技术标签:

【中文标题】无需凭据即可从特定 IP 授予对 AWS S3 存储桶的访问权限【英文标题】:Grant Access to AWS S3 bucket from specific IP without credentials 【发布时间】:2018-08-29 07:52:18 【问题描述】:

我不想让我的 S3 存储桶公开访问。但我希望无需 AWS CLI 或任何凭证即可从我的本地组织网络访问它。我怎样才能实现它?。

我尝试了将主体作为 * 并将源 IP 作为组织网络的公共 IP 的存储桶策略。

【问题讨论】:

【参考方案1】:

是的,这是正确的做法。

来自Bucket Policy Examples - Amazon Simple Storage Service:


  "Version": "2012-10-17",
  "Id": "S3PolicyId1",
  "Statement": [
    
      "Sid": "IPAllow",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::examplebucket/*",
      "Condition": 
         "IpAddress": "aws:SourceIp": "54.240.143.0/24"
       
     
  ]

【讨论】:

我认为这不会起作用,因为我曾经遇到过类似的问题,因为 S3 默认设计为允许任何 IP 地址访问。因此,要阻止 IP,您必须在策略中明确指定拒绝而不是允许。 默认情况下,Amazon S3 中的内容是私有的。以上将授予从该 IP 地址访问该存储桶的 GetObject 的权限。如果没有其他存储桶策略,并且对象具有私有 ACL,则内容将保持私有。 我刚刚做了一个测试,可以确认上面的bucket策略是足够的,假设对象有私有ACL,并且对象是匿名访问的。 是的,我很久以前尝试过相同的解决方案,但失败了,我当时是从 aws 支持团队更新的(我们试图在私有端点存在之前从 VPC 内部进行) 这完全取决于您的要求。如果 everybody 不在 CIDR 范围内,Deny 将从存储桶中阻止它们。如果这是意图,那很好。但是,如果目的是授予对特定 CIDR 范围的匿名访问权限,同时还允许 IAM 策略向特定人员(例如管理员)授予额外访问权限,则不合适。【参考方案2】:

如果打算授予对特定 CIDR 范围的匿名访问权限,同时还允许 IAM 策略授予特定人员(例如管理员)额外的访问权限,那么这将是不合适的。

如果您遵循 AWS documentation 列出的初始示例 - 您最终会得到一个可能与此类似的策略。


    "Id": "S3PolicyId1",
    "Statement": [
        
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": 
                "AWS": "*"
            ,
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::examplebucket/*",
            "Condition": 
                "IpAddress": 
                    "aws:SourceIp": "x.x.x.x/xx"
                
            
        
    ]

在将头敲在桌子上几次之后,您会发现这项政策不起作用。 S3 存储桶似乎没有隐含的拒绝规则(类似于 IAM 访问策略的设置方式)。

默认情况下,帐户被限制访问 S3,除非他们已通过策略获得访问权限。 但是,S3 默认设计为允许任何 IP 地址访问。因此,要阻止 IP,您必须在策略中明确指定拒绝而不是允许。

一旦您了解了这一点,政策就很容易调整。您只需将政策从只允许从我的 IP 地址访问到拒绝访问不是我的 IP 地址的任何地方翻转即可。


    "Id": "S3PolicyId1",
    "Statement": [
        
            "Sid": "IPDeny",
            "Effect": "Deny",
            "Principal": 
                "AWS": "*"
            ,
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::examplebucket/*",
            "Condition": 
                "NotIpAddress": 
                    "aws:SourceIp": "xxx.x.x/xx"
                
            
        
    ] 

希望这会有所帮助!

【讨论】:

小心——如果任何用户不在该 CIDR 范围内(包括管理员),第二个策略将阻止他们与存储桶进行交互。

以上是关于无需凭据即可从特定 IP 授予对 AWS S3 存储桶的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

S3 存储桶策略授予/限制对特定联合用户的访问权限

无需硬编码访问密钥即可从 android 应用程序访问 AWS S3

从 Azure 数据块读取 Amazon S3 特定文件夹,无需公开访问存储桶

如何将 S3 存储桶锁定到特定用户和 IAM 角色

AWS-IAM:授予对单个存储桶的访问权限

授予对 s3 存储桶的公共访问权限,而不是为 aws 无服务器应用程序提供静态网站