我试图使用s3 bucket作为一个简单的web主机,但希望将其放在一个反向代理之后,该代理能够分层一些所需的安全控制。
我有与反向代理相关的IP地址,我想限制s3 web访问。当我在bucket策略中应用基于IP的限制时,尽管这似乎会使帐户中的管理交互极难被阻止。
我不想通过控制台/IAM用户/联合角色中断帐户内的访问,而是只为与反向代理相关联的IP启用对s3站点的http访问。
AWS关于启用web访问所需内容的文档显示,我需要此政策声明,因此我首先包含了它。
{
"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用户或担任联合角色的帐户内部访问它的能力,所以我为这些资源添加了明确的允许。如果可能的话,我只想为"账户"放一条毯子。这就给我留下了这个策略,它似乎无法按照我的意愿运行。我似乎既不能作为用户管理它,也不能从代理访问网络内容。
{
"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范围,而不会中断从帐户管理存储桶本身的能力?
有多种方式可以授予对AmazonS3存储桶中资源的访问权限:
- IAM权限
- Bucket策略
- 预签名URL
如果访问请求满足上述任何,则将授予他们访问权限(尽管拒绝可能会覆盖它)。
IAM权限用于将权限分配给用户或组。例如,如果您想访问bucket,可以添加创建策略并将其分配给您作为IAM用户。如果您希望所有管理员都能访问存储桶,请将他们放入IAM组中,并将策略分配给该组。所有以这种方式进行的访问都需要使用AWS凭据(无匿名访问)。
Bucket策略通常用于授予匿名访问权限(不需要凭据),但可能包括IP地址范围、仅SSL和一天中的时间等限制。这是您授予反向代理访问权限的方式,因为它不会将凭据作为请求的一部分发送。
应用程序可以生成预签名URL,以授予对特定对象的临时访问权限。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
)访问指定的bucket,但前提是请求来自指定的IP地址之一。
通过Allow
授予访问总是比拒绝访问更可取,因为Deny
总是覆盖Allow
。因此,请谨慎使用Deny
,因为一旦某个内容被拒绝,就不能允许它(例如,如果拒绝阻止管理访问,则不能允许访问)。拒绝主要用于你肯定想阻止某件事的地方(例如一个已知的坏演员)。
VPC端点
最后一个值得考虑的选项是为S3使用VPC端点。这允许VPC和S3之间的直接通信,而不必通过互联网网关。这对于私有子网中的资源希望在不使用NAT网关的情况下与S3通信的情况非常好。
可以向VPC端点添加其他策略,以定义哪些资源可以访问VPC端点(例如您的反向代理范围)。Bucket Policies可以专门指VPC端点,允许来自该访问方法的请求。例如,您可以配置一个只允许从特定VPC访问的bucket策略——这对于分离Dev/Test/Prod对bucket的访问非常有用。
然而,它可能不适合您给定的用例,因为它会强制所有S3流量通过VPC端点,甚至在您的反向代理之外。这可能不是您的体系结构所期望的行为。
底线:IAM策略向用户授予访问权限。Bucket策略授予匿名访问权限。
您当然不"需要"您列出的第一个策略,事实上,您应该很少使用该策略,因为它允许完全访问bucket。