无需凭据即可从特定 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 存储桶的访问权限的主要内容,如果未能解决你的问题,请参考以下文章
无需硬编码访问密钥即可从 android 应用程序访问 AWS S3