Сервер в кармане, или просто о сложном!

главная - Статьи - Linux, FreeBSD



Авторизация по ключу SSH

Дата обновления: 20.01.2023

Теги: Linux SSH

SSH (Secure Shell) чаще всего используется для удаленного управления серверами Linux, хотя также может успешно применяться для создания SOCKS, для организации тоннеля при копировании файлов с помощью rsync. По-умолчанию, при создании сервера Linux настроен доступ по SSH по логину/паролю (как правило изначально вы получаете доступ пользователя root по паролю). Пароль можно подобрать. Но если настроить доступ по ключам, то тогда попытки подбора пароля в принципе будут невозможны.

Виды авторизации SSH

Авторизоваться на SSH сервере можно используя:

  1. логин/пароль
    Не обязательно ведет к взлому. Стойкий пароль, использование fail2ban помогут защитить сервер.
     
  2. ключ без пароля
    Безопасно и удобно, вводить пароль не нужно вообще, но надо защищать файлы ключей от копирования - если кто-то скопирует файл ключа, то сможет подключаться к серверу с другого компьютера.
     
  3. ключ с паролем
    "Двухфаторная аутентификация". Мало того, что надо иметь файл ключа, но надо знать также и пароль ключа. Максимальный уровень безопасности.


Как работает SSH по ключам

На сервере SSH (по-умолчанию, в файле ~/.ssh/authorized_keys) находится публичный ключ.

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

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

 

Постановка задачи

Задача: разрешить логин на сервер по SSH только конкретному пользователю vasya.

Считаем, что у Васи домашняя директория на сервере: /home/vasya/.

Важно: настраивая sshd на сервере, надо заранее подумать, что вы будете делать, если вдруг сессия прекратится (неверные настройки, сбой интернет и др.). Это похоже на настройку iptables. Я предполагаю, что хотя бы часть из вас, хотя бы в локальной сети, нарывались на грабли, когда после изменения конфигурации зайти на сервер можно было только локально.

 

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

Ключи желательно создавать на своем компьюетере, отправляя на сервер (компьютер, к которому будем подключаться по ssh) только публичный ключ.

Вариант 1) Создаем ключ в Windows (на клиенте Putty) ...

Putty Key Generator

Готовим ключ в Putty. Для этого на клиенте Windows запускаем puttygen.exe.
Жмем Generate, водим мышкой до полной победы.

После генерации ключа по желанию добавляем пароль ключа (Key passphrase). Надо отметить, что с паролем на ключ у вас не выйдет сделать автологин - пароль все равно надо будет вводить! Зато не будет и головной боли, что кто-то упер ключ. Эдакая двухфакторная аутентификация (нужен и ключ и пароль от него).

Сохраняем открытый ключ (например, myServer_rsa.pub) и приватный (например, myServer_rsa.ppk). И тот и другой файлы храним, но приватный храним как зеницу ока! К тому же, приватный ключ (точнее, путь к нему) надо прописать в настройках Putty (это если вы с Windows работаете).

Копируем текст из поля Public key for pasting into OpenSSH authorized_keys file вида"ssh-rsa AAA......." в блокнот (для архива) либо сразу в файл ~/.ssh/authorized_keys (про файл см. ниже) на сервер Linux. Обратите внимание, текст должен быть вставлен в одну строку!

 

Вариант 2) создаем ключ в Linux

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

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

$ ssh-keygen

Создаст два ключа (если запускать без параметров и соглашаться с default):

1) приватный .ssh/id_rsa
2) публичный .ssh/id_rsa.pub

Содержимое файла .ssh/id_rsa.pub копируется на удаленный сервер (к которому мы будем подключаться), в файл .ssh/authorized_keys того пользователя, от имени которого убдем подключаться.

Полезные колючи ssh-keygen:

-t rsa
-b 4096 (размер ключа)
-f /home/admin/.ssh/id_rsa_1

Последняя опция создаст приватный ключ /home/admin/.ssh/id_rsa_1 и публичный /home/admin/.ssh/id_rsa_1.pub

Это необходимо, если вы собираетесь администрировать несколько серверов:

$ ssh-keygen -t rsa -b 4096 -f /home/admin/.ssh/id_rsa_1
$ ssh-keygen -t rsa -b 4096 -f /home/admin/.ssh/id_rsa_2

И создадим файл /home/admin/.ssh/config

Host host1
    HostName host1_address
    User user1
    Port 22
    IdentityFile /home/admin/.ssh/id_rsa_1
Host host2
    HostName host2_address
    User user2
    Port 22
    IdentityFile /home/admin/.ssh/id_rsa_2

После чего команда

$ ssh host2

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

Содержимое публичных ключей необходимо скопировать в файлы .ssh/authorized_keys  на серверы, которые планируем в дальнейшем администрировать (id_rsa_1.pub на host1, id_rsa_2.pub на host2).

 

Настраиваем сервер SSH

На сервере (к которому будем подключаться)

На сервер надо поместить открытый (публичный) ключ (id_rsa_1.pub из примера выше), а не приватный!

mkdir /home/vasya/.ssh
touch /home/vasya/.ssh/authorized_keys

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

Примечание 2: если вы под рутом зашли и папки-файлы создаете, то потом надо права на папку дать юзеру, иначе vasya в папку .ssh не попадет:

# chown -R vasya:vasya /home/vasya/.ssh
# chmod 600 /home/vasya/.ssh/authorized_keys
# chmod 700 /home/vasya/.ssh

 

Изменяем настройку сервера sshd

Отключаем аутентификацию по паролю, запрещаем логиниться пользователем root.

# nano /etc/ssh/sshd_config

...
PermitRootLogin no
MaxAuthTries 3
MaxSessions 3
AllowUsers vasya

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys

PermitEmptyPasswords no
PasswordAuthentication no
...

Перезапуск сервера sshd:

Стойте!!! Фуф, успел )) Перед тем, как копипастить команду ниже, подумайте, что будет, если сессия разорвется, а залогиниться вы вдруг не сможете ))

# service sshd restart

Вот и все? Еще немного внимания!

Грабли

Не спешите закрывать окно консоли, чтобы радостно войти с ключом! Если что-то пойдет не так (например, сервер не примет ваш клиентский сертификат), то вы не сможете войти на сервер с удаленной консоли. Конечно, можно подойти к серверу и на нем работать, но это совсем не так удобно, а порой (например, если это удаленный хостинг) невозможно. Поэтому попробуйте сначала открыть новое окно (например, putty) и войти на сервер с ключом.

Например, если не выполнить chmod 700 на папку и chmod 600 на файл из п.2.1, вам может быть отказано в авторизации. В /var/log/secure могут быть записи такого рода:

su: pam_unix(su-l:session): session opened for user root by vasya(uid=500)
su: pam_unix(su-l:session): session closed for user root
sshd[785]: Authentication refused: bad ownership or modes for file /home/vasya/.ssh/authorized_keys
sshd[786]: Connection closed by 192.168.1.2
sshd[1451]: Authentication refused: bad ownership or modes for directory /home/vasya/.ssh
sshd[1452]: Connection closed by 192.168.1.2
sshd[1557]: User root from 192.168.1.123 not allowed because not listed in AllowUsers
sshd[1558]: input_userauth_request: invalid user root
sshd[1558]: Connection closed by 192.168.1.2

где
192.168.1.2 - сервер;
192.168.1.123 - клиент.

Надо скорректировать права доступа:

# chmod 600 /home/vasya/.ssh/authorized_keys
# chmod 700 /home/vasya/.ssh

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

Вот и все.



Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?