Вики IT-KB

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

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

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


web-server-nginx:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
web-server-nginx:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban [05.09.2025 12:04] – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1web-server-nginx:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban [05.09.2025 12:04] (текущий) – ↷ Страница перемещена из unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban в web-server-nginx:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-open-ssh-and-fail2ban Алексей Максимов
Строка 1: Строка 1:
 +===== Настройка веб-сервера на базе стека LEMP в Ubuntu Server 14.04 LTS. Часть 2. Настройка OpenSSH и Fail2ban =====
  
 +==== Установка и настройка OpenSSH ====
 +
 +<WRAP center important>
 +Если ОС Ubuntu на вашем сервере развёрнута не вами самостоятельно, а вы взяли готовый шаблон преднастроенной виртуальной машины у хостера, то есть [[https://debian.pro/1915|рекомендация]] перед началом использования SSH сделать пару вещей.
 +
 +Во первых, удалить ключи SSH-сервера, которые, возможно уже есть в системе: 
 +<code>sudo rm /etc/ssh/ssh_host_*</code>
 +Во вторых, переустановить пакеты связанные с SSH из официальных репозитариев Ubuntu: 
 +<code>sudo apt-get install --reinstall libssh2-1:amd64 \
 +openssh-blacklist openssh-blacklist-extra \ 
 +openssh-client openssh-server ssh</code>
 +
 +</WRAP>
 +
 +В нашем случае система установлена своими силами и ещё не имеет службы SSH-сервера, так как от её установки ранее мы отказались на этапе установки системы. Установим пакет **openssh-server**:
 +<code>sudo apt-get install openssh-server</code>
 +
 +Откроем основной конфигурационный файл:
 +
 +<code>sudo nano /etc/ssh/sshd_config</code>
 +
 +Ниже приведён пример конфигурационного файла, который отражает не все его параметры, а лишь те, на которые стоит обратить внимание или отредактировать. Перед каждым параметром будет приведён небольшой комментарий:
 +
 +<file c /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
 +
 +</file>
 +
 +После изменения конфигурационного файла перезапускаем службу
 +
 +<code>sudo service ssh restart</code>
 +
 +Разрешим в фаерволе подключения на ранее назначенный порт SSH и второй командой сохраним обновлённые правила iptables:
 +
 +<code>sudo iptables -A INPUT -p tcp --dport 758 -i eth0 -j ACCEPT
 +sudo iptables-save | sudo tee /etc/iptables.conf
 +</code>
 +
 +Проверим с другого компьютера имеющего подключение к Интернет подключение к SSH-серверу:
 +
 +<code>ssh -p 758 petya@11.22.33.44</code>
 +
 +\\
 +\\
 +==== Установка и настройка Fail2ban ====
 +
 +Для того, чтобы больше обезопасить наш SSH-сервер на предмет противодействия атакам по подбору паролей методом грубой силы (**brute force attack**) можно использовать разные инструменты и средства. Например можно воспользоваться дополнительной настройкой параметра **MaxStartups** в конфигурационном файле **/etc/ssh/sshd_config**. Или можно воспользоваться сторонними вспомогательными инструментами, самые известные из которых, это [[http://www.fail2ban.org/wiki/index.php/Main_Page|Fail2Ban]] и [[http://denyhosts.sourceforge.net/|DenyHosts]]. 
 +
 +Пакет **DenyHosts** уже достаточно давно не обновлялся, и имеет проблемы из-за которых он даже, [[https://www.chrissearle.org/2015/06/16/replacing-denyhosts-with-fail2ban-for-debian/|по некоторой информации]] был снят с поддержки в Debian Jessie.
 +
 +Пакет **Fail2Ban** в свою очередь является более универсальным и гибким средством, что подтверждается [[http://serverfault.com/questions/128962/denyhosts-vs-fail2ban-vs-iptables-best-way-to-prevent-brute-force-logons/|мнениями сообщества]]. Если DenyHosts заточен именно под SSH, то Fail2Ban способен обеспечивать дополнительную защиту помимо SSH и ряду других приложений.
 +
 +<blockquote>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</blockquote>
 +
 +Если же всё таки вам будет интересно почитать по DenyHosts, посмотреть на пример его применения можно [[http://anosov.me/2011/07/five-simple-steps-for-ssh-protect-in-ubuntu/|здесь]].
 +
 +Итак, наш выбор остановился на **Fail2Ban**, и мы выполняем его установку:
 +<code>sudo apt-get install fail2ban</code>
 +
 +=== Настраиваем fail2ban ===
 +
 +Основные настройки работы процесса fail2ban расположены в файле **/etc/fail2ban/fail2ban.conf**. Можно оставить эти настройки без изменений.
 +
 +Основные настройки блокировок для разных приложений можно найти в файле
 +sudo nano **/etc/fail2ban/jail.conf**
 +Скопируем файл **jail.conf** в **jail.local** и будем править именно него, это позволит обновлять в дальнейшем пакет без дополнительных предупреждений о переписывании основного конфига jail.conf, и к тому же, мы всегда будем иметь под руками для примера актуальную версию jail.conf.
 + 
 +<code>sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
 +sudo nano /etc/fail2ban/jail.local</code>
 +
 +Файл разделён на секции.
 +Секция ''[DEFAULT]'' содержит основные настройки для блокировок любых приложений
 +Далее идут секции описывающие параметры блокировок для конкретных приложений
 +
 +По умолчанию в fail2ban сразу после установки включается защита для службы SSH-сервера с параметрами - при превышении 6 неудачных вводов пароля подряд = блокировка IP-адреса подключающегося SSH-клиента на 600 секунд. 
 +Измените эти параметры под себя.
 +
 +
 +Пример важных параметров в секции ''[DEFAULT]'' в конфигурационном файле **jail.local** с комментариями к параметрам:
 +
 +<file c /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
 +...
 +</file>
 +
 +
 +Пример изменённой секции [ssh] в конфигурационном файле jail.local с комментариями по каждому параметру:
 +<file c /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
 +...
 +</file>
 +
 +После изменения настроек конфигурационных файлов перезапускаем службу fail2ban:
 +
 +<code>sudo service fail2ban restart</code>
 + 
 +При запуске службы fail2ban в **iptables** будет создана отдельная цепочка для каждого приложения. Формат именования цепочки будет такой: ''fail2ban-<имя приложения из названия jail-секций>'', например, при включении в файле **jail.local** секции **ssh**, в iptables появится цепочка **fail2ban-ssh**
 +
 +<code>$ sudo iptables -L fail2ban-ssh
 +
 +Chain fail2ban-ssh (1 references)
 +target     prot opt source               destination
 +RETURN     all  --  anywhere             anywhere</code>
 +
 +Эта цепочка будет пополняться правилами блокировки IP-адресов, с которых были предприняты попытки перебора учётных данных.
 +
 +А цепочка **fail2ban-ssh**, в свою очередь, будет входить в самое начало системной цепочки **INPUT**: 
 +
 +<code>$ 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
 +</code>
 +
 +=== Тестируем результат ===
 +
 +Давайте протестируем работу fail2ban...
 +
 +Предварительно проверим на сервере цепочку iptables fail2ban и убедимся в том, что она не содержит правил
 +
 +<code>$ sudo iptables -L fail2ban-ssh
 +
 +Chain fail2ban-ssh (1 references)
 +target     prot opt source               destination
 +RETURN     all  --  anywhere             anywhere</code>
 +
 +Заходим с внешнего IP, отличного от нашего, чтобы не заблокировать свой же адрес, с помощью SSH клиента
 +
 +<code>ssh -p 758 fakeuser@11.22.33.44</code>
 + 
 +После третьей попытки ввода неверных учётных данных SSH-сервер должен начать отвергать запросы клиента на соединение соединение.
 +Проверим на SSH-сервере правила и убедимся в том, что для зловредного клиента появилось правило блокировки
 +
 +<code>$ 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</code>
 +
 +Как видим, механизм защиты сработал. Добавленное в iptables правило должно будет автоматически удалиться через 24 часа, согласно заданным нами настройкам, что предотвратит разрастание соответствующих цепочек и не окажет отрицательного влияния на производительность iptables
 +\\
 +
 +=== Разблокировка IP-адреса в fail2ban ===
 +
 +Чтобы вручную разблокировать IP-адрес, который был заблокирован fail2ban можно выполнить команду в формате:
 +
 +<code>sudo fail2ban-client set <JAIL> unbanip <IP></code>
 +
 +Например, удалим из блокировки IP-адрес 22.33.44.55, который был заблокирован в соответствии с правилами секции [ssh] :
 +
 +<code>sudo fail2ban-client set ssh unbanip 22.33.44.55</code>
 +
 +==== Дополнительные источники информации ====
 +
 +  * [[http://help.ubuntu.ru/wiki/ssh|Ubuntu.ru Wiki -SSH]]
 +  * [[http://www.nestor.minsk.by/sr/2007/11/sr71104.html|Сетевые решения A-Z - хитрости SSH]]
 +  * [[http://serverfault.com/questions/128962/denyhosts-vs-fail2ban-vs-iptables-best-way-to-prevent-brute-force-logons|ServerFault.com - Denyhosts vs fail2ban vs iptables- best way to prevent brute force logons?]]
 +  * [[http://rus-linux.net/nlib.php?name=/MyLDP/sec/openssh.html|Linux по русски - 20 советов по безопасному использованию сервера OpenSSH]]
 +  * [[http://help.ubuntu.ru/wiki/fail2ban|Ubuntu.ru Wiki - Fail2ban]]
 +  * [[http://linuxstar.ru/nastroyka-fail2ban-v-ubuntu-server.html|LinuxStar.ru - Настройка fail2ban в ubuntu server ]]
 +  * [[http://anosov.me/2011/07/five-simple-steps-for-ssh-protect-in-ubuntu/|Андрей Аносов - Пять простых шагов для защиты ssh в Ubuntu. Часть I]]
 +  * [[http://anosov.me/2011/08/port-knocking/|Андрей Аносов - Пять простых шагов для защиты ssh в Ubuntu. Часть II — Port knocking]]
 +
 +----
 +
 +{{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 18.03.2016 15:41
 +
 +{{tag>Linux Ubuntu "Ubuntu 14.04" "14.04 LTS" "Ubuntu Server" Security SSH sshd OpenSSH openssh-server Fail2ban iptables DenyHosts jail "Brute Force" }}
 +
 +~~DISCUSSION~~