Наилучшие способы безопасности SSH (OpenSSH)

3 711 посмотрели
Posted by Алексей Нещадим in IT | Tagged , , , , , , , , | Leave a comment

OpenSSH предоставляет нам широкие возможности, однако, любые излишние возможности могут дать несколько дверей взломщику. Я же хочу показать как прикрыть некоторые из них, чтобы ваши UNIX хосты были защищены по протоколу SSH. Эта переведенная статья 2009-го года, однако даже сегодня она актуальна в полной мере. SSH идеально подходит для того, чтобы сохранить конфиденциальность и целостность данных, передаваемых между двумя сетями или системами. Здесь же изложены несколько методов, которые позволят вам повысить безопасность 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 с помощью этих команд:

chkconfig sshd off
yum erase openssh-server

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

apt-get remove openssh-server

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

service iptables restart
service ip6tables restart

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

/etc/init.d/iptables restart

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

Изначально все пользователи системы могут входить через SSH используя свои пароли или публичные ключи. Порой вы создаете UNIX / Linux пользователей для ftp или email. Однако, такие пользователи тоже могут зайти в систему через ssh. Они будут иметь полный доступ к системным инструментам, включая компиляторы и скриптовые языки, такие как Perl, Python, которые могут открыть сетевые порты и удовлетворить множество других капризов.

Доступ к системе через SSH имеют только пользователи root, alex и sergey и это указано в файле sshd_config:

AllowUsers root alex sergey

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

DenyUsers user1 user2 user3

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

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

ClientAliveInterval 300
ClientAliveCountMax 0

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

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

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

PermitRootLogin no

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

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

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

-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -s ваша подсеть -m state --state NEW -p tcp --dport 22 -j ACCEPT

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

-A RH-Firewall-1-INPUT -s ipv6network::/ipv6mask -m tcp -p tcp --dport 22 -j ACCEPT

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

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

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

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

Port 300
ListenAddress 192.168.1.5
ListenAddress ваша подсеть

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

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

PermitEmptyPasswords no

9. Препятствуйте 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 входа;
  • security/sshit проверяет SSH/FTP на BF-атаки и блокирует полученные IP.
  • BlockHosts утилита автоматической блокировки abusive IP.
  • Blacklist тоже самое что и BlockHosts.
  • Brute Force Detection Модульный shell-скрипт для парсинга логов приложения и проверки на неудачные попытки аутентификации. Стоит использоваться на системах, где логи приложений имеют свой уникальный формат, и под каждый лог нужны свои уникальные регулярные выражения.
  • IPQ BDB filter Может рассматриваться как легкая версия fail2ban.

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

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

#!/bin/bash
inet_if=eth1
ssh_port=22
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --set
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP

Обновляйте OpenSSH и операционные системы, это лучше всего делать через такие инструменты как yum, apt-get, freebsd-update или другие для использования последних security-патчей. Также проверяйте файл настроек перед перезапуском sshd: # /usr/sbin/sshd -t

Добавить комментарий