===== Настройка веб-сервера на базе стека LEMP в Ubuntu Server 14.04 LTS. Часть 2. Настройка OpenSSH и Fail2ban ===== ==== Установка и настройка OpenSSH ==== Если ОС Ubuntu на вашем сервере развёрнута не вами самостоятельно, а вы взяли готовый шаблон преднастроенной виртуальной машины у хостера, то есть [[https://debian.pro/1915|рекомендация]] перед началом использования 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 Ниже приведён пример конфигурационного файла, который отражает не все его параметры, а лишь те, на которые стоит обратить внимание или отредактировать. Перед каждым параметром будет приведён небольшой комментарий: # Меняем порт по умолчанию (порт 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**. Или можно воспользоваться сторонними вспомогательными инструментами, самые известные из которых, это [[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 и ряду других приложений.
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, посмотреть на пример его применения можно [[http://anosov.me/2011/07/five-simple-steps-for-ssh-protect-in-ubuntu/|здесь]]. Итак, наш выбор остановился на **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** с комментариями к параметрам: ... [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 с комментариями по каждому параметру: ... [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 unbanip Например, удалим из блокировки IP-адрес 22.33.44.55, который был заблокирован в соответствии с правилами секции [ssh] : sudo fail2ban-client set ssh unbanip 22.33.44.55 ==== Дополнительные источники информации ==== * [[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~~