为什么我限制了对特定 Amazon VPC 的访问权限,但仍然能从公有 IP 地址访问 Simple Storage Service(Amazon S3)上的静态网站?
上次更新日期:2020 年 3 月 13 日
我使用 Amazon Simple Storage Service(Amazon S3)托管我的静态网站。我附加了一个存储桶策略,该策略限制对存储桶的访问权限,只允许特定的 Amazon Virtual Private Cloud(Amazon VPC)访问。但是,我仍然能够从公有 IP 地址访问我的网站。如何解决此问题?
解决方法
在开始排除故障之前,请务必确认以下事项:
- 您的 Web 浏览器或代理缓存已清除,当前显示的是最新配置。
- 您从中访问存储桶的 Amazon Elastic Compute Cloud (Amazon EC2) 实例与存储桶位于相同的 AWS 区域。
- VPC 终端节点已与您正在使用的 EC2 实例的路由表关联,以便流量与存储桶策略中引用的 VPC ID 关联。
检查存储桶策略
查看存储桶策略中的语句,确认该策略允许从 VPC 对存储桶进行访问。例如,以下存储桶策略语句允许 s3:GetObject,前提是请求来自 vpc-id123456:。
注意:尽管静态网站托管允许未经身份验证(匿名)的请求,但如果用户进行了身份验证,那么可以根据他们的凭证授予他们访问权限。例如,AWS Identity and Access Management(IAM)角色对 Amazon S3 具有完全访问权限,使用该角色进行身份验证的用户仍然可以下载 VPC 之外的对象,尽管存在以下存储桶策略。如果您需要更严格的存储桶策略,请参阅限制对特定 VPC 的访问权限,在该示例策略中,如果请求来自 VPC 之外,即使是管理员或 AWS 账户根用户也会被拒绝访问。
{
"Version": "2012-10-17",
"Id": "Policy1",
"Statement": [{
"Sid": "Access-to-Trusted-VPC-only",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject*",
"Resource": "arn:aws:s3:::awsexamplebucket/*",
"Condition": {
"StringEquals": {
"aws:sourceVpc": "vpc-id123456"
}
}
}]
}
检查对象访问控制列表(ACL)
在您确认存储桶策略正确后,请检查是否有任何对象 ACL 允许公有访问。如果部分对象 ACL 确实允许公有访问并且您想要覆盖这些 ACL,则您可以:
- 为单个存储桶或 AWS 账户配置公有访问设置
- 向存储桶策略添加显式拒绝语句
要使用 Amazon S3 控制台通过配置单个存储桶的公有访问设置或您的账户的公有访问设置来覆盖对象 ACL,请选择以下选项:
- 阻止对通过新访问控制列表(ACL)授予的存储桶和对象的公有访问
- 阻止对通过任何访问控制列表(ACL)授予的存储桶和对象的公有访问
注意:您也可以使用 AWS Command Line Interface(AWS CLI)(一种 AWS 开发工具包)或 Amazon S3 REST API 配置存储桶的公有访问权限设置。有关更多信息,请参阅阻止对您的 Simple Storage Service(Amazon S3)存储的公共访问。
要使用存储桶策略覆盖对象 ACL,请添加一个语句,如果请求并非来自 VPC,则显式拒绝操作。例如,以下存储桶策略中包括一个显式拒绝语句,如果请求并非来自 vpc-id123456:,则明确拒绝 s3:GetObject。
警告:此示例存储桶策略包括一个显式拒绝语句,因此,在保存策略之前,您必须仔细检查显式拒绝访问的参数。如果您被意外锁定,请参阅我意外拒绝了所有人对我的 Amazon S3 存储桶的访问。如何重新获得访问权限?
{
"Version": "2012-10-17",
"Id": "Policy1",
"Statement": [{
"Sid": "Access-to-Trusted-VPC-only",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::awsexamplebucket/*",
"Condition": {
"StringEquals": {
"aws:sourceVpc": "vpc-id123456"
}
}
},
{
"Sid": "Deny-Access-Except-For-Trusted-VPC",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::awsexamplebucket/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpc": "vpc-id123456"
}
}
}
]
}