AWS KMS服务 是AWS 提供的一个托管服务,用户可以用这个服务来创建和管理CMK,加密秘钥等等任务。值得注意的是,KMS的硬件平台是对多个用户开放的,尽管逻辑上他们彼此不能访问,但是如果特别在意安全性的话,可以使用AWS HSM模块,这个就是指定的设备了,当然他的价格就贵了几十倍不止了。

下面看看如何使用KMS加密来加强我们S3 Bucket的安全性。

例子:我们打算创建2个用户James 和 Johnny,他们都属于同一个组,他们都具有S3的管理权限,以及对其他服务的ReadOnlyAccess的权限。我们为James 创建 一个KMS的 Master Key,加密一个Bucket,然后我们看看有什么效果。

首先,创建两个用户和一个组,分配对应的权限

AWS KMS 和 S3加密

AWS KMS 和 S3加密

接下来,我们去KMS服务,新建一个Key。KMS里面我们可以创建 Symmetric (一个加密的Key)或者 Asymmetric (公钥/私钥对)的Key,前者一般是用于EBS,S3加密等等,后者用于SSH远程访问等等。

在高级选项里面,他支持KMS,External和 CloudHSM。这里我们选择KMS,也就是由AWS来管理的 Key material。

AWS KMS 和 S3加密

给一个标签和名字

AWS KMS 和 S3加密

选择 Key的管理人员为James,默认AWS的管理员自然是有权限管理的,这里是给其他IAM用户授予的权限
AWS KMS 和 S3加密

选择Key的用户为James。只有对应的用户可以访问被这个Key加密过的文件

AWS KMS 和 S3加密

最后生成一个CMK

AWS KMS 和 S3加密

KMS 用户管理的Key默认是没有rotation的,但是我们可以打开,每年会自动更新一次

AWS KMS 和 S3加密

接下来,创建一个新的Bucket用于测试
AWS KMS 和 S3加密

然后新开一个浏览器,用James登陆。James是有S3的管理权限的,因此我可以上传一个txt文件。

AWS KMS 和 S3加密

默认这个txt文件是不能公网访问的,所以我把Block public access关掉

AWS KMS 和 S3加密

再Make Public

AWS KMS 和 S3加密

这样子就可以从公网访问了
AWS KMS 和 S3加密

到目前为止,都是正常的共享操作,没有涉及到任何加密。
下面,我们在管理员账号里面,修改这个Bucket的 默认加密设置,默认他的SSE是关掉的,我们打开,同时选择加密方式为 SSE-KMS, 选择我们自己创建的CMK

AWS KMS 和 S3加密

再回到James的账号试试看访问我们的confidential.txt文件,还是可以正常通过公网访问,仔细看看这个文件的加密情况,发现没有加密。这说明了在我们的Bucket上Enable SSE之前的文件,都不会自动加密!

AWS KMS 和 S3加密

作为对比,我再重新上传一个新的拷贝
AWS KMS 和 S3加密

看看这个新的文件的属性,发现他已经加密了
AWS KMS 和 S3加密

把这个新的文件也设置为Make Public,然后试着访问一下他的公网URL,失败。这是因为尽管我们设置了Public,但是我们使用了SSE-KMS加密,匿名访问用户无法解密这个文件,因此失败

AWS KMS 和 S3加密

接下里我们切换到Johnny的账号试试看。

Johnny去访问一下我们的第二个文件,即使是直接Open,也显示失败,因为他不是我们指定的Key User,因此没有权限访问被我们的CMK加密过的文件

AWS KMS 和 S3加密

最后,我们来看看删除Key有什么效果
假设James 对老板心怀不满,打算跳槽前报复一下社会,于是他把他所有的CMK都删了。 他可以选择 Schedule Key Deletion 。

AWS KMS 和 S3加密

AWS默认机制最低要求至少有7个工作日的冷静期时间来彻底删除这个CMK,这个期间,管理员可以反悔之前的删除操作,因为一旦彻底删除,那么被这个Key加密过的文件都无法访问了。

AWS KMS 和 S3加密

切换到管理员用户,访问一个这个加密过的文件,发现提示报错,这说明一旦开始删除的过程,即使是在冷静期,用户也无法访问被加密过的文件了

AWS KMS 和 S3加密

切换回KMS的界面,发现我们可以 Cancel key deletion,取消之前的操作
AWS KMS 和 S3加密

工作流程中,为了预防这种恶意事件的发生,管理员应该配置一些预警方式。我们可以通过Cloudtrail 发送Logs到Cloudwatch,然后Cloudwatch里面可以配置Event触发Lambda 或者直接通过Cloudwatch 的metric filter来发送SNS通知。或者,定期执行Config来检查Compliance,如果有异常,发送通知也是可以的。

CloudWatch Metric Filter 发送警报可以参考我的另外一个博文 https://blog.51cto.com/beanxyz/2582202