如何为弹性beanstalk实例添加多个键?

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是任意的.

  • 这完美地工作。然而,默认情况下,authorized_keys 已经有一个 ssh 密钥(你必须在创建环境时选择一个),你需要记住将该密钥添加到这个文件中,否则它会在部署时被删除,你可能会失去对服务器。 (2认同)

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)

  • 您可以通过添加额外的重复数据删除命令来避免@RobertoSchneiders提到的串联问题:`command:sort -u /home/ec2-user/.ssh/authorized_keys -o/home/ec2-user/.ssh/authorized_keys` (3认同)

Ken*_*Liu 8

不,Elastic Beanstalk仅支持单个密钥对.您可以手动将SSH密钥添加到authorized_keys文件中,但Elastic Beanstalk工具不会知道这些密钥.


Jim*_*gan 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
Run Code Online (Sandbox Code Playgroud)


Sam*_*yek 5

将多个 SSH 密钥添加到 Elastic Beanstalk EC2 实例的最动态方式

第1步

在 IAM 中创建一个组。称之为beanstalk-access. 将需要 SSH 访问权限的用户添加到 IAM 中的该组。还将他们的公共 ssh 密钥添加到他们的 IAM 中Security credentials

第2步

下面的部署脚本将使用一个名为jqjq 官方教程)的方便的 Linux 工具解析来自 AWS CLI 的 JSON 数据,因此我们需要将它添加到 .ebextensions 中:

  packages:
    yum:
      jq: []
Run Code Online (Sandbox Code Playgroud)

第 3 步

将以下 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 forwardingssh proxy commands了解如何完成 SSH 隧道。

添加新用户

您所做的就是将它们添加到您的 IAMbeanstalk-access组并运行部署,该脚本会将它们添加到您的 Elastic Beanstalk 实例中。