Автоматическая SSH-аутентификация по ключу

Обеспечение безопасности передачи данных – приоритетная задача при использовании сервисов с удалённым доступом к данным. Аутентификация на сервере посредством ключа позволяет обеспечить максимальную приватность пользователя, а создание приватного ключа не займёт много времени. В статье мы рассмотрим создание ключа и подключение к удалённому серверу в среде Windows и Ubuntu Linux.

by Veesp, 12 July 2017

Протокол SSH позволяет использовать как аутентификацию с помощью пароля, так и с использованием пары ключей, один из которых хранится на сервере, другой – на машине клиента. Оба метода аутентификации имеют свои преимущества и недостатки.

Аутентификация с помощью пароля

SSH использует множество функций обеспечения безопасности передачи данных для любого способа аутентификации пользователя, в т.ч. при использовании пароля. По сети пароль передается в зашифрованном виде. Это усложняет возможность его кражи путем перехвата сетевого трафика. Пароль не хранится на машине клиента, а использование пустого пароля запрещено по умолчанию. Как правило, сервер предоставляет ограниченное число попыток ввода пароля, что делает неэффективным использование грубой атаки путём подбора с помощью словаря.

Однако зашифрованная передача данных не защищает от слабых паролей. Сложность пароля полностью зависит от пользователя. Слишком простой пароль легко подобрать методами социальной инженерии, а слишком сложный пользователь может забыть. К тому же, парольный доступ не позволяет серверу абсолютно точно идентифицировать клиента. Проверка клиента основана только на правильности ввода пароля.

Плюсы парольного доступа:

Минусы:

Поскольку использование пароля не может обеспечить абсолютной безопасности клиента, при подключении по SSH надёжнее использовать аутентификацию клиента с помощью ключа.

Аутентификация с помощью ключа

Аутентификация по SSH с помощью ключа гораздо безопаснее парольной аутентификации, т.к. обеспечивает более надёжную проверку подлинности пользователя. При аутентификации используются два ключа: публичный и приватный. Публичный ключ хранится на сервере и представляет собой цифровой «замок», который можно открыть только с помощью ключа, который находится у клиента.

Если кто-либо захочет получить доступ к данным на сервере, ему сначала придётся завладеть цифровым ключом пользователя. Даже если злоумышленник попытается выступить посредником между сервером и клиентом, пользователь получит сообщение о том, что данные хоста были изменены и передача ключа по этому соединению небезопасна. Следует соблюдать главное правило обеспечения безопасности: секретный ключ действительно должен быть секретным, как со стороны пользователя, так и со стороны сервера. Если кто-то завладеет файлом приватного ключа, то легко сможет получить доступ к серверу. Если же в результате атаки на сервер кто-либо получит доступ к публичным ключам, то сможет выдавать себя за подлинный хост.

Приватный ключ дополнительно можно защитить паролем. Это сильно усложнит попытку взлома, т.к. придётся не только завладеть парой уникальных ключей, но и подобрать к ним пароль.

Один приватный ключ пользователь может использовать для подключения сразу к нескольким серверам. В таком случае на ряд серверов устанавливается один и тот же публичный ключ. Таким образом, клиенту нет необходимости использовать разные ключи к разным серверам или запоминать множество паролей, если используется парольный доступ.

Плюсы аутентификации с помощью ключа:

Минусы ключевой пары:

Генерация ключей на клиентской машине под управлением ОС Windows

Для создания файла ключа нам понадобится программа PuTTYgen. Скачать её можно на официальном сайте в составе пакета PuTTY. С её помощью мы сгенерируем ключ, который будет использоваться для авторизации и аутентификации пользователя на сервере. Если вам необходимо только сгенерировать ключ, утилиту PuTTYgen можно скачать отдельно. При запуске утилиты вы увидите окно с входными параметрами:

При нажатии кнопки Generate программа начнет создание нового ключа. Необходимо подвигать курсором или набрать на клавиатуре случайный набор символов в окне программы для сбора случайных данных. Ключ, сгенерированный программой, будет отличаться от ключа на скриншоте. Процесс генерации отображается на прогрессбаре.

После того, как ключ будет сгенерирован, программа отобразит окно с публичным ключом и отпечатком приватного.

В поле Public key прописана публичная часть ключа, которая будет храниться на сервере. В поле Key comment можно добавить пояснение к ключу. Если у клиента имеются несколько ключей для аутентификации на разных сервисах, там можно прописать название сервера, для которого используется ключ. Отпечаток ключа (fingerprint) необходим для повышения безопасности соединения и точной идентификации хоста. При первом подключении пользователь получит сообщение о том, что данный ключ ранее не использовался для аутентификации пользователя. Если же сообщение выдается повторно, это значит, что на сервере сменились публичные ключи, либо кто-то выдает себя за хост.

В поле Key passphrase можно задать пароль к ключу. В таком случае, при аутентификации пользователя по ключу, сервер будет дополнительно запрашивать пароль. Для сохранения сгенерированного ключа нажмите кнопку Save private key. Если пароль в поле Key passphrase не был задан, прежде, чем сохранить ключ, программа выдаст соотвествующее уведомление.

Ключ будет сохранен в файле с расширением .ppk (PuTTY private key). Данный файл необходимо сохранить в безопасном месте, защищенном от доступа третьих лиц.

Загрузка публичного ключа на сервер

Теперь нам необходимо загрузить публичный ключ на сервер, чтобы мы могли подключаться к нему с помощью приватного ключа. Для этого нам необходимо зайти в PuTTY и подключиться к серверу.

Откройте настройки программы и выберите пункт Session. В поле Host name необходимо прописать адрес сервера, к которому мы будем подключаться. При необходимости также нужно указать порт подключения. После указания всех параметров нажимаем Open.

Откроется окно терминала, в котором нам необходимо ввести имя пользователя и пароль. В нашем случае мы залогинились под пользователем root.

Будьте внимательны при наборе пароля: символы не отображаются во время ввода!

Ключи на сервере хранятся в папке ~/.ssh и прописаны в файле authorized_keys. Для того, чтоб добавить туда наш публичный ключ, необходимо отредактировать файл, например, в консольном текстовом редакторе nano. Открыть файл можно командой:

nano ~/.ssh/authorized_keys

Если программа спросит, точно ли вы хотите отредактировать файл, нажмите Y. В том случае, если в файле находятся другие публичные ключи, вы увидите их в окне терминала.

Во время генерации ключа в PuTTYgen публичная часть отображалась в поле Public key. Если вы не сохранили ключ, откройте файл приватного ключа в PuTTYgen - программа выделит публичный ключ из приватного. Скопируйте его и вставьте в строку терминала в программе nano. Сделать это можно щелчком правой кнопки мыши.

Нажатием Ctrl+X мы выйдем из редактора. Программа ещё раз спросит, сохранять ли изменения в файле. Нажимаем Y и выходим из редактора.

Теперь наш публичный ключ сохранен в файле ключей сервера. Для того, чтобы мы могли использовать наш приватный ключ для подключения, на клиентской машине потребуется утилита Pageant, входящая в состав пакета PuTTY. После запуска значок утилиты появится в трее. Необходимо либо дважды щёлкнуть по нему и открыть окно агента, либо открыть контекстное меню. Выберите пункт Add key и укажите путь к приватному ключу.

Теперь приватный ключ добавлен в базу ключей и при аутентификации сервер больше не станет спрашивать пароль. Во время аутентификации агент должен быть запущен.

Генерация ключей на клиентской машине под управлением ОС Ubuntu

Принцип генерации ключа в Ubuntu не отличается от такового под Windows. Стоит заметить, что пакет PuTTY доступен и в репозиториях Ubuntu Linux. Мы же сгенерируем ключ с помощью другой популярной утилиты – OpenSSH.

Сначала установим пакет из репозиториев с помощью команды:

sudo apt-get install ssh

После того, как пакет будет установлен, мы сгенерируем новый ключ с помощью команды:

ssh-keygen –t rsa

Программа предложит ввести стандартные параметры: имя файла и пароль к приватному ключу. По умолчанию ключ будет сохранен в директории /home/user/.ssh/ в виде двух файлов – id_rsa (приватный ключ) и id_rsa.pub (публичный ключ).

После генерации программа отобразит в окне терминала и отпечаток ключа. Для того, чтобы загрузить ключ на сервер, введем команду:

ssh-copy-id –i ~/.ssh/id_rsa.pub user@server

где user – имя пользователя, которое вы используете для подключения на сервере, а server - адрес вашего сервера, id_rsa.pub – файл публичного ключа.

После успешной аутентификации терминал выдаст приглашение к работе с консолью сервера.

Импортирование файла OpenSSH в PuTTY

Формат файлов ключей OpenSSH отличается от формата ключей PuTTY. Для того, чтобы ключ, созданный в Unix-системе, успешно использовался под ОС Windows в клиенте PuTTY, его необходимо конвертировать. Для этого нужно запустить генератор ключей PuTTYgen и добавить туда файл ключа.

Выберите файл ключа, сгенерированный в Unix-системе. Программа выдаст сообщение о том, что ключ успешно импортирован.

Для сохранения ключа в нужном нам формате необходимо нажать кнопку Save private key. Выберите место хранения ключа и имя файла. Помните, что файл приватного ключа должен быть надёжно защищён от доступа третьих лиц!

Для аутентификации на сервере с помощью PuTTY, нам необходимо добавить наш ключ в базу агента PuTTY (Pageant). Процесс добавления ключа описан выше.

Использование ключевой пары требует первоначальной настройки и генерации ключа, однако упрощает последующий процесс аутентификации и существенно повышает безопасность подключения. Один файл ключа можно использовать для аутентификации на нескольких серверах. В таком случае, один и тот же публичный ключ необходимо добавить на каждый сервер.