Найти тему
Записки инженера

Настройка SSH в Debian

Здравствуй, Инженер!

Ты попал ко мне на канал, а значит ты в поиске свежих идей или пищи для размышлений! 👨‍🚒

Основная идея, часть реализации которой освещена в этой статье - по ссылке.

SSH - это Secure SHell - безопасная оболочка. В первой своей версии она вовсе не была безопасной, поэтому сейчас, когда говорят SSH, подразумевают SSH-2.

Разберем настройки для сервера OpenSSH сервера для Debian. Находятся они в файле /etc/ssh/sshd_config

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

ListenAddress - буквально: прослушиваемые адреса. С других адресов сервер соединение попросту не примет.

ListenAddress :: - для всех адресов;

ListenAddress 0.0.0.0 - только для IPv4;

ListenAddress 10.1.0.1 - только для этого адреса;

ListenAddress 10.1.0.1:10101 - для конкретного адреса и порта.

Protocol 2 - версия протокола. Тут двойка и только двойка. Можно поставить 3, но только не 1 🧐 Я писал об этом выше 👆

HostKey /etc/ssh/ssh_host_rsa_key - указатель на файл приватного ключа. Позже разберемся, как их создавать.

UsePrivilegeSeparation yes - разделение привелегий. Отключать этот параметр не рекомендуется для исключения превышения прав доступа.

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

ServerKeyBits 768

Затем необходимо настроить логирование, События, связанные с доступом по SSH записываются в журнал /var/log/auth.log

В первом параметре пишем, что именно мы хотим видеть в логах. Доступны следующие значения: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. Меня, например, заботит только кто входил на мой сервер и когда, поэтому я оставлю значение AUTH.

SyslogFacility AUTH

Второй параметр - уровень откровенности сервера. Он может быть равен SILENT(🤫) , QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG (4 уровня).

LogLevel INFO

Следующий параметр задаёт время в секундах до сброса соединения с момента начала аутентификации. Мне хватает минуты, чтоб войти. Кому меньше?🙄

LoginGraceTime 60

Следующий разрешает вход с правами суперпользователя. По-моему, это противоречит здравому смыслу 🤨

Изображение взято из открытых источников
Изображение взято из открытых источников

PermitRootLogin no

Затем нужно сделать проверку на предмет дискреционных атрибутов, в частности на владение домашним каталогом:

StrictModes yes

Есть параметры, задающие черные и белые списки для входа. Это:

AllowUsers Engineer@Host

DenyUsers DonaldTrump

AllowGroups Brains

DenyGroups Stupids

Нетрудно догадаться, что инженер может заходить с хоста (имя пользователя и имя хоста - две разные проверки), Дональду Трампу вход воспрещён, позволено заходить группе мозгов и запрещено - группе глупых людей (проще говоря, тупиц 😂)

RSAAuthentication yes

PubkeyAuthentication yes

AuthorizedKeysFile .ssh/authorized_keys

Я уже обещал научить вас генерировать RSA ключи. Я не отказываюсь, но чтоб работала аутентификация, оставим три параметра выше. Последний, кстати, указывает путь к открытым ключам. В записи его могут быть переменные типа %h - домашний каталог пользователя и %u – имя пользователя.

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

IgnoreRhosts yes

RhostsRSAAuthentication no

HostbasedAuthentication no

IgnoreUserKnownHosts yes

Параметр PermitEmptyPasswords разрешает вход с пустым паролем. Как думаешь, стоит разрешать? Вот я думаю, не стоит🤗

PermitEmptyPasswords no

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

ChallengeResponseAuthentication no

PasswordAuthentication yes

Параметры, содержащие слово Kerberos, оставляем закомментированными. Если кому-то будет нужно, я потом напишу об аутентификации по Kerberos.

KerberosAuthentication no

KerberosGetAFSToken no

KerberosOrLocalPasswd yes

KerberosTicketCleanup yes

С GSSAPI та же история, что и с Kerberos – оставляем как есть.

GSSAPIAuthentication no

GSSAPICleanupCredentials yes

Далее пробрасываем иксы. Иксы - это графика в Debian (впрочем, не только в нём). Чтоб подключить иксы, необходимо к команде подключения указать ключ -X, например:

ssh magomet@mountain:6010 -X

X11Forwarding yes

X11DisplayOffset 10

PrintMotd выводит при подключении к sshd сообщение дня (message of the day) из файла /etc/motd. У меня он содержит информацию о заблокированных пользователях, учётных записях с истёкшим сроком действия и прочие полезные вещи.

PrintLastLog также весьма полезна, так как он сообщает о том, кто и откуда последний раз заходил на сервер.

PrintMotd yes

PrintLastLog yes

Следующий параметр нужен для поддержания соединения, но я реализую те же функции более безопасным и удобным способом.

TCPKeepAlive no

Для этого я дописал два следующих параметра:

ClientAliveCountMax 3

ClientAliveInterval 10

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

Параметр UseLogin нужен для интерактивных сессий (то есть, не нужен). Оставляем как есть.

UseLogin no

Следующий параметр отвечает за количество неавторизованных подключений:

MaxStartups 3:30:10

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

Banner задает файл-баннер, выводящийся на экран, при попытке подключиться к серверу.

Banner /etc/ssh/banner

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

DebianBanner no

AcceptEnv определяет, какие переменные среды, переданные клиентом, будут приняты.

AcceptEnv LANG LC_*

Следующий параметр подключает внешнюю подсистему, например Secure FTP:

Subsystem sftp /usr/lib/openssh/sftp-server

В нем записаны название службы и её расположение.

Если UsePAM включен, то запустить sshd можно будет только от имени root. Полезно, правда?

UsePAM yes

Теперь, когда ты разобрался с настройкой сервера, можно разобраться с настройкой клиента. Настройки клиента бывают глобальные и пользовательские. Первые лежат в файлеe /etc/ssh/ssh_config и применяются ко всем. Вторые могут находиться в домашнем каталоге пользователя, в ~/.ssh/config и применяются к конкретному пользователю. Файл пользовательских настроек создаётся исключительно вручную и исключительно для повышения юзабилити (usability - удобство использования, англ 👨‍🎓). Высший приоритет имеют ключи командной строки, затем следуют настройки пользователя, а после них используются глобальные настройки клиентской части.

Здесь я вижу полезным пояснить на примере моего файла /home/user/.ssh/config:

Host filehost

HostName fhost01.engineering

Port 2205

User admin

Host mailhost

HostName 10.1.0.23

Port 2000

User multiuser

Теперь при подключении к серверам fhost01.engineering, 10.1.0.23 мне не требуется судорожно вспоминать, ни имя пользователя, ни порт, достаточно после ssh набрать имя сервера. Это ли не апофеоз лени? 😇

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

Описания вообще всех параметров и их значений находятся в man ssh_config.