Apache 로그 파일 Fail2ban 및 WordPress

Apache 로그 파일 Fail2ban 및 WordPress

WordPress 사이트에 대한 무차별 공격과 지속적인 xmlrpc 및 wp-login 공격을 차단하기 위해 Fail2ban을 얻으려고 합니다.

Apache 로깅 파일 이름에 문제가 있습니다. selinux 문제를 해결하는 것은 꽤 까다로웠지만 작동하는 데 거의 가까워졌습니다.

먼저, 여기 내 Fail2Ban wordpress.conf 파일(jail.d에 있음)이 있습니다.

[wordpress]
enabled = true
usedns = no
port = http,https
filter = wordpress
banaction = firewallcmd-rich-rules
banaction_allports = firewallcmd-rich-rules

logpath = /var/www/html/site1/logs/*-access.log.*
          /var/www/html/site2/logs/*-access.log.*
          ... etc ...
maxretry = 1
findtime = 1200
bantime = 1440

이것은 작동하지만 "fail2ban-client status wordpress"의 출력을 보면 수십 개의 로그 파일이 나열되는데 이는 무의미하고 비효율적입니다. 서비스를 다시 시작하지 않으면 현재(오늘) 로그 파일을 선택하도록 할 수 없습니다.

참고로 현재 43개의 IP 주소가 "현재 금지됨"으로 표시됩니다.

내 ./logs 폴더에

2023-08-23-access.log
access.log.1692835200

문제는 아파치 로그 파일을 항상 "access.log"라고 부르고 날짜가 있는 형식으로 회전시키려는 것입니다. 그런 다음 fall2ban은 "access.log"를 보고 항상 현재 날짜 파일에서 작업할 수 있습니다. 날짜 스탬프 접미사(날짜 스탬프라고 가정)가 어디서 왔는지 모르겠습니다.

문제를 일으키는 Apache sites.conf 파일의 항목은 다음과 같습니다.

ErrorLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/error.log"
CustomLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/access.log 86400" combined

파일에 스탬프를 찍으라고 지시한 것이 아닌데 왜 그렇게 하는 걸까요?

로그 회전은 여기에 설명되어 있습니다. https://httpd.apache.org/docs/2.4/programs/rotatelogs.html

답변1

현재 활성 파일에 대해 항상 동일한 파일 이름을 유지하는 것은 rotatelogs방지하기 위해 설계된 것입니다. 미리 정의된 간격/조건에 따라 고유하지만 예측 가능한 접미사(기본적으로) 또는 이름 패턴(문자를 사용할 때 %)을 사용하여 새 파일을 엽니다.

방문자 수가 적은 사이트에서는 다음과 같이 설정하는 것이 좋습니다.

CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m" combined 

와 같이 2023년 8월의 이름 패턴을 사용하여 매달 새 로그 파일을 생성합니다 access.log.2023.08.

더 많은 트래픽을 생성하는 사이트의 경우: 매일 새 로그 파일을 생성하고(사용한 86400 옵션과 동일)

CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m.%d " combined 

그러면 2023년 8 월 24일의 이름 패턴을 사용하여 매일 새 로그 파일이 생성됩니다 access.log.2023.08.24. (이와 같은 패턴은 ls -l파일을 시간순으로 정렬하도록 보장하며 예를 들어 access.log.24082023개인 취향보다 사용하기가 훨씬 더 쉽습니다.)

이제 예측 가능한 파일 이름 패턴이 있으므로 자정 직후에 실행되는 cron 작업을 설정할 수 있습니다.

#!/bin/bash

basefile="/var/www/html/site1/logs/access.log"
currentlog=$(date +$basefile.%Y.%m.%d) 
rm $basefile 
ln -s $currentlog $basefile

# and you can do some maintenance here as well, like for example 
# compress the log file from a week ago
oldlog=$(date --date="1 week ago" +$basefile.%Y.%m.%d)
gzip $oldlog 

accesss_log에서 해당 날짜의 현재 로그 파일로의 심볼릭 링크를 생성합니다.

예상되는 정적 파일 이름으로 Fail2ban을 구성할 수 있으며 /var/www/html/site1/logs/access.log모두 황금색입니다.


원하지 않는 경우 일반적으로 다음을 사용하여 Apache httpd를 구성합니다.

CustomLog  /var/www/html/site1/logs/access.log combined

그러면 Apache hhtpd는 항상 로그 이벤트를 다음에 기록합니다./var/www/html/site1/logs/access.log

그러나 로그 파일을 회전하도록 외부 기능을 구성해야 하며 Apache httpd가 파일 핸들을 열고 이름을 바꾸면 해당 파일 핸들이 닫히지 /var/www/html/site1/logs/access.log않으므로 /var/www/html/site1/logs/access.log.old-labelApache httpd를 다시 시작해야 합니다.
Apache httpd를 다시 시작하지 않으면 모든 로그도 /var/www/html/site1/logs/access.log.old-label새 로그가 아닌 계속 기록됩니다./var/www/html/site1/logs/access.log

물론 직접 스크립트를 작성할 수도 있지만 대부분의 사람들이 사용합니다.logrotate바퀴를 재발명하는 것보다 말이죠.

답변2

HBruijn은 이미 로그 파일 부분을 잘 다루었지만, 나는 당신의 목표로 돌아가고 싶습니다:

WordPress 사이트에 대한 무차별 공격과 지속적인 xmlrpc 및 wp-login 공격을 차단하기 위해 Fail2ban을 얻으려고 합니다.

Apache의 액세스 로그는 이러한 목적으로 매우 장황할 수 있으며 Fail2ban이 모든 로그를 소화하고 분석하려고 시도하므로 구성에 성능 문제가 발생할 수 있습니다.

다음과 같은 WordPress 플러그인이 있습니다.WP 실패2금지에서 로그인 실패만 기록하는 감사 이벤트를 생성하여 이를 수행하는 데 도움이 될 수 있습니다 /var/log/auth.log.

WP FAIL2BA는 WordPress와 FAIL2BAN 사이의 링크를 제공합니다.

Oct 17 20:59:54 foobar wordpress(www.example.com)[1234]: Authentication failure for admin from 192.168.0.1 Oct 17 21:00:00 foobar wordpress(www.example.com)[2345]: Accepted password for admin from 192.168.0.1

wordpress-hard.confWPf2b에는 , wordpress-soft.conf및 의 세 가지 FAIL2BAN 필터가 제공됩니다 wordpress-extra.conf. 이는 사용자 지정 구성에 대한 추가 규칙을 사용하여 즉각적인 금지(하드)와 기존의 보다 우아한 접근 방식(소프트)을 분리할 수 있도록 설계되었습니다.

관련 정보