将证书/密钥存储在私有 AMI 上是否安全?

将证书/密钥存储在私有 AMI 上是否安全?

捆绑包含私钥/证书和环境变量的私有 AMI 是否存在重大的安全隐患?

为了实现弹性,我正在创建一个 EC2 映像,该映像应该能够在无需任何干预的情况下自行启动和配置。启动后,它将尝试:

  • 连接并安装特定的 EBS 卷
  • 关联特定的弹性 IP
  • 开始向 S3 发出 EBS 卷的备份

但是,要做到这一点,需要私钥/pem 文件,并且需要在启动时提供某些环境变量。由于这是一个私有 AMI,我想知道将这些变量/文件直接存储在映像中是否“安全”,这样我就不需要指定任何用户数据信息,因此如果实例因任何原因终止,我可以远程启动一个新实例(如果需要,可以从我的 iPhone 启动)。

答案1

私有 AMI 是安全的,我不用担心有人会窃取您的 S3 数据。但是,正在运行的服务器与您制造的服务器一样安全,您应该假设它是可以被黑客入侵的。因此,您的密钥(实际上是您帐户中所有内容的密钥)不应被随意放置。

确保启动脚本从磁盘中删除密钥并且不保留它们,除非有非常充分的理由。

如果您的服务器使用其他 AWS 服务并需要密钥来访问它们,请考虑为各种服务设置多个 AWS 账户,并合并它们的账单以方便您使用。

您还可以使用外部管理服务,如 RightScale、Scalr 或 Eucalyptus。

答案2

我知道这个问题早已消失,但 AWS 的一项新功能(2012 年中)提供了比以前更好的答案。我发现它非常有用,并认为未来的搜索者也会这样做。

您不再需要在 AWS 实例上存储任何密钥,以便该实例上的代码能够进行 AWS 调用。您现在可以利用 IAM 角色(在此公布)授予 AWS 权限,而不是本地存储私钥或证书。角色在启动时应用于实例,并提供基于令牌的安全 Amazon 服务访问。这些是临时的、自动轮换的令牌,存储在环境变量中而不是磁盘上,所以我相信这是处理原始要求最安全的方法。

这不适用于您在 Linux 环境中可能需要的通用 SSH 密钥,但无论如何,这些密钥不会与您的 AWS 账户绑定,应单独管理。角色只是调解您对 Am​​azon 服务的访问。

角色的一个优点是您必须在实例启动时分配它们,但您可以随时更改它们的功能。对于给出的示例,您可以授予实例角色映射 EIP、挂载 EBS 卷和写入特定 S3 存储桶的能力,然后在需要时添加创建和轮询 SQS 队列的能力,而无需对实例进行任何更改。

答案3

直接存储在 S3 中的 AMI 将由 Amazon 加密并使用您的密钥签名(请参阅“使用实例存储作为根设备的 AMI 的创建过程执行以下操作:”http://docs.amazonwebservices.com/AWSEC2/latest/DeveloperGuide/index.html?ComponentsAMIs.html)。

但是,存储在 EBS 卷中的 AMI 基于未加密的快照:aws.amazon.com/ec2/faqs/#Do_you_offer_encryption_on_Amazon_EBS_volumes_or_snapshots

无论哪种情况,您都应该仔细查看包含 AMI 的 S3 存储桶的权限。默认情况下,只有您的账户可以访问该存储桶,但您可能还想使用 S3 ACL 添加进一步的保护。

答案4

我真的想不出更安全的方法来做到这一点,因为私有 AMI 受到与您的 EC2 帐户相同的 AWS 安全级别的保护。

另一种方法是将密钥存储在源代码存储库中,并在启动 EC2 实例时检查它们;尽管您随后通过网络发送密钥,但您可以加密流量(例如使用 svn:ssh 或 Subversion 的 https)。

相关内容