Блокирование нежелательных попыток входа SSH с помощью PyFilter в Ubuntu 16.04

Secure Shell (SSH) — это криптографический сетевой протокол для защиты работы сетевых сервисов. Он обычно используется для удаленного управления компьютерной системой или для передачи файлов. Когда SSH имеет общий доступ к интернету, возникают проблемы безопасности. Например, боты могут попытаться угадать ваш пароль с помощью методов brute force.

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

В этом мануале вы научитесь устанавливать и настраивать PyFilter для блокировки SSH-запросов. Затем вы установите PyFilter как сервис и при желании синхронизируете список заблокированных адресов между серверами: эта функция позволяет нескольким серверам совместно использовать список запрещенных IP-адресов. Также вы узнаете, как разблокировать IP-адреса.

Требования

  • Сервер Ubuntu 16.04, настроенный по этому мануалу.
  • Python 3 (идет в Ubuntu 16.04 по умолчанию).
  • Пакетный менеджер pip, который можно установить с помощью команды:

sudo apt-get install python3-pip

1: Загрузка и настройка PyFilter

Клонируйте репозиторий PyFilter с Github. Перейдите в домашний каталог и клонируйте репозиторий:

cd ~
git clone https://github.com/Jason2605/PyFilter.git

Это создаст новый каталог PyFilter, который нужно переместить в /usr/local:

sudo mv PyFilter /usr/local/PyFilter

Теперь перейдите в /usr/local/PyFilter:

cd /usr/local/PyFilter

Затем нужно создать конфигурационный файл. PyFilter поставляется с конфигурационным файлом по умолчанию, он находится в Config/config.default.json. Скопируйте его и отредактируйте копию, чтобы не потерять файл по умолчанию: если что-то пойдет не так, у вас будет доступ к конфигурации по умолчанию.

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

sudo cp Config/config.default.json Config/config.json

С помощью команды less просмотрите его содержимое:

less Config/config.json

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

2: Запуск PyFilter

Загрузка PyFilter включает скрипт под названием run.sh, который вы должны использовать для запуска PyFilter.

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

sudo chmod +x run.sh

Теперь запустите скрипт:

./run.sh

PyFilter начнет просматривать логи и вы увидите такой вывод:

No file to check within rule: Mysql
No file to check within rule: Apache
No file to check within rule: Nginx
Checking Ssh logs

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

Результаты PyFilter регистрирует в каталоге /usr/local/PyFilter/Log.

Когда IP превысит установленный предел неудачных запросов на вход, вы увидите такой результат:

2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name.

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

Чтобы остановить PyFilter, нажмите CTRL+C.

Теперь нужно создать сервис для PyFilter и добавить его в автозагрузку.

3: Создание сервиса для PyFilter

Теперь, когда PyFilter работает, создайте для него сервис, чтобы он запускался каждый раз, когда вы будете перезагружать сервер.

В каталоге PyFilter есть скрипт под названием install.sh, который создает сервис для PyFilter и позволяет запускать его вместе с системой.

Сделайте скрипт исполняемым:

sudo chmod +x install.sh

Запустите его:

./install.sh

Если установка прошла успешно, вы увидите:

Service created and enabled, check the status of it by using "sudo systemctl status PyFilter"

Чтобы убедиться, что все работает правильно, запустите:

sudo systemctl status PyFilter

Вы увидите такой вывод:

PyFilter.service - PyFilter
Loaded: loaded (/etc/systemd/system/PyFilter.service; enabled; vendor preset: enabled)
Active: <^>active^> (running) since Wed 2018-03-21 18:55:35 UTC; 12s ago
Main PID: 8383 (bash)
CGroup: /system.slice/PyFilter.service
├─8383 bash /usr/local/PyFilter/run.sh
├─8384 sudo python3 run.py
└─8387 python3 run.py

Если вы получили ошибку, проверьте все предыдущие этапы.

4: Синхронизация списка заблокированных адресов между серверами (опционально)

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

Как уже говорилось в требованиях, для поддержки этой функции необходимо установить и настроить Redis.

Вам также нужен модуль Python redis, который вы можете установить с помощью pip:

pip3 install redis

Затем отредактируйте свой конфигурационный файл, чтобы включить поддержку Redis вместо SQLite. Откройте файл Config/config.json в текстовом редакторе:

nano Config/config.json

Найдите строку:

"database": "sqlite"

Замените sqlite на redis:

"database": "redis"

Укажите информацию для подключения к Redis. Найдите такой раздел:

"redis": {
"host": "127.0.0.1",
"password": null,
"database": 0,
"sync_bans": {
"active": true,
"name": "your_hostname",
"check_time": 600
}
},

Укажите в этом разделе сведения о соединении сервера Redis. Затем в разделе sync_ban укажите имя хоста. Чтобы синхронизация между серверами была корректной, это имя должно быть уникальным для всех систем, на которых запущен PyFilter, если они используют один сервер Redis.

Сохраните изменения и закройте файл. Перезапустите PyFilter:

sudo systemctl restart PyFilter

5: Настройка PyFilter для сбора данных о местоположении IP-адресов (опционально)

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

Чтобы использовать эту функцию, вам понадобится модуль geoip2, который вы можете установить с помощью pip:

pip3 install geoip2

После установки этого модуля перезапустите PyFilter, чтобы он распознал новый модуль:

sudo systemctl restart PyFilter

Теперь вместе с заблокированным IP вы увидите дополнительную информацию о нем:

2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name. The IP was from United Kingdom.

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

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

PyFilter – это просто средство блокировки IP-адресов, которое может создавать правила iptables. Когда PyFilter блокирует IP-адрес, он обновляет правила брандмауэра, а затем сохраняет моментальные снимки правил в файлах usr/local/PyFilter/Config/blacklist.v4 и /usr/local/PyFilter/Config/blacklist.v6.

Например, несколько заблокированных IPv4 адресов в файле /usr/local/PyFilter/Config/blacklist.v4 выглядят так:

# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018
*filter
:INPUT ACCEPT [217:30580]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [249:30796]
-A INPUT -s 203.0.113.13/32 -j DROP

-A INPUT -s 203.0.113.14/32 -j DROP


-A INPUT -s 203.0.113.15/32 -j DROP

COMMIT
# Completed on Thu Mar 22 19:53:04 2018

Чтобы разблокировать эти адреса, откройте черный список в редакторе:

sudo nano /usr/local/PyFilter/Config/blacklist.v4

Удалите связанные с ними правила брандмауэра из файла. Например, чтобы разблокировать адрес 203.0.113.13, вы должны получить такой файл:

# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018
*filter
:INPUT ACCEPT [217:30580]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [249:30796]
-A INPUT -s 203.0.113.14/32 -j DROP
-A INPUT -s 203.0.113.15/32 -j DROP
COMMIT
# Completed on Thu Mar 22 19:53:04 2018

Затем сохраните файл и закройте редактор. Перезапустите PyFilter:

sudo systemctl restart PyFilter

Это обновит правила брандмауэра PyFilter.

Читайте также: Вывод и удаление правил IPTables

Также PyFilter может игнорировать определенные IP-адреса; для этого их нужно добавить в белый список в файле /usr/local/PyFilter/Config/config.json.

Заключение

Теперь PyFilter установлен на сервер и отслеживает SSH-подключения к нему.

Чтобы узнать больше о каждом разделе конфигурационного файла и о том, как настроить мониторинг других сервисов (MySQL, Apache, и т.д.), посетите сайт PyFilter.

Tags: , , ,