ssh-copy-id (установка ключа на сервер)
ssh-copy-id это скрипт из состава OpenSSH, который устанавливает ваш открытый ключ на удалённый сервер. Он входит по SSH, обычно с паролем, пропускает уже установленные ключи и добавляет остальные в ~/.ssh/authorized_keys учётной записи, при необходимости создавая каталог и файл. Это обычный первый шаг перед отключением входа по паролю.
Что делает ssh-copy-id, шаг за шагом
Согласно руководству ssh-copy-id, скрипт с помощью ssh входит на удалённую машину, предположительно по паролю, поэтому для первого запуска вход по паролю должен быть включён. Он составляет список ключей, пробует войти с каждым из них, чтобы понять, установлен ли он уже, и затем устанавливает только те, с которыми вход не удался. По умолчанию они добавляются в конец ~/.ssh/authorized_keys, а файл и каталог при необходимости создаются.
Подробности видны в самом скрипте. На удалённой стороне он выставляет umask 077, поэтому новый каталог закрыт для других, а новый файл читается только владельцем. Перед добавлением он дописывает недостающий перевод строки, чтобы ключи не слиплись, и запускает restorecon, если команда есть, что восстанавливает метки SELinux. Существующие ключи он никогда не удаляет.
Какие ключи копируются, зависит от параметров. С -i берётся только указанный файл. Без него, если ssh-add -L что-то выводит, используются ключи из вашего агента, а иначе самый недавно изменённый файл ~/.ssh/id*.pub.
Команды и ручной вариант
Используйте псевдоним Host из ~/.ssh/config, чтобы не вводить данные сервера каждый раз. Сначала сделайте пробный запуск, который только печатает ключи, предназначенные к установке, затем установите по-настоящему:
ssh-copy-id -n -i ~/.ssh/id_ed25519.pub myserver
ssh-copy-id -i ~/.ssh/id_ed25519.pub myserver
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 myserverВ руководстве перечислены -p для порта, -o и -F для передачи параметров ssh или файла конфигурации, -t для другого целевого файла, -f чтобы пропустить проверку «уже установлен» и -s для работы через sftp, если сервер ограничивает удалённые команды. Проверьте результат входом только по ключу:
ssh -o IdentitiesOnly=yes -o PasswordAuthentication=no -i ~/.ssh/id_ed25519 myserverЕсли скрипта нет, то же самое вручную:
cat ~/.ssh/id_ed25519.pub | ssh myserver 'umask 077; mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'Ручной способ не проверяет дубликаты и отсутствие финального перевода строки, поэтому потом просмотрите файл.
Подводные камни и ошибки
Несколько значений по умолчанию неприятно удивляют.
- Может скопироваться больше ключей, чем вы хотели. Без
-iустанавливаются все ключи, загруженные в ssh-agent, а комментарием, как отмечено в руководстве, становится имя файла, с которым ключ загружали. Всегда указывайте-i. - Нужен работающий вход. Если вход по паролю уже выключен и ключа нет, используйте консоль провайдера, а не скрипт.
- Он только добавляет и не проверяет. Дубликаты (при
-f) и забытые ключи копятся в authorized_keys. - Ограничения не добавляются. В руководстве сказано, что для параметров вроде
fromилиcommandнужно отредактировать файл ключа до копирования. - Только открытый ключ. Передавайте файл
.pub, но не закрытый ключ. - Права могут помешать. В руководстве sshd сказано, что если файл, каталог
~/.sshили домашний каталог доступны другим на запись, sshd не будет использовать файл при включённомStrictModes. См. Permission denied (publickey).
Устанавливайте ключи для именной учётной записи администратора, а не для root (см. PermitRootLogin).
Безопасный порядок перед отключением пароля
Копирование ключа это первый шаг перехода на аутентификацию по ключу, и порядок действий важен.
- Создайте ключ через ssh-keygen с парольной фразой.
- Установите его командой
ssh-copy-id -i, не закрывая исходную сессию. - Из второго терминала войдите только по ключу и убедитесь, что это работает.
- Отредактируйте конфигурацию сервера, выполните
sudo sshd -tи перезагрузите конфигурацию. - Из третьего терминала проверьте, что ключ по-прежнему работает, а попытка входа только по паролю отклоняется.
Точные строки для PasswordAuthentication и связанных параметров даёт руководство по усилению защиты SSH. Если что-то пошло не так, руководство по восстановлению доступа покажет, как вернуться через консоль провайдера.
Считайте установку ключа изменением доступа: записывайте, чей это ключ, и при уходе сотрудника удаляйте его строку. О ключе на аппаратном токене см. FIDO2 и WebAuthn и руководство по двухфакторной аутентификации SSH.
Связанные термины: authorized_keys, Аутентификация по ключу, ssh-keygen, PasswordAuthentication, PermitRootLogin.
Часто задаваемые вопросы
Что делает ssh-copy-id?
Она входит на сервер по SSH и добавляет ваш открытый ключ в ~/.ssh/authorized_keys, при необходимости создавая каталог и файл. Сначала она проверяет, какие из ваших ключей уже установлены, и пропускает их.
Нужен ли включённый вход по паролю для ssh-copy-id?
Обычно да, для первого запуска, потому что скрипт входит по паролю, чтобы установить ключ. Если вход по паролю уже отключён, добавьте ключ через другой работающий вход или консоль провайдера.
Как скопировать конкретный ключ через ssh-copy-id?
Используйте параметр -i с файлом открытого ключа, например ssh-copy-id -i ~/.ssh/id_ed25519.pub myserver. Без -i скрипт берёт ключи из вашего ssh-agent, а иначе самый свежий файл id*.pub.
Что делать, если ssh-copy-id не установлен?
Добавьте ключ вручную: передайте файл .pub в ssh и выполните на сервере mkdir -p ~/.ssh и cat >> ~/.ssh/authorized_keys с umask 077. Затем проверьте, что у каталога права 700, а у файла 600.
Удаляет ли ssh-copy-id старые ключи?
Нет. Она только добавляет недостающие ключи. Просматривайте authorized_keys сами и удаляйте строки бывших сотрудников и списанных устройств.
Хотите увидеть, в каком состоянии ваш сервер?
Запустите бесплатную read-only проверку сервера или откройте Security Lab и посмотрите цикл обнаружение, сдерживание, восстановление, проверка в действии.
Получить бесплатную проверку сервераОткрыть Security Lab