关于[How to] SSH to Elastic [an] Beanstalk instance有一个非常好的问题,但我注意到的一件事是,通过这种方法,只能添加一个SSH密钥。
如何向实例添加多个SSH密钥?有没有办法自动将多个密钥添加到新实例?
答案 0 :(得分:38)
创建名为.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
的名称是任意的。
答案 1 :(得分:19)
结合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控制台中定义的私钥同名时才有效。
答案 2 :(得分:13)
继Jim Flanagan的回答之后,您可以通过在应用程序源目录中创建包含内容的.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
答案 3 :(得分:8)
不,Elastic Beanstalk仅支持单个密钥对。您可以手动将SSH密钥添加到authorized_keys
文件中,但Elastic Beanstalk工具无法知道这些密钥。
答案 4 :(得分:7)
您可以实现此目的的一种方法是创建一个用户数据脚本,该脚本将您要使用的其他密钥对的公钥附加到~ec2-user / .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
答案 5 :(得分:3)
在IAM中创建一个组。称之为beanstalk-access
。在IAM中添加需要SSH访问权限的用户。还要将他们的公共ssh密钥添加到他们的IAM Security credentials
。
下面的部署脚本将使用名为jq
(jq official tutorial)的便捷Linux工具从AWS CLI解析JSON数据,因此我们需要将其添加到.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。
users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
(在下面的代码片段中)在这里,我们将JSON $users
列表转换为BASH数组并将其称为$users_array
。
readarray -t users_array&lt; &lt;(jq -r'。[]'&lt;&lt;&lt;“$ users”) 声明-p users_array
(在下面的代码片段中)我们开始循环遍历用户数组。
for i in "${users_array[@]}"
do
(在下面的代码片段中)这可以在一行中完成,但它会抓取与beanstalk-access
组中每个用户关联的SSH密钥列表。它还没有把它变成一个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
如果您的Elastic Beanstalk EC2实例位于公有子网中,您可以使用以下命令ssh到它:
ssh ec2-user@ip-address -i /path/to/private/key
如果您的Elastic Beanstalk EC2实例位于私有子网中(因为它应该用于云安全最佳实践),那么您将需要一个“堡垒服务器”EC2实例,它将充当隧道所有SSH访问的网关到EC2实例。查找ssh agent forwarding
或ssh proxy commands
以了解如何完成SSH隧道。
您只需将它们添加到IAM beanstalk-access
组并运行部署,该脚本会将它们添加到您的Elastic Beanstalk实例中。
答案 6 :(得分:1)
答案 7 :(得分:1)
而不是运行echo
并将您的密钥存储在Git上,您可以将您的公钥上传到AWS上的IAM用户,而不是:
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;