amazon-web-services - KMS 和 S3 存储桶
问题描述
我有一个包含文件的存储桶
我已通过存储桶策略授予对 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"
}
]
}
存储桶对该存储桶使用 AWS-KMS(CMK 加密),并且 test-user1 不在该客户托管密钥的密钥用户列表中
关键政策如下:
{
"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 可以从存储桶中下载和读取文件吗?如果是,他为什么可以?
解决方案
当您指示 S3 使用 KMS 对静态对象进行加密时,S3 将在对象存储时自动使用 S3 对其进行加密,并在对象访问时对其进行解密。如果 KMS CMK 的资源策略允许账户中的所有 IAM 用户使用密钥,那么任何有权访问 S3 存储桶的 IAM 用户都可以从 S3 下载对象,他们收到的内容将是未加密的。如果您锁定对 CMK 的访问,则只有有权使用 CMK 进行解密的用户(除了访问 S3 存储桶的权限)可以从 S3 下载对象。如果用户无权访问用于加密对象的 KMS 密钥,那么他们不会像您预期的那样从 S3 接收加密对象,而是实际上会收到拒绝访问错误。
您最初假设用户将能够从 S3 下载对象,但他们会收到对象的加密版本,这是不正确的,因为解密发生在 S3 内的服务器端。如果您希望用户能够从 S3 下载文件的加密版本,那么您必须在上传到 S3 之前自己加密文件。
推荐阅读
- gitlab - 将项目推送到 Gitlab 但我无法推送布局
- algorithm - 无限棋盘井字游戏的最佳数据结构
- python - DRF ForeignKey 值未部分显示
- java - 为什么 Scala 有自己的内置库?
- ruby-on-rails - 如何在覆盖另一个模块的某些方法的模块上调用类方法?
- angular - 如何在firestore angularfire中的变量中分配快照的结果
- php - 使用 Regex 从 Wikipedia API 获取信息框
- android - .DexArchiveMergerException:无法合并 dex
- azure - Kubernetes:AKS 无法查看该站点
- python - 尝试在 Python 控制台中输入时出错