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