Вогняний щит Вивчаємо популярні надбудови для iptables

Зміст статті

Блокуємо зловмисників за допомогою fail2ban

Не секрет, що варто лише засвітитися в Мережі новому сервісу, як відразу до нього потягнуться нитки брутфорсерів, які намагаються підібрати облікові дані. Зупинити зловмисників можна різними способами, один із них – утиліта Fail2ban (fail2ban.org). Ідея проста: демон, скануючи логи, перевіряє наявність записів про невдалі спроби введення пароля або спробу входу в заборонену область мережі. Якщо такі будуть знайдені, підозрілий IP блокується засобами iptables/ipwf або TCP Wrapper (/etc/hosts.allowdeny). Згодом бан може зніматися автоматично, без втручання юніксоїда, що дуже зручно, адже під роздачу може потрапити легітимний хост. Про блокування користувач/адмін отримує повідомлення електронною поштою. Спочатку Fail2ban розроблявся для захисту SSH, сьогодні це вже фреймворк, який можна легко налаштувати під будь-які програми та події, у тому числі і прописати свої методи блокування IP. Зручно також, що процес може захищати відразу кілька сервісів.

На сторінці завантаження Fail2ban пропонуються власні збірки пакетів для більшості дистрибутивів Linux, але для установки краще вибрати варіант з репозиторію. Мейнтейнери враховують особливості конкретного дистру плюс додають від себе файли запуску та правила блокування.

У Ubuntu/Debian установка дуже проста:

$ sudo apt-get install fail2ban

Демон стартує за замовчуванням, захищаючи тільки SSH. Усі налаштування виконуються в декількох файлах, розміщених у каталозі /etc/fail2ban (для Debian/Ubuntu). У fail2ban.conf зберігаються параметри запуску демона, всередині нічого цікавого щодо налаштувань для нас немає. Починаючи з версії0.7, фільтри та дії прописуються в різних файлах. Після встановлення їх можна знайти відповідно у підкаталогах filter.d та action.d. Файли всередині цих директорій можуть мати розширення .conf та .local. Параметри з другого замінюють установки з першого, тобто щоб щось перевизначити, вносити зміни безпосередньо до .conf не потрібно. Таким чином полегшується подальше оновлення та повернення до дефолтних налаштувань. Правила пошуку досить прості.

Передбачено використання змінних, причому є вбудовані. Так, HOST відповідає регулярному виразу, який використовується для пошуку IP або імені вузла:

Ось, наприклад, правило для пошуку спроб DDOS-атаки на SSH:

$ grep -v '^#' /etc/fail2ban/fi lter.d/sshd-ddos.conf [Defi nition] failregex = sshd(?:[d+])?: Did no receive identifi cation string від $ ignoreregex =

Рядок failregex описує, що шукати. У ignoreregex – значення, які мають ігноруватися. В одному файлі може бути кілька рядків. Хто хоч трохи розуміється на регулярних виразах, легко створить своє правило, використовуючи наявні приклади. Для аналізу лог-файлу демон викликає утиліту fail2ban-regex, яку зазвичай застосовують і для перевірки нового фільтра.

Наприклад, у постачанні немає правила для Asterisk або іншого подібного сервера, але сьогодні атаки на VoIP не рідкісні, і в логах можна побачити записи на кшталт:

NOTICE[3309] chan_sip.c: Registration from 'sip:[email protected]' failed for '9.8.7.6' — Відмінний peer found

Правило буде таке:

failregex = NOTICE.* .*: Registration from '.*' failed for '' — No matching peer found

І так для кожного випадку. Перевіряємо:

$ fail2ban-regex /var/log/asterisk.log 'NOTICE.* .*: Registration from '.*'failed for '' — No matching peer found'

Якщо все нормально, записуємо фільтри в новий файл asterisk.conf, взявши приклад будь-якої з каталогу filter.d.

З тим, що шукати, розібралися. Залишилося вказати, де шукати, і що робити зі знахідкою. Опис усіх дій зібраний у підкаталозі action.d. Тут кілька файлів під кожну програму/завдання, як правило, там уже все налаштовано, і міняти нічого не потрібно. Але щоб нові фільтри побачив Fail2ban, необхідно оголосити їх у /etc/bail2ban/jail.conf. Усередині цього конфіга знаходимо кілька секцій із описом різних сервісів.

У fi lter та action прописуємо ім'я файлу без розширення з відповідних підкаталогів плюс додаткові параметри

fi lter = asterisk action = iptables-allports[name=ASTERISK, protocol=all] sendmail-whois[name=ASTERISK, dest=root, [email protected]]

Логи Asterisk

Перевизначаємо дефолтні значення

maxretry = 5 bantime = 6000

Перевіряємо, чи запущені послуги:

$ sudo service iptables start $ sudo service fail2ban start

$ sudo iptables -L -v grep fail2ban

Колекція аддонів Xtables-addons

Проект patch-o-matic (-ng), що пропонував різні розширення для iptables, вже деякий час не розвивається, його місце зайняв Xtables-addons (xtables-addons.sf.net). Головна його особливість - для встановлення модулів не потрібно перескладання ядра та/або iptables. У результаті додавання нових функцій відбувається дуже просто, немає проблем при оновленні ядра. Якщо ядро ​​збиралося вручну, перевірте наявність CONFIG_NETFILTER_XTABLES у параметрах:

$ grep -i xtables /boot/confi g- uname -r CONFIG_NETFILTER_XTABLES=m

В одних дистрибутивах основні модулі вже включені до базового складу, в інших- Розміщені в репозиторіях пакетів. У Ubuntu команда:

$ sudo apt-cache search xtables-addons

…видасть два пакети: один із інструментами та бібліотеками, інший – із вихідними.

$ sudo apt-get build-dep xtables-addons-common

Як правило, в ріпі знаходиться не найактуальніша версія, тому качаємо з сайту архів з вихідними текстами, розпаковуємо та даємо стандартну послідовність команд: «./configure; make; make install».

Перевіряємо завантаження модуля:

$ cd /usr/libexec/xtables-addons/ $ sudo ./xt_geoip_dl $ sudo mkdir /usr/share/xt_geoip $ sudo apt-get install libtext-csv-xs-perl $ sudo ./xt_geoip_build -D /usr/share/xt_geoip *.csv

Після виконання останньої команди буде виведено таблицю країн, які потім вказуються через кому в параметрах '—src-cc' (країна джерело), ​​'—dst-cc' (призначення). Усі параметри можна дізнатися, виконавши "iptables-m geoip-help".

// Блокуємо азіатських друзів $ sudo iptables -A INPUT -m geoip --src-cc CN, TW, KR -j REJECT // Блокуємо анонімні проксі $ sudo iptables -A INPUT -m geoip --src-cc A1 -j REJECT // Підключатися до SSH можна тільки з України $ sudo iptables -A INPUT -p tcp –dport 22 -m geoip ! -src-cc UK -j REJECT // Заборона вихідних ICMP в деякі країни $ sudo iptables -A OUTPUT -p icmp -m geoip -dst-cc ES -j REJECT

Використовуючи GeoIP, можна маркувати трафік, щоб обробляти його по-іншому або вважати окремо:

iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc UA -j MARK --set-mark 1

$ sudo iptables -A INPUT -p tcp -m tcp -dport 22 -j TARPIT

Тепер усі, хто спробує підключитися до 22 порту, потраплять до розставлених мереж.

Модуль DELUDE дозволяє ввести в оманусканер, показуючи, що запитуваний порт відкритий і приймає підключення. Якщо ти ще не вирішив, який краще, TARPIT або DELUDE, використовуй CHAOS, який у відповідь на запит застосовує в основному DROP (за замовчуванням до більшості пакетів), але іноді TARPIT, DELUDE або REJECT. Можна змінити поведінку модуля, встановивши параметри при завантаженні за допомогою '—delude'/'—tarpit' або в процесі виконання у файлі /sys/modules/ xt_CHAOS/parameters.

Проект IPP2P припинив своє існування, але в аддонах доступний відповідний модуль, що дозволяє розпізнавати P2P-трафік, який можна блокувати або обмежити. Як додаткові параметри можна вказати один з P2P-протоколів, або все відразу:

$ sudo iptables -A FORWARD -m ipp2p --ipp2p -j DROP

Аналізуємо трафік із OpenDPI

Міжмережні екрани, що працюють на другому та третьому рівнях, давно вже перестали задовольняти сучасні вимоги безпеки. Наприклад, блокування портів, які використовуються ICQ, нічого не дасть. Користувач може обійти заборону, підключившись через проксі, що працює на дозволених портах на зразок 80. Тільки піднявшись вище, проаналізувавши дані прикладного рівня, можна обмежити небажаний трафік. Стандартними засобами iptables цього не можна домогтися, тому юніксоїди взяли на озброєння L7-filter і IPP2P. Але говорити про них не будемо, тому що їм на зміну прийшло цікавіше рішення — OpenDPI (opendpi.org, code.google.com/p/opendpi).

Ставимо необхідні для збирання пакети:

$ sudo apt-get install make gcc libpcap-dev

Завантажуємо з сайту проекту opendpi-1.2.0.tar.gz та opendpi-netfilterwrapper1.1.tar.gz, а потім встановлюємо відповідно до інструкцій усередині, не забувши накласти два патчі:

$ tar -xzf opendpi-netfi lter-wrapper-1.1.tar.gz $cd opendpi-netfi lter-wrapper-1.1 $tar-xzf../opendpi-1.2.0.tar.gz $cd opendpi-1.2.0 $ patch -p0

Встановлюємо змінне середовище:

$ cd ../wrapper $ patch -p3

Якщо все одно отримуємо помилку, тоді пробуємо ванільне ядро ​​версії 2.6.33. Ставимо модуль:

$ sudo make modules_install $ sudo cp ipt/libxt_opendpi.so /lib/xtables

Завантажуємо та можемо використовувати:

$ sudo modprobe xt_opendpi

Усі доступні параметри можна отримати, ввівши:

$ sudo iptables -m opendpi --help

Вибираємо потрібний протокол (вони також описані у файлі ipq_protocols_osdpi.h) та блокуємо його:

iptables -A FORWARD -m opendpi --bittorrent -j DROP

Це найпростіший варіант, можна маркувати потрібний трафік, щоб потім використовувати у шейпері.

Висновок

Використовуючи сторонні напрацювання, можна легко розширити стандартні можливості iptables, істотно зменшивши ризики для хоста або цілої мережі. Звичайно, деякий час доведеться витратити на створення та налагодження необхідних правил, але це згодом окупиться сповна.