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