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