SSH-ключи
Теория в нескольких словах, ssh может авторизоваться не по паролю, а по ключу. Ключ состоит из открытой и закрытой части:
- Открытая, кладётся на сервер в домашний каталог пользователя, под которым заходят на сервер
- Закрытая, кладётся на компьютер в домашний каталог пользователя, который идёт на удалённый сервер
Половинки сравниваются и если всё хорошо, происходит соединение.
Важно понимать, авторизуется не только клиент на сервере, но и сервер по отношению к клиенту. Главной особенностью ключа по сравнению с паролем является то, что его нельзя украсть, взломав сервер ключ не передаётся с клиента на сервер, а во время авторизации клиент доказывает серверу, что владеет ключом, та самая криптографическая магия.
Типы шифрования ключей
Программа ssh-keygen
можен генерировать четыре типа ключей:
RSA
этот алгоритм обеспечивает наилучшую совместимость из всех, но требует большего размера ключа для обеспечения достаточной безопасности. Длина ключа по умолчанию составляет 3072 бит, но вы можете самостоятельно задать его размер от 1024 до 16384 бит с помощью опции -b команды ssh-keygenDSA
криптографический алгоритм с использованием открытого ключа для создания электронной подписи, но не для шифрования. Это значит, что только один узел сможет подписать сообщение, а другие смогут только проверить ее на корректность. Алгоритм основан на вычислительной сложности взятия логарифмов в конечных полях. Алгоритм DSA в сравнении с RSA показывает лучшие показатели при генерации подписи, но уступает по времени при ее проверке. Также отметим, что максимальная длина ключа данного типа — 1024 бит. Это не самый безопасный показатель в защите от взломаECDSA
это реализация схемы цифровой подписи, основанная на использовании эллиптических кривых и модульной арифметики. Производительность данного алгоритма быстрее, чем у алгоритма RSA, так как для обеспечения шифрования требуются ключи гораздо меньшего размера. Однако у него есть минус: он более уязвим перед взломом с помощью квантовых вычислений, чем RSAED25519
это схема подписи на эллиптической кривой, которая обеспечивает лучшую безопасность, чем ECDSA и DSA, и хорошую производительность. Его главными преимуществами являются скорость. Однако данный алгоритм поддерживается только в версиях от OpenSSH 6.5.ECDSA-SK
иED25519-SK
это те же ECDSA и ED25519, но поддерживающие аппаратный аутентификатор. Данные алгоритмы появились не так давно в версии OpenSSH 8.2. Они позволяют реализовать двухфакторную аутентификацию с помощью устройств, которые поддерживают протокол FIDO/U2F. Существует множество разновидностей физической аутентификации, например USB-токен, или другие виды устройств, подключаемые к оборудованию с помощью Bluetooth или NFC
Генерация ключа
Свой ключ можно сгенерировать с помощью команды:
ssh-keygen
Ключ можно закрыть паролем, пароль спрашивается один раз и сохраняется некоторое время. Если пароль указать пустым, он спрашиваться при использовании не будет. Восстановить забытый пароль невозможно. Сменить пароль на ключ можно с помощью команды:
ssh-keygen -p
Чтобы выбрать любой подходящий тип из перечисленых:
- dsa
- ecdsa
- ed25519
- rsa
Используется опция -t
:
ssh-keygen -t тип
Структура ключа
~/.ssh/id_rsa.pub
открытый ключ. Его копируют на сервера, куда нужно получить доступ.
~/.ssh/id_rsa
закрытый ключ. Его нельзя никому показывать. Если вы в письмо/чат скопипастите его вместо pub, то нужно генерировать новый ключ.
Копирование ключа на сервер
В каталоге пользователя, под которым вы хотите зайти на сервер, если создать файл ~/.ssh/authorized_keys
и положить туда открытый ключ, то можно будет заходить без пароля. Обратите внимание, права на файл не должны давать возможность писать в этот файл посторонним пользователям, иначе ssh его не примет.
В ключе последнее поле user@machine
. Оно не имеет никакого отношения к авторизации и служит только для удобства определения где чей ключ. Заметим, это поле может быть поменяно (или даже удалено) без нарушения структуры ключа.
Если вы знаете пароль пользователя, то процесс можно автоматизировать, команда позволяет скопировать ключ не редактируя файлы вручную:
ssh-copy-id user@server
Пример боевой команды:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server.beget.tech