Аутентификация по 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). Они и предложили миру криптографическую систему, состоящую из открытого и закрытого ключей, которые вычисляются с помощью математических действий. Прямая дешифрация такого ключа является задачей разложения его на простые множители. Предполагается, что решение этой задачи является вычислительно сложным и не может быть завершено в какой-то разумный срок, что и является основой стойкости данной криптосистемы.

Согласно рассылке от 2 декабря 2019 года группе заинтересованных лиц удалось вычислить ключ длиной в 240 десятичных разрядов или 795 бит.

Разумеется, данная криптосистема не лишена слабых сторон и подвергается изучению практически с момента создания со стороны пытливых умов. Интересующимся — поиск в помощь.

Договоримся, что 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 можно почитать в документах Совета Интернета..