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

Автор выбралCode.org, чтобы получить пожертвование в размере 200 долларов в рамках программыWrite for DOnations.

Вступление

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

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

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

Предпосылки

Для завершения этого урока вам понадобится:

  • Один сервер Ubuntu 16.04, настроенный следующим образомthe Ubuntu 16.04 initial server setup guide, включая пользователя sudo без полномочий root и брандмауэр.

  • Python 3, который уже установлен по умолчанию в Ubuntu 16.04.

  • PIP установлен сsudo apt-get install python3-pip.

  • (Необязательно) Redis устанавливается черезHow to Install Redis on Ubuntu 16.04, если вы хотите настроить функцию межсерверной синхронизации запрета PyFilter вStep 4.

[[step-1 -—- download-and-configuring-pyfilter]] == Шаг 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 и убедимся, что все работает.

[[step-2 -—- running-pyfilter]] == Шаг 2 - Запуск PyFilter

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

Сначала измените разрешения для скрипта, чтобы сделать его исполняемым.

sudo chmod +x run.sh

Как только разрешения будут предоставлены, запустите скрипт для запуска PyFilter:

./run.sh

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

OutputNo 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.

Эти результаты также записываются в каталог/usr/local/PyFilter/Log.

Когда IP достигнет пределов, которые требуют запрета, вы увидите вывод, похожий на этот:

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

[.note] #Note: Если вы случайно заблокировали себя в своей капле из-за того, что заблокировали себя, вы можете вернуться в нее, следуя инструкциямHow To Use the DigitalOcean Console to Access your Droplet. Затем следуйте инструкциям вStep 6, чтобы удалить заблокированный IP-адрес.
#

Чтобы закрыть PyFilter, нажмитеCTRL+C.

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

[[step-3 -—- created-a-service-for-pyfilter]] == Шаг 3 - Создание службы для PyFilter

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

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

Измените скрипт, чтобы вы могли его выполнить:

sudo chmod +x install.sh

Затем запустите скрипт:

./install.sh

Вы увидите этот вывод, указывающий, что установка прошла успешно:

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

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

sudo systemctl status PyFilter

Вы увидите этот вывод, показывающий, что это службаactive:

Output● 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

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

Далее давайте рассмотрим, как настроить PyFilter для обмена запрещенными IP-адресами с другими серверами.

[[step-4 -—- configuring-pyfilter-for-cross-server-ban-syncing-optional]] == Шаг 4. Настройка PyFilter для межсерверной синхронизации запрета (необязательно)

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

Как указано в предварительных условиях, вам потребуется установить и настроить Redis.

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

pip3 install redis

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

nano Config/config.json

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

Config/config.json

"database": "sqlite"

Изменитеsqlite наredis:

Config/config.json

"database": "redis"

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

Config/config.json

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

Измените этот раздел, чтобы он включал сведения о подключении к вашему серверу Redis. Затем в разделеsync_bans изменитеname на имя вашего хоста. Это имя должно быть уникальным для каждой отдельной системы, в которой работает PyFilter, использующей один и тот же сервер Redis, для правильной работы синхронизации запретов между серверами.

Сохраните файл и выйдите из редактора. Затем перезапустите PyFilter, чтобы применить эти изменения:

sudo systemctl restart PyFilter

PyFilter теперь установлен и работает.

[[step-5 -—- configuring-pyfilter-to-gather-location-data-about-ip-addresses-optional]] == Шаг 5. Настройка PyFilter для сбора данных о местоположении об IP-адресах (необязательно)

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

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

pip3 install geoip2

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

sudo systemctl restart PyFilter

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

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

PyFilter теперь успешно регистрирует, из какой страны отправляются запросы.

Наконец, давайте посмотрим, как разблокировать адрес.

[[step-6 -—- un-banning-ip-addresses]] == Шаг 6 - Отмена запрета IP-адресов

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

Вот пример нескольких запрещенных адресов IPv4 в/usr/local/PyFilter/Config/blacklist.v4:

/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

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

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

Удалите связанные правила iptables из файла. В данном случае мы удалили203.0.113.13 из файла:

/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.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 обновит правила вашего брандмауэра, используя этот файл.

См.How To List and Delete Iptables Firewall Rules для получения дополнительной информации об управлении правилами с помощью iptables.

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

Заключение

Теперь у вас установлен PyFilter, который контролирует ваши SSH-соединения.

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

Related