21 способ обеспечения безопасности OpenSSH

Не на каждом сервере есть ftp, samba или какая-либо другая программа, предоставляющая удаленные возможности, однако, на большинстве UNIX хостов мы встретим OpenSSH. OpenSSH предоставляет нам широкие возможности, однако, любые излишние возможности могут дать несколько дверей взломщику. Я же хочу показать как прикрыть некоторые из них, чтобы ваши UNIX хосты были защищены по протоколу SSH. Эта переведенная статья 2009-го года, однако даже сегодня она актуальна в полной мере.

OpenSSH это реализация протокола SSH. OpenSSH используется для удаленного входа, создания бекапов, удаленного файлового трансфера через scp или sftp и многое другое. SSH идеально подходит для того, чтобы сохранить конфиденциальность и целостность данных, передаваемых между двумя сетями или системами. Однако, основным преимуществом является сервер аутентификации, который может работать с помощью публичных ключей. Время от времени появляются новости о 0-day exploit для OpenSSH. Здесь же изложены несколько методов, которые позволят вам повысить безопасность OpenSSH сервера, не смотря на такие новости.

Стандартные файлы настроек и порт SSH:

  • /etc/ssh/sshd_config - конфигурационный файл сервера OpenSSH
  • /etc/ssh/ssh_config - конфигурационный файл клиента OpenSSH
  • ~/.ssh/ - пользовательские конфигурационные директории
  • ~/.ssh/authorized_keys и ~/.ssh/authorized_keys2 - списки публичных ключей (RSA или DSA), которые могут быть использованы для авторизации в пользовательский аккаунт
  • /etc/nologin - если этот файл существует, то система будет отказываться пускать кого-либо кроме root-пользователя. Лучше удалить и не использовать.
  • /etc/hosts.allow и /etc/hosts.deny - списки контроля доступа (ACL)
  • SSH стандартный порт : TCP 22

Содержание

1: Отключите OpenSSH сервер

Рабочие станции и ноутбуки могут работать без OpenSSH сервера. Если вам не нужна удаленная авторизация или возможности файлового трансфера, отключите или удалите SSH сервер. Закройте лишнюю дверь, если вы её не используете. CentOS / RHEL / Fedora Linux - пользователи могут отключить или удалить openssh-server с помощью этих команд:

Debian / Ubuntu Linux пользователи могут отключить и удалить с помощью утилиты apt-get:

Так же вам вероятно потребуется обновить настройки вашего firewall'а (iptables), чтобы удалить правила для ssh. Для CentOS / RHEL / Fedora редактируйте файлы /etc/sysconfig/iptables и /etc/sysconfig/ip6tables. После окончания перезапустите iptables:

Для пользователей Debian / Ubuntu это, как правило, один файл — /etc/init.d/iptables. После редактирования которого смело перезапускаем firewall.

2: Используйте только второй протокол SSH

SSH протокол первой версии (SSH-1) подвержен проблемам и уязвимостям безопасности с помощью атак вида man-in-the-middle. SSH-1 полностью устарел и его не стоит использовать. Откройте файл sshd_config и проверьте, что подобная строка имеет место:

3: Ограничьте пользователям SSH доступ

Изначально все пользователи системы могут входить через SSH используя свои пароли или публичные ключи. Порой вы создаете UNIX / Linux пользователей для ftp или email. Однако, такие пользователи тоже могут зайти в систему через ssh. Они будут иметь полный доступ к системным инструментам, включая компиляторы и скриптовые языки, такие как Perl, Python, которые могут открыть сетевые порты и удовлетворить множество других капризов. Один из моих клиентов имел устаревший php-скрипт и атакующий воспользовался возможностью и создал новый аккаунт в системе через этот php-скрипт. И тем не менее, атакующий не смог проникнуть через ssh, потому что его пользователь не был указан в директиве AllowUsers. Доступ к системе через SSH имели только пользователи root, vivek и jerry и это было указано в файле sshd_config:

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

Вы также можете настроить Linux PAM, разрешающий или запрещающий авторизацию через sshd-сервер. Вы можете создать список имен групп для авторизации или же запрета авторизации через данный протокол.

4: Настройте время ожидания при простое для выхода

Пользователь может зайти на сервер через ssh и если вы настроите таймаут простоя, то сможете избежать необслуживаемой ssh сессии. Откройте sshd_config и проверьте следующие значения определены:

Здесь выставлено время ожидания(простоя) в секундах (300 с = 5 мин.). Когда это время пройдет, простаивающая сессия пользователя будет закрыта, и пользователь автоматически выйдет из системы.

5: Отключите .rhosts файлы

OpenSSH сервер может использовать протокол Rlogin для авторизации, и подобное стоит пресекать. Отключите чтение пользовательских файлов ~/.rhosts и ~/.shosts. Обновите sshd_config со следующими настройками:

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

6: Отключите аутентификацию на основе хоста

Для отключения подобной аутентификации, обновите sshd_config со следующей опцией:

7: Отключите доступ root через SSH

Это означает что доступ пользователя root через ssh поверх сети не нужен. Обычные пользователи могут использовать утилиты su или sudo(предпочтительней) чтобы повысить права до уровня root. Это позволяет быть уверенным в получении информации о том, кто запускал привилегированные команды на системе через sudo. Для отключения входа root пользователя через SSH обновите sshd_config со след. строкой:

8: Включите предупреждающий баннер

Установка предупреждающего баннера сводится к редактированию следующей строки и создания соотв. файла:

Пример файла /etc/issue:

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

9: Настройте firewall на порту ssh (22)

Вы должны настроить firewall для ssh порта (22) обновив конфигурации iptables или же pf firewall. Обычно, сервер OpenSSH должен принимать только входящие соединения вашей сети или другой удаленной сети.

Настройка iptables

Измените ваш /etc/sysconfig/iptables (для пользователей Redhat) для подтверждения соединений только с сетями 192.168.1.0/24 и 202.54.1.5/29:

Если вы используете IPv6, не забудьте отредактировать /etc/sysconfig/ip6tables (для пользователей Redhat):

Заменив ipv6network::/ipv6mask вашим IPv6 диапазоном.

В случае других дистрибутивов, таких как Debian, ничего принципиально не меняется. Нужно также добавить подобные правила в INPUT цепочку.

Настройка *BSD PF Firewall

Если вы используете PF firewall настройте /etc/pf.conf следующим образом:

10: Измените порт SSH и ограничьте используемый IP

Первоначально SSH слушает все доступные интерфейсы и IP адреса доступных на системе и ограничение прослушивания порта и смена самого порта может повысить безопасность (Обычно bruteforce скрипты пытаются соединиться только на порту #22). Для того чтобы привязать OpenSSH слушать только ip 192.168.1.5 и 202.54.1.5 на порту #300, просто подправьте вашу конфигурацию:

11: Используйте сильные пароли и ключи

Невозможно оценить насколько важно использовать сильные пароли и ключи. Brute-Force атака работает если вы используете пароли, которые основываются на данных из словарей. Есть также специальные расширенные "словари", которые могут содержать наиболее популярные пароли. Они называются rainbow tables. Вы можете заставить пользователей избегать пароли подверженные подобным атакам и выявлять слабые пароли с помощью утилиты John the Ripper. Вот пример генератора случайных паролей, написанных на баше (положите его в ваш ~/.bashrc):

Если вы совсем параноик, то вместо /dev/urandom используйте /dev/random

Запустите в консоли:

12: Используйте публичные ключи для аутентификации

Используйте пару ключей публичный/приватный с парольной защитой для приватного ключа. Посмотрите как использовать аутентификацию основанную на RSA и DSA и никогда не используйте пустой ключ (без passphrase) для логина.

13: Используйте Keychain для аутентификации

Keychain это специальный bash-скрипт созданный для удобства и гибкости использования аутентификации на ключах. Он может дать некоторые фишки безопасности даже на ключи без passphrase. Узнайте как установить и использовать keychain утилиты.

14: Ограничьте SSHD с помощью chroot (Заприте пользователей в их домашних директориях)

По умолчанию пользователям разрешено гулять по директориям сервера, даже таким как /etc, /bin/ и другим. Вы можете защитить ssh используя chroot или специальные утилиты вроде rssh. Но с выходом OpenSSH версий 4.8p1 или 4.9p1 вам больше не нужно надеяться на такие сторонние решения. Посмотрите в этот пост чтобы узнать о новой директиве ChrootDirectory блокирующей пользователей в их собственных домашних директориях.

15: Используйте TCP Wrapper'ы

TCP Wrapper это сетевая ACL система (использующая списки контроля доступа), основанная на хостах, используемая для фильтрации доступа в сеть и OpenSSH поддерживает TCP wrapper'ы. Просто обновите ваш /etc/hosts.allow для разрешения SSH только с адресов 192.168.1.2 172.16.23.12:

Просмотрите этот FAQ о настройке и использованию TCP wrapper'ов под Linux / Mac OS X и другими UNIX-подобными операционными системами.

16: Запретите пустые пароли

Вы должны явно запретить удаленный логин для аккаунтов с пустыми паролями, обновив sshd_config следующей строкой:

17: Препятствуйте SSH взломщикам (Brute Force Attack)

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

  • DenyHosts утилита для безопасности SSH серверов, написанная на Python. Она предназначена для предотвращения BF-аттак анализируя неудачные попытки аутентификации из лога и последующей блокировки ip адресов, с которых и производилась попытка входа.
  • Fail2ban программа работающая аналогичным образом, и также написанная на Python. Имеет большую популярность, так как защищает от BF-аттак не только SSH-сервер, но и другое ПО.
  • security/sshguard-pf защищает от BF атак как ssh так и другие сервисы, используя pf firewall
  • security/sshguard-ipfw защищает от BF атак как ssh так и другие сервисы, используя ipfw firewall
  • security/sshguard-ipfilter защищает от BF атак как ssh так и другие сервисы, используя ipfilter firewall
  • security/sshblock блокирует abusive попытки ssh входа/
  • Brute Force Detection Модульный shell-скрипт для парсинга логов приложения и проверки на неудачные попытки аутентификации. Стоит использоваться на системах, где логи приложений имеют свой уникальный формат, и под каждый лог нужены свои уникальные регулярные выражения.
  • IPQ BDB filter Может рассматриваться как легкая версия fail2ban.

18: Входящие ограничения соединений порта #22

Оба firewall'а, и netfilter и pf, позволяют устанавливать простые регулирующие опции на входящие соединения #22 порта.

Пример с использованием iptables

Следующий пример режет все входящие соединения, у которых было более 5 попыток на #22 порт за 60 секунд:

Другой пример с iptables:

Для больших деталей используйте команду:

Пример с использованием *BSD PF

Следующие ограничения представляют из себя всего 20 максимальных соединений от источника за все время или 15 попыток за 5 секундный интервал. Если кто-то нарушает наши правила, то он попадает в нашу таблицу abusive_ips и блокируется на дальнейшие соединения. И в окончание стоит упомянуть о flush. Он просто обнуляет заполненные таблицы, если нам это потребуется.

19: Используйте Port Knocking

Одним из первых способов защиты была показана смена порта на нестандартный. Однако, простым nmap можно его найти, и начать BF-атаку. Но что, если закрывать сначала все порты, и лишь при определенных обстоятельствах открывать порт ssh. И какие же можно использовать обстоятельства? Можно использовать попытки соединений по какому-то определенному набору, или последовательности портов. И лишь после таких действий открывать порт для ssh, и разрешать соединение с клиентом, потому что он знает в какие двери нужно было постучать (knocking). Для такой техники нам ничего не потребуется кроме вашего firewall'а:

Сначала мы стучимся в порт #1234, потом в #3456, затем в #2345 и входим по #22 порту, который открылся.

20: Используйте анализаторы логов

Читайте ваши логи используя logwatch или logcheck. Эти утилиты могут упростить вам жизнь. Они будут проходить по логом по данным интервалам времени и сообщать об участках и деталях, которые вы хотите видеть. И удостоверьтесь что директива LogLevel имеет значение INFO или DEBUG в sshd_config:

21: Обновляйте OpenSSH и операционные системы

Это лучше всего делать через такие инструменты как yum, apt-get, freebsd-update или другие для использования последних security-патчей.

Иные способы

Чтобы скрыть версию openssh, вы должны обновить исходный код и заново скомпилировать openssh. Проверьте что такие опции включены:

Проверяйте файл настроек перед перезапуском sshd:

Есть и другие техники, но о них стоит поговорить в отдельности. 🙂

Источник: welinux.ru.