我有一个应用程序,它将用于处理一些高度敏感的文档。
目的是通过我的应用程序将这些文档上传到S3。我的应用程序也只能根据需要检索这些文档。
正如我所读到的,S3提供了服务器端加密(SSE),其中数据在上传/下载时分别进行透明加密和解密。
在这种情况下,这似乎是我对S3存储桶的任何错误配置,或者如果我的AWS凭据被泄露,攻击者将可以访问我在S3中的所有敏感数据。我知道我应该确保不要误解S3并保护我的凭据,但我也知道事情会发生。
基本上,据我所知,服务器端加密实际上是一种"加密";勾选框";type选项,它允许您说您已经停止加密,但不能保护您免受最常见的S3数据泄露(存储桶错误配置和信誉受损)。
说到这里,客户端加密似乎是我的最佳选择。也就是说,在整个数据生命周期中,我还没有读到很多在客户端管理用于加密数据的密钥的好方法。
我的问题是
- 我是否正确理解服务器端加密
- 客户端会是我最安全的选择吗
- 在使用客户端加密时,您建议使用哪些策略/工具来管理密钥
TLDR:
CSE实际上是在S3中存储数据的最安全的方式,前提是您可以确保密钥的安全
使用CSE,亚马逊自己保证永远不会访问私钥,而不是SSE&无法在任何时候查看/共享您的数据,例如通过传票强制查看/共享。
出于教育目的,理论上最安全的方法是CSE+SSE-KMS的两个组合加密层。这应该只在极端情况下使用,但它最终是在S3中存储数据的最安全的方式。
CSE+SSE-S3也不会造成任何伤害,因为SSE-S3是免费的
更深入的解释:
我是否正确理解服务器端加密?
是的,服务器端加密(SSE)允许您在休息时进行加密。
然而,使用SSE并不一定意味着你不能免受bucket错误配置或信誉受损的影响。
SSE有三种类型。
它们都具有加密&数据解密由AWS管理:
- SSE-S3:使用S3托管密钥的服务器端加密
- SSE-KMS:使用存储在AWS KMS中的KMS密钥进行服务器端加密
- SSE-C:S3服务器端加密,使用客户提供的加密密钥
SSE-S3
✅防止物理访问
❌防止存储桶配置错误
❌防止凭据泄露
❌AWS在任何情况下都无法查看您的数据
SSE-S3至少可以确保,如果有人从AWS数据中心撕下一个存有您数据的硬盘,您的数据将被加密。
任何对您的对象具有s3:GetObject
访问权限的IAM主体都可以读取未加密的对象,因此,如果有权访问该对象的AWS凭据被泄露,任何恶意行为者都可以访问您文件的解密版本。
使用SSE-S3意味着——是的,如果你的bucket配置错误或凭据泄露,恶意行为者可以访问你的未加密数据。
但它不是来保护你的
在实践中,更多的是允许AWS遵守安全合规认证&防止滥用亚马逊的内部网络和/或对物理S3基础设施的人为安全(尽管这种情况极为罕见)。
使用SSE-S3&任何加密都比没有好。
SSE-KMS
✅防止物理访问
✅防止存储桶配置错误
❌防止凭据泄露
❌AWS在任何情况下都无法查看您的数据
有了SSE-KMS,你就有了一层额外的保护——KMS密钥——以防你某天早上醒来&随机决定向世界敞开你的水桶。
它要求任何想要读取或写入对象的恶意参与者都能够访问对象和密钥您必须错误配置您的S3权限&您的KMS密钥权限意外授予访问权限,而不仅仅是SSE-S3中的S3权限。
这个选项虽然不是免费的,但可以防止bucket配置错误,但不会损害信誉。
你的存储桶可以打开,但任何无法访问KMS密钥的人都会被加密。
仅供参考:AWS KMS的设计使任何人,包括AWS员工,都无法从服务中检索到您的明文密钥。
SSE-C
✅防止物理访问
✅防止存储桶配置错误
✅防止凭据泄露
❓AWS在任何情况下都无法查看您的数据1
SSE-C防止bucket错误配置&AWS信誉受损。
你管理自己的密钥&S3管理加密和解密过程。您确实需要在请求中提供加密密钥,但不需要编写任何代码来执行对象加密或解密。
在这种情况下,除了你之外,没有人拥有解锁文件的密钥。
你的水桶可以向任何人开放&你的凭据可能会被泄露,任何人都可以获得一个对象。但是,如果你是唯一一个拥有解锁文件所需密钥的人,那么任何人都可能得到加密后的胡言乱语。
虽然这个SSE选项使您免受bucket错误配置的影响&信用受损,您现在还要负责保护您的信用、存储桶和您的密钥(可以说是一个更大的攻击向量)。
1从技术上讲,亚马逊在您将密钥发送给他们时曾访问过您的密钥,但根据文档,亚马逊S3不会存储您提供的加密密钥。显然,S3源代码不是开源的,我们不能100%保证这一点。如果AWS撒谎,我会感到非常惊讶,因为这会影响他们的声誉,但为了正确起见,我会把这记为不确定。
客户端会是我最安全的选择吗?
CSE
✅防止物理访问
✅防止存储桶配置错误
✅防止凭据泄露
✅AWS在任何情况下都无法查看您的数据
客户端加密(CSE)将更加"可靠";"安全";而不是用于S3存储的SSE,因为您可以管理所有内容。你管理加密过程、加密密钥和相关工具,而不是AWS。
在对象上传到S3&从S3下载后,您将对它们进行解密。S3不知道你是如何做到这一点的,只是存储你的文件。
使用CSE时,您是最弱(或最强)的一环,但就数据安全性而言,CSE比SSE更安全。
在使用客户端加密时,您建议使用哪些策略/工具来管理密钥?
这是一个非常广泛的问题,但对于S3 CSE,您有两个选项:
- 使用存储在AWS密钥管理服务(AWS KMS)中的密钥
- 使用在应用程序中存储(和检索)的密钥
选择哪个选项取决于您对AWS的信任程度。
使用哪种方法的答案取决于您的文件的灵敏度&您对AWS的信任程度和/或您保护密钥安全的能力