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

绑定包含私钥/证书和环境variables的私有AMI是否有重大的安全隐患?

为了弹性,我创build了一个EC2映像,它应该能够在没有任何干预的情况下引导和configuration自身。 开机后,它将尝试:

  • 连接并挂载特定的EBS卷
  • 关联特定的弹性IP
  • 开始向EBS卷发行备份

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

一个私人的AMI是安全的,我不会担心有人盗用你的S3数据。 但是,正在运行的服务器与您所做的一样安全,您应该认为它是可以破解的。 因此,您的钥匙确实是您账户中所有钥匙的钥匙,不应该放在身边。

确保启动脚本删除磁盘上的密钥,不要保留它们,除非有很好的理由。

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

您还可以使用RightScale,Scalr或Eucalyptus等外部pipe理服务。

我知道这个问题已经死了很久,但是AWS的一个新特性已经出现了(2012年年中),它提供了比以前更好的答案。 我发现它非常有帮助,并认为未来的search者也可能。

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

这不适用于您在Linux环境下可能需要的一般SSH密钥,但这些密钥不会绑定到您的AWS账户,应该单独pipe理。 angular色只是调解您对亚马逊服务的访问。

关于angular色的一个好处就是你必须在实例启动时分配它们,但是你可以随时改变它们的能力。 对于给定的示例,您可以授予实例angular色映射EIP,装入EBS卷并写入特定S3存储桶的能力,然后在需要时添加创build和轮询SQS队列的function,而无需更改任何内容实例。

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

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

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

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

另一种方法是将密钥存储在源代码库中,并在启动EC2实例时将其检出; 虽然你通过线路发送密钥,但是可以encryptionstream量(例如,使用svn:ssh或https进行Subversion)。