Статья также доступна на украинском (перейти к просмотру).
Оглавление
- Характеристики и описание работы SSH
- Управление работой SSH
- Основные меры по безопасному использованию SSH
- Применение параметров ssh_config
- Применение шаблонов в authorized_keys SSH-сервера
- Применение PAM-модулей
- Применение утилиты IPTABLES
- Применение методов TCPwrappers
Необходимость обеспечения безопасных соединений и передачи данных между узлами сети требует использования наиболее защищенных сетевых протоколов. Одним из них является протокол SSH (Secure SHell), на базе которого работает командная оболочка с тем же названием. Он обеспечивает туннелирование TCP- соединений и позволяет осуществлять удаленное управление сетевыми ОС, в частности, Linux. Поэтому актуальным является вопрос правильной настройки для оптимизации его работы и повышения уровня безопасности
Характеристики и описание работы SSH
Это сетевой протокол прикладного уровня, работающий на уровне TCP-соединений. Чаще всего задействован порт 22. Свободная реализация протокола – OpenSSH. Специфицирован RFC 4251. Протокол работает в паре клиент-сервер. Для аутентификации сервера используется алгоритм DH (Diffie-Hellman).
SSH-сервер «прослушивает» соединение от клиентов и осуществляет их аутентификацию с использованием шифрования с открытым ключом. Соответственно, сервер и клиент должны иметь по одной паре ключей – открытый и закрытый. При установке соединения производится обмен открытыми ключами. Тоннель, образуемый посредством SSH-соединения, используется для симметричного шифрования данных, достаточно быстрого. То есть фактически инкапсулируются любые данные, в том числе и протоколы, в частности, ftp. Это дает возможность передавать данные даже без запуска сервера для инкапсулирующегося протокола.
Таким образом, в отличие от других подобных протоколов, в частности, telnet и rlogin, здесь весь трафик шифруется. Поэтому SSH устойчив к снифингу, то есть атакам, связанным с прослушиванием, а также к session hijacking, что делает невозможным вмешательство «со стороны» в уже установленную сессию. Однако протокол не устойчив к вмешательствам типа man-in-middle, которые могут осуществляться на этапе проверки пользовательского оттиска ключа (key fingerprint) и поэтому Администраторам системы необходимо принимать дополнительные меры безопасности.
Управление работой SSH
Управление работой протокола осуществляется с помощью параметров командной строки SSH и параметров, которые находятся в файлах конфигурации – системном и пользовательском – SSH_CONFIG и CONFIG (для OpenSSH). Параметры в файлах прописываются в формате «название: значение» по одному в строке. Это позволяет Администратору управлять как клиентом, так и сервером.
Расположение пользовательского файла: $home/.ssh/config
Расположение системного файла (по умолчанию): /etc/ssh/ssh_config
Все эти параметры выполняются SSH в соответствии с их приоритетом. Уровни приоритета следующие:
- Параметры командной строки.
- Параметры пользовательского конфигурационного файла.
- Параметры системного файла.
Сервер SSH имеет свой собственный набор конфигурационных файлов, включая основной файл для всей системы с именем SSHD_CONFIG (Daemon), расположенный на удаленном узле по адресу: /etc/ssh/sshd_config.
Основные меры по безопасному использованию SSH
- Запрет подключения с пустым паролем или отключение входа по паролю.
- Запрет удаленного root-доступа.
- Ограничение доступа на уровне пользователей и групп.
- Использование длинных RSA ключей авторизации и тайной фразы для них.
- Применение нескольких методов аутентификации, в том числе двухфакторной аутентификации.
- Использовать другой TCP-порт для SSH сервера вместо стандартного.
- Блокировка потенциально опасных IP-адресов.
- Ограничение количества IP-адресов, из которых разрешен доступ.
- Не использовать популярные логины для системного доступа по SSH.
- Постоянный мониторинг сообщений об ошибках проверки подлинности.
- Установка детекторов IDS (Intrusion Detection System).
Большинство из указанных шагов реализуются настройкой соответствующих параметров конфигурационных файлов типа SSH_CONFIG, но могут быть и другие решения, в том числе нестандартные. Рассмотрим более подробно их реализацию с использованием разных подходов.
Применение параметров ssh_config
Как отмечалось выше, все параметры указываются в системном конфигурационном файле. Для демонстрации его содержимого введем в терминале команду:
$nano /etc/ssh/ssh_config
Результат исполнения представлен ниже. Именно здесь можно изменять значение тех или иных параметров. Для сохранения изменений и выхода из редактора нажимаем клавиши ctrl+O.
Ниже приведены наиболее важные параметры ssh_config в плане обеспечения защиты, которые можно задействовать для реализации многих вышеуказанных мер.
Название параметра | Назначение |
PermitRootLogin | Запрещает удаленный root-доступ, если установлено значение no. |
AllowUser, AllowGroup | Позволяет определить ограниченный круг пользователей или групп, которым разрешена регистрация. Для этого необходимо прописать имена или названия таких пользователей или групп в качестве параметров. По умолчанию регистрация разрешена для всех пользователей. |
DenyUser, DenyGroup | Позволяет запретить регистрацию определенным пользователям или группам. Для этого необходимо прописать их имена или названия в качестве параметров. По умолчанию регистрация никому не запрещена. |
AuthenticationMethods | Определяет методы аутентификации пользователей. |
MaxAuthTries | Ограничивает количество попыток идентификации клиента в пределах одного соединения. По умолчанию установлено значение 6. |
ClientAliveInterval | Указывает время бездействия клиента в секундах, после чего отправляется запрос отклика. Значение по умолчанию – 0. |
ClientAliveCountMax | Устанавливает количество запросов, проверяющих доступность клиента, которые могут оставаться без ответа. Если предел достигнут, SSH-сервер отключает клиента и завершает сеанс. Значение по умолчанию – 3. |
AllowTcpForwarding | Определяет, будет ли разрешено перенаправление TCP. Значение по умолчанию – yes. |
PasswordAuthentication | Разрешает аутентификацию по паролю. По умолчанию установлено значение yes. |
PubkeyAuthentication | Разрешает аутентифицировать с помощью открытого ключа. По умолчанию установлено значение yes. |
Использование указанных выше параметров позволит значительно снизить вероятность проникновения в систему злоумышленников.
Например, рассмотрим способ защиты за счет запрета методов аутентификации, используемых по умолчанию. Так можно разрешить доступ только для тех IP-адресов, которые будут соответствовать установленному шаблону. Все остальные хосты будут блокироваться, поскольку для них не будет доступного метода аутентификации.
Для запрета всех методов аутентификации необходимо установить значение no для параметров PasswordAuthentication и PubkeyAuthentication в файле конфигурации ssh_config:
PasswordAuthentication no PubkeyAuthentication no
Затем необходимо добавить нужные методы аутентификации после адреса совпадения в конце файла. При этом, обязательно размещение Match в конце файла, поскольку все сроки конфигурации после него помещаются в середину условного блока до следующего срока Match. Например:
Match Address 127.0.0.* PubkeyAuthentication yes
Аргументы сопоставления и разрешенные условные настройки конфигурации описаны на справочной странице sshd_config.
Шаблоны соответствия документированы на справочной странице ssh_config.
Применение шаблонов в authorized_keys SSH-сервера
В файле ~/.ssh/authorized_keys на сервере хранится открытый ключ, который сравнивается с ключом клиента при его аутентификации. Клиентский ключ находится на узле клиента в файле по адресу ~/.ssh/id_rsa.
В целях предотвращения несанкционированного подключения со сторонних сетей путем применения злоумышленником украденного ключа клиента, желательно использование шаблонов для фильтрации IP-адресов в файле authorized_keys. Для этого достаточно вместо записи типа:
ssh-ed25519 AAAAC3NzaC1lZSOMEKEYFINGERPRINT comment
вставить другой:
from="pattern" ssh-ed25519 AAAAC3NzaC1lZSOMEKEYFINGERPRINT comment
где pattern – шаблон для фильтрации IP-адресов, соответствующий клиентскому хосту, с которого вы подключаетесь из общего доступного DNS-имени, IP-адреса или любого сетевого блока.
Например:
from="192.168.1.0/24" ssh-ed25519 AAAAC3NzaC1lZSOMEKEYFINGERPRINT comment
Эта запись исключает возможность подключения к серверу из других сетей, кроме указанной в шаблоне.
Применение PAM-модулей
Возможности ОС Linux позволяют использовать постоянно обновляющиеся бесплатные специализированные пакеты libpam. Одним из них является пакет libpam-geoip, предоставляемый geoip-database-contrib. Он позволяет производить фильтрацию IP-адресов при доступе по SSH. Более подробные рекомендации по его использованию можно найти на сайте разработчиков.
Применение утилиты IPTABLES
Программа обеспечивает интерфейс командной строки для управления работой между сетевым экраном netfilter для ОС Linux. Это позволяет управлять фильтрацией пакетов на уровне IP-адресов. Таким образом, можно разрешить или запретить трафик из той или иной сети или хоста. Например, чтобы разрешить трафик только по сети 192.168.0.0/24, введем следующие команды:
$ iptables -A INPUT -p tcp --dport 22 --source 192.168.0.0/24 -j ACCEPT $ iptables -A INPUT -p tcp --dport 22-j DROP
Вторая команда обеспечивает принудительное перенаправление отклоненного трафика на порт 22. Можно устанавливать многие другие правила для различных типов сетей или хостов, которые должны размещаться до последней команды перенаправления трафика. Для того чтобы посмотреть правила использования утилиты введем в терминале:
$ iptables –h
Результат выполнения команды показан ниже на изображениях.
Для большого количества сетей или хостов можно использовать модули ipset или iprange, что позволит применить фильтры для любого произвольного диапазона IP-адресов. Однако следует учесть, что установленные правила не сохраняются после перезагрузки системы и поэтому нужно реализовать какой-либо механизм для обновления данных. Для IPv6-адресов вместо iptables необходимо использовать утилиту ip6tables.
Применение методов TCPwrappers
С помощью этого метода можно разрешить или запретить удаленное подключение тех или иных хостов. Для этого нужно указать определенные хосты в файлах hosts.allow (разрешены) и hosts.deny (запрещены). Для демонстрации работы метода введем в терминале:
$nano /etc/hosts.allow
Результаты выполнения команды приведены ниже. В редакторе nano открылось содержимое соответствующего файла. Здесь мы можем указать любую сеть или хост и сохранить изменения (ctrl+O).
Также можно запретить подключение с любых IP-адресов в файл hosts.deny:
$nano /etc/hosts.deny
Результат приведен ниже. Здесь мы вносим те сети или хосты, подлежащие запрету. Например, для запрета всех хостов необходимо указать параметр ALL, как показано в комментариях файла. После внесения изменений нажимаем ctrl+O и выходим из редактора. Следует отметить, что поддержка tcpwrappers была отключена в OpenSSH 6.7.
Подписывайтесь на наш телеграмм-канал t.me/freehostua, чтобы быть в курсе новых полезных материалов. Смотрите наш канал YouTube на youtube.com/freehostua.
Мы что-то упустили, в чем ошиблись?
Сообщите об этом в комментариях, и мы обязательно обсудим это.
Дата: 12.07.2022 Автор: Евгений
|
|
Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus