Fail2Ban CentOS 메모리 소비

Fail2Ban CentOS 메모리 소비

Fail2Ban은 내 시스템에서 많은 메모리(1.2GB)를 사용합니다. 이를 줄이는 방법을 설명하는 여러 기사가 있습니다. 다음은 데비안의 예입니다.

  • /etc/default/fail2ban파일 에 1ulimit1 명령을 추가합니다 .
  • (파일에) 마지막 줄에 추가하십시오:

    ulimit -s 256
    

불행하게도 CentOS 7에는 그러한 파일이나 디렉터리가 없습니다. 내 시스템에 어떻게 적용할 수 있나요?


몇 가지 메시지가 표시된 후 내 Fail2Ban Systemd 파일은 다음과 같습니다.

[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`

불행히도 결과는 여전히 1251888KB입니다.

답변1

/etc/기본

이 디렉토리는 /etc/defaultRed Hat 기반 배포판에서는 절대 사용되지 않습니다. 이것이 데비안/우분투주의입니다. 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-server의 내용

fail2ban-serverSystemd용 서비스 파일이 포함되어 있습니다 .

$ 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 서비스 파일의 내용:

$ 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수동으로 다시 활성화할 때까지 서비스가 비활성화된다는 것입니다. 따라서 .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 지시문을 바꾸려면 다음 파일을 만듭니다. /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매뉴얼 페이지를 확인하십시오 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사용자 정의 파일에 추가하기만 하면 설정과 동일한 효과를 얻을 수 있습니다 ..confulimit -s 256

발췌 - setrlimit(2) 매뉴얼 페이지

매뉴얼 페이지를 보면 이러한 스위치가 Systemd 제한 사항과 어떻게 일치하는지 setrlimit(2)확인할 수 있습니다 .ulimit

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

인용하다

답변2

머신에 공통 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'

답변3

해결책은 /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
}

불행히도 그것은 50MB만 저장했습니다.

답변4

내가 보통 하는 일은 다음과 같이 구성하는 것입니다.fail2ban.local

[Definition]
dbfile =
dbpurgeage = 0

영구 데이터베이스에는 처리된 모든 원시 로그 라인이 포함되어 있으므로, 이는 일반적으로 시스템에 수백 MB의 쓸모 없는 . sqlite 데이터베이스에 로그인합니다.

이는 dbfile처음에는 지속성을 의미하므로 /var/lib/fail2ban/fail2ban.sqlite3, 다른 테이블에서 다른 IP를 알아내기 위해 Fail2ban을 다시 시작하면 데이터베이스에서 수백 MB의 로그(처리되지 않은)가 불필요하게 다시 로드됩니다. 생각해 보세요!

관련 정보