需要一些帮助来授予对 AWS S3 存储桶的访问权限,而无需向公众公开

需要一些帮助来授予对 AWS S3 存储桶的访问权限,而无需向公众公开

我正在尝试设置一个 AWS S3 存储桶,用于存储网站将提供给网站用户的文件。该网站是一个内部网(只有登录的用户才能访问提供 S3 存储桶中资产链接的任何页面)。

当我将存储桶纳入"Principle": "*"策略时,AWS 会警告我不要将存储桶公开供公众访问。然而,我尝试过的所有只授予特定用户访问权限的方法都不起作用(导致AccessDenied错误)。

在阅读了数小时的在线文章、AWS 文档以及 ServerFault 和 StackExchange 上的大量问题后,我还是一无所知。我开始想,也许我误解了 S3 存储桶具有公共访问权限的后果。这甚至是一个问题吗,因为我似乎无法在不授予公共访问权限的情况下仍然可以访问文件(通过存储文件的网站)。

该网站是一个 Craft 2 CMS 网站,带有 AWS S3 插件。该插件需要 AWS“访问密钥 ID”和“秘密访问密钥”。我在 IAM 中为该网站设置了一个用户,并使用了该用户的密钥。

我尝试过的方法

  1. 我尝试将策略应用于存储桶本身。如果我在存储桶本身上使用以下策略,我可以从网站访问文件。但我收到来自 AWS 的警告,说这会开放公共访问权限(我理解这是由于该"Principle": "*"字段造成的)。
{
    "Id": "Policy1599693986936",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1599693977359",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::MY-BUCKET/*",
                "arn:aws:s3:::MY-BUCKET"
            ],
            "Principal": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::MY-BUCKET"
            ],
            "Principal": "*"
        }
    ]
}
  1. 为了避免公共访问问题/警告,我尝试仅对 IAM 用户本身制定策略,而不直接对存储桶制定策略。我使用了这项政策:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucketMultipartUploads",
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::MY-BUCKET"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::MY-BUCKET/*"
        }
    ]
}

但是当我尝试通过我们的网站查看文件时,这会导致<Code>AccessDenied</Code>错误。因此,它似乎没有授予所需的权限,即使它授予的权限与上面 #1 中的策略相同,只是这些权限特定于此用户(我在网站上使用其密钥)。

  1. 我还尝试在存储桶的策略中应用条件,限制对我的网站 IP 地址的访问,但这会导致AccessDenied错误。我使用的附加字段是:
   "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "SERVER-IP-ADDRESS"
                    ]
                }
            },

问题

  1. 我是否误解了如何授予用户(以及特定网站,使用该用户的凭据)访问 S3 存储桶的权限?
  2. 如何授予网站(或任何访问 S3 的工具)对存储桶的独占访问权限,而不向公众开放存储桶?
  3. 在我的使用场景中开放“公共访问”的实际风险是什么?由于它是一个私人网站(仅限密码访问的内联网),如果我授予对 S3 存储桶的公共访问权限,这是否重要?我可以忽略 AWS 的警告吗?

答案1

您是否拥有此 AWS 账户中 VPC 中的 VPN 或 DX 连接资源?如果是,您可以使用该连接访问 S3 中托管的网站,而无需“通过互联网”。

您需要配置 S3 端点到您的 VPC,并从那里对其应用正确的策略(IIRC 默认它允许一切,所以也许这对您有用)。

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html

它可能更具限制性,因为它不仅会阻止具有正确身份验证的用户,还会阻止具有正确“通信”权限的用户,因为您需要允许所有用户通过 VPN/Dx 从任何地方通过连接访问 AWS,这在您的情况下可能有效,也可能无效。

相关内容