Создание и использование закрытого и открытого ключа в программе ssh
Введение
Для общего понимания ключей рекомендуется прочитать
страницу посвященную ssh-ключам
Все приведенные на этой странице команды будут выполняться в терминале (xterm, terminal, konsole,...), а т.к.
ssh-доступ почти всегда подразумевает работу в командной строке, будем считать, что как выполнять команды Вы знаете.
В примерах ниже мы будем для определенности использовать RSA-ключи, хотя Вы можете использовать и другие виды ключей:
- DSA-ключи: файлы id_dsa*, длина в битах всегда 1024, как требуется по FIPS 186-2
- ECDSA-ключи: в данный момент не поддерживаются на сервере BlueGene
Создание ssh-ключа
Перед созданием ключа убедитесь, что у Вас еще нет ключа:
- ls -l ~/.ssh
- если команда отработала без ошибок и вы получили в выводе файлы id_rsa/id_dsa то у Вас уже есть нужный ключ, создавать не требуется
- если в выводе вы получили файлы id_ecdsa, то ключ у Вас есть, но в данный момент на BlueGene по такому виду ключа не зайти.
- в этом случае придется создать rsa-ключ, можно использовать простой способ
- если ssh-ключа у Вас нет, то требуется создать (можно использовать простой способ)
Простой способ создания ssh-ключей
Для создания ключа введите команду:
ssh-keygen -t rsa
В результате эта команда в интерактивном режиме создаст пару ssh-ключей (открытый и закрытый) типа RSA с длиной ключа 2048 бит.
Местоположение файлов:
- закрытый ssh-ключ (identification): ~/.ssh/id_rsa
- публичный ssh-ключ (public key): ~/.ssh/id_rsa.pub.
При создании генератор запросит пароль, если введете пустой, то пароль зашифрован не будет (если Вы забудете тот пароль, который зашифруете ключ, то воспользоваться ключом больше не сможете).
Универсальный способ создания ssh-ключей
Будем использовать ту же программу (ssh-keygen), но с дополнительными параметрами:
- -t тип-ключа (rsa/dsa/...): какой тип ключа нужен
- -b длина ключа: какой длины (для dsa длина всегда 1024)
- -f имя_ключа: в какой файл сохранять ключ, если мы хотим разные ключи для разных целей (подробнее о том, зачем это может быть нужно можете посмотреть в разделе "Использование нескольких ssh-ключей" на странице посвященную ssh-ключам)
Пример:
- вводите: ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_hpc
- в результате:
- в интерактивном режиме будет создана пара ssh-ключей (открытый и закрытый) типа RSA с длиной ключа 4096 бит (разумеется Вы можете зашифровать закрытую часть ключа паролем).
- ключи:
В дальнейшем не забудьте прописать в настройках программы ssh для данного сервера путь именно к этому закрытому ssh-ключу (в параметре IdentityFile файла ~/.ssh/config), о чем — в следующем разделе.
За более подробной информацией обращайтесь к справочным страницам (man ssh-keygen,
или на сайте OpenBSD ) и
F.A.Q по OpenSSH
Конфигурирование ssh-программы
Хотя в данный момент Вы можете уже пользоваться ssh-ключом для доступа на требуемый сервер, рекомендуется для удобства прописать требуемые параметры, чтобы не вводить заново.
Особенно это актуально в случае, если для разных серверов требуется разный ssh-ключ.
Программа ssh читает настройки из файла
~/.ssh/config, для того, чтобы узнать о
всех доступных параметрах рекомендуем ознакомиться с документацией (man ssh_config
или на сайте OpenBSD), а здесь мы дадим пример, который каждый может переделать под свои нужды.
Допустим вы хотите входить на вычислительный сервер regatta1.cs.msu.ru под пользователем edu-vmk-stud-500-001 и использовать ключ ~/.ssh/id_rsa
В командной строке Вам придется ввести:
ssh regatta1.cs.msu.ru -l edu-vmk-stud-500-001 -i ~/.ssh/id_rsa, где:
- -l: какой логин использовать
- -i: какой ключ использовать (указывается закрытый ssh-ключ (Identity))
- regatta1.cs.msu.ru: на какой сервер заходить.
Довольно длинная команда, но ее можно сильно сократить, для этого нам и нужен
~/.ssh/config
Пример конфигурационного файла ~/.ssh/config:
# настройки для сервера регатта
Hostљregatta
љљљљHostnameљregatta1.cs.msu.su
љљљљUserљedu-vmk-stud-500-001
љљљљIdentityFileљ~/.ssh/id_rsa
Если при наличии этой информации в ~/.ssh/config мы введем
ssh regatta, то мы получим тот же результат, что и в предыдущем случае.
Кратко по параметрам:
- # как и в большинстве конфигурационных файлах unix этот символ используется для комментариев
- Host: имя (множество имен), обозначающие секцию. Если вместо regatta будет, скажем, regatta *, то можно будет вводить не только regatta, но и regatta.cs.msu.su, результат будет одинаковым
- Hostname: какое на самом деле имя сервера использовать
- User: под каким пользователем заходить
- IdentityFile: какой ключ авторизует пользователя, указывается его закрытая часть (т.е. закрытый ssh-ключ)
Зачем полезно указывать ключ —
смотрите на странице по ssh ключам раздел по использованию различных ключей
Получение отпечатка ssh-ключа (fingerprint)
Отпечаток ключа это не публичная и не приватная часть ключа. Её не получится использовать для доступа, но при помощи неё можно проверить, что публичный ключ подлиный(а не повредился при передаче или не был подменён злоумышленником)
Для этого понадобится уже знакомая Вам программа ssh-keygen:
- ssh-keygen -l -f путь_до_публичного_ssh-ключа, т.е:
- если использовался простой метод создания, то: ssh-keygen -l -f ~/.ssh/id_rsa.pub, в результате будет что-то вида
2048 4c:d1:96:6f:dd:e5:67:ce:55:8b:fb:38:b2:a2:63:c5 user@host (RSA)
- для универсального метода Вы должны указать путь до своего ключа, в нашем примере это будет: ssh-keygen -l -f ~/.ssh/id_rsa_hpc.pub, в результате в нашем примере будет
4096 82:80:b0:ab:1c:71:c0:ab:77:bd:8f:62:83:39:15:3b user@host (RSA)
- в наших примерах мы использовали RSA-ключ, а в этом случае можно указывать и закрытый ключ (т.е. без .pub), вывод будет тот же
Пришлите вывод тому, кто спрашивает у Вас отпечаток (если хотите, перенаправьте вывод команды ssh-keygen в файл, но можете и просто скопировать из терминала эту строку в письмо/документ/форму на сайте и т.д.).
Перейти с доступа по паролю на доступ по ключу.
Если у вас уже есть доступ на систему по паролю, но вы хотите перейти на доступ по ключу то вы можете воспользоваться командой ssh-copy-id:
-
ssh-copy-id -i ~/.ssh/id_rsa_hpc.pub edu-vmk-stud-500-001@regatta1.cs.msu.ru
- -i: позволяет указать путь до публичного люча, например: ~/.ssh/id_rsa_hpc.pub (это указывать не обязательно)
- далее следует логин для системы (edu-vmk-stud-500-001) и адресс самой системы(regatta1.cs.msu.ru)
- система спросит у вас пароль и разместит ключ (с правильными правами и в нужном месте).
- после этого можно попробовать зайти на систему. Система проведёт проверку ключа и не будет спрашивать пароль.
- Примечание: для хостинга это не работает (нужен полный shell), возникает ошибка:
invalid characters in scp command!
here:
set -e; \
umask 077; \
keyfile=$HOME/.ssh/authorized_keys ; \
mkdir -p -- "$HOME/.ssh/" ; \
while read alg key comment ; do \
[ -n "$key" ] || continue; \
if ! grep -sqwF "$key" "$keyfile"; then \
printf "$alg $key $comment\n" >> "$keyfile" ; \
fi ; \
done \
'
try using a wildcard to match this file/directory