有一个很好的问题[如何] SSH到弹性[一]魔豆实例 ,但有一点我注意到的是,通过这种方法,它是唯一可能增加一个SSH密钥。
我怎样才能多SSH密钥添加到一个实例? 有没有一种方法可以自动多个密钥添加到新的实例?
有一个很好的问题[如何] SSH到弹性[一]魔豆实例 ,但有一点我注意到的是,通过这种方法,它是唯一可能增加一个SSH密钥。
我怎样才能多SSH密钥添加到一个实例? 有没有一种方法可以自动多个密钥添加到新的实例?
不,弹性魔豆仅支持单个密钥对。 您可以SSH密钥手动添加到authorized_keys
文件,但这些不会是已知的弹性魔豆的工具。
要创建一个名为.ebextensions/authorized_keys.config
是另一种方式来做到这一点。
files:
/home/ec2-user/.ssh/authorized_keys:
mode: "000400"
owner: ec2-user
group: ec2-user
content: |
ssh-rsa AAAB3N...QcGskx keyname
ssh-rsa BBRdt5...LguTtp another-key
文件的名称authorized_keys.config
是任意的。
结合rhunwicks的和rch850的答案,这里是一个干净的方式来增加额外的SSH密钥,同时保留通过AWS控制台的一组:
files:
/home/ec2-user/.ssh/extra_authorized_keys:
mode: "000400"
owner: ec2-user
group: ec2-user
content: |
ssh-rsa AAAB3N...QcGskx keyname
ssh-rsa BBRdt5...LguTtp another-key
commands:
01_append_keys:
cwd: /home/ec2-user/.ssh/
command: sort -u extra_authorized_keys authorized_keys -o authorized_keys
99_rm_extra_keys:
cwd: /home/ec2-user/.ssh/
command: rm extra_authorized_keys
需要注意的是eb ssh
只有私钥文件具有相同的名称作为AWS控制台中定义的私有密钥将工作。
从弗拉纳根的回答以下,你可以通过创建被添加到每个实例的按键.ebextensions/app.config
与内容应用程序源目录:
commands:
copy_ssh_key_userA:
command: echo "ssh-rsa AAAB3N...QcGskx userA" >> /home/ec2-user/.ssh/authorized_keys
copy_ssh_key_userB:
command: echo "ssh-rsa BBRdt5...LguTtp userB" >> /home/ec2-user/.ssh/authorized_keys
你能做到这一点的方法之一是创建附加您要使用EC2〜用户/的.ssh / authorized_keys中的附加密钥对的公钥用户数据的脚本,并与用户数据启动实例,例如:
#!
echo ssh-rsa AAAB3N...QcGskx keyname >> ~ec2-user/.ssh/authorized_keys
echo ssh-rsa BBRdt5...LguTtp another-key >> ~ec2-user/.ssh/authorized_keys
创建IAM组。 说它像beanstalk-access
。 加入谁需要在IAM该组的SSH访问权限的用户。 另外补充他们的公共SSH密钥(县)的IAM Security credentials
。
部署脚本下面将从AWS CLI使用一个方便的Linux工具被称为解析JSON数据jq
( JQ官方教程 ),所以我们需要将它添加在.ebextensions:
packages:
yum:
jq: []
下面的BASH部署脚本添加到.ebextensions:
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/980_beanstalk_ssh.sh":
mode: "000755"
owner: ec2-user
group: ec2-user
content: |
#!/bin/bash
rm -f /home/ec2-user/.ssh/authorized_keys
users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
readarray -t users_array < <(jq -r '.[]' <<<"$users")
declare -p users_array
for i in "${users_array[@]}"
do
user_keys=$(aws iam list-ssh-public-keys --user-name $i)
keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
declare -p keys_array
for j in "${keys_array[@]}"
do
ssh_public_key=$(aws iam get-ssh-public-key --encoding SSH --user-name $i --ssh-public-key-id $j | jq '.["SSHPublicKey"] .SSHPublicKeyBody' | tr -d \")
echo $ssh_public_key >> /home/ec2-user/.ssh/authorized_keys
done
done
chmod 600 /home/ec2-user/.ssh/authorized_keys
chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys
不幸的是,因为这是YAML,你不能缩进代码,使其更容易阅读。 但是,让我们打破发生的事情:
(在代码片段正下方),因此我们将移除默认的SSH密钥文件给该列表此部署脚本的完全控制。
rm -f /home/ec2-user/.ssh/authorized_keys
(在代码片段正下方)使用AWS CLI,我们得到了在用户列表beanstalk-access
组,然后我们那个管道JSON列表分为jq
仅提取`$用户列表。
users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
(在代码片段正下方),在这里,我们要转换的是JSON $users
列表到BASH阵列,把它$users_array
。
readarray -t users_array <<(JQ -r '[]' <<< “$用户”)声明-p users_array
(在代码段正下方)我们首先通过用户的阵列循环。
for i in "${users_array[@]}" do
(在代码段正下方)这可能可以在一行中完成的,但它抓住关联到每个用户SSH密钥列表beanstalk-access
组。 这还没有把它变成一个BASH阵列,它仍然是一个JSON列表。
user_keys=$(aws iam list-ssh-public-keys --user-name $i) keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
(在代码段正下方)现在,它把每个用户的SSH密钥的那个JSON列表至BASH阵列。
readarray -t keys_array < <(jq -r '.[]' <<<"$keys") declare -p keys_array
(在代码段正下方)现在,它的转换即JSON列表到BASH阵列。
readarray -t keys_array < <(jq -r '.[]' <<<"$keys") declare -p keys_array
(在代码段正下方)现在我们通过SSH密钥的每个用户的阵列循环。
for j in "${keys_array[@]}" do
(在代码片段正下方),我们将每个用户的每一个SSH密钥authorized_keys
文件。
ssh_public_key=$(aws iam get-ssh-public-key --encoding SSH --user-name $i --ssh-public-key-id $j | jq '.["SSHPublicKey"] .SSHPublicKeyBody' | tr -d \") echo $ssh_public_key >> /home/ec2-user/.ssh/authorized_keys
(在代码段正下方)关闭了两个$users_array
环和$users_keys
循环。
done done
(在代码片段正下方)给予authorized_keys
文件,它原本有相同的权限。
chmod 600 /home/ec2-user/.ssh/authorized_keys chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys
如果你的弹性魔豆EC2实例在公共子网,你可以ssh到它使用:
ssh ec2-user@ip-address -i /path/to/private/key
如果你的弹性魔豆EC2实例在专用子网(因为它应该是云安全最佳实践),那么你就需要有一个“堡垒服务器” EC2实例将作为网关的隧道的EC2实例的所有SSH访问。 查找ssh agent forwarding
或ssh proxy commands
来获取如何完成SSH隧道的想法。
你要做的就是将它们添加到您的IAM beanstalk-access
组和运行部署,以及脚本将它们添加到您的弹性魔豆实例。
https://stackoverflow.com/a/16776129/7459377
最简单的方法 - 像@rhunwicks但有一个“>”符号上第一副本:
问候。
而不是运行echo
和存储上的Git你的钥匙,你可以上传你的公钥来对IAM用户对AWS比做:
commands:
copy_ssh_key_userA:
command: rm -f /home/ec2-user/.ssh/authorized_keys;aws iam list-users --query "Users[].[UserName]" --output text | while read User; do aws iam list-ssh-public-keys --user-name "$User" --query "SSHPublicKeys[?Status == 'Active'].[SSHPublicKeyId]" --output text | while read KeyId; do aws iam get-ssh-public-key --user-name "$User" --ssh-public-key-id "$KeyId" --encoding SSH --query "SSHPublicKey.SSHPublicKeyBody" --output text >> /home/ec2-user/.ssh/authorized_keys; done; done;