【问题标题】:How to add multiple keys for elastic beanstalk instance?如何为弹性豆茎实例添加多个键?
【发布时间】:2012-10-23 10:36:04
【问题描述】:

[How to] SSH to Elastic [an] Beanstalk instance 上有一个很好的问题,但是我注意到的一件事是,通过这种方法,只能添加一个 SSH 密钥。

如何向一个实例添加多个 SSH 密钥?有没有办法自动为新实例添加多个键?

【问题讨论】:

标签: amazon-ec2 amazon-web-services ssh-keys amazon-elastic-beanstalk


【解决方案1】:

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

步骤 1

在 IAM 中创建一个组。称之为beanstalk-access。将需要 SSH 访问权限的用户添加到 IAM 中的该组。还将他们的公共 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,所以您不能缩进代码以使其更易于阅读。但让我们分解发生的事情:

  • (在下面的代码 sn-p 中)我们正在删除默认的 SSH 密钥文件,以便将该列表的完全控制权交给此部署脚本。

      rm -f /home/ec2-user/.ssh/authorized_keys
    
  • (在下面的代码 sn-p 中)使用 AWS CLI,我们获取 beanstalk-access 组中的用户列表,然后我们将该 JSON 列表传送到 jq 以仅提取该列表`$users.

      users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
    
  • (在下面的代码 sn-p 中)在这里,我们将 JSON $users 列表转换为 BASH 数组并将其称为 $users_array

    readarray -t users_array

  • (在下面的代码 sn-p 中)我们开始循环遍历用户数组。

      for i in "${users_array[@]}"
      do
    
  • (在下面的代码 sn-p 中)这可能可以在一行中完成,但它会获取与 beanstalk-access 组中的每个用户关联的 SSH 密钥列表。它还没有变成 BASH 数组,它仍然是一个 JSON 列表。

      user_keys=$(aws iam list-ssh-public-keys --user-name $i)
      keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
    
  • (在下面的代码 sn-p 中)现在它将每个用户的 SSH 密钥的 JSON 列表转换为 BASH 数组。

     readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
     declare -p keys_array
    
  • (在下面的代码 sn-p 中)现在它将 JSON 列表转换为 BASH 数组。

     readarray -t keys_array < <(jq -r '.[]' <<<"$keys")
     declare -p keys_array
    
  • (在下面的代码 sn-p 中)现在我们遍历每个用户的 SSH 密钥数组。

     for j in "${keys_array[@]}"
     do
    
  • (在下面的代码 sn-p 中)我们将每个用户的每个 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
    
  • (在下面的代码 sn-p 中)关闭$users_array 循环和$users_keys 循环。

    done
    done
    
  • (在下面的代码 sn-p 中)赋予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 forwardingssh proxy commands 了解如何完成 SSH 隧道。

添加新用户

您只需将它们添加到您的 IAM beanstalk-access 组并运行部署,该脚本就会将它们添加到您的 Elastic Beanstalk 实例中。

【讨论】:

  • 由于和 aws iam 命令,这对我来说失败了:2018-10-16 13:43:24 错误 [实例:i-05cc43b96ffc69145] 命令在实例上失败。返回码:1 输出:(TRUNCATED)...rform: iam:GetGroup on resource: group beanstalk-access
  • @JosephCrawford 您确定您创建了名为 beanstalk-access 的 IAM 组吗?然后还要确保有分配给该组的用户。
  • 是的,我做了这两件事,但这是部署期间 beanstalk 返回的错误。此外,我删除了配置文件并从 yum 包中删除了 jq,现在我仍然无法部署,因为它试图在每次部署时运行该命令,我发现这很奇怪。
  • ls -la .ebextensions 总计 16 drwxrwxrwx@ 4 jcrawford 员工 128 Oct 16 15:03 。 drwxrwxrwx@ 36 名 jcrawford 员工 1152 10 月 16 日 09:18 .. -rw-r--r--@ 1 名 jcrawford 员工 744 9 月 18 日 10:07 composer.config -rw-r--r--@ 1 名 jcrawford 员工 10 月 73 日16 09:53 project.config 2018-10-16 19:05:05 INFO 将新版本部署到实例。 2018-10-16 19:06:09 错误 [实例:i-05cc43b96ffc69145] 命令在实例上失败。返回码:1 输出:(截断)...erform:iam:GetGroup on resource:group BeanstalkAccess
  • 终于能够让我们的环境恢复到运行状态。将在进一步测试启用 SSH 后克隆我们的 QA 环境。
【解决方案2】:

您可以将公钥上传到 AWS 上的 IAM 用户,而不是运行 echo 并将您的密钥存储在 Git 上:

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;

【讨论】:

    【解决方案3】:

    https://stackoverflow.com/a/16776129/7459377

    最简单的方法 - 像 @rhunwicks 但在第一个副本上有一个“>”符号:

    问候。

    【讨论】:

    • 不要复制和粘贴现有答案并应用小改动。如果您对现有答案有贡献,请使用 share button 和您的新答案。
    【解决方案4】:

    结合 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 控制台中定义的私钥同名时才有效。

    【讨论】:

      【解决方案5】:

      创建一个名为.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是任意的。

      【讨论】:

      • 这非常有效。但是,默认情况下,authorized_keys 已经有一个 ssh 密钥(您必须在创建环境时选择一个),并且您需要记住将该密钥添加到此文件中,否则它将在部署时被删除,您可能会失去对服务器。
      • ^ 并获取 ssh 密钥 eb ssh 到实例中并输入 cat ~ec2-user/.ssh/authorized_keys
      • 在后续部署期间不会每次都附加 keyname 和 another-key 吗?在重建环境之前导致重复?
      • @Max 不会。它将覆盖authorized_keys
      • 这是一个很好的解决方案 - 我想知道是否可以通过环境变量添加这些文件,在这种情况下您可以在不重建环境的情况下管理访问?
      【解决方案6】:

      根据 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
      

      【讨论】:

      • 这种方法的问题是它会在每次部署时连接文件。 @rch850 提出的解决方案没有这个问题。
      • 当我复制粘贴这段代码时,我得到一些不是空格的坏字符,请注意
      • 您可以通过添加额外的重复数据删除命令来避免@RobertoSchneiders 提到的串联问题:command: sort -u /home/ec2-user/.ssh/authorized_keys -o /home/ec2-user/.ssh/authorized_keys
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        您可以完成此操作的一种方法是创建一个用户数据脚本,该脚本将您要使用的其他密钥对的公钥附加到 ~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
        

        【讨论】:

        • 确实如此,但这会使通过各种 AWS 工具管理密钥变得更加困难。 AWS 内部有没有办法做到这一点?
        • Elastic Beanstalk 不允许您指定用户数据
        • 您可以在正在部署的应用程序版本的源代码树中使用类似.ebextensions/app.config 的文件来添加其他命令。见docs.aws.amazon.com/elasticbeanstalk/latest/dg/…
        猜你喜欢
        • 2015-03-20
        • 2016-01-04
        • 2018-02-25
        • 2019-11-06
        • 2018-03-23
        • 2016-01-13
        • 2015-04-02
        • 2017-09-01
        • 2013-05-25
        相关资源
        最近更新 更多