首页 > 解决方案 > KMS 和 S3 存储桶

问题描述

  1. 我有一个包含文件的存储桶

  2. 我已通过存储桶策略授予对 test-user1(在 IAM 中具有 AdministratorAccess 策略)的完全访问权限

    "Version": "2012-10-17",
    "Id": "Policy1595762326470",
    "Statement": [
        {
            "Sid": "Stmt1595762736524",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxx:user/test-user1"
            },
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::test-user1-bucket"
        }
    ]
}
  1. 存储桶对该存储桶使用 AWS-KMS(CMK 加密),并且 test-user1 不在该客户托管密钥的密钥用户列表中

  2. 关键政策如下:

{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxx:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxx:user/kolyaiks_iam"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxx:user/kolyaiks_iam"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::xxx:user/kolyaiks_iam"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

test-user1 可以从存储桶中下载和读取文件吗?如果是,他为什么可以?

标签: amazon-web-servicesamazon-s3aws-kms

解决方案


当您指示 S3 使用 KMS 对静态对象进行加密时,S3 将在对象存储时自动使用 S3 对其进行加密,并在对象访问时对其进行解密。如果 KMS CMK 的资源策略允许账户中的所有 IAM 用户使用密钥,那么任何有权访问 S3 存储桶的 IAM 用户都可以从 S3 下载对象,他们收到的内容将是未加密的。如果您锁定对 CMK 的访问,则只有有权使用 CMK 进行解密的用户(除了访问 S3 存储桶的权限)可以从 S3 下载对象。如果用户无权访问用于加密对象的 KMS 密钥,那么他们不会像您预期的那样从 S3 接收加密对象,而是实际上会收到拒绝访问错误。

您最初假设用户将能够从 S3 下载对象,但他们会收到对象的加密版本,这是不正确的,因为解密发生在 S3 内的服务器端。如果您希望用户能够从 S3 下载文件的加密版本,那么您必须在上传到 S3 之前自己加密文件。


推荐阅读