Zorp – модульний фаєрвол рівня додатків, Linuxoid
OpenSource forever
У http://www.tux.in.ua/articles/249 було розглянуто OpenSource фаєрвол сьомого рівня ModSecurity, що дозволяє захиститися від загроз типових для веб-сервера, але в звичайній мережі можна зустріти й інші сервіси, що також потребують захисту.
Підхід Zorp
Автор Syslog-NG угорець Балазс Шайдлер (Balazs Scheidler) розробив ще один корисний додаток Zorp. На великій сторінці сайту проекту [http://www.balabit.com/] він буквально називається як Modular Application Level Gateway (хоча в деяких документах його назва дещо інша new generation proxy firewall). Але як би не звучала його назва, призначення залишається незмінним – захист програм від спрямованих атак. Принцип дії схожий на розглядається раніше ModSecurity. Zorp є прозорим (transparent) проксі, який виступає посередником при роботі клієнта та сервера. У цьому випадку для клієнта, який хоче встановити нове з'єднання, Zorp виступає як сервер, а реальний сервер бачить Zorp як клієнта. Перебуваючи посередині, такий проксі знає особливості свого протоколу і на підставі наявної інформації та налаштувань може ухвалити рішення про необхідність продовження поточного з'єднання. Але на відміну від ModSecurity, який є окремим додатком, і в ідеальних умовах, що потребує встановлення на окремий комп'ютер, Zorp фактично є розширенням до Netfilter/iptables. Таким чином, вся обробка відбувається на єдиному комп'ютері, який знаходиться на вході мережі, що зменшує її засмічення пакетами, які все одно будуть відкинуті. Крім того, функції пристроїв захисту не будуть дублюватися, що підвищить надійність за рахунок сумарного зменшення їх кількості, а зз іншого боку призведе до менших затримок, оскільки весь аналіз буде зроблено лише один раз і в одному місці. Взаємодія сервера та клієнта у разі використання Zorp виглядає так.

Клієнт бажаючи встановити з'єднання посилає TCP SYN пакет, який надходить на маршрутизатор із встановленим iptables (ipchais) використовуючим Zorp. Отриманий пакет перевіряється на відповідність правил iptables. Якщо він повинен бути оброблений Zorp, то в записі має бути вказана мета TPROXY (iptables) або REDIRECT (ipchains). Як один з параметрів вказується порт, де Zorp чекатиме підключення. Zorp отримує пакет перевіряє його на відповідність зі своїми правилами і запускає відповідний проксі, який ініціалізує з'єднання з сервером і далі діє вже від імені клієнта, а в процесі роботи перевіряє потік даних, що проходить. Природно та інші ланцюжки також повинні пропускати оброблені Zorp пакети. Тепер аномалії нижчого рівня відсіюватимуться відразу. Такий принцип роботи дозволяє робити те, що недоступне багатьом HTTPS, POP3S, IMAPS або SSH з'єднання. Тобто коли користувач підключається до web-сервера, останній відсилає йому сертифікат, проксі може перехопити цей сертифікат і відправити користувачеві свій, тепер перебуваючи посередині можна безперешкодно контролювати будь-який трафік. Так само можна автоматично перевіряти сертифікати та дозволяти доступ лише до певних ресурсів. Недоліків у такого способу як мінімум два: підвищена вимога до продуктивності системи в порівнянні з використанням звичайного пакетного фільтра, і велика складність у налаштуванні в порівнянні зі спеціалізованими проксі на кшталт ModSecurity або DansGuardian.
Версії Zorp
УВ даний час доступні три версії Zorp: Zorp Pro, Zorp GPL та Zorp Unofficial. Zorp Unofficial раніше грав роль тестової бета версії, але останні два роки фактично не розвивається, його можна вільно отримати з сайту [http://zorp-unoff.sourceforge.net/]. Найпросунутішою є комерційний Zorp Pro, що є доопрацьованим Debian, який можна встановити за 10 хвилин (без налаштування). У його складі є:
- 16 модулів, які контролюють свої протоколи.
- сервер управління (Zorp Management Server - ZMS), за допомогою якого зручно створювати та налаштовувати правила роботи системи фільтрації, клієнти за допомогою яких і виробляється віддалена настройка доступні для декількох систем
- можливе підключення модуля антивірусної перевірки
- сувора аутентифікація за будь-яким протоколом, генерування ключів на льоту на основі інформації клієнта
- можливість гарячого перезавантаження без розриву існуючих зв'язків
- технічна підтримка
GPL версія, що розповсюджується вільно не має таких багатих можливостей, і має модулі, що дозволяють контролювати лише 6 типів протоколів (HTTP, FTP, PSSL, TELNET, WHOIS, FINGER) і Plug. Останній працює без перевірки протоколу та підтримує протоколи, що використовують лише один порт (SSH, MySQL, VNC, Microsoft Terminal Service, GOPHER, SMB/CIFS, TALK, SYSLOG, RSYNC). Також у GPL версії для SSL можлива робота тільки із заздалегідь згенерованими ключовими парами. І що найсумніше збирати та налаштовувати все це доведеться самостійно та вручну. Використовуючи версію Pro щодо просто організувати одноразову аутентифікацію (SSO – Single-sign-on authentication), з Zorp GPL зробити це неможливо. Залишилось додати, що використання Netfilter накладаєобмеження операційної системи, тут лише GNU/Linux. Сам проксі в Zorp написаний мовою С, а модулі контролю із застосуванням мови високого рівня Python.
Установка Zorp GPL
І дати команду на оновлення та встановлення.
У разі використання інших дистрибутивів доведеться трохи попрацювати, перебравши всі компоненти з вихідних текстів, знайти готові прекомпільовані пакети, відмінні від deb, мені не вдалося. Так як міжмережевий екран повинен мати мінімум компонентів і тим більше не мати компілятора, встановлюємо базову систему, а збираємо все інше на окремому комп'ютері. Насамперед необхідно перезбирати ядро, залишивши лише необхідні опції, а також утиліти iptables. Версії ядра 2.2 вже мають вбудований прозорий проксі, і для його активації потрібно лише включити в меню "Networking options" - "IP: firewalling" і активуємо "Transparent proxy support". У наступних версіях 2.4/2.6, коли було введено iptables, таку можливість було прибрано, тому перед компіляцією необхідно буде накласти патч tproxy [ http://www.balabit.com/products/oss/tproxy/] . Ім'я патча має вигляд cttproxy-2.6.15-2.0.4.tar.gz де 2.6.15 означає версію ядра для якого він призначений, а 2.0.4 версію tproxy. Також слід пам'ятати про дві сумісності. Версії TProxy 1.2.x сумісні з усіма версіями Zorp, але не підходять до ядра серії 2.6, а версія TProxy 2.0 працюватиме з ядрами 2.4 і 2.6, але сумісна тільки з Zorp починаючи 2.1.9. Для прикладу використовуємо ядро 2.6.15.
Патчі для ядра знаходяться в каталозі patch_tree, не всі обов'язкові, достатньо встановити тільки 03-tproxy.diff.
При конфігуруванні в “Networking options” – “IP: Netfilter Configuration” – “”, включаємо “Connection tracking”, “IP tables support”,“Full NAT” та “Transparent proxying” з додатковими опціями .

.config файл це виглядає так
Крім того, для прозорого проксі необхідний віртуальний dummy інтерфейс. Простежте, щоб у вкладці “Network device support” було активовано пункт “Dummy net driver support”. Якщо в процесі роботи Zorp виникнуть проблеми, слід додати налагоджувальну інформацію. Заглянувши в net/ipv4/netfilter/iptable_tproxy.c, знайдете рядок
Тобто режим налагодження можна активувати глобально, поставивши CONFIG_ NETFILTER_DEBUG=y або замінивши перший рядок на #if 1.
В останніх версіях модуль iptable_tproxy.o, завантажується автоматично при запуску, при необхідності, якщо використовуєте ядро версії 2.4 або раніше 2.6, то завантажте його вручну за допомогою modprobe.
Якщо з ядром все гаразд, то наступним кроком модифікуємо та перезбираємо утиліти iptables, щоб вони могли працювати з новою таблицею tproxy та новою метою TPROXY. У підкаталозі iptables лежать два патчі. Один для версії iptables 1.2.7a, другий для 1.3
Zorp складається з бібліотеки libzorpll та себе zorp. Останніми версіями на момент написання статті були libzorpll_3.1.2.2 та zorp_3.0.9.tar.gz. Якихось особливостей щодо їх встановлення немає, робимо це звичайним чином. Настроюємо Dummy інтерфейс.
У RedHat та клонах, а також SuSE це буде файл ifcfg-dummy0, що лежить у /etc/sysconfig/network.
У Slackware /etc/rc.d/ створюємо файл/etc/rc.d/rc.inet4 такого змісту
НалаштуванняZorp
Для налаштування Zorp використовується три файли, які за промовчанням повинні лежати в /etc/zorp/. Файл instances.conf містить список прикладів Zorp, з якими потрібно працювати і сценарієм zorpctl, що запускаються. Інший файл zorpctl.conf міститьглобальні налаштування, пов'язані з роботою самого zorpctl (дозвіл автоматичного рестарту, pid файл, додаткові аргументи командного рядка). І третій файл policy.py зберігає правила і політики, пов'язані з прикладами.
Тоді під час запуску утиліти zorpctl перевірятимуться відповідні дозволи.
Для зручності припустимо, що на міжмережевому екрані є три мережні інтерфейси:
- eth0 інтранет інтерфейс з IP 192.168.0.1/24 - local
- eth1 DMZ з IP 10.0.0.1/24 - dmz
- eth2 Інтернет IP 111.222.333.444
Дописуємо наступні рядки в instances.conf.
Перше поле - це ім'я прикладу, обране довільно. Для кожного імені можна використовувати окремий файл, але налаштувати численні зони в межах єдиного файлу. Опції -v або -verbose показує рівень оповіщення, а -р або -policy на файл політик. Можливі інші параметри, або можна просто прив'язати Zorp до певного сервісу. Начебто такого.
Підключаємо модулі для роботи з протоколами http, ftp, ssl та plug.
Ось так можна організувати фільтрацію вмісту URL http запиту, для цього додаємо сервіс local_internet_http і даємо йому такий опис.
Як бачите спочатку на основі стандартного класу HttpProxyURIFilter, який визначено в модулі Addon . py (за замовчуванням у ньому використовуються файли blacklist-http та blacklist-http.ignore) був створений новий клас >Файли http.black та http.white містять список регулярних виразів, тут можна вказати URL, до яких необхідно заборонити доступ, слова при знаходження у запиті він буде перериватись. Наприклад, додавши рядок .*exe можна заборонити завантажувати файли із зазначеним розширенням. Щоб помилково не заборонити доступ до цінних ресурсів, їх вартозанести до http.white.
Використовуючи таку конструкцію, можна організувати NAT засобами самого Zorp.
Якщо заглянути в модулі, то можна виявити, що контролю піддаються практично всі основні параметри протоколів, що підтримуються, і за якими можна організувати фільтрацію, або іншу їх обробку. Наприклад, використавши наступну конструкцію, можна обробити код відповіді 404, замінивши його своїм повідомленням.
Побудова правил iptables
Таблиця tproxy містить усі вбудовані ланцюжки, найбільш природно використовувати PREROUTING . Найпростіше правило, яке направить потрібний пакет Zorp, виглядає так.
Але щоб не засмічувати Zorp сміттям, відсіваючи пакети, які не повинні проходити через фільтр, засобами Net Filter, краще вказати інтерфейс, з якого очікується пакет, тому для кожного створимо свої ланцюжки. Інші пакети будуть проходити відповідно до стандартної політики (-Р ).
Створюємо ланцюжки для кожного інтерфейсу.
І прив'язуємо їх до свого інтерфейсу.
І дозволяємо проходження по ланцюжку INPUT
Тепер можна запускати Zorp zorpctl start та перевірити результат.
Zorp дозволяє на порядок краще захистити комп'ютерні системи, у порівнянні зі звичайним міжмережевим екраном, хоча б тому, що сам проксі навіть без контролю за програмами, ізолює системи від нападів спрямованих на нижчий рівень, які можливо не бачить Netfilter. Але, на жаль, налаштовувати варіант GPL все-таки не просто. Хоча зовсім не обов'язково робити це відразу і за один день, можна поступово нарощувати його можливості.