背景:设置一个包含一些自动扩展组和一些非扩展独立虚拟机的基础设施。一些角色需要机密(私钥),这些机密应仅限于 root 用户或特定用户。管理通过 Puppet(“无服务器” - 配置在 git 存储库中)完成,也可以使用 Ansible。
- 将机密信息放在 Puppet 或 git 中是不可接受的,因为它们很容易被访问
- 将机密信息放入 EC2 用户数据中会限制对特定 VM 的访问,并在自动扩展组中正确复制,但 VM 中的任何 Unix 用户都可以访问它。
- 将机密信息放在安全的 S3 存储桶中需要做大量工作,限制对特定虚拟机的访问,在自动缩放组中正确复制,加密静态数据,但虚拟机中的任何 unix 用户都可以访问它 - 请参阅http://blogs.aws.amazon.com/security/post/Tx2B3QUWAA7KOU/如何管理Amazon EC2 容器服务中的机密信息
- AWS KMS 改进了安全的 S3 存储桶,但我找不到任何限制访问其服务的迹象在虚拟机中。
我并不幻想 Linux 的用户权限是万无一失的。但是将机密访问权限限制为 Linux 根用户...很有用!:-)
答案1
我们找到了一个可行的解决方案:
- 使用 Vault 或类似工具来管理实际的秘密,按角色分组,并使用短密钥解锁每组秘密。
- 使用可编写脚本(例如:Cloudformation、Terraform、aws cli)自动创建实例,作为创建脚本的一部分……
- 使用 Vault 密钥创建并填充短期 S3 存储桶
- 通过 EC2 用户数据提供引导脚本,从 S3 存储桶中获取 Vault 密钥
假设:
- S3 bucket url 随机性阻止其(快速)发现
- 您的基本 AMI 在引导完成之前是安全的;这意味着它不是预先扎根的;-) 并且不会出现不安全/配置错误的服务,这些服务可能会使其在 S3 存储桶生命周期的短暂时间窗口内受到成功攻击。
感谢@ceejayoz 提供的有用提示。