亚马逊AWS官方博客

AWS KMS 之 EBS 和 S3 加密最佳实践

本篇主要从AWS安全视角中的数据保护层面对S3和EBS进行加密管理,并结合CloudTrail 和 CloudWatch相结合做到数据加密中的可追溯性,并阐述EBS加密与解密的过程。另外通过本篇你将掌握利用AWS Key Management Service (KMS) 去创建和管理密钥,并管理AWS 服务和应用程序中加密的使用方式,这里主要围绕生产场景常用的AWS服务EBS和S3的最佳实践方法供其参考。

首先我们在此先启用CloudTrail,让其提供给密钥加密管理有对应的记录,方便密钥的监管的合规性要求。

 

启用与配置CloudTrail 日志功能

登陆AWS管理控制台,点击服务并选中CloudTrail

指定跟踪名称,选择跟踪到所有的区域;并输入对应跟踪器名称:kms-trail,指定对应S3存储桶,如下图

 

配置CloudWatch与IAM策略

CloudTrail 与S3存储配置好后;在CloudTrail界面,配置其CloudWatch日志,以及IAM策略。

 

创建KMS Master key

在控制台的服务选项中,选择KMS服务,创建一个Master key,

定义管理权限

指定哪个账户具有管理密钥的权限

 

定义密钥使用权限

指定哪个账户具有使用密钥的权限

如果这里想通过脚本的方式进行,也可参考下面的json文件配置:

{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountID:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam:: AccountID:user/awsent"
            },
            "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:: AccountID:user/awsent"
            },
            "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:: AccountID:user/awsent"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

启用密钥轮换功能

在创建Master Key后,需要开启密钥轮换功能,从AWS安全角度以及最佳实践角度,需要将其开启。

 

AWS EBS 与KMS 集成示例

Amazon EBS 可通过AWS KMS 提供卷加密功能。每个卷均使用 AES-256-XTS 进行加密。这需要两个256位密钥,您可以将它们视为一个512 位密钥。数据密钥在您账户中的客户主密钥下加密。要使Amazon EBS为您加密卷,它必须能够访问 账户中的CMK。您可以通过向Amazon EBS 提供对 CMK 的授权来创建数据密钥 以及加密和解密这些数据密钥。

以下是加密/解密EBS 卷数据的基本步骤:

  1. Amazon EBS 通过AWS KMS 在 CMK 下获取加密数据密钥,并将加密密钥与卷 元数据一起存储。
  2. 托管 EC2 实例的服务器从存储中检索加密数据密钥。
  3. 通过 SSL 调用AWS KMS 以解密加密的数据密钥。AWS KMS 识别 CMK,向队 列中的HSA 发出内部请求以解密数据密钥,并通过 SSL 会话将密钥返回给客 户。
  4. 已解密数据密钥存储在内存中,用于加密和解密传入和传出附加的 EBS 卷的 所有数据。Amazon EBS 保留加密数据密钥以供以后使用,以防内存中的数据 密钥不再可用。

加密EBS卷资源

创建Volumes

EBS加密成功从volume 页面可以看到对应的加密字段,如下所示

 

加密EC2 启动卷

刚才我通过KMS 主密钥将其EBS卷进行了加密,接下来我们来看下如何通过KMS将其EC2启动卷进行加密。在对EC2启动卷加密前需要将其停机。

可以看到EC2的启动卷也成功加密了。

 

S3数据加密

创建存储桶,并上传测试文件,并通过KMS主密钥进行加密:

 

验证加密

访问对象URL

 

禁用KMS 主密钥

 

CloudWatch 监控验证

总结

通过本篇你将掌握KMS对密钥的管理方式,也可以获取如何通过KMS去EC2启动卷、EBS卷、S3存储的加密管理的实践方法,同时也明白在对数据加密的过程中将CloudTrail 和CloudWatch相结合做到在整个实现的过程中起到审计与监控的作用。

 

本篇作者

罗俊

亚马逊 AWS 专业服务团队云架构咨询顾问。负责企业客户的云架构设计、迁移、安全和优化,云上自动化运维,容器等相关咨询服务。对云原生技术、区块链等有深入的研究和热情。