Здравствуй, Инженер!
Ты попал ко мне на канал, а значит ты в поиске свежих идей или пищи для размышлений! 👨🚒
Основная идея, часть реализации которой освещена в этой статье - по ссылке.
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.