fail2ban + iptables= захист від DNS ANY флуда в ISC BIND named

Останнім часом значно почастішали атаки на DNS-сервери з використання DNS ANY reflection.  Багато власників власних серверів в мережі Інтернет навіть не підозрюють, що саме їх машини є знаряддям DDOS-атак зловмисників!

Якщо Ви НЕ надаєте послуги публічного DNS-сервера (кешуючий ДНС) на зразок гуглового 8.8.8.8/8.8.4.4 то саме для Вас нижченаведені поради допоможуть запобігти використанню Вашого сервера як рефлек тора, збереже Ваш трафік, ресурси машини і репутацію!

Що ж! Кілька нескладних кроків:

1.Забороняємо рекурсивні DNS запити:

В секцію options {}  файла /etc/named.conf (або /var/named/chroot/etc/named.conf , якщо використовується chroot), додаємо

recursion no; 
allow-recursion { none; };

2.Включаємо ведення журналу (логу):

Секцію logging {} файла /etc/named.conf (або /var/named/chroot/etc/named.conf , якщо використовується chroot), приводимо (щонайменше) до такого виду:

logging {
    channel default_debug {
        file "/var/log/default_debug.log";
        severity dynamic;
    };
    channel security_file {
        file "/var/log/security.log" versions 3 size 1m;
        severity dynamic;
        print-time yes;
    };
    category security {
        security_file;
    };
};

Рестартуємо BIND (named) на зразок service named restart і:

2.1. Перевіряємо виконання заборони на рекурсію:

dig -t ANY google.com @IP.ADDRESS.YOUR.SERVER

; <<>> DiG 9.7.4b1-RedHat-9.7.4-0.2.b1.fc14 <<>> -t ANY google.com @IP.ADDRESS.YOUR.SERVER
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 57079
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;google.com.                    IN      ANY

;; Query time: 10 msec
;; SERVER: IP.ADDRESS.YOUR.SERVER#53(IP.ADDRESS.YOUR.SERVER)
;; WHEN: Sat Aug  3 16:05:26 2013
;; MSG SIZE  rcvd: 28

Status: REFUSED свідчить про вірне налаштування служби.

2.2. Перевіряємо журнал:

 tail /var/log/security.log

В сервері під атакою будуть з’являтися безліч записів на зразок:

03-Aug-2013 15:37:35.433 client 198.1.88.35#19410: query (cache) 'stellolstel.cc/ANY/IN' denied

3. Налаштовуємо fail2ban:

Налаштовуємо фільтр, якщо його не було в стандартній поставці (/etc/fail2ban/filter.d/named-refused.conf):

# Fail2Ban configuration file for named (bind9). Trying to generalize the
#          structure which is general to capture general patterns in log
#          lines to cover different configurations/distributions
#
# Author: Yaroslav Halchenko
#
# $Revision$
#

[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+)?

# Option: failregex
# Notes.: regex to match the password failures messages in the logfile.
# Values: TEXT
#
failregex = %(__line_prefix)sclient <HOST>#.+: query(?: \(cache\))? '.*' denied\s*$

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Включаємо правило блокування небажаного трафіку DNS-запитів (/etc/fail2ban/jail.conf):

[named-refused-udp]

enabled  = true
filter   = named-refused
action   = iptables-multiport[name=NAMEd, port="domain,953", protocol=udp]
            sendmail-whois[name=NAMEd, dest=main26@anyplace-hosting.net]
logpath  = /var/named/chroot/var/log/security.log
#ignoreip = 168.192.0.1
bantime  = 86400  ; 1 day
findtime = 60   ; 1 minute
maxretry = 10

Не забуваємо (при потребі) — внести список ІР-адрес, які слід ігнорувати при блокуванні (відповідно ці адреси не будуть блокуватися цим правилом).

При успішному спрацюванні в журналі (tail /var/log/fail2ban.log) будуть з’являтися записи на зразок:

2013-08-03 16:37:33,733 fail2ban.actions: WARNING [named-refused-udp] Ban 93.31.232.114
2013-08-03 16:38:47,313 fail2ban.actions: WARNING [named-refused-udp] Ban 174.132.78.251
2013-08-03 16:42:21,821 fail2ban.actions: WARNING [named-refused-udp] Ban 86.196.78.14
2013-08-03 16:44:21,180 fail2ban.actions: WARNING [named-refused-udp] Ban 74.63.223.98
2013-08-03 16:46:04,164 fail2ban.actions: WARNING [named-refused-udp] Ban 2.27.34.247
2013-08-03 16:46:27,923 fail2ban.actions: WARNING [named-refused-udp] Ban 81.218.109.90
2013-08-03 16:46:46,199 fail2ban.actions: WARNING [named-refused-udp] Ban 77.251.8.229
2013-08-03 16:47:11,003 fail2ban.actions: WARNING [named-refused-udp] Ban 149.154.208.179
2013-08-03 16:47:49,868 fail2ban.actions: WARNING [named-refused-udp] Ban 212.33.233.189
2013-08-03 16:49:55,215 fail2ban.actions: WARNING [named-refused-udp] Ban 130.0.125.26

І, звісно, якщо це не було зроблено раніше, то не забуваємо включити запуск fail2ban при завантаженні сервера 🙂

chkconfig fail2ban on
Опубліковано у BIND, DNS, Firewall, Linux, Tips&Tricks, Безпека, моніторинг, Нотатки на колінці | Теґи: , . | Додати в закладки: постійне посилання на публікацію.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *