反向代理的AWS Bucket策略

时间:2017-10-20 19:33:38

标签: amazon-web-services amazon-s3 reverse-proxy amazon-iam

我正在尝试将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范围,而不会破坏从帐户管理存储桶本身的能力?

1 个答案:

答案 0 :(得分:2)

可以通过多种方式为Amazon S3存储桶中的资源授予访问权限:

  • IAM权限
  • Bucket Policy
  • 预先签名的网址

如果访问请求符合上述任何,则会授予他们访问权限(尽管拒绝可能会覆盖它)。

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策略授予用户访问权限。存储桶策略授予匿名访问权限。

你当然不需要"需要"您列出的第一个策略,实际上您应该很少使用该策略,因为它授予对存储桶的完全访问权限。