Как настроить аутентификацию SSH на основе ключей в Linux

Secure Shell, сокращенно SSH, – это криптографический сетевой протокол, позволяющий осуществлять безопасный доступ к удаленной системе через незащищенную сеть интернет.

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

SSH предоставляет четыре метода аутентификации: парольная аутентификация, ключевая аутентификация, аутентификация на хосте и клавиатурная аутентификация.

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

При парольной аутентификации все, что вам нужно, – это пароль пользователя удаленной системы. Если вы знаете пароль удаленного пользователя, то можете получить доступ к соответствующей системе с помощью команды ssh user@remote-system-ip.

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

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

Что такое аутентификация на основе ключей SSH?

Аутентификация на основе ключей SSH – это метод аутентификации пользователя на сервере SSH с помощью пары криптографических ключей. Ключи генерируются с помощью генератора пар ключей, например, команды ssh-keygen. Закрытый ключ хранится в секрете у пользователя, а открытый ключ передается SSH-серверу.

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

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

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

Вот шаги по настройке аутентификации на основе ключей SSH:

  • Сгенерируйте пару ключей на своем компьютере с помощью команды ssh-keygen.
  • Скопируйте открытый ключ в файл authorized_keys SSH-сервера.
  • Отключите аутентификацию по паролю на SSH-сервере.
  • После настройки аутентификации по ключу SSH вы сможете подключаться к SSH-серверу без ввода пароля.

Преимущества аутентификации на основе ключей

Вот некоторые преимущества аутентификации на основе ключей SSH:

  1. Повышенная безопасность: Аутентификация на основе ключей SSH значительно надежнее, чем аутентификация на основе паролей. Она устойчива к атакам методом перебора, и вероятность ее угадывания или взлома крайне мала.
  2. Защита от кражи паролей: Поскольку в процессе аутентификации не используются пароли, нет риска, что кто-то перехватит и украдет ваш пароль.
  3. Пары ключей для пользователя и сервера: Пары ключей SSH состоят из открытого и закрытого ключа. Открытый ключ размещается на сервере, а закрытый – на клиентской машине. Такое разделение обеспечивает дополнительный уровень безопасности, поскольку закрытый ключ никогда не покидает ваше устройство.
  4. Удобство: После настройки аутентификация на основе ключей SSH позволяет входить в систему без необходимости запоминать или набирать пароли. Это особенно удобно при частом входе в систему или при автоматизации задач.
  5. Автоматизация и сценарии: Аутентификация на основе ключа SSH широко используется в автоматизации и сценариях, поскольку позволяет процессам безопасно подключаться к удаленным серверам без ручного ввода пароля.
  6. Поддержка многофакторной аутентификации (MFA): Аутентификация на основе ключа SSH может использоваться совместно с MFA, обеспечивая дополнительный уровень безопасности за счет требования второго фактора аутентификации (например, парольной фразы или аппаратного маркера) в дополнение к ключу, парольная фраза или аппаратный токен) в дополнение к ключу.
  7. Отмена и управление ключами: Если закрытый ключ скомпрометирован или по каким-либо причинам должен быть отозван, вы можете просто удалить соответствующий открытый ключ из списка авторизованных ключей на сервере. Такой непосредственный контроль над доступом является преимуществом.
  8. Аудит и подотчетность: Аутентификация на основе ключей SSH обеспечивает четкое отслеживание доступа к серверу, поскольку доступ каждого пользователя привязан к его уникальному ключу. Это может быть полезно для обеспечения соответствия нормативным требованиям и контроля безопасности.
  9. Совместимость: Аутентификация на основе ключей SSH широко поддерживается различными операционными системами и клиентами SSH, что делает ее универсальным и кроссплатформенным решением.
  10. Снижение усталости от паролей: Пользователям не нужно запоминать или управлять сложными паролями для нескольких серверов, что снижает риск использования слабых или повторно используемых паролей.
  11. Более длинные ключи: Пары ключей SSH используют более длинные криптографические ключи по сравнению с обычными паролями, что делает их более устойчивыми к атакам.

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

Надеюсь, вы получили основное представление об SSH и методах аутентификации. Теперь давайте перейдем к рассмотрению пошаговой настройки аутентификации на основе ключей SSH в Linux.

Настройка аутентификации на основе ключа SSH в Linux

Для целей данного руководства я буду использовать две системы Debian Linux. Debian 11 с IP-адресом 192.168.1.101 является локальной системой, а сервер Debian 12 с IP-адресом 192.168.1.20 выступает в качестве удалённой системы, т.е. ssh-сервера.

Шаг 1: Создание пары ключей SSH в локальной системе

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

Не создавайте пары ключей от имени *root, так как только root сможет использовать эти ключи. Создавайте ключевые пары от имени обычного пользователя.

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

ssh-keygen

Приведенная выше команда создаст 3072-битную пару ключей RSA. Введите ключевую фразу дважды. Что еще более важно, запомните свою ключевую фразу. Она понадобится позже.

Пример вывода:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/ostechnix/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ostechnix/.ssh/id_rsa
Your public key has been saved in /home/ostechnix/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ostechnix@pvedebian
The key's randomart image is:
+---[RSA 3072]----+
Bo..o..o.o |
|* =.o.o  o . |
|.+ + o+.. |
|..o =.E+ |
|oX + .. S |
|O * o |
|++ = |
|.oX |
|*=o+ |
+----[SHA256]-----+

В случае если вы уже создали пару ключей, вы увидите следующее сообщение. Просто введите y, чтобы перезаписать существующий ключ.

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

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

Если вы не хотите вводить ключевую фразу (это небезопасно), просто дважды нажмите клавишу ENTER, когда вам будет предложено ввести ключевую фразу. Однако я рекомендую использовать парольную фразу.

Использование ssh-ключа без пароля, как правило, не является хорошей идеей с точки зрения безопасности. Их использование должно быть ограничено очень специфическими случаями, такими как доступ служб к удаленной системе без участия пользователя (например, удаленное резервное копирование с помощью rsync, unison, …).

Если у вас уже есть ssh-ключ без парольной фразы в приватном файле ~/.ssh/id_rsa и вы хотите обновить ключ с парольной фразой, используйте следующую команду:

ssh-keygen -p -f ~/.ssh/id_rsa

Пример вывода:

Enter new passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved with the new passphrase.

Шаг 2: Копирование открытого ключа SSH на SSH-сервер (удаленная система)

Мы создали пару ключей в локальной системе. Далее скопируйте открытый ключ SSH на ваш удаленный SSH-сервер с помощью команды:

ssh-copy-id ostechnix@192.168.1.20

Здесь я буду копировать открытый ключ локальной системы (Debian 11 Desktop) на удаленную систему (Debian 12 Server в моем случае).

Технически говоря, приведенная выше команда скопирует содержимое файла ~/.ssh/id_rsa.pub key локальной системы в файл ~/.ssh/authorized_keys удаленной системы.

Наберите yes для продолжения соединения с удалённым SSH-сервером, а затем введите пароль sudo удалённой системы.

/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
ostechnix@192.168.1.20's password: Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ostechnix@192.168.1.20'"
and check to make sure that only the key(s) you wanted were added.

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

ssh-copy-id -f ostechnix@192.168.1.20

Мы успешно добавили открытый ключ SSH локальной системы в удаленную систему.

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

Шаг 3. Отключение парольной аутентификации SSH на удаленном SSH-сервере

Вы должны выполнить следующие команды от имени пользователя root или sudo.

Для отключения парольной аутентификации перейдите на консоль удаленной системы и отредактируйте файл конфигурации /etc/ssh/sshd_config с помощью любого редактора:

sudo nano /etc/ssh/sshd_config

Найдите следующую строку. Откомментируйте ее и установите значение no.

PasswordAuthentication no

Перезапустите службу sshd, чтобы изменения вступили в силу.

sudo systemctl restart sshd

Шаг 4: Проверка аутентификации на основе ключа SSH

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

Зайдите в локальную систему и по протоколу SSH войдите на удаленный сервер, используя команду:

ssh ostechnix@192.168.1.20

Вам будет предложено ввести ключевую фразу для входа в удаленную систему по протоколу ssh. Введите пароль для ключа и нажмите клавишу ENTER.

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

Enter passphrase for key '/home/sk/.ssh/id_rsa': 
Last login: Thu Sep  7 14:12:11 2023 from 192.168.1.101
ostechnix@debian12:~$ 

Как вы заметили, мы вошли в учетную запись удаленной системы, используя парольную фразу, которую создали ранее с помощью команды ssh-keygen, а не используя реальный пароль удаленной учетной записи пользователя.

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

Если вы попытаетесь выполнить ssh с другой клиентской системы, то получите следующее сообщение об ошибке. Например, я попытался войти по SSH на свой сервер Debian 12 с одной из систем Ubuntu, используя команду:

ssh sk@192.168.1.20
  • Пример вывода:*
The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is 67:fc:69:b7:d4:4d:fd:6e:38:44:a8:2f:08:ed:f4:21.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.20' (ECDSA) to the list of known hosts.
Permission denied (publickey).

Как видно из приведенного выше результата, я не могу подключиться к удаленному SSH-серверу с других систем.

Шаг 5: Добавление ключей новой клиентской системы на SSH-сервер

Это очень важно. Как я уже говорил, вы не сможете получить доступ к удаленной системе через SSH, кроме той, которую вы настроили (в нашем случае это Debian 11 Desktop).

Я хочу дать разрешения на доступ к удаленному SSH-серверу большему количеству клиентов. Что я должен сделать? Просто. Вам нужно сгенерировать пару ключей SSH во всех клиентских системах и вручную скопировать открытый ключ ssh на удаленный сервер, к которому вы хотите получить доступ по SSH.

Для создания пары ключей SSH в клиентских системах выполните:

ssh-keygen

Введите ключевую фразу дважды. После создания пары ключей скопируйте открытый ssh-ключ (не закрытый) на удаленный сервер вручную.

Отобразите pub-ключ с помощью команды:

cat ~/.ssh/id_rsa.pub

Вы должны увидеть результат, как показано ниже.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCt3a9tIeK5rPx9p74/KjEVXa6/OODyRp0QLS/sLp8W6iTxFL+UgALZlupVNgFjvRR5luJ9dLHWwc+d4umavAWz708e6Na9ftEPQtC28rTFsHwmyLKvLkzcGkC5+A0NdbiDZLaK3K3wgq1jzYYKT5k+IaNS6vtrx5LDObcPNPEBDt4vTixQ7GZHrDUUk5586IKeFfwMCWguHveTN7ykmo2EyL2rV7TmYq+eY2ZqqcsoK0fzXMK7iifGXVmuqTkAmZLGZK8a3bPb6VZd7KFum3Ezbu4BXZGp7FVhnOMgau2kYeOH/ItKPzpCAn+dg3NAAziCCxnII9b4nSSGz3mMY4Y7 ostechnix@pvedebian

Скопируйте все содержимое (на USB-накопитель или любой другой носитель) и перейдите в консоль удаленного сервера. Создайте каталог ssh в домашнем каталоге, как показано ниже.

mkdir -p ~/.ssh

Следующим шагом добавьте pub-ключ вашей клиентской системы, сгенерированный на предыдущем шаге, в файл с именем ~/.ssh/authorized_keys:

echo {Your_public_key_contents_here} >> ~/.ssh/authorized_keys

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

Если ручное добавление ssh pubkey кажется сложным, временно включите аутентификацию по паролю в удаленной системе, скопируйте ключ с помощью команды ssh-copy-id из локальной системы и отключите аутентификацию по паролю.

Заключение

SSH Аутентификация на основе ключей обеспечивает дополнительный уровень защиты ваших Linux-серверов от атак типа brute-force. Как видите, настройка аутентификации на основе ключей не так уж и сложна. Использование аутентификации на основе ключа является одним из рекомендуемых методов обеспечения безопасности Linux-сервера.

Часто задаваемые вопросы

✅ Что такое аутентификация на основе ключа SSH?

Аутентификация на основе ключа SSH – это безопасный метод входа в удаленные системы или серверы по сети. Вместо пароля для подтверждения личности используется пара криптографических ключей – открытый ключ и закрытый ключ.

✅ Как работает аутентификация на основе ключа SSH?

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

✅ Каковы преимущества аутентификации на основе ключей SSH?

Вот список важных особенностей.- Повышенная безопасность: Ключи SSH значительно труднее взломать, чем пароли, что делает этот метод аутентификации более надежным.- Удобство: Один раз взломав ключи SSH, вы получаете более надежную аутентификацию. Удобство: После настройки вы можете входить в систему без ввода пароля каждый раз.- Автоматизация: Ключи SSH обычно используются для автоматизированных процессов, таких как обмен данными между серверами или выполнение сценариев без вмешательства пользователя.- Уменьшение опасности использования паролей: Поскольку вы не вводите пароли, нет риска перехвата пароля при входе в систему.

✅ Как создать SSH-ключи?

Вы можете создать SSH-ключи с помощью команды ssh-keygen на вашей локальной машине. При этом будет создана пара ключей – открытый и закрытый. Обычно они находятся в каталоге .ssh пользователя.

✅ Можно ли использовать одну и ту же пару SSH-ключей на нескольких серверах?

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

✅ Как настроить аутентификацию на основе ключей SSH на удаленном сервере?

Обычно вы добавляете свой открытый ключ в файл ~/.ssh/authorized_keys на удаленном сервере. Это позволит серверу распознать открытый ключ при попытке подключения с закрытым ключом.

✅ Что произойдет, если я потеряю закрытый ключ?

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

✅ Совместима ли аутентификация на основе ключа SSH со всеми операционными системами и клиентами SSH?

Да, аутентификация на основе ключа SSH широко поддерживается и может использоваться с различными операционными системами (Linux, macOS, Windows с помощью таких инструментов, как PuTTY) и клиентами SSH.

✅ Можно ли защитить ключи SSH паролем?

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

✅ Подходит ли аутентификация на основе ключа SSH для всех случаев использования?

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

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен ostechnix.com

Похожие статьи

Комментарии (0)