Как защитить SSH сервер от атаки методом перебора (грубой силой – брут-форсинга) используя fail2ban. Не забываем проверить не используется ли у нас ipv6, если используется, то закрываем лишнее

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

Конфигурационные файлы

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

Не нужен - выключай

Если вашему серверу не требуется удаленное подключение по SSH, то обязательно отключите его. В таких системах как CentOS/RHEL делается это так:

Chkconfig sshd off yum erase openssh-server

Используйте SSH второй версии

Протокол SSH первой версии имеет проблемы с безопасностью, которые закрыты во второй версии. Поэтому, используйте вторую версию. Убедитесь, что в файле /etc/ssh/sshd_config указана опция Protocol 2 .

Ограничивайте SSH доступ

По умолчанию, все системные пользователи имеют возможность подключаться к системе по SSH. Рекомендуем ограничить SSH доступ в целях безопасности. Например, разрешить SSH для пользователей root, merion и networks:

AllowUsers root merion networks

С другой стороны, вы можете разрешить доступ всем пользователям, кроме указанных:

DenyUsers root merion networks

Время неактивности

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

ClientAliveInterval 300 ClientAliveCountMax 0

В данной настройке мы указали время бездействия равным 300 секунд (5 минут).

Про файлы.rhosts

Дело в том, что данный файл содержит список хостов и пользователей. Если в данном файле содержится комбинация хоста и юзера, то данный пользователь сможет подключиться к системе по SSH без запроса пароля. Рекомендуем отключить эту «замечательную» фичу:

IgnoreRhosts yes

Никакой аутентификации на базе хоста!

Так называемая Host-Based Authentication позволяет пользователю с определенного хоста подключаться к серверу. Отключаем:

HostbasedAuthentication no

Прямое подключение через root

PermitRootLogin no

Сделайте баннер

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

22 порт только изнутри!

Сделайте доступ к 22 порту системы только через цепочку фаервол правил. Лучше всего, оставить доступ только изнутри LAN. Например, в Iptables можно дать доступ для 192.168.11.0/24:

A RH-Firewall-1-INPUT -s 192.168.11.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT

Где слушать

По умолчанию SSH слушает подключения на всех доступных интерфейсах. Мы рекомендуем сменить порт по умолчанию и указать IP – адрес, на котором необходимо ожидать подключения. Например, мы укажем порт 962 и IP – адрес 192.168.11.24

Port 962 ListenAddress 192.168.11.24

Криптостойкие пароли

Используйте устойчивые к защите пароли. В сети множество инструментов, которые сгенерируют криптостойкий пароль онлайн, бесплатно и без смс:)

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

Бывают пользователи без паролей. Их доступ к SSH так же необходимо запретить с помощью опции:

Port 962 PermitEmptyPasswords no

Анализируйте логи

Установите логирование событий в режим INFO или DEBUG – это позволит иметь расширенный контроль над системой:

LogLevel INFO

Полезна ли Вам эта статья?

Пожалуйста, расскажите почему?

Нам жаль, что статья не была полезна для вас:(Пожалуйста, если не затруднит, укажите по какой причине? Мы будем очень благодарны за подробный ответ. Спасибо, что помогаете нам стать лучше!

Secure Shell можно найти повсюду. С момента выпуска в 1995 году, SSH получил широкое распространение как мощный протокол удаленного доступа для Linux.

Однако, как известно, большая сила - большая ответственность. Неправильно сконфигурированный SSH демон может быть больше угрозой, нежели помощью. В этой статье мы рассмотрим пять шагов по усилению безопасности SSH.

1. Отключаем root логин.

Самый простой шаг. Очевидно, что существует мало причин разрешения захода root через SSH. Отключить же такой доступ довольно просто и это позволит усилить безопасность.

Найдем /etc/ssh/sshd_config (возможно он находиться в другом каталоге, это зависит от дистрибутива). В нем определим место PermitRootLogin и заменим значение на "no":

PermitRootLogin no

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

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

PasswordAuthentication no
ChallengeResponseAuthentication no

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

Europa ~ # emerge -pv denyhosts
These are the packages that would be merged, in order:
Calculating dependencies... done!
app-admin/denyhosts-2.5 0 kB
Total size of downloads: 0 kB
europa ~ # emerge denyhosts

Документации по программе не очень много (если чего - есть, например ), однако все опции конфигурирования нормально описаны в конфигурационном файле.

Europa $ nano -w /etc/denyhosts.conf

Не думаю, что конфигурирование DenyHosts вызовет особые проблемы - достаточно внимательно прочитать конфиг.

После конфигурирования можно запустить программу демоном или через шедулер. В Gentoo демоном:

Rc-update add denyhosts default

Через cron, скажем каждые 10 минут:

Python /usr/bin/denyhosts -c /etc/denyhosts.conf

Вся радость DenyHost не только в блокировании хостов, пытающихся пробиться к вашему SSH серверу, но и в том, что можно синхронизировать свой "черный список" с серверами DenyHost. Таким образом создается коллективный список хостов, содержащий всех нападающих. Он предотвратит нападение в самом корне.

4. Изменяем номер порта.

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

В конфиге стоит поменять.

Несколько правил по защите доступ к ssh серверу.

1. Добавляем в конфигурацию ssh сервера слушать еще один порт, помимо стандартного. (Для простоты запоминания можно использовать 4 повторяющихся цифры для всех своих серверов).

$ sudo vi /etc/ssh/sshd_config Port 22 Port xxxx

2. Ограничиваем обращения на 22 порт только доверенным ip адресам *например 8.8.8.8 (таких правил сделать можно несколько, работа/дом)

$ sudo vi /etc/sysconfig/iptables -A INPUT -s 8.8.8.8 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

3. Не забываем проверить не используется ли у нас ipv6, если используется, то закрываем лишнее

$ sudo vi /etc/sysconfig/ip6tables *filter:INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p ipv6-icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT -A INPUT -j REJECT --reject-with icmp6-adm-prohibited -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited COMMIT

Для того, чтобы использовать ssh только на определенном адресе достаточно в файле конфигурации sshd_config указать парметр ListenAddress (например ListenAddress 74.125.200.100). В таком случае ssh будет доступен только на этом адресе и не будет работать через ipv6

4. Используем файл конфигурация ssh на стороне клиента.

Расположение: ~/.ssh/config

# fix Write failed: broken pipe ServerAliveInterval 120 TCPKeepAlive no # для использования коротких имен Host dev-vps # ip адрес или публичное доменное имя хоста Hostname 127.0.0.3 # Под каким юзером осуществлять вход User developer # Файл ключа для авторизации (если используется) IdentityFile ~/.ssh/id_rsa.dev

И еще один пример использования файла конфигурации:
{<1>}

Host ssh-server-1 Hostname 1.2.3.4 User dev Port 1234 Host ssh-server-2 User root # Hostname 192.168.10.20 # nc without -q0 if RHEL based & with -q0 debian based IdentityFile ~/.ssh/id_rsa.work-pc ProxyCommand ssh -q0 ssh-server-1 nc -q0 192.168.10.20 22

И теперь при подключении на ssh-server-1 мы сразу прыгнем на нужны нам хост. (Удобно использовать например при разных ключах на серверах)

А так-же хипстерский прокси вариант:

{<2>}

Скачиваем клиент ngrok на сервер, который находится за файерволом. Запускаем бинарник и указываем какой порт нам нужно пробросить

Для зашиты нашего сервера от перебора паролей можно воспользоваться утилитами sshguard или sshit.

Принципы работы.

sshguard и sshit работают по одному принципу. Анализируют системные сообщения о неверной аутентификации и в случае достижения определенного значения заносят атакующий ip в блокирующее правило файервола. Через определенное время ip из правила удаляется.
Соответсвенно для работы необходим настроенный файервол.

SSHGuard

sshguard умеет работать с

  • AIX native firewall - for IBM AIX operating systems
  • netfilter/iptables - for Linux-based operating systems
  • Packet Filter (PF) - for BSD operating systems (Open, Free, Net, DragonFly -BSD)
  • IPFirewall (IPFW) - for FreeBSD and Mac OS X
  • IP Filter (IPFILTER) - for FreeBSD, NetBSD and Solaris
  • tcpd"s hosts_access (/etc/hosts.allow) - portable across UNIX
  • null - portable do-nothing backend for applying detection but not prevention

Я использую PF поэтому в заметке примеры на PF.

Установка sshguard.

FreeBSD:

Устанавливаем из портов

Cd /usr/ports/security/sshguard-pf/&& make install clean

Если по каким-то причинам Вы не используете порты, скачайте последнию версию с сайта sshguard и соберите в ручную

./configure --with-firewall=pf && make && make install

Debian:

apt-get install sshguard

Настройка ОС для работы sshguard.

Создаем файл для хранения логов

# touch /var/log/sshguard

Debian (wheezy):

Редактируем в //etc/default/sshguard следующую строчку

#mcedit /etc/default/sshguard #ARGS="-a 40 -p 420 -s 1200" ARGS="-a 5 -p 420 -s 2400 -b 5:/etc/sshguard/blacklist"

и перезапускаем sshguard
service sshguard restart

FreeBSD:

Нам необходимо добавить две строки в конфигурацию PF

Table persist

объявляем таблицу куда sshguard вносит ip роботов.

Block in quick on $if0 proto tcp from

Собственно само блокирующее правило, его стоит разметить на самом верху блока правил конфигурационного файла PF. $if0 интерфейс на котором будут блокироваться подключения, для блокировки на всех интерфейсах замените на any.
Перечитайте файл конфигурации

Auth.info;authpriv.info |exec/usr/local/sbin/sshguard

и перезапустите syslog

#/etc/rc.d/syslogd restart

Собственно после этих манипуляций sshguard будет блокировать атаки с параметрами по умолчанию.
При атаке в /var/log/auth.log мы увидим примерно следующие

Jun1611:01:40 www sshd:Invalid user test from61.172.251.183Jun1612:29:48 www sshd:Invalid user test from85.114.130.168Jun1612:29:49 www sshd:Invalid user test from85.114.130.168Jun1612:29:49 www sshd:Invalid user test from85.114.130.168Jun1612:29:50 www sshd:Invalid user test from85.114.130.168Jun1612:29:50 www sshguard:Blocking85.114.130.168:4for>420secs:4 failures over 2 seconds.

Настройка параметров sshguard

sshguard имеет ряд параметров которые мы можем переопределить
-a количество неудачных попыток аутентификации после которого ip будет заблокирован. По умолчанию 4.
-p через сколько секунд ip будет разблокирован. По умолчанию 420.
-s сколько секунд sshguard помнит ip. По умолчанию 1200. Чтоб было понятней если с ip идет одна атака в 30 минут то он ни когда не попадет в бан при дефолтовой настройке.
-w белые ip, сети, или путь к файлу белых адресов. Формат файла одна строка - одна запись, # определяет комментарии.
-b определяет через сколько блокировок ip будет добавлен в черный список и путь до него. Черный список загружается при старте sshguard и автоматически не очищается.

у sshguard нет файла конфигурации параметры задаются при старте sshguard. В нашем случае sshguard пускается syslog поэтому отредактируем syslog.conf так, что sshguard будет блокировать ip после 3 неудачных попыток аутонтификации на 30 минут, а после 5 блокировок заносить его в черный список.

Auth.info;authpriv.info |exec/usr/local/sbin/sshguard -a 3-p 1500-b 5:/usr/local/etc/sshguard.blacklist

первый раз блокируется на 420 секунд и удаляется через 7 минут
второй раз на 2*420 у удаляется через 14 минут
третий раз на 2*2*420 и удаляется через 28 минут и тд...
2^(N-1)*420 N-й раз.

Sshit

Sshit - это perl скрипт соответственно необходимо чтобы в системе был perl, а так же 2 модуля

  • IPC::Shareable
  • Proc::PID::File

Sshit умеет работать только с pf и ipfw.

Установка sshit

cd /usr/ports/security/sshit/&& make install clean

Конфигации sshit.

Sshit имеет конфигурационный файл /usr/local/etc/sshit.conf в котором можно переопредилить значения по умолчанию.

FIREWALL_TYPE ="pf"; # Какой firewall используем MAX_COUNT =3; # Количество неудачных попыток аутентификации после которого ip блокируется WITHIN_TIME =60; # В течении сколько секунд должно произойти заданное кол-во неудачных аутентификаций RESET_IP =300; # Через сколько секунд ip будет разблокирован. PFCTL_CMD ="/sbin/pfctl"; PF_TABLE ="badhosts"#имя таблицы куда заносятся плохие ip

Настройка ОС для работы sshit.

По аналогии с настройкой под sshguard редактируем файл конфигурации PF

Table persist block in quick on $if0 proto tcp from to $if0 port ssh label "ssh brute"

перечитываем конфигурационный файл

#pfctl -f /etc/pf.conf

Редактируем syslog.conf

Auth.info;authpriv.info |exec/usr/local/sbin/sshit

и перезапустите syslog

SSH – безопасный протокол для передачи данных (команд, файлов, видеосигнала и т.д.) между компьютерами.

По умолчанию он включен на VPS и выделенных серверах большинства хостинг-провайдеров, так как с его помощью возможно легко и безопасно управлять удаленной машиной. К слову, на сервисе Велл-Веб можно недорого арендовать сервер VPS . Так как SSH поднят на всех VPS, Чтобы при использовании Secure Shell не возникло проблем, необходима правильная защита SSH.

Отключаем доступ от рута

В первую очередь рекомендуется деактивировать возможность удаленного подключения к машине под учетной записью суперпользователя (root). Для этого нужно найти файл sshd_config, который обычно (но не всегда) находится в каталоге /etc/ssh/, и открыть его.

В нем потребуется отыскать пункт PermitRootLogin и заменить его значение на "no", то есть должна получиться такая запись:

PermitRootLogin no

Естественно, это не предотвратит взлом, но все же несколько его затруднит.

Чтобы свести к минимуму возможность взлома, рекомендуется вместо авторизации по логину и паролю использовать авторизацию при помощи ключей. Это можно сделать несколькими способами. Подобное, к слову, еще и неплохая SSH защита от брутфорса.

Смена порта по умолчанию

Так как взлом сервера по SSH обычно происходит через перебор паролей (брутфорс), то рационально будет изменить стандартный 22-й порт на какой-нибудь другой. Сделать это очень легко. В первую очередь нужно открыть уже упомянутый файл sshd_config, и добавить там одну строчку:

Port номер_порта

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

Port 3048

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

Ограничение доступа по IP

Еще один способ защиты, который практически до нуля снизит вероятность несанкционированного подключения – это установка ограничений на авторизацию. SSH можно настроить таким способом, чтобы авторизоваться на сервере можно было только с удаленных машин с определенными IP-адресами. Для этого в файле sshd_config в строке AllowUser к имени каждого пользователя нужно дописать @номер_IP. Запись может иметь, например, такой вид:

AllowUsers [email protected], [email protected]

Перед тем, как использовать этот способ, рекомендуется убедиться, что не возникнет ситуаций, при которых может потребоваться зайти на сервер с машины, IP-адрес которой не предусмотрен конфигурацией.

Безопасный пароль

Ну и конечно же стоит использовать стойкий к перебору пароль. Длинный и с как можно более разнообразными символами, желательно с кракозябрами. Это must have.