Подтвердить что ты не робот

Как добавить несколько ключей для экстренного экземпляра beanstalk?

Есть очень хороший вопрос о [Как сделать] SSH для Эластичного экземпляра Beanstalk, но я заметил, что благодаря этому методу можно добавить только один SSH-ключ.

Как добавить несколько экземпляров SSH в экземпляр? Есть ли способ автоматически добавить несколько ключей в новые экземпляры?

4b9b3361

Ответ 1

Нет, Elastic Beanstalk поддерживает только одну пару ключей. Вы можете вручную добавить SSH-ключи в файл authorized_keys, но они не будут известны инструментам Elastic Beanstalk.

Ответ 2

Чтобы создать файл с именем .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 является произвольным.

Ответ 3

После ответа Джима Фланагана вы можете получить ключи, добавленные к каждому экземпляру, создав .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

Ответ 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

Один из способов добиться этого - создать пользовательские данные script, который добавляет открытые ключи дополнительных пар ключей, которые вы хотите использовать для ~ 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

Ответ 6

fooobar.com/questions/260411/...

самый простой метод - например, @rhunwicks, но с одним символом " > " в ​​первой копии:

С уважением.

Ответ 7

Самый динамичный способ добавления нескольких ключей SSH в Эластичные экземпляры EC2 в Beanstalk

Шаг 1

Создайте группу в IAM. Назовите это что-то вроде beanstalk-access. Добавьте пользователей, которым нужен SSH доступ к этой группе в IAM. Также добавьте свои общедоступные ключи ssh к их IAM Security credentials.

Шаг 2

Развертывание script ниже будет анализировать данные JSON из AWS CLI с помощью удобного инструмента Linux под названием jq (jq официальный учебник), поэтому нам нужно добавить его в .ebextensions:

  packages:
    yum:
      jq: []

Шаг 3

Добавьте следующий BASH развертывание script в .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 по умолчанию, чтобы полностью контролировать этот список для этого развертывания script.

      rm -f /home/ec2-user/.ssh/authorized_keys
    
  • (В фрагменте кода непосредственно ниже) Используя AWS CLI, мы получаем список пользователей в группе beanstalk-access, а затем мы собираем этот список JSON в jq, чтобы извлечь только тот список пользователей $.

      users=$(aws iam get-group --group-name beanstalk-access | jq '.["Users"] | [.[].UserName]')
    
  • (В фрагменте кода непосредственно ниже). Здесь мы конвертируем этот список JSON $users в массив BASH и вызываем его $users_array.

    readarray -t users_array < < (jq -r '. []' < < "$ users" ) declare -p users_array

  • (В фрагменте кода непосредственно ниже). Мы начинаем цикл через массив пользователей.

      for i in "${users_array[@]}"
      do
    
  • (В фрагменте кода непосредственно ниже) Это, вероятно, можно сделать в одной строке, но он захватывает список ключей SSH, связанных с каждым пользователем в группе beanstalk-access. Он еще не превратил его в массив BASH, он все еще является списком JSON.

      user_keys=$(aws iam list-ssh-public-keys --user-name $i)
      keys=$(echo $user_keys | jq '.["SSHPublicKeys"] | [.[].SSHPublicKeyId]')
    
  • (В фрагменте кода ниже) Теперь он преобразует этот список JSON для каждого SSH-ключа каждого пользователя в массив 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

Если ваш экземпляр EC2 из эластичного beanstalk находится в общедоступной подсети, вы можете просто ssh включить его, используя:

ssh [email protected] -i /path/to/private/key

Если ваш экземпляр ECAL Extract Beanstalk EC2 находится в частной подсети (как и в случае с лучшими практиками облачной безопасности), тогда вам понадобится экземпляр EC2 "bastion server", который будет действовать как шлюз для туннелирования всех SSH-доступа к экземплярам EC2. Найдите ssh agent forwarding или ssh proxy commands, чтобы получить представление о том, как выполнить туннелирование SSH.

Добавление новых пользователей

Все, что вы делаете, это добавить их в группу IAM beanstalk-access и запустить развертывание, а script добавит их в ваши экземпляры Elastic Beanstalk.

Ответ 8

вместо запуска echo и сохранения ваших ключей на Git, вы можете загрузить свои открытые ключи пользователю IAM на AWS, а не делать:

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;