S3存储桶策略安全最佳实践

这个策略是一个Amazon S3存储桶策略,用于精细控制对S3存储桶的访问。它由两个声明(Statement)组成,每个声明都有自己的规则和条件。下面是对每个声明的提炼和解释:

第一个声明(Sid: AllowSSLRequestsOnly)

  • 声明ID(Sid): "AllowSSLRequestsOnly",用于标识声明。

  • 效果(Effect): "Deny",表示这个规则是用于拒绝访问的。

  • 主体(Principal): { "AWS": "*" },这意味着这个规则适用于所有AWS账户。

  • 动作(Action): "s3:*",表示所有S3服务操作。

  • 资源(Resource): 包括整个存储桶以及存储桶内的对象。

  • 条件(Condition):

    • "Bool": { "aws:SecureTransport": "false" },这个条件指定了如果请求不是通过安全的SSL/TLS连接(HTTPS),则拒绝请求。

这个声明的目的是确保所有对S3存储桶的操作都必须通过安全的HTTPS连接进行,从而提高数据传输的安全性。

第二个声明(Sid: Access-to-specific-VPCE-only)

  • 声明ID(Sid): "Access-to-specific-VPCE-only",标识声明。

  • 主体(Principal): "*",适用于所有用户和角色。

  • 动作(Action): 包括S3的读取、写入和删除操作。

  • 效果(Effect): "Deny",拒绝不符合以下条件的访问。

  • 资源(Resource): 存储桶内的所有对象。

  • 条件(Condition):

    • "StringNotEquals": 包含多个条件,用于指定不在特定VPC端点、账户或角色下的请求将被拒绝。

    • "aws:sourceVpce": "<VPC_ENDPOINT_ID>",确保只有来自特定VPC端点的请求被允许。

    • "aws:PrincipalTag/network-perimeter-exception": "true",允许带有特定标签的请求。

    • "aws:PrincipalAccount": 指定特定的账户ID,只有来自这些账户的请求被允许。

    • "BoolIfExists": 如果存在条件,则应用附加的布尔逻辑。

    • "aws:PrincipalIsAWSService": "false""aws:ViaAWSService": "false",拒绝不是AWS服务的请求或未经AWS服务代理的请求。

    • "ArnNotLikeIfExists": 如果存在匹配特定模式的ARN,则拒绝请求。

    • "aws:PrincipalTag/data-perimeter-include": "true",允许带有特定标签的请求。

这个声明的目的是限制对S3存储桶的访问,只允许来自特定VPC端点、特定账户、特定角色或带有特定标签的请求。它通过一系列条件来实现细粒度的访问控制。

请注意,<BUCKET_NAME><VPC_ENDPOINT_ID><load-balancing-account-id><third-party-account-a><third-party-account-b><my-account-id> 需要替换为实际的值。此外,策略中可能还有更多的声明来满足特定的访问控制需求。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSSLRequestsOnly",
            "Effect": "Deny",
            "Principal": {
                "AWS": "*"
            },
            "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>",
                    "aws:PrincipalTag/network-perimeter-exception": "true",
                    "aws:PrincipalAccount": [
                        "<load-balancing-account-id>",
                        "<third-party-account-a>",
                        "<third-party-account-b>"
                    ]
                },
                "BoolIfExists": {
                    "aws:PrincipalIsAWSService": "false",
                    "aws:ViaAWSService": "false"
                },
                "ArnNotLikeIfExists": {
                    "aws:PrincipalArn": "arn:aws:iam::<my-account-id>:role/aws-service-role/*"
                },
                "StringEquals": {
                    "aws:PrincipalTag/data-perimeter-include": "true"
                }
            }
        }
    ]
}

最后更新于