Ответ 1
Нет, Elastic Beanstalk поддерживает только одну пару ключей. Вы можете вручную добавить SSH-ключи в файл authorized_keys
, но они не будут известны инструментам Elastic Beanstalk.
Есть очень хороший вопрос о [Как сделать] SSH для Эластичного экземпляра Beanstalk, но я заметил, что благодаря этому методу можно добавить только один SSH-ключ.
Как добавить несколько экземпляров SSH в экземпляр? Есть ли способ автоматически добавить несколько ключей в новые экземпляры?
Нет, Elastic Beanstalk поддерживает только одну пару ключей. Вы можете вручную добавить SSH-ключи в файл authorized_keys
, но они не будут известны инструментам Elastic Beanstalk.
Чтобы создать файл с именем .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
является произвольным.
После ответа Джима Фланагана вы можете получить ключи, добавленные к каждому экземпляру, создав .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
Объединяя ответы 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.
Один из способов добиться этого - создать пользовательские данные 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
fooobar.com/questions/260411/...
самый простой метод - например, @rhunwicks, но с одним символом " > " в первой копии:
С уважением.
Создайте группу в IAM. Назовите это что-то вроде beanstalk-access
. Добавьте пользователей, которым нужен SSH доступ к этой группе в IAM. Также добавьте свои общедоступные ключи ssh к их IAM Security credentials
.
Развертывание script ниже будет анализировать данные JSON из AWS CLI с помощью удобного инструмента Linux под названием jq
(jq официальный учебник), поэтому нам нужно добавить его в .ebextensions:
packages:
yum:
jq: []
Добавьте следующий 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
Если ваш экземпляр 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.
вместо запуска 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;