В последнее время, благодаря карантину, количество несанкционированных попыток подключений к серверам выросло на порядок. Очень много "хакеров" отправили из школ, университетов и других учебных заведений учиться домой. И делать дома им особо не чего. Чтобы убедиться в этом достаточно просто посмотреть логи сервера.
И сегодня мы поговорим об очень простом скрипте, который поможет в борьбе с не званными гостями, под названием Denyhosts - это скрипт защищающий ssh от взлома. Он анализирует количество неудачных попыток подключения к серверу с последующей блокировкой. Блокировка происходит путем внесения IP в hosts.deny и добавления правила для iptables.
Он ни в коем случае не является последней инстанцией, нерушимой опорой и бронёй как у танка. Это дополнительное средство защиты.
Но если его использовать в купе, например, с fail2ban, то получится достаточно крепкое и устойчивое противоядие. Почему современные админы так редко его используют или вовсе проходят стороной для меня остаётся загадкой. Ведь, как говорится, в бою все средства хороши. А запретить всё и вся не всегда возможно и не совсем правильно.
1. Установка denyhosts.
В Ubuntu версии 18 установка проста и тривиальна.
$ sudo apt-get install denyhosts
Если вдруг попытка установки посыпала ошибками, не нужно расстраиваться и опускать руки. Linux в 2020 году так и не избавилась от иногда странных и не чем не обоснованных ошибок.
Об этом моменте люди уже позаботились и в установочный пакет включили скрипт установки, который нам достаточно скачать.
Переходим в папку временных файлов.
$ cd /tmp/
Скачиваем сам установочный пакет denyhosts.
$ wget http://downloads.sourceforge.net/project/denyhost/denyhost-3.0/denyhosts-3.0.tar.gz
Распаковываем и устанавливаем.
$ tar xzf denyhosts*.tar.gz
$ cd DenyHosts*
$ sudo python setup.py install
После выполнения приведенных выше команд denyhosts будет установлен на сервере, но для запуска пока не готов.
Скопируем файл демона в каталог /etc/init.d/.
$ sudo cp /usr/local/bin/daemon-control-dist /etc/init.d/denyhosts
Затем нужно открыть скрипт
$ sudo nano /etc/init.d/denyhosts
и привести перечисленные ниже пункты к соответствующему виду
DENYHOSTS_BIN = “/usr/local/bin/denyhosts.py”
DENYHOSTS_LOCK = “/run/denyhosts.pid”
DENYHOSTS_CFG = “/etc/denyhosts.conf”
PYTHON_BIN = “/usr/bin/env python”
С установкой закончили. Танцев с бубном было не много.
2. Добавляем наши IP в исключение Denyhosts.
После установки denyhosts нужно первым делом и в обязательном порядке внести свой IP в список исключений. Это нужно для того чтобы если вы забыли переключить раскладку или капслок светит в глаз, но вы его упорно игнорируете, ну или вдруг накрыл кратковременный склероз, denyhosts вас узнает и как говорится поймет и простит. Для этого откройте файл /etc/hosts.allow.
$ nano /etc/hosts.allow
И добавляем свой ip или диапазон.
Сохраняем изменения, используя комбинацию клавиш Ctrl + O и выходим из редактора, используя Ctrl + X.
Не все знают или не видят или не особо смотрят логи, но есть ещё один файл куда нужно прописать исключения. Это файл Allowed-warned-hosts.
Переходим в нужную директорию
$ cd /var/lib/denyhosts
Смотрим есть ли там нужный файл
$ ls -la
Если файла allowed-warned-hosts нет, то создаем его командой
$ touch allowed-warned-hosts
Открываем в редакторе и заносим туда свои IP, но уже без названия службы. Просто ip-адрес или диапазон адресов.
$ nano allowed-warned-hosts
Сохраняем изменения, используя комбинацию клавиш Ctrl + O и выходим из редактора, используя Ctrl + X.
Вот теперь можно переходить к другим пунктам настройки.
3. Настройка denyhosts
Чтобы denyhosts знал, где лежит лог со списком злоумышленников, знал сколько попыток им давать и высылать или нет вам письмо с информацией о посланных полями и лесами нарушителями, нам нужно отредактировать файл denyhosts.conf.
$ sudo nano /etc/denyhosts.conf
И правим перечисленные пункты под свои нужды
SECURE_LOG = /var/log/auth.log Путь к логам сервера
PURGE_DENY = Время, по истечении которого забаненные IP удаляются. Смысла в этом не вижу, но такой пункт есть.
DENY_THRESHOLD_INVALID = 2 Неудачных попыток входа c несуществующим логином до бана.
DENY_THRESHOLD_VALID = 3 Число попыток входа с существующим логином, но неверным паролем до бана.
DENY_THRESHOLD_ROOT = 2 Число неудачных попыток входа до бана для пользователя root.
IPTABLES = /sbin/iptables блокировать подключения с использованием IPTABLES.
DAEMON_SLEEP = 20s Период активации демона, ну или время проверки лога доступа.
Если нам нужно чтобы denyhosts высылал вам отчеты о проделанной работе, то нужно подправить следующие пункты. Комментировать я думаю смысла нет.
ADMIN_EMAIL = admin@bestmail.ru
SMTP_HOST = localhost
SMTP_PORT = 25
SMTP_FROM = DenyHosts <bestmail@bestmail.ru>
SMTP_SUBJECT = DenyHosts Daily Report</h6>
Если всё устраивает, то сохраняем изменения, используя комбинацию клавиш Ctrl + O и выходим из редактора, используя Ctrl + X.
4. Запуск службы denyhosts и добавление в автозагрузку
Для того чтобы внесенные в конфигурационный файл изменения были учтены, нужно перезапустить denyhosts
$ sudo service denyhosts restart
Для более старых версий Ubuntu/Debian Linux или систем не на основе systemd, введите:
$ sudo /etc/init.d/denyhosts restart
Включение службы denyhosts на Ubuntu Linux 16.04 LTS во время загрузки
$ sudo systemctl enable denyhosts.service
На этом установка и настройка denyhosts закончена. В логах с мстительной улыбкой можно наблюдать посланных и отвергнутых))).
5. Удалить заблокированный IP-адрес из DenyHosts
Если вдруг так случилось что важный ip был заблокирован, то для начала нужно остановить службу denyhosts
$ sudo /etc/init.d/denyhosts stop
Чтобы удалить заблокированный IP-адрес полностью, нам нужно отредактировать следующие файлы, удалив оттуда IP-адрес.
# nano /etc/hosts.deny
# nano /var/lib/denyhosts/hosts
# nano /var/lib/denyhosts/hosts-restricted
# nano /var/lib/denyhosts/hosts-root
# nano /var/lib/denyhosts/hosts-valid
# nano /var/lib/denyhosts/users-hosts
Заблокированный адрес будет добавлен во все файлы в каталоге /var/lib/denyhosts/, но и не стоит забывать о /etc/hosts.deny. И если с фалом /etc/denyhost все просто, то с папкой /var/lib/denyhosts/ будет проблематичней.
Один из лучших способов найти в какой файл внесен заблокированный адрес это команда grep. Т.е. чтобы найти заблокированный адрес 8.8.8.8 выполните команду:
$ cd /var/lib/denyhosts
$ grep 8.8.8.8 *
Команда покажет в каких файлах есть этот адрес. Удаляем и запускаем denyhosts.
$ sudo /etc/init.d/denyhosts start
И еще вариант, взятый с англоязычного сайта. С какого уже не помню, но способ проверен и полностью рабочий.
Вы можете сделать это в 4 командах. python script автоматизирует процесс удаления:
$ sudo /etc/init.d/denyhosts stop
$ git clone https://github.com/rsprabery/unblock.git
$ sudo python unblock/unblock.py <IP_ADDRESS>
$ sudo /etc/init.d/denyhosts start
Теперь расскажу что да как. Сначала останавливаем denyhosts. Скачиваем скрипт который найдет и удалит заблокированный адрес. Запускаем скрипт заменив IP_ADDRESS на нужный ip. Запускаем denyhosts.
Скрипт работает на всех версиях Ubuntu. Работает быстро, четко, без редактирования каких либо файлов.
6. Итог
Denyhosts простой как палка. Отрабатывает на 100% все попытки постучать вашему серверу ssh по кумполу. Не висит постоянно в памяти и использует простые средства блокировки.
Но есть два момента которые я не использую:
1) В моих конфигурациях я не использую блокировку подключения с использованием IPTABLES, т.к. этим у меня занимается fail2ban о котором я расскажу в следующей статье.
2) Так же не использую синхронизацию черных списков с серверами denyhosts. Мой опыт использования коллективных черных списков такой себе... Потому как регулярный поиск и вычленение хороших адресов из этих списков утомляет. А это будет происходить регулярно. Что одному хорошо, то не факт что другому тоже))).
P.S. Всем кто дочитал до конца спасибо! Буду рад если поможет в работе.
Всё что понаписано выше проверено на Ubuntu Server 18.04 и работает по сей день.