什么是最好的方法传递AWS的全权证书用户的数据EC2实例?
-
22-07-2019 - |
题
我有工作处理架构的基础上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 使用'秘密',这是硬编码进入一个初始脚本。虽然它的工作,我有两个问题与我的办法。
- 'zip-P'不是很安全的
- 密码是硬编码的实例(总是'秘密')
该方法非常类似的描述 在这里,
是否有更典雅的或接受的方法?使用全球公益物进行加密的凭证和保存的私人钥匙的实例,以解密这个方法我在考虑,但现在我不知道有任何警告。我可以堆密钥对直接?我错过了一些超级明显的一部分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
.
更新
好吧,在这里不安全志同道合的比较各种方法的讨论迄今为止:
- 安全的数据时 存储在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
)
- 安全的数据时 存储在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与容易获得的关键)
- 解密数据的访问 任何 用户所管理的登录到AMI和访问
- 安全的数据时 存储在AMI
user-data
并密不容易获得的关键- 平均
- 加密的数据访问 任何 用户所管理的登录到AMI和访问
telnet
,curl
,wget
, 等等。(可以访问加密的http://169.254.169.254/1.0/user-data
)- 一个试图解密的加密数据,然后可使用暴力攻击
- 安全的数据时 存储在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/