我正在尝试设置一个 AWS S3 存储桶,用于存储网站将提供给网站用户的文件。该网站是一个内部网(只有登录的用户才能访问提供 S3 存储桶中资产链接的任何页面)。
当我将存储桶纳入"Principle": "*"
策略时,AWS 会警告我不要将存储桶公开供公众访问。然而,我尝试过的所有只授予特定用户访问权限的方法都不起作用(导致AccessDenied
错误)。
在阅读了数小时的在线文章、AWS 文档以及 ServerFault 和 StackExchange 上的大量问题后,我还是一无所知。我开始想,也许我误解了 S3 存储桶具有公共访问权限的后果。这甚至是一个问题吗,因为我似乎无法在不授予公共访问权限的情况下仍然可以访问文件(通过存储文件的网站)。
该网站是一个 Craft 2 CMS 网站,带有 AWS S3 插件。该插件需要 AWS“访问密钥 ID”和“秘密访问密钥”。我在 IAM 中为该网站设置了一个用户,并使用了该用户的密钥。
我尝试过的方法
- 我尝试将策略应用于存储桶本身。如果我在存储桶本身上使用以下策略,我可以从网站访问文件。但我收到来自 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": "*"
}
]
}
- 为了避免公共访问问题/警告,我尝试仅对 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 中的策略相同,只是这些权限特定于此用户(我在网站上使用其密钥)。
- 我还尝试在存储桶的策略中应用条件,限制对我的网站 IP 地址的访问,但这会导致
AccessDenied
错误。我使用的附加字段是:
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"SERVER-IP-ADDRESS"
]
}
},
问题
- 我是否误解了如何授予用户(以及特定网站,使用该用户的凭据)访问 S3 存储桶的权限?
- 如何授予网站(或任何访问 S3 的工具)对存储桶的独占访问权限,而不向公众开放存储桶?
- 在我的使用场景中开放“公共访问”的实际风险是什么?由于它是一个私人网站(仅限密码访问的内联网),如果我授予对 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,这在您的情况下可能有效,也可能无效。