我正在尝试将s3存储桶用作简单的Web主机,但希望将其置于能够分层一些必需安全控件的反向代理之后。
我有与反向代理关联的IP地址,我想限制s3 web访问。当我在存储桶策略中应用基于IP的限制时,虽然它似乎使帐户中的管理交互极难阻止。
我希望不会通过控制台/ IAM用户/联盟角色中断帐户内的访问,但只启用对s3站点的http访问,只显示与反向代理关联的IP。
有关启用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存储桶成为静态网络主机,仅限于为网络访问选择IP范围,而不会破坏从帐户管理存储桶本身的能力?
答案 0 :(得分:2)
可以通过多种方式为Amazon S3存储桶中的资源授予访问权限:
如果访问请求符合上述任何,则会授予他们访问权限(尽管拒绝可能会覆盖它)。
IAM权限用于为用户或群组分配权限。例如,如果您想要访问存储桶,则可以添加创建策略并将其作为IAM用户分配给。如果您希望所有管理员都访问该存储桶,请将其置于 IAM组中,并将该策略分配给该组。以这种方式进行的所有访问都需要使用AWS凭证(无匿名访问)完成。
Bucket Policy 通常用于授予匿名访问权限(不需要凭据),但可以包含IP地址范围,仅限SSL和时间等限制。这是您授予对反向代理的访问权限的方式,因为它不会将凭据作为其请求的一部分发送。
应用程序可以生成预签名网址,以便将临时访问权限授予特定对象。 URL包括验证访问权限的计算签名。这通常在HTML页面上生成链接时使用(例如,链接到私有图像)。
您的情况
因此,首先,您应该使用类似于以下的政策授予您自己和管理员的访问权限。
{
"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
,因为一旦被拒绝,就不能允许它(例如,如果拒绝阻止管理访问,则不能允许访问)。拒绝主要用于你肯定想阻止某些东西的地方(例如一个已知的坏演员)。
VPC端点
值得考虑的最后一个选项是使用 VPC Endpoint for S3 。这允许在VPC和S3之间直接通信,而不必经过因特网网关。这非常适用于私有子网中的资源希望在不使用NAT网关的情况下与S3通信的情况。
可以将其他策略添加到VPC端点,以定义哪些资源可以访问VPC端点(例如,您的反向代理范围)。存储桶策略可以专门引用VPC端点,允许来自该访问方法的请求。例如,您可以配置仅允许从特定VPC访问的存储桶策略 - 这对于将Dev / Test / Prod访问分离到存储桶非常有用。
但是,它可能不适合您的特定用例,因为它会强制所有 S3流量通过VPC端点,甚至在您的反向代理之外。这可能不是您的架构所需的行为。
底线: IAM策略授予用户访问权限。存储桶策略授予匿名访问权限。
你当然不需要"需要"您列出的第一个策略,实际上您应该很少使用该策略,因为它授予对存储桶的完全访问权限。