我有工作处理架构的基础上AWS,需要EC2查询S3和P.为了运行的情况下有访问API的凭证都是发给作为户数据(f)的形式base64编码壳脚本。例如:

$ cat ec2.sh
...
export AWS_ACCOUNT_NUMBER='1111-1111-1111'
export AWS_ACCESS_KEY_ID='0x0x0x0x0x0x0x0x0x0'
...
$ zip -P 'secret-password' ec2.sh
$ openssl enc -base64 -in ec2.zip

许多实例中都发起了...

$ ec2run ami-a83fabc0 -n 20 -f ec2.zip

每个实例的解码和解密ec2.zip 使用'秘密',这是硬编码进入一个初始脚本。虽然它的工作,我有两个问题与我的办法。

  1. 'zip-P'不是很安全的
  2. 密码是硬编码的实例(总是'秘密')

该方法非常类似的描述 在这里,

是否有更典雅的或接受的方法?使用全球公益物进行加密的凭证和保存的私人钥匙的实例,以解密这个方法我在考虑,但现在我不知道有任何警告。我可以堆密钥对直接?我错过了一些超级明显的一部分API?

有帮助吗?

解决方案

你可以储存的凭证的机(或转让、使用,然后将它们删除。)

你可以转让的证书通过安全通道(例如使用 scp 与非交互式身份验证,例如钥对中的),这样你就不需要执行的任何定义的加密(只有确保的权限是正确的设定 0400 在该关键文件,例如设定的权限,在主文件和使用 scp -p)

如果上述不会回答你的问题,请提供更多的具体细节。什么你的设置是什么,你是在努力实现的目标。是EC2行动发起的多个节点上,从一个中心位置?是SSH之间可利用多个节点和中心位置?等等。


编辑

你有没有考虑 参数化AMI, 要求那些实例AMI来第一次填充的用户数据(ec2-run-instances -f user-data-file)与其AWS钥匙?AMI然后可以动态检索这些每个实例的参数 http://169.254.169.254/1.0/user-data.


更新

好吧,在这里不安全志同道合的比较各种方法的讨论迄今为止:

  1. 安全的数据时 存储在AMI user-data 未加密的
    • 明确的文本数据的访问 任何 用户所管理的登录到AMI和访问 telnet, curl, wget, 等等。(可以访问的明文 http://169.254.169.254/1.0/user-data)
    • 你很容易受到代理请求的攻击(例如攻击者问Apache,可以或不可以运行AMI上得到和前进的明文 http://169.254.169.254/1.0/user-data)
  2. 安全的数据时 存储在AMI user-data 和密(或decryptable)与容易获得的关键
    • 容易获得的关键(密码)可以包括:
      • 关键硬编码在脚本里ABI(其中ABI可以通过攻击者)
      • 关键硬编码在一个脚本上AMI本身,那里的剧本是可读的 任何 用户所管理的登录到AMI
      • 任何其他容易获得的信息,例如公共钥匙,等等。
      • 任何私人钥匙(其公钥可以容易地获得)
    • 给一个容易获得的关键(密码),同样的问题确定在第1点适用,即:
      • 解密数据的访问 任何 用户所管理的登录到AMI和访问 telnet, curl, wget, 等等。(可以访问的明文 http://169.254.169.254/1.0/user-data)
      • 你很容易受到代理请求的攻击(例如攻击者问Apache,可以或不可以运行AMI上得到和转发的加密 http://169.254.169.254/1.0/user-data,ulteriorly descrypted与容易获得的关键)
  3. 安全的数据时 存储在AMI user-data 并密不容易获得的关键
    • 平均
    • 加密的数据访问 任何 用户所管理的登录到AMI和访问 telnet, curl, wget, 等等。(可以访问加密的 http://169.254.169.254/1.0/user-data)
      • 一个试图解密的加密数据,然后可使用暴力攻击
  4. 安全的数据时 存储在AMI在一个安全的位置 (没有附加价值为这是加密的)
    • 数据是唯一能够给一个用户,用户需要的数据,以便于操作
      • 例如文件所拥有的用户:用户与掩0600或0400
    • 攻击者必须能够模拟特定的用户在以获得的数据
      • 额外的安全层,例如可否认用户直接登记(具有通过 root 交互式模拟)提高了安全性

所以任何方法涉及AMI user-data 是不是最安全的,因为获得 任何 用户在机器(最弱点)妥协的数据。

这可能是减轻如果S3全权证书只需要有限的一段时间(即在部署过程中), 如果 AWS让你重写或删除的内容 user-data 当完成它的(但这似乎不是这种情况。) 一个替代办法将是建立的临时S3凭证期间部署的过程中,如果可能的(损害这些凭证,从 user-data, 之后,部署进程完成和凭证已经失效,书不再构成安全威胁。)

如果上述不适用(例如S3凭据需要通过部署无限期地节点)或不可能的(例如不能发出的临时S3凭证为部署仅),那么最好的方法仍然是硬着头皮 scp 凭证到各种节点,可能是并行的,用正确的所有权和权限。

其他提示

我写了一篇文章审查各种方法传递秘密EC2实例安全的利弊&缺点的每一个。

http://www.shlomoswidler.com/2009/08/how-to-keep-your-aws-credentials-on-ec2.html

最好的方法是使用 实例概况.其基本思想是:

  • 创建一个实例简介
  • 创建一个新的IAM作用
  • 分配的政策以前创建的作用,例如:

    { "声明":[ { "Sid":"Stmt1369049349504", "行动":"simple:", "效应":"允许", "资源":"" } ] }

  • 关联方面的作用和实例档案在一起。

  • 当你开始一个新的EC2实例,确保提供实例档案名称。

如果所有运作良好,以及图书馆使用连接到AWS服务从内EC2实例支持检索凭证从实例的元数据,你的代码将能够堆服务。

一个完整的例子取自宝途用户的邮件列表:

首先,你必须创建一个JSON政策文件,表示什么样的服务和资源的IAM的作用应该有访问。例如,这种政策补助金的所有S3行动桶"my_bucket".你可以使用任何政策是适当的。

BUCKET_POLICY = """{
  "Statement":[{
    "Effect":"Allow",
    "Action":["s3:*"],
    "Resource":["arn:aws:s3:::my_bucket"]}]}"""

接下来,你需要创建一个实例简介IAM.

import boto
c = boto.connect_iam()
instance_profile = c.create_instance_profile('myinstanceprofile')

一旦你的实例档案,需要创建的作用,增加的作用,以实例简介和准的政策与作用。

role = c.create_role('myrole')
c.add_role_to_instance_profile('myinstanceprofile', 'myrole')
c.put_role_policy('myrole', 'mypolicy', BUCKET_POLICY)

现在,你可以使用的实例简介的时候你启动一个实例:

ec2 = boto.connect_ec2()
ec2.run_instances('ami-xxxxxxx', ..., instance_profile_name='myinstanceprofile')

我想指出,它不是需要提供任何凭证以EC2实例了。使用IAM,您可以创建一个作为你的EC2实例。在这些角色,可以设置严格的政策,允许EC2实例,例如获得特定目的是从具体S3斗并没有更多。你可以读取更多关于IAM角色中的资源文档:

http://docs.aws.amazon.com/IAM/latest/UserGuide/WorkingWithRoles.html

像其他人已经指出了这里,你真的不需要储存AWS证书EC2实例,通过使用IAM角色 https://aws.amazon.com/blogs/security/a-safer-way-to-distribute-aws-credentials-to-ec2/.我将增加可以采用同样的方法也用于安全地储存 不有关信息请参阅的凭据 你EC2实例,如说,如果你有一些数据库凭证你想保持安全。你拯救无有关信息请参阅的凭据上S3Bukcet,并使用IAM作用的访问,水桶。你可以找到更详细的信息,在这里- https://aws.amazon.com/blogs/security/using-iam-roles-to-distribute-non-aws-credentials-to-your-ec2-instances/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top