Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban

Настройка веб-сервера на базе стека LEMP в Ubuntu Server 14.04 LTS. Часть 2. Настройка OpenSSH и Fail2ban

Установка и настройка OpenSSH

Если ОС Ubuntu на вашем сервере развёрнута не вами самостоятельно, а вы взяли готовый шаблон преднастроенной виртуальной машины у хостера, то есть рекомендация перед началом использования SSH сделать пару вещей.

Во первых, удалить ключи SSH-сервера, которые, возможно уже есть в системе:

sudo rm /etc/ssh/ssh_host_*

Во вторых, переустановить пакеты связанные с SSH из официальных репозитариев Ubuntu:

sudo apt-get install --reinstall libssh2-1:amd64 \
openssh-blacklist openssh-blacklist-extra \ 
openssh-client openssh-server ssh

В нашем случае система установлена своими силами и ещё не имеет службы SSH-сервера, так как от её установки ранее мы отказались на этапе установки системы. Установим пакет openssh-server:

sudo apt-get install openssh-server

Откроем основной конфигурационный файл:

sudo nano /etc/ssh/sshd_config

Ниже приведён пример конфигурационного файла, который отражает не все его параметры, а лишь те, на которые стоит обратить внимание или отредактировать. Перед каждым параметром будет приведён небольшой комментарий:

/etc/ssh/sshd_config
# Меняем порт по умолчанию (порт 22) на другой порт. 
# При смене порта, в целях безопасности, лучше выбирать порт не выше, чем 1024, 
# так как именно этот нижний диапазон портов может использоваться только пользователями 
# системы с root-овыми привилегиями
Port 758
 
# Явно задаём IP адрес на котором должен работать SSH-сервер
ListenAddress 11.22.33.44
 
# Явно задаём использование только протокола v2
Protocol 2
 
# Явно указываем используемый протокол.
# В данном случае отключаем прослушиватель на IPv6, так как он не используется
AddressFamily inet
 
# Запрещаем доступ пользователя root через SSH
PermitRootLogin no
 
# Запрещаем доступ с "пустыми" паролями 
PermitEmptyPasswords no
 
# Запрещаем использовать файлы ~/.rhosts и ~/.shosts, имеющиеся у пользователя, 
# чтобы запретить небезопасный доступ через RSH
IgnoreRhosts yes
RhostsRSAAuthentication no
 
# Запрещаем кросс-хостинговую аутентификацию
HostbasedAuthentication no
 
# Отключаем использование sftp-server. Вместо него можно использовать утилиту scp  
#Subsystem sftp /usr/lib/openssh/sftp-server
 
# Явно указываем локальных пользователей, которым разрешено подключаться к SSH-серверу
AllowUsers petya
 
# Выполняем сброс бездействующих сессий через 900 секунд (15 минут).
ClientAliveInterval 900 
ClientAliveCountMax 0
 
# Отключаем использование DNS для обратного резолва имени клиента
# Отключение также рекомендуется для File2Ban 
# (http://www.fail2ban.org/wiki/index.php/OpenSSH)  
UseDNS no

После изменения конфигурационного файла перезапускаем службу

sudo service ssh restart

Разрешим в фаерволе подключения на ранее назначенный порт SSH и второй командой сохраним обновлённые правила iptables:

sudo iptables -A INPUT -p tcp --dport 758 -i eth0 -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables.conf

Проверим с другого компьютера имеющего подключение к Интернет подключение к SSH-серверу:

ssh -p 758 petya@11.22.33.44



Установка и настройка Fail2ban

Для того, чтобы больше обезопасить наш SSH-сервер на предмет противодействия атакам по подбору паролей методом грубой силы (brute force attack) можно использовать разные инструменты и средства. Например можно воспользоваться дополнительной настройкой параметра MaxStartups в конфигурационном файле /etc/ssh/sshd_config. Или можно воспользоваться сторонними вспомогательными инструментами, самые известные из которых, это Fail2Ban и DenyHosts.

Пакет DenyHosts уже достаточно давно не обновлялся, и имеет проблемы из-за которых он даже, по некоторой информации был снят с поддержки в Debian Jessie.

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

Fail2ban is similar to DenyHosts … but unlike DenyHosts which focuses on SSH, fail2ban can be configured to monitor any service that writes login attempts to a log file, and instead of using /etc/hosts.deny only to block IP addresses/hosts, fail2ban can use Netfilter/iptables and TCP Wrappers /etc/hosts.deny
http://en.wikipedia.org/wiki/Fail2ban

Если же всё таки вам будет интересно почитать по DenyHosts, посмотреть на пример его применения можно здесь.

Итак, наш выбор остановился на Fail2Ban, и мы выполняем его установку:

sudo apt-get install fail2ban

Настраиваем fail2ban

Основные настройки работы процесса fail2ban расположены в файле /etc/fail2ban/fail2ban.conf. Можно оставить эти настройки без изменений.

Основные настройки блокировок для разных приложений можно найти в файле sudo nano /etc/fail2ban/jail.conf Скопируем файл jail.conf в jail.local и будем править именно него, это позволит обновлять в дальнейшем пакет без дополнительных предупреждений о переписывании основного конфига jail.conf, и к тому же, мы всегда будем иметь под руками для примера актуальную версию jail.conf.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Файл разделён на секции. Секция [DEFAULT] содержит основные настройки для блокировок любых приложений Далее идут секции описывающие параметры блокировок для конкретных приложений

По умолчанию в fail2ban сразу после установки включается защита для службы SSH-сервера с параметрами - при превышении 6 неудачных вводов пароля подряд = блокировка IP-адреса подключающегося SSH-клиента на 600 секунд. Измените эти параметры под себя.

Пример важных параметров в секции [DEFAULT] в конфигурационном файле jail.local с комментариями к параметрам:

/etc/fail2ban/jail.local
...
[DEFAULT]
 
# IP–адреса с маской подсети, которые не должны быть заблокированы. 
# Можно задать список IP-адресов разделяя значения пробелами. 
# Стандартную строку локального адреса лучше закомментировать, 
# так как при проникновении в систему под любой непривилегированной учётной записью, 
# можно произвести атаку перебором на пользователя с root-привилегиями.
#
#ignoreip = 127.0.0.1/8
 
# Далее идут правила блокировки следующего порядка:
# Если в течении 30 минут было 3 неудачных попытки = блокируем IP-адрес клиента на 24 часа.
 
# Время блокировки в секундах, 
# по истечении которого IP–адрес удаляется из пула заблокированных
bantime  = 86400
 
# Время, в течение которого суммируются подозрительные попытки в количестве maxretry
findtime = 1800
 
# Количество подозрительных попыток, после которых применяется правило. 
# Применительно к sshd — это число неудачных попыток входа, 
# после которых происходит блокировка.
maxretry = 3
 
# Файлы с правилами реагирования - в каталоге /etc/fail2ban/action.d/.
# По умолчанию используется файл iptables-multiport.conf. 
# Заглянув в этот файл можно понять как fail2ban работает с правилами iptables. 
# Можем оставить всё без изменений.
banaction = iptables-multiport
...

Пример изменённой секции [ssh] в конфигурационном файле jail.local с комментариями по каждому параметру:

/etc/fail2ban/jail.local
...
[ssh]
 
# Признак активности изолятора (jail)
enabled = true
 
# Порт на котором запущено наблюдаемое приложение.
# Может быть указан как в виде номера порта, 
# например для SSH-сервера по умолчанию - 22, так в виде его буквенного обозначения - ssh
# Именно этот порт будет блокироваться средствами iptables 
# в случае обнаружения попыток несанкционированного доступа к приложению.
port = 758
 
# Имя файла фильтра с регулярными выражениями из каталога /etc/fail2ban/filter.d/,
# по которым идёт поиск подозрительных совпадений в логе приложения.
# По умолчанию фильтру для SSH-сервера соответствует файл /etc/fail2ban/filter.d/sshd.conf
filter = sshd
 
# Путь к наблюдаемому логу, 
# который fail2ban будет обрабатывать с помощью заданного ранее фильтра.
# Вся история удачных и неудачных входов в систему, в том числе и по SSH,
# по умолчанию записывается в лог /var/log/auth.log.
logpath = /var/log/auth.log
 
# Количество подозрительных попыток 
# (может переопределяеть глобавльны параметр из секции [DEFAULT])
maxretry = 3
...

После изменения настроек конфигурационных файлов перезапускаем службу fail2ban:

sudo service fail2ban restart

При запуске службы fail2ban в iptables будет создана отдельная цепочка для каждого приложения. Формат именования цепочки будет такой: fail2ban-<имя приложения из названия jail-секций>, например, при включении в файле jail.local секции ssh, в iptables появится цепочка fail2ban-ssh

$ sudo iptables -L fail2ban-ssh

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Эта цепочка будет пополняться правилами блокировки IP-адресов, с которых были предприняты попытки перебора учётных данных.

А цепочка fail2ban-ssh, в свою очередь, будет входить в самое начало системной цепочки INPUT:

$ sudo iptables -L INPUT

Chain INPUT (policy DROP)
target     prot opt source       destination
fail2ban-ssh  tcp  --  anywhere  anywhere  multiport dports 758
ACCEPT     all  --  anywhere     anywhere
ACCEPT     all  --  anywhere     anywhere state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere     anywhere tcp dpt:758

Тестируем результат

Давайте протестируем работу fail2ban…

Предварительно проверим на сервере цепочку iptables fail2ban и убедимся в том, что она не содержит правил

$ sudo iptables -L fail2ban-ssh

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Заходим с внешнего IP, отличного от нашего, чтобы не заблокировать свой же адрес, с помощью SSH клиента

ssh -p 758 fakeuser@11.22.33.44

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

$ sudo iptables -L fail2ban-ssh

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
REJECT     all  --  r-88-111-222-88.provider.ru  anywhere reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere

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

Разблокировка IP-адреса в fail2ban

Чтобы вручную разблокировать IP-адрес, который был заблокирован fail2ban можно выполнить команду в формате:

sudo fail2ban-client set <JAIL> unbanip <IP>

Например, удалим из блокировки IP-адрес 22.33.44.55, который был заблокирован в соответствии с правилами секции [ssh] :

sudo fail2ban-client set ssh unbanip 22.33.44.55

Дополнительные источники информации

Обсуждение

Ваш комментарий:
 

unix-linux/ubuntu/ubuntu-14-04-lts-trusty-tahr/how-to-install-lemp-web-server-on-ubuntu-14-04/setup-open-ssh-and-fail2ban.txt · Последние изменения: 17.12.2016 17:10 — Алексей Максимов