我正在尝试将 s3 存储桶用作简单的 Web 主机,但希望将其放在能够分层一些所需安全控制的反向代理后面。
我有与我想限制 s3 Web 访问的反向代理关联的 IP 地址。当我在存储桶策略中应用基于 IP 的限制时,尽管它似乎使帐户中的管理交互非常难以阻止。
我不希望通过控制台/IAM 用户/联合角色从帐户内部中断访问,而是仅针对与反向代理关联的 IP 启用对 s3 站点的 http 访问。
关于启用 Web 访问所需内容的 AWS 文档表明我需要此策略声明,因此我将其包含在其中。
{
"Id": "S3_Policy",
"Statement": [
{
"Sid": "AllowWebAccess",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::mybucket/*"
]
}
]
}
然后我想将网络流量限制为一组特定的 IP,所以我添加了这个语句。
{
"Id": "S3_Policy",
"Statement": [
{
"Sid": "AllowWebAccess",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::mybucket/*"
]
},
{
"Sid": "DenyNonProxyWebAccess",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"99.99.99.1/32",
"99.99.99.2/32",
"99.99.99.3/32",
"99.99.99.4/32",
"99.99.99.5/32"
]
}
}
}
]
}
此拒绝策略的意外后果是阻止我使用 IAM 用户或假定的联合角色从我的账户内部访问它的能力,因此我为这些资源添加了显式允许。如果可能的话,我只想为“帐户”放置一条毯子。这让我有了这项政策,而且它似乎并没有按照我的意愿运作。我似乎无法以我的用户身份管理它或从代理访问 Web 内容。
{
"Id": "S3_Policy",
"Statement": [
{
"Sid": "AllowWebAccess",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::mybucket/*"
]
},
{
"Sid": "DenyNonProxyWebAccess",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"99.99.99.1/32",
"99.99.99.2/32",
"99.99.99.3/32",
"99.99.99.4/32",
"99.99.99.5/32"
]
}
}
},
{
"Sid": "AllowAccountUsersAccess",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:IAM::999999999999:user/user@place",
"arn:aws:IAM::999999999999:user/user2@place",
"999999999999"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::my bucket"
]
}
]
}
有没有办法让 S3 存储桶成为静态 Web 主机,仅限于选择用于 Web 访问的 IP 范围,而不会破坏从帐户管理存储桶本身的能力?
最佳答案
可以通过多种方式授予对 Amazon S3 存储桶中的资源的访问权限:
如果访问请求满足 任意 以上,他们将被授予访问权限(尽管拒绝可能会覆盖它)。
IAM 权限 用于将权限分配给 用户 或 群 .例如,如果您想访问存储桶,您可以添加创建策略并将其分配给您 作为 IAM 用户 .如果您希望您的所有管理员都访问存储桶,请将它们放入 IAM集团并将策略分配给组。以这种方式进行的所有访问都需要使用 AWS 凭证完成(无匿名访问)。
一个 存储桶策略 通常用于授予匿名访问(不需要凭据),但可以包括 IP 地址范围、仅限 SSL 和时间等限制。这是您授予对反向代理访问权限的方式,因为它不会将凭据作为其请求的一部分发送。
一个 预签名网址 可以由应用程序生成授予 临时访问 到一个特定的对象。 URL 包含一个计算签名,用于验证访问。这通常用于在 HTML 页面上生成链接(例如链接到私有(private)图像)。
您的情况
因此,首先,您应该使用类似于以下的策略向您自己和您的管理员授予访问权限:
{
"Id": "S3_Policy",
"Statement": [
{
"Sid": "AllowWebAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::mybucket/*"
]
}
]
}
注意没有
Principal
因为它适用于已分配此策略的任何用户/组。接下来,您希望授予对反向代理的访问权限。这可以通过 来完成。存储桶策略 :
{
"Id": "S3_Policy",
"Statement": [
{
"Sid": "DenyNonProxyWebAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mybucket/*",
"arn:aws:s3:::mybucket"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"99.99.99.1/32",
"99.99.99.2/32",
"99.99.99.3/32",
"99.99.99.4/32",
"99.99.99.5/32"
]
}
}
}
]
}
此策略允许 (
Allow
) 访问指定的存储桶,但前提是请求来自指定的 IP 地址之一。通过
Allow
授予访问权限总是比拒绝访问更可取,因为 Deny
总是覆盖 Allow
.因此,请使用 Deny
谨慎,因为一旦某事被拒绝,就不能再被允许(例如,如果拒绝阻止管理访问,则不能允许访问)。拒绝主要用于您肯定想要阻止某些东西(例如已知的坏 Actor )的地方。VPC 端点
最后一个值得考虑的选择是使用 S3 的 VPC 端点 .这允许 VPC 和 S3 之间直接通信,而无需通过 Internet 网关。这对于私有(private)子网中的资源希望在不使用 NAT 网关的情况下与 S3 通信的情况非常有用。
可以将其他策略添加到 VPC 终端节点以定义哪些资源可以访问 VPC 终端节点(例如,您的反向代理范围)。存储桶策略可以专门引用 VPC 端点,允许来自该访问方法的请求。例如,您可以配置仅允许来自特定 VPC 的访问的存储桶策略——这对于分离对存储桶的开发/测试/生产访问非常有用。
但是,它可能不适合您的给定用例,因为它会强制所有 S3 流量通过 VPC 端点,甚至在您的反向代理之外。这可能不是您的架构所期望的行为。
底线: IAM 策略授予用户访问权限。存储桶策略授予匿名访问权限。
您当然不需要“需要”您列出的第一个策略,实际上您应该很少使用该策略,因为它授予对存储桶的完全访问权限。
关于amazon-web-services - 反向代理的 AWS 存储桶策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46856132/