Аутентификация по SSH с помощью ключей RSA.
Для чего
Во-первых, повышение безопасности целевой системы. Если вы хоть иногда просматриваете логи своего сервера (роутера), то вам наверняка попадались записи о попытках подбора пароля. Что-то типа
Failed password for admin from 5.15.18.25 port 22 ssh2
RSA-ключ длиной 4096 бит в настоящее время представляет собой математическую головоломку, решение которой не укладывается в обозримый временной промежуток. Так что вероятность его прямого подбора невозможна в принципе.
Во-вторых, расширение возможностей. С включением авторизации по паре ключей RSA вы получаете удобную плюшку в виде возможности автоматического входа на сервер через различные инструменты автоматизации рутинных задач.
В-третьих, повышение уровня комфорта. Когда число управляемых серверов (роутеров) измеряется десятками, то однажды можно устать набирать пароли и/или запоминать их.
Немного теории
Аббревиатура RSA образована из фамилий трёх человек: Рональда Ривеста (Ronald Linn Rivest), Ади Шамира (Adi Shamir) и Леонарда Адлемана (Leonard Max Adleman). Они и предложили миру криптографическую систему, состоящую из открытого и закрытого ключей, которые вычисляются с помощью математических действий. Прямая дешифрация такого ключа является задачей разложения его на простые множители. Предполагается, что решение этой задачи является вычислительно сложным и не может быть завершено в какой-то разумный срок, что и является основой стойкости данной криптосистемы.
Разумеется, данная криптосистема не лишена слабых сторон и подвергается изучению практически с момента создания со стороны пытливых умов. Интересующимся — поиск в помощь.
Договоримся, что RSA-ключ, RSA-пара, ключи RSA в общем случае обозначают криптографическую систему в целом. А когда это будет необходимо, будем явно указывать, какой ключ имеется в виду.
Подготовка
Для получения открытого (публичного, public key) и закрытого (приватного, private key) ключей необходимо воспользоваться генератором, который есть на любой linux/freebsd-машине
$ ssh-keygen
По умолчанию генератор создает 2048-битную ключевую пару, но при желании его можно запустить с флагом
$ ssh-keygen -b 4096
и получить пару 4096-битных ключей.
Для учебных целей можете воспользоваться он-лайн генератором, которых чуть более девяти тысяч, но в боевом применении этого делать не стоит по очевидным причинам.
Шаги работы команды при её первом запуске будут выглядеть примерно так
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/fooname/.ssh/id_rsa):
Если вы согласны сохранить ключи в свой домашний каталог, жмите Enter. Если есть возражения, поменяйте путь и жмите Enter.
Будьте внимательны! Если вы однажны уже сгенерировали ключи и забыли об этом, генератор вас предупредит
/home/fooname/.ssh/id_rsa already exists. Overwrite (y/n)?
Если вы ответите утвердительно (y, yes), старые ключи будут перезаписаны, и вы не сможете ими воспользоваться. При возникновении сомнений смените путь и/или имя файла.
Далее.
Created directory '/home/fooname/.ssh'.
Enter passphrase (empty for no passphrase):
Парольная фраза необходима для того, чтобы даже при настроенной авторизации по ключевой паре подтверждать вход паролем. Скажем сразу — это не подходит для автоматизации задач. Повторяем ввод парольной фразы (или жмём Enter, если её не будет)
Enter same passphrase again:
В итоге генератор сообщит,
Your identification has been saved in /home/fooname/.ssh/id_rsa.
Your public key has been saved in /home/fooname/.ssh/id_rsa.pub.
куда положил ключи, а также представит отпечаток и его визуализацию
The key fingerprint is:
SHA256:qjpato4JM8d5DocJ72/ywmR0t13+P4ubmZOmU6bRQ68 fooname@fooserver
The key's randomart image is:
+---[RSA 2048]----+
| |
| |
| |
|. . . . . |
|.. . . oSo o . |
| +o+ ... o = . |
|++@ o . * + |
|.X=*.. o E=. |
|+o=O= .+*+oo |
+----[SHA256]-----+
Здесь fooname@fooserver к отпечатку не относится, а имеет смысл комментария, чтобы не запутаться, с каким пользователем и сервером этот отпечаток ассоциирован.
Теперь у вас есть пара RSA-ключей. Обращаем ваше внимание, что она находится на некой linux/freebsd-машине, которую вы использовали для генерации. Целевая система (то есть к которой необходимо настроить доступ) может находиться где-то еще. Следовательно, после копирования ключей (о чём ниже) их следует затереть во избежание компрометации
$ rm -rf ~/.ssh
Если же это подконтрольная вам система, и вы понимаете, что делаете, ключи можно оставить.
Размещение ключей на linux-сервере
Не будем останавливаться на копировании открытого ключа с помощью утилиты ssh-copy-id, потому что есть она не везде, делает всё за нас, в этой связи суть происходящего ускользает. Желающие могут воспользоваться поиском.
Итак. Получаем созданный открытый ключ
$ cat ~/.ssh/id_rsa.pub
который будет выглядеть вот так
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDl/uAR6vX14P8s7foYnNZIm64/EM5m16j+cgn5Vc9ENtAjas795wso+qGV9sE4nfPPxFtVdGjLKS5FLyAfjPAsUGcEdae66MvtPXgtH9bciNbbK2kSBG+R0m3z6/Y5D11ofPMkOR8wAF443g1kHz+woA+jRKEN4wKuAqspWYBJPX6j4bB68L20J5ET/svqE7zsVeIWMCxmgxufidCOifHTQyspOjXiR7dYBLynhvmPFP2QJofG1lCFB9+5PT2SSzJTL8J5SMPZdAvzloMztIRMPU/+vTJSjgk+sdWO0rgAwGEOMrd3++sFRfFrxjJ0Mld1spamVtWmBLlgHk0K5yDz fooname@fooserver
Логинимся на целевую систему и переходим в свой домашний каталог (или переходим в каталог пользователя, если вы под root)
$ cd ~
Создаем папку для хранения ключей, копируем все символы ключа (начиная с ssh-rsa и до fooname@fooserver включительно) и вставляем в файл authorized_keys
$ mkdir -p .ssh
$ echo скопированные_символы_ключа >> .ssh/authorized_keys
Сразу настраиваем права доступа, чтобы посторонние не могли туда попасть,
$ chmod -R go= .ssh
удалив доступ для «group» и «other». А если вы под root, то меняем еще и владельца
$ chown -R fooname:fooname .ssh
Теперь целевая система «знает» о вас.
Проделав выше приведённые манипуляции вручную, мы посмотрели, что стоит за работой утилиты ssh-copy-id, и можем легко и непринуждённо копировать наши ключи куда угодно с соблюдением необходимых мер безопасности.
Размещение ключей на роутере Mikrotik
Для импорта открытого ключа на Mikrotik воспользуемся Winbox.
Известным нам способом получаем созданный открытый ключ
$ cat ~/.ssh/id_rsa.pub
который, напоминаем, выглядит так
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDl/uAR6vX14P8s7foYnNZIm64/EM5m16j+cgn5Vc9ENtAjas795wso+qGV9sE4nfPPxFtVdGjLKS5FLyAfjPAsUGcEdae66MvtPXgtH9bciNbbK2kSBG+R0m3z6/Y5D11ofPMkOR8wAF443g1kHz+woA+jRKEN4wKuAqspWYBJPX6j4bB68L20J5ET/svqE7zsVeIWMCxmgxufidCOifHTQyspOjXiR7dYBLynhvmPFP2QJofG1lCFB9+5PT2SSzJTL8J5SMPZdAvzloMztIRMPU/+vTJSjgk+sdWO0rgAwGEOMrd3++sFRfFrxjJ0Mld1spamVtWmBLlgHk0K5yDz fooname@fooserver
Выделяем все без исключения символы и сохраняем в какой-нибудь файл (хоть в Проводнике, хоть в Far'е). Желательно с понятным именем и расширением, например id_rsa.pub. Затем, используя Winbox, копируем файл на роутер
Открываем список пользователей и переходим на вкладку SSH Keys. Нажимаем кнопку Import SSH Key, в поле User пишем имя существующего пользователя, которому будет соответствовать наш ключ, выбираем файл с ключом из списка и нажимаем кнопку Import SSH Key.
Если все выполнено правильно, картинка будет выглядеть так
Теперь на роутер можно попасть, используя RSA-ключи.
Подключение к целевой системе
Для того, чтобы получить доступ к целевой системе по SSH с использованием RSA-ключа, необходимо импортировать в неё открытый ключ, как мы выяснили выше по тексту.
Теперь разбираемся с закрытым ключом.
Если подключение к целевым системам будет осуществляться из той системы, где была сгенерирована ключевая пара, то закрытый ключ уже лежит на своем месте в вашем домашнем каталоге
$ ls -l ~/.ssh
total 8
-rw------- 1 fooname fooname 1675 мая 8 21:01 id_rsa
-rw-r--r-- 1 fooname fooname 405 мая 8 21:01 id_rsa.pub
с именем id_rsa. Можете даже заглянуть в него
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
... ... ...
-----END RSA PRIVATE KEY-----
Выполнив команду на подключение,
$ ssh fooname@fooserver
вы сразу попадёте в консоль целевой системы. Если что-то пошло не так, проверьте всё с самого начала.
Для случая, когда подключение к целевой системе будет осуществляться из какого-то совсем иного места, то есть другой linux/freebsd-машины, необходимо на этой другой машине в свой домашний каталог поместить закрытый ключ с выставлением необходимых прав.
Использование RSA-ключа в PUTTY
Нередко (а даже наиболее больше максимально часто) администратор использует windows-машину на своем рабочем месте. К счастью, для windows-среды существует совершенно прекрасный SSH-клиент PUTTY, который, к тому же, умеет много чего еще. Давайте разберемся, как с его помощью воспользоваться RSA-ключом.
Для начала посетим сайт PuTTY и скачаем отсюда PuTTY Key Generator, который потребуется нам для конвертации нашего закрытого ключа. Затем получаем содержимое нашего закрытого ключа
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
... ... ...
-----END RSA PRIVATE KEY-----
и копируем его полностью.
Открываем Блокнот, вставляем скопированные данные и сохраняем файл без расширения, не забыв при этом указать тип файла Все файлы. В принципе ничего страшного не произойдет, если сохранить файл с расширением .txt, но на наш взгляд это немного неряшливо.
Запускаем скачанный ранее PuTTY Key Generator (puttygen.exe), заходим в пункт меню Conversions и выбираем Import Key
Будет выполнено чтение и загрузка нашего закрытого ключа. Далее жмём кнопку Save private key
Если PuTTYgen спросит нас,
(Вы уверены, что хотите сохранить этот ключ, не защитив его парольной фразой?) отвечаем Да и сохраняем файл с понятным именем. Обратите внимание, что теперь тип файла будет PuTTYgen Private Key Files и расширение .ppk.
Чтобы наконец воспользоваться новым функционалом, запускаем putty.exe и в дереве параметров идем в Connection -> SSH -> Auth, где в поле Private key file for authentication нажимаем кнопку Browse... и выбираем наш сконвертированный файл закрытого ключа с расширением .ppk
После этого возвращаемся в узел Session, задаем имя сессии и нажимаем кнопку Save
Таким образом мы получили сохраненную сессию, которая содержит настройки для авторизации с помощью RSA.
Чтобы подключиться к целевой системе, необходимо запустить PUTTY, выбрать созданную нами сессию и нажать Load для загрузки настроек, затем указать DNS-имя (или ip-адрес), порт и нажать Open. После чего мы должны оказаться в командной строке под своей учетной записью. Если этого не произошло, пройдитесь внимательно по всем шагам еще раз.
Заключение
Последним шагом в настройке безопасного входа по SSH является отключение возможности входа с паролем. В разных системах и устройствах настройка может отличаться, но, к примеру, в linux/freebsd-системах это делается через редактирование файла конфигурации службы ssh
...
PubkeyAuthentication yes
...
PasswordAuthentication no
То есть раскомментировать указанные строки (если они закомментированы) и установить сооветствующий режим.
В роутерах Mikrotik возможность входа с паролем автоматически отключается после импорта открытого ключа, как указано в инструкции.
Несмотря на то, что криптосистема RSA является одной из самых распространенных, протокол SSH позволяет использовать для аутентификации ключи криптосистем DSA, ECDSA и других. Использование каждой из них должно соответствовать вашей задаче. Подробно о протоколе SSH можно почитать в документах Совета Интернета..