Потребление памяти Fail2Ban CentOS

Fail2Ban использует огромную память в моей системе (1,2 ГБ). Существует несколько статей, в которых описывается, как его уменьшить. Ниже приведен пример для Debian.

  • добавьте команду 1ulimit1 в файл /etc/default/fail2ban .
  • Добавить (в файл) в последней строке:

     ulimit -s 256 

К сожалению нет такого файла или каталога в CentOS 7. Как применить это в моей системе?


После некоторых советов мой файл Systemd для Fail2Ban

 [Unit] Description=Fail2ban Service [Service] Type=forking ExecStart=/usr/bin/fail2ban-client -x start ExecStop=/usr/bin/fail2ban-client stop ExecReload=/usr/bin/fail2ban-client reload PIDFile=/var/run/fail2ban/fail2ban.pid Restart=always LimitSTACK=256` 

К сожалению, результат по-прежнему составляет 1251888 КБ.

/ И т.д. / по умолчанию

Каталог /etc/default никогда не используется в дистрибутивах на основе Red Hat. Это Debian / Ubuntu-ism. Для Centos 7 вы можете посмотреть пакеты, которые были установлены, которые относятся к fail2ban следующим образом:

 $ rpm -aq|grep fail fail2ban-server-0.9-9.el7.noarch fail2ban-sendmail-0.9-9.el7.noarch fail2ban-firewalld-0.9-9.el7.noarch fail2ban-systemd-0.9-9.el7.noarch fail2ban-0.9-9.el7.noarch 

Содержание fail2ban-сервера

Сервер fail2ban-server содержит файл службы для Systemd.

 $ rpm -ql fail2ban-server-0.9-9.el7.noarch | grep systemd /usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.py /usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.pyc /usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.pyo /usr/lib/systemd/system/fail2ban.service 

Файл службы Systemd

Содержимое файла службы Systemd:

 $ more /usr/lib/systemd/system/fail2ban.service [Unit] Description=Fail2ban Service After=syslog.target network.target firewalld.service [Service] Type=forking ExecStart=/usr/bin/fail2ban-client -x start ExecStop=/usr/bin/fail2ban-client stop ExecReload=/usr/bin/fail2ban-client reload PIDFile=/var/run/fail2ban/fail2ban.pid Restart=always [Install] WantedBy=multi-user.target 

Таким образом, можно добавить дополнительные опции в этот файл, как быстрый и грязный способ подтвердить, работают ли они.

Долгосрочные исправления

Чтобы сделать их постоянными, я добавлю опции более «официальным» способом, чтобы обновления пакета fail2ban не перезаписывали изменения этого файла. Это можно сделать, добавив настроенную версию файла fail2ban.service в этот каталог:

 /etc/systemd/system/fail2ban.service 

ПРИМЕЧАНИЕ. Файл в этом каталоге /etc/systemd/system всегда переопределяет файл .service по умолчанию.

Тем не менее, делать это так, есть оговорки, один из них заключается в том, что если файл службы присутствует здесь, когда fail2ban должен быть обновлен через yum это приведет к отключению службы, пока вы не вручную ее fail2ban не fail2ban . Поэтому вместо этого вы можете переопределить фрагменты файла .service , добавив их в этот каталог под .service /etc

выдержка

Чтобы отредактировать файл блока, предоставленный пакетом, вы можете создать каталог под названием /etc/systemd/system/unit.d/, например, /etc/systemd/system/httpd.service.d/ и поместить туда * .conf файлы для переопределения или добавления новых параметров. systemd будет анализировать эти файлы * .conf и применять их поверх исходного блока. Например, если вы просто хотите добавить дополнительную зависимость к единице, вы можете создать следующий файл: /etc/systemd/system/unit.d/customdependency.conf

  [Unit] Requires=new dependency After=new dependency 

В качестве другого примера, чтобы заменить директиву ExecStart для единицы, которая не относится к типу onehot, создайте следующий файл: /etc/systemd/system/unit.d/customexec.conf

  [Service] ExecStart= ExecStart=new command 

поэтому вы можете создать каталог, /etc/systemd/system/fail2ban.service.d и добавить в него файлы *.conf с таким содержимым:

 [Service] ExecStart= ExecStart=new command 

Добавьте туда свои варианты.

Ulimits & Systemd

Если вы пытаетесь установить параметр ulimit для определенной службы, посмотрите на страницу man для systemd.exec .

выдержка

 LimitCPU=, LimitFSIZE=, LimitDATA=, LimitSTACK=, LimitCORE=, LimitRSS=, LimitNOFILE=, LimitAS=, LimitNPROC=, LimitMEMLOCK=, LimitLOCKS=, LimitSIGPENDING=, LimitMSGQUEUE=, LimitNICE=, LimitRTPRIO=, LimitRTTIME= These settings control various resource limits for executed processes. See setrlimit(2) for details. Use the string infinity to configure no limit on a specific resource. 

Поэтому просто добавление LimitSTACK=256 в настроенный .conf файл, который я опишу выше, должен дать вам такой же эффект, как установка ulimit -s 256 .

Excerpt – setrlimit (2) справочная страница

Если вы просматриваете setrlimit(2) страницу setrlimit(2) вы можете увидеть, как переключатели ulimit выстраиваются в линию с лимитами Systemd.

  RLIMIT_STACK The maximum size of the process stack, in bytes. Upon reaching this limit, a SIGSEGV signal is generated. To handle this signal, a process must employ an alternate signal stack (sigaltstack(2)). Since Linux 2.6.23, this limit also determines the amount of space used for the process's command-line arguments and environment variables; for details, see execve(2). 

Рекомендации

  • systemd – ArchLinux Wiki

Если ваша машина имеет обычные скрипты sysvinit, вы можете сделать это в /etc/init.d/fail2ban (достаточно рано, т.е. до запуска демона).

Если ваш компьютер использует systemd, вы можете сделать это через fail2ban.service . Например, вместо

 ExecStart=/usr/bin/fail2ban-client -x start 

делать

 ExecStart=/bin/sh -c 'ulimit -s 256; /usr/bin/fail2ban-client -x start' 

Решением было отредактировать /etc/init.d/fail2ban.

Это стартовый скрипт:

 start() { echo -n $"Starting fail2ban: " ulimit -s 256 ${FAIL2BAN} -x start > /dev/null RETVAL=$? if [ $RETVAL = 0 ]; then touch ${lockfile} echo_success else echo_failure fi echo return $RETVAL } 

К сожалению, это только спасает меня 50 мб

ulimit также влияет на процессы детей, включая программы уведомлений по электронной почте, такие как sendmail, которые могут не допускать такого ограничения стекирования. Это случай exim4 sendmail, который, используя предложенную настройку памяти, будет segfault вместо отправки по электронной почте, как это должно быть, когда включена «рецидивирующая» тюрьма.