NT3*_*3RP 32 amazon-ec2 ssh-keys amazon-web-services amazon-elastic-beanstalk
关于[如何] SSH到Elastic [an] Beanstalk实例有一个非常好的问题,但我注意到的一件事是,通过这种方法,只能添加一个SSH密钥.
如何向实例添加多个SSH密钥?有没有办法自动添加多个键到新实例?
小智 40
创建一个名为的文件.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
Run Code Online (Sandbox Code Playgroud)
文件名authorized_keys.config
是任意的.
scr*_*ibu 21
结合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
Run Code Online (Sandbox Code Playgroud)
请注意,eb ssh
仅当私钥文件与AWS控制台中定义的私钥具有相同名称时才会起作用.
rhu*_*cks 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
Run Code Online (Sandbox Code Playgroud)
不,Elastic Beanstalk仅支持单个密钥对.您可以手动将SSH密钥添加到authorized_keys
文件中,但Elastic Beanstalk工具不会知道这些密钥.
实现此目的的一种方法是创建一个用户数据脚本,该脚本将您要使用的其他密钥对的公钥附加到~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
Run Code Online (Sandbox Code Playgroud)
在 IAM 中创建一个组。称之为beanstalk-access
. 将需要 SSH 访问权限的用户添加到 IAM 中的该组。还将他们的公共 ssh 密钥添加到他们的 IAM 中Security credentials
。
下面的部署脚本将使用一个名为jq
(jq 官方教程)的方便的 Linux 工具解析来自 AWS CLI 的 JSON 数据,因此我们需要将它添加到 .ebextensions 中:
packages:
yum:
jq: []
Run Code Online (Sandbox Code Playgroud)
将以下 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
Run Code Online (Sandbox Code Playgroud)
不幸的是,因为这是 YAML,您不能缩进代码以使其更易于阅读。但是让我们分解一下正在发生的事情:
(在下面的代码片段中)我们正在删除默认的 SSH 密钥文件,以便完全控制该部署脚本的列表。
rm -f /home/ec2-user/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)使用 AWS CLI,我们获取beanstalk-access
组中的用户列表,然后我们将该 JSON 列表通过管道jq
传输到其中以仅提取该 `$users 列表。
users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)在这里,我们将该 JSON$users
列表转换为 BASH 数组并调用它$users_array
。
readarray -t users_array < <(jq -r '.[]' <<<"$users") 声明 -p users_array
(在下面的代码片段中)我们开始遍历用户数组。
for i in "${users_array[@]}"
do
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)这可能可以在一行中完成,但它会获取与beanstalk-access
组中每个用户关联的 SSH 密钥列表。它还没有把它变成一个 BASH 数组,它仍然是一个 JSON 列表。
user_keys=$(aws iam list-ssh-public-keys --user-name $i)
keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)现在它将每个用户的 SSH 密钥的 JSON 列表转换为 BASH 数组。
readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
declare -p keys_array
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)现在它正在将该 JSON 列表转换为 BASH 数组。
readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
declare -p keys_array
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)现在我们遍历每个用户的 SSH 密钥数组。
for j in "${keys_array[@]}"
do
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)我们将每个用户的每个 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
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)关闭$users_array
循环和$users_keys
循环。
done
done
Run Code Online (Sandbox Code Playgroud)(在下面的代码片段中)为authorized_keys
文件提供与原来相同的权限。
chmod 600 /home/ec2-user/.ssh/authorized_keys
chown ec2-user:ec2-user /home/ec2-user/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)如果您的 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 隧道。
您所做的就是将它们添加到您的 IAMbeanstalk-access
组并运行部署,该脚本会将它们添加到您的 Elastic Beanstalk 实例中。
归档时间: |
|
查看次数: |
10969 次 |
最近记录: |