您可以看到,到 S3 存储桶的流量是通过 VPC 网关端点传输的,该端点用于 VPC 内的应用程序,而不是通过公共互联网。这是一种最佳做法!不过,我们还需要确保只有我们授权的 IAM 角色才能访问 S3 存储桶,而且只能从我们的 VPC 访问。
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "DenyInsecureConnections",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<BUCKET_NAME>",
"arn:aws:s3:::<BUCKET_NAME>/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
}
},
{
"Sid": "Access-to-specific-VPCE-only",
"Principal": "*",
"Action": [
"s3:GetObject*",
"s3:PutObject*",
"s3:DeleteObject*"
],
"Effect": "Deny",
"Resource": "arn:aws:s3:::<BUCKET_NAME>/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "<VPC_ENDPOINT_ID>"
}
}
}
]
}
如果没有 S3 的 VPC 端点,从 EC2 实例到 S3 的网络连接会通过互联网网关出VPC,然后返回 AWS 网络,从其公共端点到达 S3。有了 VPC 端点,这些网络流量就会保留在 AWS 私有网络中。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket",
"s3:GetBucketPolicy",
"s3:GetObjectAcl",
"s3:PutObjectAcl",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::<BUCKET_NAME>",
"arn:aws:s3:::<BUCKET_NAME>/*"
],
"Condition": {
"Bool": {
"aws:PrincipalIsAWSService": "true"
},
"StringEquals": {
"aws:PrincipalOrgID": "<my-org-id>",
"aws:ResourceOrgID": "<my-org-id>"
},
"ArnEquals": {
"aws:PrincipalArn": "<THE_ROLE_ARN>"
}
}
}
]
}
为了实现控制目标,您可以编写一个AWS服务控制策略(SCP),以确保您的应用程序的临时凭证只能在您期望的网络空间内访问您的S3存储桶。根据提供的信息,您可以使用SCP来限制对S3的访问,以确保只有在特定网络空间内的应用程序才能访问该存储桶。
在上面的示例中,这个SCP将拒绝所有对S3存储桶的操作,除非请求来自于指定的IP地址范围(您期望的网络空间)。您需要将示例中的"your-s3-bucket-name"替换为您的S3存储桶名称,并根据您的网络空间配置正确的IP地址范围。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::your-s3-bucket-name",
"arn:aws:s3:::your-s3-bucket-name/*"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"192.168.1.0/24", // 期望的网络空间IP范围
"10.0.0.0/16"
]
}
}
}
]
}