amazon-web-services - 反向代理的 AWS 存储桶策略

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

我正在尝试将 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 用户 .如果您希望您的所有管理员都访问存储桶,请将它们放入 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/

    相关文章:

    amazon-web-services - 使用 Jenkins 和 Cloud Formation 的 AWS AMI 自动化

    amazon-web-services - Cloudformation init 不执行命令,而是创建文件

    amazon-s3 - Airflow/minio : How do I use minio as a local S3 proxy for data sent from Airflow?

    networking - Docker Compose网络:nginx中的主机名无法解析

    google-app-engine - 我是否需要在 Google App Engine 后面设置反向代理?

    ubuntu - 使用现有的 Nginx 安装转发到 GitLab 子域

    python - 在 Amazon Elasticsearch Service 上建立索引 - 批量插入

    amazon-web-services - 如何在 EC2 上启动 Spark 2.0

    hadoop - 将数据从Cloudera移至Amazon S3存储桶

    node.js - 设置 nginx 来提供静态文件(如果存在),或者让服务器创建它(如果不存在)