Настройка беспарольной аутентификации по SSH на сервере FreeBSD

Published by Leave your thoughts

SSH (или secure shell) – это сетевой протокол, который защищает взаимодействие с сервером путём шифрования данных. SSH – самый распространённый способ взаимодействия с сервером FreeBSD. Существует несколько способов аутентификации, но данное руководство охватывает только беспарольную аутентификацию по SSH.

Как работают SSH-ключи?

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

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

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

Закрытый ключ работает подобно паролю, его нужно хранить на клиентской машине. Закрытый ключ нельзя разглашать. Если сторонний пользователь получит ваш закрытый ключ, он сможет получить доступ к серверу; такой ключ нужно срочно заменить. Длина закрытого ключа обычно составляет, по меньшей мере, 2048 бит. Его можно дополнительно защитить с помощью парольной фразы (это пароль, который запрашивается при попытке использовать закрытый ключ). Парольная фраза может защитить ключ в случае несанкционированного доступа.

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

Чтобы настроить аутентификацию на основе SSH-ключей, нужно добавить открытый ключ в аккаунт пользователя на удалённом сервере. Открытый ключ должен храниться в специальном файле в домашнем каталоге удалённого пользователя (.ssh/authorized_keys).

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

Создание ключей SSH

Создайте SSH-ключи на локальном компьютере.

Для этого используется утилита ssh-keygen. Она по умолчанию создаёт 2048-битный RSA-ключ, такой ключ подойдёт в большинстве случаев.

Введите в терминал:

ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):

Вы можете принять место хранения ключей по умолчанию или указать свой путь к ключам. По умолчанию ключи находятся в каталоге .ssh в домашнем каталоге пользователя. Файл закрытого ключа называется id_rsa, а открытый ключ находится в id_rsa.pub.

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

Если вы создавали SSH-ключи раньше, на экране может появиться запрос:

/home/username/.ssh/id_rsa already exists.
Overwrite (y/n)?

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

Далее будет запрошена парольная фраза.

Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

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

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

Your identification has been saved in /home/8host/.ssh/id_rsa.
Your public key has been saved in /home/8host/.ssh/id_rsa.pub.
The key fingerprint is:
76:e2:bc:19:18:b3:35:59:f4:54:b9:d3:bc:d0:56:a1 username@localcomputer
The key's randomart image is:
+--[ RSA 2048]----+
|          . ...o.|
|         . o  o .|
|          . .E.+.|
|         o   .ooo|
|      o S .   o..|
|       X +     . |
|      o +        |
|         +       |
|        o        |
+-----------------+

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

Копирование открытого ключа на сервер

Добавить открытый ключ на сервер можно несколькими способами.

Примечание: На каждый сервер можно добавить неограниченное количество SSH-ключей.

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

Копирование ключа с помощью ssh-copy-id

Если на локальном компьютере установлена утилита ssh-copy-id, с её помощью вы можете быстро добавить открытый ключ на удалённый сервер. Обычно (но не всегда) утилита ssh-copy-id включена в пакет OpenSSH.

Чтобы узнать, есть ли эта утилита на локальном компьютере, просто попробуйте запустить её. Если она не установлена, на экране появится ошибка:

Command Not Found

Вы можете установить её или воспользоваться другим методом копирования ключа.

В команде ssh-copy-id нужно указать IP-адрес или доменное имя, а также имя пользователя, для которого нужно добавить эти SSH-ключи.

ssh-copy-id username@remote_host

Команда может вернуть:

The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe.
Are you sure you want to continue connecting (yes/no)? yes

Это значит, что локальный компьютер не узнаёт удалённый сервер, потому что ранее SSH-ключи никогда не использовались при аутентификации. Чтобы продолжить, введите yes и нажмите RETURN.

Утилита сканирует локальную учетную запись пользователя в поисках открытого ключа, id_rsa.pub. Когда она найдёт нужный файл, она запросит пользователя удалённого сервера.

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
username@111.222.11.222's password:

Введите пароль и нажмите RETURN. Утилита подключится к аккаунту пользователя на удалённом хосте и установит открытый ключ; это происходит путём копирования содержимого файла id_rsa.pub в файл .ssh/authorized_keys в домашнем каталоге удалённого пользователя.

Если копирование прошло успешно, на экране появится:

Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'username@111.222.11.222'"
and check to make sure that only the key(s) you wanted were added.

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

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

Копирование ключа через SSH

Если на вашем сервере нет утилиты ssh-copy-id, но есть парольный SSH-доступ к серверу, вы можете установить открытый ключ с помощью SSH-клиента.

Для этого нужно вывести открытый ключ на локальном компьютере и передать его по SSH на удалённый сервер. На удалённом сервере нужно создать каталог ~/.ssh (если такого каталога нет), а затем добавить открытый ключ в файл authorized_keys в этом каталоге. Используйте перенаправление потока >>, чтобы вставить ключ в файл authorized_keys (если ранее вы добавляли SSH-ключи на удалённый сервер, такой файл уже существует; при этом ключи не будут переписаны новыми ключами).

Если вы не изменили название файла открытого ключа по умолчанию (id_rsa.pub), используйте эту команду:

cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Команда может вернуть такое сообщение:

The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe.
Are you sure you want to continue connecting (yes/no)? yes

Это значит, что локальный компьютер не узнаёт удалённый сервер, потому что ранее SSH-ключи никогда не использовались при аутентификации. Чтобы продолжить, введите yes и нажмите RETURN.

Команда запросит пароль удалённого пользователя:

username@111.222.11.222 password:

Введите пароль и нажмите RETURN. Если команда выполнена успешно, она не вернёт никакого вывода. Ключ id_rsa.pub будет добавлен в файл authorized_keys.

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

Копирование ключа вручную

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

Процесс не меняется: вам нужно взять открытый ключ на локальной машине и добавить его в .ssh/authorized_keys в домашнем каталоге удалённого пользователя.

Войдите на удалённый сервер:

ssh username@remote_host

При этом может появиться сообщение:

The authenticity of host '111.222.11.222 (111.222.11.222)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ab:e6:6d:12:fe.
Are you sure you want to continue connecting (yes/no)? yes

Это значит, что локальный компьютер не узнаёт удалённый сервер, потому что ранее SSH-ключи никогда не использовались при аутентификации. Чтобы продолжить, введите yes и нажмите RETURN.

После этого будет запрошен пароль удалённого пользователя:

Password for username@111.222.11.222:

Создайте каталог .ssh в домашнем каталоге удалённого пользователя, если такого каталога пока что нет:

mkdir -p ~/.ssh

Вернитесь на локальную машину и запросите открытый SSH-ключ:

cat ~/.ssh/id_rsa.pub

Скопируйте вывод в буфер, затем откройте файл authorized_keys в текстовом редакторе:

ee ~/.ssh/authorized_keys

Вставьте в него открытый ключ, а затем сохраните и закройте файл (Esc, a, a).

Открытый ключ SSH теперь добавлен на удалённый сервер.

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

Если ключ был успешно добавлен на удалённый сервер FreeBSD, у вас получится подключиться к серверу без пароля удалённого пользователя.

ssh username@remote_host

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

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

Отключение парольной аутентификации

Если настройка беспарольной аутентификации по SSH прошла успешно, нужно отключить парольную аутентификацию. Это сделает сервер неуязвимым для brute force атак.

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

Войдите на удалённый сервер с помощью ключей как пользователь root или sudo. Откройте конфигурационный файл демона SSH:

sudo ee /etc/ssh/sshd_config

В этом файле найдите директиву ChallengeResponseAuthentication. Она может быть закомментирована. Раскомментируйте её и установите значение no:

ChallengeResponseAuthentication no

Сохраните и закройте файл.

Чтобы изменения вступили в силу, перезапустите сервис sshd:

sudo service sshd restart

Теперь доступ к серверу можно получить только по SSH-ключам.

Заключение

Теперь сервер защищён от несанкционированного доступа и brute force атак. Кроме того, во время аутентификации вам не нужно указывать пароль пользователя.

Tags: ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>