首页 文章

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

提问于
浏览
26

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

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

8 回答

  • 1

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

  • 36

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

  • 7

    结合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
    

    请注意,仅当私钥文件与AWS控制台中定义的私钥具有相同名称时,_903240才会起作用 .

  • 7

    继Jim 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
    
  • 1

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

    向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 <<(jq -r' . []'<<<“$ 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 into it:

    ssh ec2-user@ip-address -i /path/to/private/key

    如果您的Elastic Beanstalk EC2实例位于私有子网中(因为它应该用于 Cloud 安全最佳实践),那么您将需要一个"bastion server" EC2实例,该实例将充当用于隧道对EC2实例的所有SSH访问的网关 . 查找 ssh agent forwardingssh proxy commands 以了解如何完成SSH隧道 .

    添加新用户

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

  • 2

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

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

    问候 .

  • 16

    而不是运行 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;
    

相关问题