September 21

Bind Ratelimiting & Fail2Ban

Das Ratelimiting von Bind9 ist eine feine Sache. Wer gar einen offenen DNS-Server betreibt (böse!),
wird kaum drum herum kommen. Um es zu aktivieren genügt ein Eintrag in die Config-File eures Bind Dienstes:

rate-limit
{
# wieviele Anfragen duerfen pro Sekunde und Client kommen
responses-per-second 5;
window 20; # Burst Wert
exempt-clients {
127.0.0.1;
#weitere IP-Adressen, die nicht gelimited werden sollen
#Semikolon jeweils nicht vergessen!
} ;
};

Damit kann man schon ganz ordentlich vorbeugen, zum Mittelsmann einer DNS-Amplification zu werden.
Es hat mich jedoch enorm gestört, dass es einige dennoch immer wieder versucht haben – also wollte ich die Nasen mit Fail2ban aussperren.

Damit das klappt, muss Bind eventuelle Verstöße natürlich ordentlich loggen. Dazu macht es Sinn, ein bisschen Ordnung in die Logs zu bringen.
Ich habe das mit folgenden Einträgen gelöst:

logging{
channel simple_log {
file "/var/log/named/bind.log" versions 3 size 5m;
severity info;
print-time yes;
print-severity yes;
};
channel security_file {
file "/var/log/named/security.log" versions 3 size 30m;
severity dynamic;
print-time yes;
};
category default {
simple_log;
};
channel query_log {
file "/var/log/named/bind-queries.log" versions 1 size 10m;
print-category yes;
print-time yes;
};
category queries {
query_log;
};
category query-errors {
simple_log;
};
category security {
security_file;
};
};

Auch hier sind die Verzeichnisse, sowie Anzahl versions und maximale Größe natürlich Geschmackssache.
Die Regex für Fail2ban kommt ganz normal in das Verzeichnis /etc/fail2ban/filter.d (kann natürlich bei anderen Systemen abweichen), ich habe den Filter named-ddos.conf genannt:

[Definition]
# Daemon name
_daemon=named
# Shortcuts for easier comprehension of the failregex
__pid_re=(?:\[\d+\])
__daemon_re=\(?%(_daemon)s(?:\(\S+\))?\)?:?
__daemon_combs_re=(?:%(__pid_re)s?:\s+%(__daemon_re)s|%(__daemon_re)s%(__pid_re)s?:)
# hostname daemon_id spaces
# this can be optional (for instance if we match named native log files)
__line_prefix=(?:\s\S+ %(__daemon_combs_re)s\s+)?
failregex = %(__line_prefix)sinfo: client <HOST>.*: rate limit slip .*
ignoreregex =

Nun fehlt nur noch der entsprechende Eintrag in die Jail Config:

#BIND DNS BLOCK
[named-ddos-udp]
enabled = true
port = domain
protocol = udp
filter = named-ddos
logpath = /var/log/named/bind.log
bantime = 2678400
maxretry = 3

Ggf. noch die Bantime nach eigenen Wünschen anpassen, Fail2ban durchstarten, fertig.


Schlagwörter: , , , ,

Veröffentlicht21. September 2014 von gerger in Kategorie "Allgemein

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.