AWS Key Management Service (AWS KMS) 是一个密钥管理服务,可以用来创建和管理您的主密钥,AWS KMS使用对称加密算法,即使用相同的算法和密钥来加密和解密数字数据。AWS KMS已经和大多数的AWS服务集成,这就意味着您可以使用自己的密钥来加密这些服务中的数据,同时,您可以使用AWS CloudTrail服务来满足您的审核、监督和合规性要求,您可以随时通过AWS CloudTrail来监控和查询您的密钥使用记录。
信封加密
AWS KMS使用信封加密的方式实现数据的保护。简单来说,信封加密就是用数据密钥对明文数据进行加密,然后再使用其他数据密钥对这个数据密钥进行加密,但是您的最后一个数据密必须以明文的形式存在,以便您对其他的数据密钥进行加密和解密操作。这个最顶层的明文密钥称为主密钥,AWS KMS可以帮我们安全地存储和管理这个主密钥,在AWS KMS服务中,这个主密钥称为"客户主密钥(CMK)"。
CMK类型
客户主密钥(CMK)是AWS KMS 中的主要资源,AWS KMS使用CMK来生成、加密和解密数据密钥。AWS 中的CMK有以下3种类型:
➀ 客户托管CMK
客户托管CMK是指您自己创建的主密钥,您对这类CMK有完全的权限,如启用、禁用、删除、轮换等。在您AWS 账户的每个区域(Region)中,您最多可以创建1000个客户托管CMK,但是您可以通过向AWS申请提高这个限制,以便创建更多的CMK。
➁ AWS 托管 CMK
AWS托管CMK是由与AWS KMS集成的服务创建,这类CMK的别名格式为 aws/service-name,如 aws/ebs,所以您无法使用 aws/格式来创建客户托管CMK。您可以查看AWS账户中的AWS托管CMK,如果您使用了AWS托管CMK,也可以在AWS CloudTrail中对使用情况进行审核。您无法管理AWS托管CMK,如进行删除、密钥轮换等操作。AWS 托管 CMK 不计入有关账户中 CMK 数的限制。
➂ AWS拥有的CMK
AWS拥有的CMK是AWS拥有和管理的在多个AWS账户中使用的CMK集合的一部分,您无法查看、管理以及使用AWS拥有的CMK,所以您也无法在AWS CloudTrail中审核使用情况。
KMS身份验证及访问控制
AWS KMS使用IAM角色或IAM用户来对请求进行验证,我们建议您通过角色来进行相关的授权,而不是直接通过IAM用户的ak,sk。您可以通过AWS KMS密钥策略或IAM策略来进行访问控制,密钥策略使用JSON来定义权限,需要注意的是,策略文档不能超过32KB。
您必须使用AWS密钥策略来控制对CMK的访问,因为IAM策略本身无法允许对CMK进行访问,所以我们建议您将AWS密钥策略和IAM策略结合使用,以便对CMK进行详细的权限控制。
密钥轮换
不管是加密还是密码,最佳实践是密钥不要大量的重复使用,同时,应该对密钥进行定期的更新(轮换)。AWS KMS支持对客户托管CMK进行自动轮换密钥和手动轮换密钥,默认情况下,AWS KMS 禁用CMK的自动轮换功能,启用后,AWS KMS会在启用日期365天之后自动轮换密钥,您无法自定义自动轮换的天数,自动轮换的过程对客户完全是透明的,客户无需更改任何配置,AWS KMS会自动完成所有的操作,同时,您可以通过订阅AWS CloudWatch Events中的事件,以便在发生自动轮换时可以直接通知到您。如果1年1次的频率无法满足当前需求,您也可以手动轮换密钥,但手动轮换的方式意味着您必须要更新您的应用程序使用新的主密钥。
对于AWS 托管 CMK,您无法管理其自动轮换,AWS KMS 会每3年进行一次密钥轮换,当然,这也意味着您无法通过手动轮换的方式来管理AWS托管CMK。对于您自己导入的CMK,您只能使用手动方式来进行密钥的轮换。
接下来,让我们一起通过演练,来看一下如果使用AWS KMS创建您的第一个客户托管CMK。
演练:创客户托管CMK
➀ 打开KMS服务控制台,并选择"客户管理的密钥"
➁ 选择"创建密钥"
➂ 填写别名和描述等信息,然后选择"下一步"
➃ 根据需要添加Tag,我们建议您添加类似的Tag,以方便对其进行管理
➄ 定义密钥的管理员,同时也可以定义管理员是否可以删除此密钥
➅ 定义权限,也就是谁可以调用此CMK进行加密和解密操作,您也可以指定其他AWS账户,指定的那个用户就会有权限允许其账号下的IAM用户和角色去使用该CMK
➆ 确认当前的策略,确认没有问题后点击"完成",即可创建一个CMK
➇ 如果想启用密钥轮换,可以在CMK详情中的"密钥轮换"中设置
通过KMS加密S3中的文件
在AWS S3中使用AWS KMS来加密数据时,AWS S3会自动完成数据密钥的申请、数据的加密等操作,整个过程对用户来说是透明的,用户无需进行任何的额外操作。详细的加密流程如下:
➀ 用户上传文件到配置KMS加密的S3存储桶
➁ S3会向AWS KMS服务发起请求,请求明文数据密钥以及使用指定的客户托管 CMK 或 AWS 托管 CMK 加密的密钥的副本
➂ AWS KMS服务收到请求后,会使用S3请求中指定的CMK来创建一个数据密钥,并使用CMK来加密这个数据密钥
➃ AWS KMS会将明文数据密钥和加密后的数据密钥一同发送给AWS S3
➄ AWS S3收到密钥后,会使用明文数据密钥来加密指定的文件,
➅ 加密完成后,会尽快从内存中删除明文密钥,只保存加密后的文件和加密的数据密钥
➆ AWS S3会将加密后的数据保存到S3,同时将将加密的数据密钥作为元数据存储
了解AWS S3使用AWS KMS加密数据的原理以后,让我们通过下面的演练来实际体验一下整个加密过程。
演练:使用KMS加密S3中的文件
在了解AWS KMS及AWS S3之间的加密流程后,接下来让我们一起来看下整个加密过程的实际操作步骤。
➀ 准备工作:您必须有一个已经创建好的CMK以及一个AWS S3存储桶
注意:AWS KMS和AWS S3存储桶必须位于同一AWS Region,否则所有加密的请求会出现400错误
➁ 如果您想对上传到指定存储桶的文件都进行加密,则可以直接在AWS S3属性中的"默认加密"中指定您的CMK。
CMK ARN可以在AWS KMS控制台中的CMK详细信息里获取到
➂ 加密配置完成后,可以在AWS S3存储桶的"默认加密"中看到所使用的加密方式
➃ 上传本地文件到AWS S3存储桶
➄ 查看S3文件属性,可以看到已经使用我们指定的CMK进行了加密
通过KMS解密S3中的加密文件
和加密一样,解密过程对用户来说也是透明的,S3会自动完成数据密钥和数据的解密工作,用户在S3中进行下载等文件操作时,S3会自动对加密的文件进行解密,所以用户下载的文件是解密后的文件。但需要注意的是:如果您用某个CMK加密了S3中的文件,您必须要保管好该CMK,请不要轻易进行禁用和删除操作,否则使用该CMK加密的所有S3文件将无法下载。
详细的解密流程如下:
➀ 用户发起加密文件的解密请求
➁ AWS S3会将用户的请求发送到AWS KMS服务,该请求中包含了加密的数据密钥以及加密所使用的的CMK等信息
➂ AWS KMS使用对应的CMK来对加密的数据密钥进行解密
➃ AWS KMS会将解密后的明文数据密钥发送到S3
➄ S3收到后,会使用明文密钥来对加密数据进行解密
➅ 用户得到解密后的数据文件
➆ 解密完成后,S3会尽快从内存中删除明文数据密钥
AWS KMS服务在中国区的情况
AWS KMS服务目前在北京区域和宁夏区域均可使用,目前已经和Amazon EBS,Amazon S3,Amazon Relational Database Service(RDS)和Amazon Aurora无缝集成,随着AWS中国区服务的增加,后续会支持更多的AWS服务。