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

时间:2012-11-02 18:11:57

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

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

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

8 个答案:

答案 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)

向Elastic Beanstalk EC2实例添加多个SSH密钥的最动态方法

第1步

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

第2步

下面的部署脚本将使用名为jqjq official tutorial)的便捷Linux工具从AWS CLI解析JSON数据,因此我们需要将其添加到.ebextensions:

  packages:
    yum:
      jq: []

第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

不幸的是,因为这是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
    

第4步

如果您的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实例中。

答案 6 :(得分:1)

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

最简单的方法 - 比如@rhunwicks但是有一个&#34;&gt;&#34;第一份上的符号:

问候。

答案 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;