В этом посте мы разработаем процедуру для экстренного доступа к хостам SSH, используя аппаратные ключи безопасности в автономном режиме. Это всего лишь один из подходов, и вы можете адаптировать его под себя. Мы будем хранить центр сертификации SSH для наших хостов на аппаратном ключе безопасности. Эта схема будет работать практически на любом OpenSSH, включая SSH с единым входом.
Зачем всё это? Ну, это вариант на крайний случай. Это бэкдор, который позволит вам получить доступ к своему серверу в том случае, когда по какой-то причине больше ничего не помогает.
Зачем использовать сертификаты вместо открытых / закрытых ключей для экстренного доступа?
- В отличие от открытых ключей, срок действия сертификатов может быть очень коротким. Вы можете сгенерировать сертификат, действительный в течение 1 минуты или даже 5 секунд. По истечении этого срока сертификат станет непригодным для новых подключений. Это идеально подходит для экстренного доступа.
- Вы можете создать сертификат для любой учётной записи на своих хостах и при необходимости отправлять такие вот «одноразовые» сертификаты коллегам.
Что вам понадобится
- Аппаратные ключи безопасности, которые поддерживают резидентные ключи.
Резидентные ключи — это криптографические ключи, которые полностью хранятся внутри ключа безопасности. Иногда они защищены буквенно-цифровым PIN-кодом. Открытая часть резидентного ключа может быть экспортирована из ключа безопасности, при необходимости — вместе с дескриптором закрытого ключа. Поддержку резидентных ключей, имеют, например, USB-ключи серии Yubikey 5. Желательно, чтобы они предназначались только для экстренного доступа к хосту. Для этого поста я буду использовать только один ключ, но у вас должен быть дополнительный для резервного копирования. - Безопасное место для хранения этих ключей.
- OpenSSH версии 8.2 или выше на вашем локальном компьютере и на серверах, к которым вы хотите получить экстренный доступ. Ubuntu 20.04 поставляется с OpenSSH 8.2.
- (необязательно, но желательно) Средство CLI для проверки сертификатов.
Подготовка
Для начала нужно создать центр сертификации, который будет находиться на аппаратном ключе безопасности. Вставьте ключ и запустите:
$ ssh-keygen -t ecdsa-sk -f sk-user-ca -O resident -C [security key ID]
В качестве комментария (-C) я указал yubikey-9-512-742@smallstep.com, чтобы не забыть, к какому ключу безопасности относится этот центр сертификации.
Кроме добавления ключа к Yubikey, локально будет сгенерировано два файла:
- sk-user-ca, дескриптор ключа, который ссылается на закрытый ключ, хранящийся в ключе безопасности,
- sk-user-ca.pub, который будет открытым ключом для вашего центра сертификации.
Но не волнуйтесь, на Yubikey хранится ещё один закрытый ключ, который невозможно извлечь. Поэтому тут всё надёжно.
На хостах от имени пользователя root добавьте (если ещё не добавили) в конфигурацию вашего SSHD (/etc/ssh/sshd_config) следующее:
TrustedUserCAKeys /etc/ssh/ca.pub
Затем на хосте добавьте открытый ключ (sk-user-ca.pub) в /etc/ssh/ca.pub
Перезагрузите демон:
# /etc/init.d/ssh restart
Теперь мы можем попробовать получить доступ к хосту. Но сначала нам понадобится сертификат. Создайте пару ключей, которая будет связана с сертификатом:
$ ssh-keygen -t ecdsa -f emergency
Сертификаты и SSH-пары
Иногда так и тянет использовать сертификат как замену пары открытый / закрытый ключ. Но для аутентификации пользователя одного сертификата недостаточно. Каждый сертификат также имеет закрытый ключ, связанный с ним. Вот почему нам нужно сгенерировать эту пару «экстренных» ключей, прежде чем мы выдадим себе сертификат. Важно то, что подписанный сертификат мы показываем серверу, с указанием пары ключей, для которых у нас есть закрытый ключ.
Таким образом, обмен открытыми ключами всё ещё жив-здоров. Это прокатывает даже с сертификатами. Сертификаты просто избавляют сервер от необходимости хранить открытые ключи.
Далее создайте сам сертификат. Мне нужна авторизация пользователя ubuntu в 10-минутном интервале. Вы можете сделать по-своему.
$ ssh-keygen -s sk-user-ca -I test-key -n ubuntu -V -5m:+5m emergency
Вам будет предложено подписать сертификат с помощью отпечатка пальцев. Вы можете добавить дополнительные имена пользователей, разделенные запятыми, например, -n ubuntu,carl,ec2-user
Всё, теперь вас есть сертификат! Далее нужно указать правильные разрешения:
$ chmod 600 emergency-cert.pub
После этого вы можете ознакомится с содержимым вашего сертификата:
$ step ssh inspect emergency-cert.pub
Вот как выглядит мой:
emergency-cert.pub
Type: ecdsa-sha2-nistp256-cert-v01@openssh.com user certificate
Public key: ECDSA-CERT SHA256:EJSfzfQv1UK44/LOKhBbuh5oRMqxXGBSr+UAzA7cork
Signing CA: SK-ECDSA SHA256:kLJ7xfTTPQN0G/IF2cq5TB3EitaV4k3XczcBZcLPQ0E
Key ID: "test-key"
Serial: 0
Valid: from 2020-06-24T16:53:03 to 2020-06-24T17:03:03
Principals:
ubuntu
Critical Options: (none)
Extensions:
permit-X11-forwarding
permit-agent-forwarding
permit-port-forwarding
permit-pty
permit-user-rc
Здесь открытый ключ — это созданный нами ключ emergency, а с центром сертификации связан sk-user-ca.
Наконец-то мы готовы запустить команду SSH:
$ ssh -i emergency ubuntu@my-hostname
ubuntu@my-hostname:~$
- Теперь вы можете создавать сертификаты для любого пользователя на хосте, который доверяет вашему центру сертификации.
- Вы можете удалить emergency. Вы можете сохранить sk-user-ca, но вам это не нужно, поскольку он также находится на ключе безопасности. Возможно, вы также захотите удалить исходный открытый ключ PEM со своих хостов (например, в ~/.ssh/authorized_keys для пользователя ubuntu), если вы использовали его для экстренного доступа.
Экстренный доступ: план действий
Вставьте ключ безопасности и запустите команду:
$ ssh-add -K
Таким образом вы добавите открытый ключ центра сертификации и дескриптор ключа в SSH-агент.
Теперь экспортируйте открытый ключ, чтобы сделать сертификат:
$ ssh-add -L | tail -1 > sk-user-ca.pub
Создайте сертификат со сроком годности, например, не более часа:
$ ssh-keygen -t ecdsa -f emergency
$ ssh-keygen -Us sk-user-ca.pub -I test-key -n [username] -V -5m:+60m emergency
$ chmod 600 emergency-cert.pub
И теперь вновь SSH:
$ ssh -i emergency username@host
Если ваш файл .ssh/config вызывает какие-то проблемы при подключении, вы можете запустить ssh с параметром -F none, чтобы обойтись без него. Если вам нужно отправить сертификат коллеге, самый простой и безопасный вариант — это Magic Wormhole. Для этого понадобится всего два файла — в нашем случае это emergency и emergency-cert.pub.
Что мне нравится в этом подходе, так это аппаратная поддержка. Вы можете поместить ключи безопасности в сейф, и они никуда не денутся.
На правах рекламы
Эпичные серверы — это дешёвые VPS с мощными процессорами от AMD, частота ядра CPU до 3.4 GHz. Максимальная конфигурация позволяет решить практически любые задачи — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe. Присоединяйтесь!