我想知道应该使用哪些实践来在 EC2 上创建安全且有弹性的 Rails 和 mysql 服务器。更具体地说,当我说“安全且有弹性”时,我试图平衡这样一个事实:我需要使用 dm-crypt 在块级安全 EBS 存储上保护数据(MySQL 数据和 Rails 日志)。为了确保安全,我不愿意以明文形式存储密码。当然,问题是如果服务器重新启动,加密文件系统无法自动挂载,这意味着我也无法自动启动 mysqld / nginx / Passenger / 等。
另一方面,我正在寻找一种有弹性的解决方案,即可以通过手动干预和自动化相结合的方式快速恢复故障(例如暂时丢失存储或 EC2 实例发生故障)。
我唯一的选择是创建一个手动调用的 shell 脚本来挂载加密的 EBS 卷,然后启动相应的服务器进程吗?还是有一些更复杂的密钥管理工具可以以安全的方式自动执行此过程?
针对这种情况,人们在生产服务器环境中做了什么?
答案1
如果您这样做只是为了保护静态数据的合规性要求,那么将加密密钥存储在 AMI 中没有问题——它们与加密卷是分开的(实际上,与大多数系统相比,密钥位于与加密分区相同的磁盘的单独分区上)。它不能防止有人进入 AMI(正在运行或正在运行),但如果它正在运行,那么他们已经获得了磁盘数据,如果它没有运行,那么 AWS 就会有疑问要回答,至少数据和密钥不会闲置正确的彼此相邻。
如果你有一个真正的硬件平台,你可以使用安全密钥存储硬件模块来存储加密密钥,但在这种情况下,你大概仅限于手动方法。我可以设想某种鲁布·戈德堡设计,涉及启动实例,连接到确实持有密钥的远程系统,实际上说“我已准备好启动,请安装我的卷”,但该解决方案的脆弱性和普遍丑陋让我毛骨悚然。