Сгенерируйте ключ на машине, за которой вы сидите
Не на сервере. Закрытая половина никогда не должна существовать на хосте, к которому вы можете потерять доступ, а её копирование сводит на нет смысл её существования.
ssh-keygen -t ed25519 -a 100 -C "laptop-2026"-a 100 задаёт число раундов KDF, защищающих парольную фразу, — единственное, что отделяет украденный ноутбук от вашего парка машин. Используйте парольную фразу. Если у вас есть аппаратный токен, используйте его вместо этого:
ssh-keygen -t ed25519-sk -O resident -C "token-1"Установите открытую половину
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@<ipv4>Вручную, из root-сессии, если у учётной записи ещё нет пароля:
install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
install -m 600 -o deploy -g deploy /dev/null /home/deploy/.ssh/authorized_keys
cat >> /home/deploy/.ssh/authorized_keysВставьте одну строку, затем Ctrl-D. Права имеют больше значения, чем люди ожидают: sshd отказывает в доступе, если домашний каталог или каталог .ssh доступны для записи группе, и объясняет это только в журнале демона, никогда — клиенту.
Ограничьте ключ, пока вы там
Опции в authorized_keys применяются к каждому ключу. restrict отключает всё, а затем вы добавляете обратно то, что ключу действительно нужно:
restrict,pty ssh-ed25519 AAAAC3Nza... deploy@laptopКлюч, который существует для выполнения одной задачи, должен быть ограничен выполнением одной задачи:
restrict,command="/usr/local/bin/backup-receive" ssh-ed25519 AAAAC3Nza... backupПроверьте перед блокировкой
Оставьте первую сессию подключённой. Из второго терминала:
ssh -o PreferredAuthentications=publickey deploy@<ipv4> idЕсли это выводит ваш uid, путь ключа работает. Если нет, ssh -vvv на клиенте и journalctl -u ssh -n 50 на сервере вместе скажут, какая сторона недовольна. Примерно в половине случаев дело в правах, в остальных — в неправильном имени пользователя.
Отключите пароли
cat > /etc/ssh/sshd_config.d/20-keys-only.conf <<EOF
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitEmptyPasswords no
AuthenticationMethods publickey
EOF
sshd -t && systemctl reload sshAuthenticationMethods publickey — это ремень поверх подтяжек. Даже если более поздний drop-in незаметно включит пароли, демон всё равно откажет всему, что не является ключом.
Подтвердите с клиента, что дверь закрыта:
ssh -o PreferredAuthentications=password deploy@<ipv4>Ожидаемый результат: Permission denied (publickey).
Ключи при развёртывании
В панели ведётся список ключей для каждой учётной записи. Отметьте нужные, и cloud-init запишет их во время первой загрузки, что означает, что экземпляр может существовать с самого начала с уже отключённой парольной аутентификацией. Прикрепление ключа к заказу превращает десять минут, описанных выше, в одну.
Если вы потеряли ключ
Здесь нет восстановления на основе идентичности, потому что мы не храним идентичность. Внеполосная консоль — это путь назад: она подключается к экземпляру по пути, который никогда не касается sshd, и из аварийной оболочки вы можете добавить новый ключ и продолжить работу.
Храните второй ключ на второй машине — и вам никогда не придётся читать эту статью.