Es kann Probleme mit destination file
geben. Eine Lösung dazu findet sich unter xt_recent mit syslog-ng.
Ich habe auf meinem clamav-mirror zahlreiche Connects von veralteten Clients (> 300,000 / day). Daher trage ich die IP mit veralteten Versionen (die einen Apache-Code 403 produzieren) in die Firewall ein.
Voraussetzungen:
Konfiguriere Apache HTTP-Server
Das Access Log von apache muss an syslog-ng gehen:
LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" mirrorlog
CustomLog "| /bin/logger -t apache2" mirrorlog
Solange das log file nur durch die Pipe läuft, werden keine Einträge geschrieben. Damit das Access Log auch als file geschrieben wird, muss entweder die Config von slog-ng um eine destination oder die apache-config um ein weiteres Log erweitert werden.
syslog-ng
Da wir das acces-log über logger direkt an syslog-ng senden, ist es über die normale source ‘internal’ verfügbar.
parser pattern_db { db_parser ( file(/usr/local/var/patterndb.xml)); }; destination deny-mirror { file("/proc/net/xt_recent/clamav-403" template("+${APACHE.SRC-IP}\n")); }; filter f_mirror { match("database.clamav.net" value(".apache.domain")) and match ("403" value(".apache.request_status")); }; log { source(src); parser(pattern_db); filter(f_mirror); destination (deny-mirror); };
Da jede Message durch den parser pattern_db läuft, brauchen wir auch ein pattern-db-file mit dem folgenden Inhalt:
(wer keine pattern-db verwendet, kann auch den CSV-Parser von hier verwenden).
<?xml version='1.0' encoding='UTF-8'?>
<patterndb version='3' pub_date='2011-07-06'>
<ruleset id='1fba26d756011614557cf496fed7b5c0' name='apache'>
<pattern>apache2</pattern>
<rules>
<rule class='apache.access_log' id='019045a7383c252e57c20435ae5bf86c' provider='fs'>
<patterns>
<pattern>@ESTRING:.apache.domain: @@IPv4:.apache.client_ip@ @ESTRING:.apache.ident_name: @@ESTRING:.apache.user_name: @@QSTRING:.apache.timestamp:[]@ @QSTRING:.apache.request_url:"@ @NUMBER:.apache.request_status@ @NUMBER:.apache.content_length@ @QSTRING:.apache.referer:"@ @QSTRING:.apache.user_agent:"@</pattern>
</patterns>
<tags>
<tag>httpd</tag>
<tag>IPv4</tag>
</tags>
</rule>
</rules>
</ruleset>
</patterndb>
iptables
iptables -N clamav-403
iptables -A INPUT -p tcp --dport 80 -m recent --rcheck --name clamav-403 --seconds 3600 --hitcount 5 -j DROP
Und so funktioniert das ganze
Syslog-ng filtert Logeinträge von Apache mit dem Inhalt database.clamav.net und 403. Als destination ist /proc/net/xt_recent/clamav-403 definiert. Das Template trägt die IP in die Firewall ein. Mit dem Erreichen von “hitcount” ist die ip für “seconds” geblockt.
Wird _rcheck_ durch _update_ ersetzt, bleibt der block länger bestehen. Die _rcheck_ option bedeutet: wir blocken dich für die nächste Stunde. _update_ hingegen bedeutet: wir wollen dich eine Stunde lang nicht sehen. Aber kommst Du innerhlab einer Stunde wieder, läuft die Zeit von neuem.
Grundsätzlich speichert xt_recent 100 IP addresses. Dieses Limit kann mit “modprobe ipt_recent ip_list_tot=10000” (hier 10000) geändert werden. Das ist aber nurmöglich, ehe die erste iptables-rule aktiv ist.
Besser ist es mit
chmod 600 /sys/module/xt_recent/parameters/ip_list_tot
echo 10000 > /sys/module/xt_recent/parameters/ip_list_tot
chmod 400 /sys/module/xt_recent/parameters/ip_list_tot
ip_list_tot “on-the-fly” zu ändern.
Possibly related posts: (automatically generated)
- Related posts on apache
- Compiling httpd-2.2.16 and php-5.3.3 on Mac OS X 10.6.4
Pingback: fail2ban mit xt_recent | florian @it