在 S3 中存储高度敏感/私有文件的最安全选项是什么?
What is the most secure option for storing highly sensitive / private files in S3?
我有一个应用程序将用于处理一些高度敏感的文档。
目的是通过我的应用程序将这些文档上传到 S3。这些文档也只会根据需要由我的应用程序检索。
正如我一直在阅读的那样,S3 提供服务器端加密 (SSE),其中数据分别在 upload/download 上透明地加密和解密。
既然如此,这似乎是我对 S3 存储桶的任何错误配置,或者如果我的 AWS 凭据被泄露,攻击者将可以访问我在 S3 中的所有敏感数据。我知道我应该确保不要错误配置 S3 并保护我的凭据,但我也知道事情会发生。
基本上,据我所知,服务器端加密实际上是一个“选中复选框”类型的选项,它允许您说您有静态加密,但不能保护您免受最常见的 S3 数据的影响泄漏(存储桶配置错误和信誉受损)。
言归正传,客户端加密似乎是我的最佳选择。也就是说,我还没有读到很多关于在整个数据生命周期中管理用于在客户端加密我的数据的密钥的好选择。
我的问题是
- 我对服务器端加密的理解正确吗?
- 客户端会是我最安全的选择吗?
- 在使用客户端加密时,您对管理密钥有何建议?strategies/tools
TLDR:
CSE 实际上是在 S3 中存储数据最安全的方式,当然您可以确保您的密钥安全。
使用 CSE,与 SSE 不同,Amazon 自己可以保证永远无法访问私钥,并且无法在任何时候 view/share 您的数据,例如当被迫通过传票时。
出于教育目的,理论上最安全的方法是 CSE + SSE-KMS 的 2 层组合加密。这应该只在极端情况下使用,但它最终是在 S3 中存储数据的最安全方式。
CSE + SSE-S3 也不会造成任何伤害,因为 SSE-S3 是免费的。
更深入的解释:
Do I understand server-side encryption correctly?
是的,服务器端加密 (SSE) 允许您进行静态加密。
但是,使用 SSE 并不一定意味着您无法避免存储桶配置错误或信用受损。
SSE 有 3 种类型。
它们都有一个共同点,即数据的加密和解密由 AWS 管理:
- SSE-S3: 使用 S3 托管密钥的服务器端加密
- SSE-KMS: 使用存储在 AWS KMS 中的 KMS 密钥进行服务器端加密
- SSE-C: 使用客户提供的加密密钥的 S3 服务器端加密
SSE-S3
✅ 防止物理访问
❌ 防止存储桶配置错误
❌ 防止凭据泄露
❌ AWS 在任何情况下都无法查看您的数据
SSE-S3 至少可以确保,如果有人从 AWS 数据中心窃取了存储您数据的硬盘,您的数据将被加密。
任何对您的对象具有 s3:GetObject
访问权限的 IAM 委托人都能够读取未加密的对象,因此,如果可以访问该对象的 AWS 凭据泄露,任何恶意行为者都能够访问文件的解密版本。
使用 SSE-S3 意味着 - 是的,如果您的存储桶配置错误或凭据泄露,恶意行为者可以访问您未加密的数据。
但不是为了保护你
在实践中更多的是允许 AWS 遵守 security compliance certifications 并防止滥用 Amazon 的内部网络 and/or 对物理 S3 基础设施的人为安全(这种情况可能极为罕见)。
使用 SSE-S3 花费 0.00 英镑,任何加密都优于 none。
SSE-KMS
✅ 防止物理访问
✅ 防止存储桶配置错误
❌ 防止凭据泄露
❌ AWS 在任何情况下都无法查看您的数据
使用 SSE-KMS,您有一个额外的保护层 - KMS 密钥 - 以防您有一天早上醒来并随机决定向世界开放您的存储桶。
它要求任何想要读取或写入对象的恶意行为者都可以访问对象和密钥。 您必须错误配置 S3 权限和 KMS 密钥权限才能意外授予访问权限,而不仅仅是像 SSE-S3 那样的 S3 权限。
此选项虽然不是免费的,但可以防止存储桶配置错误,但不会损害信用。
您的存储桶可以打开,但所有无法访问 KMS 密钥的人都将被加密为乱码。
仅供参考:AWS KMS 旨在 no one, including AWS employees, can retrieve your plaintext keys from the service.
SSE-C
✅ 防止物理访问
✅ 防止存储桶配置错误
✅ 防止凭据泄露
❓ AWS 在任何情况下都无法查看您的数据1
SSE-C 防止存储桶配置错误和 AWS 信用受损。
您管理自己的密钥,S3 管理加密和解密过程。您确实需要在请求中提供加密密钥,但您无需编写任何代码来执行对象加密或解密。
在这种情况下,除了您之外,没有人拥有解锁文件的密钥。
您的存储桶可能对任何人开放,您的凭据可能会泄露给任何人以获取对象。但是,如果您是唯一拥有解锁文件所需密钥的人,那么任何人都可能得到加密的乱码。
虽然此 SSE 选项可让您免受存储桶配置错误和信用受损的影响,但您现在还负责保护您的信用、存储桶 和 您的密钥(可以说是更大的攻击向量)。
1 从技术上讲,当您将密钥发送给亚马逊时,亚马逊已经在某个时候访问了您的密钥,但根据文档,Amazon S3 does not store the encryption key you provide。显然,S3 源代码不是开源的,我们不能 100% 保证这一点。如果 AWS 在撒谎,我会感到非常惊讶,因为这会影响他们的声誉,但为了正确起见,我将其标记为不确定。
Would client-side be my most secure option?
✅ 防止物理访问
✅ 防止存储桶配置错误
✅ 防止凭据泄露
✅ AWS 在任何情况下都无法查看您的数据
对于 S3 存储,客户端加密 (CSE) 比 SSE 更“安全”,因为您可以管理一切。您管理加密过程、加密密钥和相关工具,而不是由 AWS 来管理。
您在将对象上传到 S3 之前对其进行加密,并且在从 S3 下载它们之后对其进行解密。 S3 不知道您是如何做到这一点的,它只存储您的文件。
你是最弱(或最强)的link使用CSE但在数据安全方面,CSE比SSE更安全。
What strategies/tools do you recommend for managing keys when using client-side encryption?
这是一个非常广泛的问题,但关于 S3 CSE,您有 2 options:
- 使用存储在 AWS Key Management Service (AWS KMS) 中的密钥
- 使用您在应用程序中存储(和检索)的密钥
选择哪个选项取决于您对 AWS 的信任程度。
关于使用哪种方法的答案取决于文件的敏感性以及您对 AWS 的信任程度and/or您保持密钥安全的能力。
我有一个应用程序将用于处理一些高度敏感的文档。
目的是通过我的应用程序将这些文档上传到 S3。这些文档也只会根据需要由我的应用程序检索。
正如我一直在阅读的那样,S3 提供服务器端加密 (SSE),其中数据分别在 upload/download 上透明地加密和解密。
既然如此,这似乎是我对 S3 存储桶的任何错误配置,或者如果我的 AWS 凭据被泄露,攻击者将可以访问我在 S3 中的所有敏感数据。我知道我应该确保不要错误配置 S3 并保护我的凭据,但我也知道事情会发生。
基本上,据我所知,服务器端加密实际上是一个“选中复选框”类型的选项,它允许您说您有静态加密,但不能保护您免受最常见的 S3 数据的影响泄漏(存储桶配置错误和信誉受损)。
言归正传,客户端加密似乎是我的最佳选择。也就是说,我还没有读到很多关于在整个数据生命周期中管理用于在客户端加密我的数据的密钥的好选择。
我的问题是
- 我对服务器端加密的理解正确吗?
- 客户端会是我最安全的选择吗?
- 在使用客户端加密时,您对管理密钥有何建议?strategies/tools
TLDR:
CSE 实际上是在 S3 中存储数据最安全的方式,当然您可以确保您的密钥安全。
使用 CSE,与 SSE 不同,Amazon 自己可以保证永远无法访问私钥,并且无法在任何时候 view/share 您的数据,例如当被迫通过传票时。
出于教育目的,理论上最安全的方法是 CSE + SSE-KMS 的 2 层组合加密。这应该只在极端情况下使用,但它最终是在 S3 中存储数据的最安全方式。
CSE + SSE-S3 也不会造成任何伤害,因为 SSE-S3 是免费的。
更深入的解释:
Do I understand server-side encryption correctly?
是的,服务器端加密 (SSE) 允许您进行静态加密。
但是,使用 SSE 并不一定意味着您无法避免存储桶配置错误或信用受损。
SSE 有 3 种类型。
它们都有一个共同点,即数据的加密和解密由 AWS 管理:
- SSE-S3: 使用 S3 托管密钥的服务器端加密
- SSE-KMS: 使用存储在 AWS KMS 中的 KMS 密钥进行服务器端加密
- SSE-C: 使用客户提供的加密密钥的 S3 服务器端加密
SSE-S3
✅ 防止物理访问
❌ 防止存储桶配置错误
❌ 防止凭据泄露
❌ AWS 在任何情况下都无法查看您的数据
SSE-S3 至少可以确保,如果有人从 AWS 数据中心窃取了存储您数据的硬盘,您的数据将被加密。
任何对您的对象具有 s3:GetObject
访问权限的 IAM 委托人都能够读取未加密的对象,因此,如果可以访问该对象的 AWS 凭据泄露,任何恶意行为者都能够访问文件的解密版本。
使用 SSE-S3 意味着 - 是的,如果您的存储桶配置错误或凭据泄露,恶意行为者可以访问您未加密的数据。
但不是为了保护你
在实践中更多的是允许 AWS 遵守 security compliance certifications 并防止滥用 Amazon 的内部网络 and/or 对物理 S3 基础设施的人为安全(这种情况可能极为罕见)。
使用 SSE-S3 花费 0.00 英镑,任何加密都优于 none。
SSE-KMS
✅ 防止物理访问
✅ 防止存储桶配置错误
❌ 防止凭据泄露
❌ AWS 在任何情况下都无法查看您的数据
使用 SSE-KMS,您有一个额外的保护层 - KMS 密钥 - 以防您有一天早上醒来并随机决定向世界开放您的存储桶。
它要求任何想要读取或写入对象的恶意行为者都可以访问对象和密钥。 您必须错误配置 S3 权限和 KMS 密钥权限才能意外授予访问权限,而不仅仅是像 SSE-S3 那样的 S3 权限。
此选项虽然不是免费的,但可以防止存储桶配置错误,但不会损害信用。
您的存储桶可以打开,但所有无法访问 KMS 密钥的人都将被加密为乱码。
仅供参考:AWS KMS 旨在 no one, including AWS employees, can retrieve your plaintext keys from the service.
SSE-C
✅ 防止物理访问
✅ 防止存储桶配置错误
✅ 防止凭据泄露
❓ AWS 在任何情况下都无法查看您的数据1
SSE-C 防止存储桶配置错误和 AWS 信用受损。
您管理自己的密钥,S3 管理加密和解密过程。您确实需要在请求中提供加密密钥,但您无需编写任何代码来执行对象加密或解密。
在这种情况下,除了您之外,没有人拥有解锁文件的密钥。
您的存储桶可能对任何人开放,您的凭据可能会泄露给任何人以获取对象。但是,如果您是唯一拥有解锁文件所需密钥的人,那么任何人都可能得到加密的乱码。
虽然此 SSE 选项可让您免受存储桶配置错误和信用受损的影响,但您现在还负责保护您的信用、存储桶 和 您的密钥(可以说是更大的攻击向量)。
1 从技术上讲,当您将密钥发送给亚马逊时,亚马逊已经在某个时候访问了您的密钥,但根据文档,Amazon S3 does not store the encryption key you provide。显然,S3 源代码不是开源的,我们不能 100% 保证这一点。如果 AWS 在撒谎,我会感到非常惊讶,因为这会影响他们的声誉,但为了正确起见,我将其标记为不确定。
Would client-side be my most secure option?
✅ 防止物理访问
✅ 防止存储桶配置错误
✅ 防止凭据泄露
✅ AWS 在任何情况下都无法查看您的数据
对于 S3 存储,客户端加密 (CSE) 比 SSE 更“安全”,因为您可以管理一切。您管理加密过程、加密密钥和相关工具,而不是由 AWS 来管理。
您在将对象上传到 S3 之前对其进行加密,并且在从 S3 下载它们之后对其进行解密。 S3 不知道您是如何做到这一点的,它只存储您的文件。
你是最弱(或最强)的link使用CSE但在数据安全方面,CSE比SSE更安全。
What strategies/tools do you recommend for managing keys when using client-side encryption?
这是一个非常广泛的问题,但关于 S3 CSE,您有 2 options:
- 使用存储在 AWS Key Management Service (AWS KMS) 中的密钥
- 使用您在应用程序中存储(和检索)的密钥
选择哪个选项取决于您对 AWS 的信任程度。
关于使用哪种方法的答案取决于文件的敏感性以及您对 AWS 的信任程度and/or您保持密钥安全的能力。