Если при создании Linux-инстанса в AWS не была создана пара ключей (KeyPair) для доступа к нему через SSH либо они утеряны, то необходимо совершить ряд операций для получения доступа к машине. К уже запущенному инстансу добавить ключи через консоль AWS невозможно. Существует три способа, с помощью которых мы сможем восстановить доступ по SSH к инстансу.
Самый простой способ — настройка ключа с использованием механизма cloud-init (спасибо за подсказку yusman). Но он не работает если права на директорию /home
повреждены или дистрибутив не поддерживает директивы cloud-init.
Второй способ — создание образа (Amazon Machine Image) с существующего инстанса и последующий запуск нового инстанса на его основе, но с созданием ключа. Таким образом фактически будет клонирована существующая машина с той лишь разницей, что на последнем этапе возможно создать новые ключи. Создание образа может занять длительное время для инстанса с дисками большого объема, и вам придется настраивать все сервисы, завязанные на эту машину заново. Поэтому данный способ в большинстве случаев займет больше времени.
В официальной документации от Amazon описывается и другой способ. Он позволяет восстановить доступ и свести к минимуму издержки на перенастройку сервисов (по сравнению со вторым способом), которые завязаны на инстанс, к которому потерян доступ. В статье дается его пошаговое описание.
Внимание! Этот способ работает только для инстансов, в которых в качестве корневого устройства используется блочное хранилище (Amazon Elastic Block Store), и не работает для локального хранилища инстансов (Amazon EC2 Instance Store).
Чтобы узнать, какой тип корневого устройства используется у вас, откройте Amazon EC2 консоль, перейдите в Instances, выберите инстанс и проверьте значение параметра Root device type в панели с детальной информацией.
Если на вашей машине EBS, то данный способ подходит для вас.
Шаг 1. Подготовка
Для начала необходимо сохранить некоторую информацию, чтобы не пришлось отвлекаться и не переходить на другие экраны (тем более это будет очень неудобно). Все данные можно найти в детальной информации инстанса (как туда попасть вы уже знаете). Запишите следующие настройки:
- Instance ID
- AMI ID
- EBS ID
- Root device
- Availability zone
Для инстанса, запущенного в VPC, сохраните значение VPC ID.
Для EC2-classic: eсли для инстанса создан эластичный IP-адрес (Elastic IP), то необходимо сохранить и его значение.
Изображение кликабельно
Для получения идентификатора блочного хранилища (EBS ID) необходимо кликнуть по названию Root device.
Шаг 2. Создание временного инстанса
Следующий этап — создание инстанса, с помощью которого вы будете восстанавливать ключи на оригинальном инстансе. Можно пропустить этот шаг, если у вас есть другой запущенный инстанс, находящийся в той же зоне (Availability zone), что и восстанавливаемый, и при этом он создан с использованием такого же AMI или версия операционной системы на нем позволит подключить диск с оригинального инстанса и скопировать на него ключи SSH. Если такого инстанса нет, то выполните следующие действия:
- Перейдите в консоль EC2 (на дашборд или в меню Instances) и нажмите Launch Instance
- На странице выбора AMI (Choose an Amazon Machine Image) выберите такой, который использовался для создания оригинального инстанса (его вы записывали на первом шаге — AMI ID). Если по какой-то причине этот AMI недоступен, можно создать образ с оригинального инстанса и использовать его либо выбрать такой тип AMI, к которому бы можно было подключить корневой диск восстанавливаемого инстанса
- На странице выбора типа инстанса (Choose an Instance Type) выберите самый дешевый из доступных типов
- На странице с детальной информацией (Configure Instance Details) укажите такую же зону (Availability Zone), как в нашем инстансе. Если он запущен в VPC, выберите в пункте Network аналогичную VPC и укажите подсеть (subnet) в данной зоне.
При этом настройки Network Interfaces нет необходимости менять.
- На странице редактирования хранилища (Add Storage) никаких изменений не требуется
- На странице тэгов (Add Tags) добавьте имя для временного инстанса, чтобы его было легко идентифицировать и потом не тратить время на сверку Instance ID и EBS ID, так как на страницах, где надо будет определить с каким инстансом или томом вы работаете, в названии будет фигурировать это значение.
- Жмите Review and Launch, а затем Launch
- Последний этап — выбор существующей пары ключей либо создание новой. Загрузите файл ключа (pem) и не забудьте сделать бэкап, чтобы все операции не пришлось выполнять заново.
- После того, как сохранили файл, запустите инстанс кнопкой Launch Instances
Шаг 3. Подключение корневого диска с восстанавливаемой машины к временному инстансу
Сначала необходимо отключить диск от оригинального инстанса и подключить его к временному. Так как это корневой диск, перед его отключением оригинальный инстанс придется остановить.
- Перейдите в консоль EC2 в раздел Instances и выберите оригинальный инстанс (его можно определить по записанному ранее Instance ID либо по имени, которое отличается от того которое вы указали при создании временного инстанса).
Далее в меню Actions — Instance State — Stop.
Внимание! Когда останавливается инстанс, все данные на локальных хранилищах (Amazon EC2 Instance Store) стираются. Если у вас есть данные на таких томах, позаботьтесь об их сохранности, перенеся их на постоянное хранилище, если это необходимо.
- После того как инстанс остановлен, переходите в раздел Elastic Block Store — Volumes и выбирайте корневой том оригинального инстанса. Его можно определить по сохраненному Volume ID либо основываясь на информации из колонки Attachment Information, в которой содержится название инстанса.
Далее в меню Actions — Detach Volume
- Подключите этот том к временному инстансу. Для этого выберите его снова, далее в меню Actions — Attach Volume и в появившемся диалоговом окне укажите ваш временный инстанс.
После чего нажимайте Attach. В случае, если оригинальный инстанс создавался через AWS Marketplace AMI и раздел содержит коды AWS Marketplace, вы получите ошибку, в которой говорится о том, что нельзя подключить раздел с кодами к работающему инстансу.
В этом случае остановите наш временный инстанс и заново выполните действия по подключению корневого тома оригинального инстанса к временному инстансу. Вторая попытка должна быть удачной.
- Теперь вы должны увидеть, что оба диска подключены к временному инстансу.
- Если вы останавливали инстанс, запустите его:
- Перейдите в раздел Instances в навигационной панели
- Выберите временный инстанс
- Далее в меню Actions — Instance State — Start.
Шаг 4. Подготовка ключей для подключения к инстансу по SSH
Пользователям Linux нет необходимости генерировать какие-то дополнительные ключи. Необходимо лишь дать права на чтение этого файла:
chmod 400 my-keypair.pem
- Откройте PuTTYgen (устанавливается вместе с PuTTY)
- Выберите в параметрах RSA 2048 бит
- Загрузите сохраненный pem-ключ нажав Load (Load an existing private key file)
- Укажите парольную фразу (key passphrase) и подтвердите её (confirm passphrase). Это делать не обязательно, но так безопасней. Разница будет лишь в том, что при подключении с использованием этого ключа всегда будет предлагаться ввести эту фразу, чтобы подтвердить вход
- Сохраните файл с тем названием, которое вы указали при создании пары ключей (KeyPair) в процессе создания временного инстанса (название совпадает с именем pem-ключа)
Ключ готов.
Шаг 5. Подключение к временному инстансу по SSH
Подключитесь по 22 порту с использованием ключа. Имя пользователя зависит от того, какой AMI использовался при создании инстанса. Его вы записывали в самом начале. Возможны следующие имена пользователей:
- Amazon Linux 2 или Amazon Linux AMI — ec2-user
- Centos AMI — centos
- Debian AMI — admin или root
- Fedora AMI — ec2-user или fedora
- RHEL AMI — ec2-user или root
- SUSE AMI — ec2-user или root
- Ubuntu AMI — ubuntu
- Для остальных, если имена ec2-user и root не работают — обратитесь к поставщику AMI
Название хоста, к которому надо подключаться, — user@aws-host.amazon.com, где user — имя, которое описано выше, а aws-host.amazon.com — ip-адрес вашего инстанса, который можно найти на вкладке детальной информации (с неё вы в самом начале сохраняли параметры). Параметр называется IPv4 Public IP. Обратите внимание, что если вы не используете Elastic IP, при каждом старте инстанса у него будет новый ip-адрес.
- Запустите PuTTY
- В поле Host Name адрес в формате имя_пользователя@ip-адрес
- Перейдите в раздел Connection — SSH — Auth и загрузите ppk-ключ (Private key file for authentication)
- Нажмите Open и затем согласитесь доверять серверу
- Если вы указывали парольную фразу (passphrase) при создании ppk-ключа, введите её, чтобы подтвердить вход:
Using username "ubuntu". Authenticating with public key "imported-openssh-key" Passphrase for key "imported-openssh-key":
- Вы на сервере.
Шаг 6. Копирование ключей с временного инстанса на оригинальный
Смонтируйте том, который вы подключили к временному инстансу, чтобы вы могли получить доступ к его файловой системе.
/dev/sdf
(может отображаться по-разному на вашем инстансе), используйте следующие операции для монтирования тома в /mnt/tempvol
:
- Определите названия разделов подключенного диска:
[user ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 10G 0 disk └─xvda1 202:1 0 10G 0 part / xvdf 202:80 0 10G 0 disk └─xvdf1 202:81 0 10G 0 part
/dev/xvda1
и/dev/xvdf1
— разделы дисков. У/dev/xvdf1
не указана точка монтирования (MOUNTPOINT), значит это раздел диска, который мы подключили ранее. - Создайте временную директорию для монтирования раздела:
[user ~]$ sudo mkdir /mnt/tempvol
- Смонтируйте раздел в созданный каталог:
[user ~]$ sudo mount /dev/xvdf1 /mnt/tempvol
Скопируйте SSH-ключи с временного инстанса на смонтированный раздел.
Внимание! Используйте имя пользователя, которое указано в командной строке. Это необходимо, так как несмотря на то, что вы успешно подключились со стандартным именем пользователя, которое зависит от операционной системы (описано в шаге 5), в AMI из AWS Marketplace оно может быть другим после входа. Например, для AMI WordPress Certified by Bitnami при входе по SSH используется стандартный логин для Ubuntu — ubuntu
. Однако имя пользователя после входа в систему — bitnami
ubuntu
, используйте следующую команду для копирования:
[user ~]$ cp .ssh/authorized_keys /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
Если у вас нет прав на редактирование файлов в /mnt/tempvol
, то скопируйте файлы с использованием sudo
и проверьте права, чтобы удостовериться, что вы сможете зайти на оригинальный инстанс:
- Проверьте права на файл:
[user ~]$ sudo ls -l /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
total 4
-rw------- 1 200 500 392 Aug 15 00:06 authorized_keys
В примере, 200 — это ID пользователя и 500 — ID группы.
- Перезапустите команду копирования ключей с использованием
sudo
:[user ~]$ sudo cp .ssh/authorized_keys /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
- Проверьте, не изменились ли права на файл:
[user ~]$ sudo ls -l /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
Если права изменились, восстановите их:
[user ~]$ sudo chown 200:500 /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
Отмонтируйте раздел:
[user ~]$ sudo umount /mnt/tempvol
Шаг 7. Запуск инстанса с восстановленным доступом по SSH
- В консоли EC2 выберите диск, который вы подключали к временному, и в меню: Actions — Detach Volume. Дождитесь, пока состояние (state) диска станет available (можете использовать кнопку Refresh для обновления информации).
Не забудьте предварительно остановить инстанс, если раздел содержит коды AWS Marketplace.
- Для этого же диска перейдите в меню Actions — Attach Volume
- Выберите оригинальный инстанс и укажите имя корневого диска, которое вы записали в самом начале.
Изображение кликабельно
Нажмите Attach
- Запустите инстанс
- Для EC2-classic: если для оригинального инстанса был настроен Elastic IP, переассоциируйте его с ним:
- Перейдите в раздел Elastic IP на навигационной панели
- Выберите адрес Elastic IP, который вы записали в самом начале
- Далее Actions — Associate address
- Выберите ID оригинального инстанса и нажмите Associate
Шаг 8. Проверка доступа
Подключитесь к инстансу с восстановленным доступом с помощью созданного ключа.
Если имя новой пары ключей отличается от того, который был ранее, убедитесь, что вы подключаетесь с использованием нового приватного ключа.
Шаг 9. Завершающий этап
Если вы создавали новый временный инстанс для того, чтобы выполнить все операции, а не использовали уже существующий, остановите его, если он вам больше не нужен:
- Перейдите в раздел Instances на навигационной панели
- Выберите временный инстанс
- Далее в меню Actions — Instance State — Terminate
Таким образом вы восстановили доступ к Linux Amazon EC2 инстансу.
Автор: Xordal