Вогняна дуга

Брандмауер - перша лінія захисту будь-якого сервера, і від його правильного налаштування залежить, чи зможе зловмисник просунутися далі в своїх спробах проникнення в систему. Сучасні фаєри пропонують безліч механізмів забезпечення безпеки, використовуючи які ти можеш залишити «не при справах» 99% атакуючих. І все це без необхідності покупки дорогого устаткування і комерційного софта.

Головна мета всіх зломщиків - отримання доступу до командного інтерпретатора сервера для використання його можливостей в своїх інтересах. Найбільш часто проникнення в «святая святих» здійснюється за допомогою дірок в сервісах або ж через підбір пароля (брутфорс) до одного з них (наприклад, ssh).

сканування портів

Щоб виявити наявність уразливих сервісів на машині, атакуючий виробляє розвідку за допомогою сканера портів і різних систем виявлення вразливостей. Зазвичай в якості сканера портів використовується nmap, який здатний здійснювати сканування десятком різних способів і в деяких випадках вміє виявляти версії ОС і сервісів. Ось список особливо популярних прапорів nmap, які зазвичай використовують зломщики:

Прапори nmap, використовувані при скануванні

  • -sT - звичайне TCP-сканування за допомогою відкриття з'єднання на налаштованому порту і його завершення;
  • -sS - SYN / ACK-сканування, зв'язок розривається відразу після відповіді на запит відкриття з'єднання;
  • -sU - UDP-сканування;
  • -sF - сканування пакетами з встановленим прапором FIN;
  • -sX - сканування пакетами з встановленими прапорами FIN, PSH і URG;
  • -sN - сканування пакетами без встановлених прапорів.

Метод захисту від сканування простий і відомий будь-якому системному адміністратору. Полягає він в простому закриття всіх сервісів, які не повинні бути видні з зовнішньої мережі. Наприклад, якщо на машині працюють сервіси ssh, samba і apache, а з зовнішнього світу має бути видно тільки веб-сервер з корпоративної веб-сторінкою, то міжмережевий екран може бути налаштований так:

Початкова настройка iptables

outif = "eth1"
iptables -F
iptables -i $ outif -A INPUT \
-m conntrack \
--ctstate ESTABLISHED, RELATED \
-j ACCEPT
iptables -i $ outif -A INPUT -p tcp \
--dport 80 -j ACCEPT
iptables -i $ outif -P INPUT DROP
iptables -i $ outif -P OUTPUT ACCEPT

Початкова настройка ipfw

outif = "rl0"
ipfw add allow ip from any to any \
via lo0
ipfw add allow ip from me to any \
via $ outif
ipfw add allow tcp from any to me \
established via $ outif
ipfw add allow tcp from any 80 \
to me via $ outif
ipfw add deny ip from any to any \
via $ outif

Початкова настройка pf

outif = "rl0"
set skip on lo0
block all
pass out on $ outif from $ outif \
to any keep state
pass in on $ outif proto from any \
to $ outif port 80

Всі три набори правил роблять одне і те ж - дозволяють проходження будь-якого трафіку по інтерфейсу зворотного петлі (loopback), дозволяють приймати пакети вже встановлених з'єднань (щоб, наприклад, браузер міг отримати відповідь на запит до віддаленого сервера), дозволяють звернення на 80-й порт, блокуючи всі інші, і дозволяють будь-які коннект назовні. Зверни увагу, що якщо в прикладах iptables і ipfw ми явно задали правила для дозволу прийому пакетів вже встановлених з'єднань (established), то у випадку з pf для цього достатньо було вказати «keep state» в рулесете, дозвільному будь-які вихідні сполуки.

В общем-то, така схема захисту мережевих сервісів від сканування і проникнення відмінно працює, але ми можемо піти далі і налаштувати фаєр так, щоб деякі види сканування взагалі не могли б бути виконані. Технічно ми не можемо зробити це відносно звичайного сканування (прапори nmap '-sT', '-sS' і '-sU') просто тому, що в ньому немає нічого кримінального, однак нестандартні типи сканування, такі як '-sN', '-sF' і '-sX', породжують пакети, які ніяк не могли бути створені легальними додатками.

Тому без тіні сумніву відкидаємо подібні з'єднання.

Методи боротьби з екзотичними видами сканування

# Заборона FIN-сканування
Linux> iptables -A INPUT -p tcp \
-m tcp \
--tcp-flags FIN, ACK FIN -j DROP
FreeBSD> ipfw add reject tcp from any to any \
not established tcpflags fin
# Заборона X-сканування
Linux> iptables -A INPUT -p tcp -m tcp \
--tcp-flags FIN, SYN, RST, PSH, ACK, URG
FIN, SYN, RST, PSH, ACK, URG \
-j DROP
FreeBSD> ipfw add reject tcp from any to any \
tcpflags fin, syn, rst, psh, ack, urg
# Заборона N-сканування
Linux> iptables -A INPUT -p tcp -m tcp \
--tcp-flags FIN, SYN, RST, PSH, ACK, URG NONE -j DROP
FreeBSD> ipfw add reject tcp from any to any \
tcpflags! fin. syn. rst. psh. ack. urg
У OpenBSD всі ці рядки можна замінити простим записом на початку
/etc/pf.conf:
scrub in all

Директива scrub активує механізм нормалізації пакетів, при якому фрагментовані пакети возз'єднуються, а пакети з неприпустимою комбінацією прапорів відкидаються. Крім екзотичних видів сканування scrub дозволяє захиститися і від обману систем виявлення вторгнень (посилка сильно фрагментованих пакетів) і деяких видів DoS-атак.

Для захисту від SYN / ACK-сканування, ініційованого за допомогою nmap-прапора '-sS', ми можемо використовувати метод пасивного визначення ОС (OS Fingerprint), доступний в брандмауерах pf і iptables / netfilter (починаючи з версії 1.4.6). Під час проведення звичайного сканування (прапор '-sT') nmap використовує стандартний інтерфейс сокетів операційної системи, тому такий скан майже нічим не відрізняється від потоку звичайних пакетів (нижче ми розглянемо деякі його відмінності), однак при SYN / ACK-скануванні nmap формує пакети самостійно, тому вони мають деякі риси, які видають їх джерело. Метод пасивного визначення ОС дозволяє ідентифікувати ці пакети і відкинути їх за допомогою стандартних правил брандмауера:

OpenBSD> block in quick from any os NMAP
Linux> iptables -I INPUT -p tcp -m osf --genre NMAP \
-j DROP

Модуль osf брандмауера iptables / netfilter використовує базу «відбитків», зібрану і оновлювану розробниками OpenBSD (/etc/pf.os), тому обидва цих правила повинні привести до однакових результатів. Цікаво також і те, що вони дозволяють ефективно протидіяти функції визначення ОС утиліти nmap (прапор '-O').

Тепер ми захищені майже від усіх видів сканування, крім стандартного і тупого '-sT'. Як бути з ним? Насправді все просто. Факт сканування портів легко помітити, просто проаналізувавши логи брандмауера. Якщо за короткий проміжок часу відбувалося безліч коннектов на різні порти - значить, нас сканували. Залишилося тільки перекласти цю ідею на правила брандмауера. Для iptables є відмінний рецепт, який блокує всіх, хто занадто наполегливо стукає в неробочі порти:

Боротьба зі скануванням за допомогою iptables

Встановивши пакет xtables-addons, що містить напрацювання проекту patch-omatic, ми отримаємо доступ до модуля PSD (Port Scan Detect), реалізованому за образом і подобою демона scanlogd. Всі попередні рядки можуть бути легко замінені простим правилом:

# Iptables -A INPUT -m psd -j DROP

На жаль, в пакетних фільтрах ipfw і pf нічого подібного немає, але це не біда, тому як скануванню портів добре протидіє демон PortSentry і той самий scanlogd.

Заборона Icmp-повідомлень

Доброю практикою також є заборона ICMP-повідомлень, які можуть видати додаткову інформацію про хості або бути використані для виконання різних зловмисних дій (наприклад, модифікації таблиці маршрутизації). Нижче наведена таблиця зі списком можливих типів ICMP-повідомлень:

Як бачиш, відповідь на деякі ICMP-повідомлення може привести до розголошення певної інформації про вузол, в той час як інші - привести до модифікації таблиці маршрутизації, тому їх необхідно заборонити.

Зазвичай вихід у зовнішній світ дозволяють ICMP-повідомлень 0, 3, 4, 11 і 12, в той час як на вхід беруть тільки 3, 8 і 12. Ось як це реалізується в різних брандмауерах:

Заборона небезпечних ICMP-повідомлень

Linux> iptables -A INPUT -p icmp \
-icmp-type 3,8,12 -j ACCEPT
Linux> iptables -A OUTPUT -p icmp \
-icmp-type 0,3,4,11,12 -j ACCEPT
FreeBSD> ipfw add allow icmp \
from any to $ outif in \
via $ outif icmptype 3,8,12
FreeBSD> ipfw add allow icmp \
from $ outif to any out \
via $ outif icmptype 0,3,4,11,12
OpenBSD> pass in inet proto icmp \
from any to $ outif \
icmp-type <3, 8, 12> keep state
OpenBSD> pass out inet proto icmp \
from $ outif to any \
icmp-type <0, 3, 4, 11, 12> \
keep state

При бажанні ти можеш заборонити весь ICMPтрафік, включаючи пінг-запити, але це може вплинути на коректність роботи мережі.

Захист від брутфорса за допомогою iptables

Те ж саме можна зробити і з використанням pf:

Захист від брутфорса за допомогою pf

# Створюємо таблицю для брутфорсер
table persist
# Блокуємо всіх, хто в неї потрапляє
block in quick from
# Розміщуємо в таблицю bruteforcers всіх, хто ініціює більше двох з'єднань на 22-ій порт в хвилину
pass in on $ ext_if inet proto tcp to $ outif \
port 22 flags S / SA keep state \
(Max-src-conn-rate 60/2, \ overload flush)

Брандмауер ipfw не володіє достатньою функціональністю для ефективної протидії брутфорсер, тому його користувачі повинні використовувати інструменти більш високого рівня, такі як спеціальні модулі PAM, системи виявлення вторгнень і програми на зразок sshguard.

На щастя, захиститися від подібних атак легко. Досить не відкривати порти незахищених сервісів у зовнішній світ, а в разі різкої необхідності використовувати захисні системи самих сервісів (наприклад, сертифікати ssh) або механізм «стуку в порти» (про нього розказано в кінці статті).

Linux> iptables -A INPUT -i $ outif \
-s 192.168.1.0/24 -j DENY
FreeBSD> ipfw add deny ip from \
192.168.1.0/24 to any via $ outif
OpenBSD> block in on $ outif from \
192.168.1.0/24 to any

В якості альтернативи або додаткової міри захисту можна (і навіть потрібно) використовувати спеціальні директиви ipfw і pf і налаштування ядра Linux:

Linux> echo 1> / proc / sys / net / ipv4 / conf / all / rp_filter
FreeBSD> ipfw add deny ip from any to any not antispoof in
OpenBSD> antispoof quick for $ ext_if

корисності IPTABLES

В кінці статті ми розглянемо кілька цікавих можливостей iptables / netfilter, які можуть виявитися корисними при захисті сервера від проникнень. Почнемо з механізму віддаленого управління брандмауером, який отримав ім'я «стукіт в порти» (port knoking). Суть його полягає в тому, щоб змусити файервол виконувати певні дії після підключення до заданого порту. Нижче наведено приклад правил, які відкривають порт SSH на 10 секунд після «стуку» в 27520-ий порт:

Друга корисність iptables поширюється в пакеті xtables-addons (patch-o-matic) і носить ім'я TARPIT. Ця дія (таке ж, як ACCEPT або DENY), яке «підвішує» з'єднання, не дозволяючи атакуючій стороні його закрити. З'єднання, пакети якого потрапляють в TARPIT, буде благополучно встановлено, проте розмір вікна буде дорівнює нулю, завдяки чому віддалена машина не зможе відправляти дані, витрачаючи свої ресурси, а з'єднання буде закрито тільки по закінченню таймаута. TARPIT можна використовувати в екстрених випадках для захисту від DoS:

# Iptables -A INPUT -p tcp -m tcp -dport 80 -j TARPIT

Або ж для введення атакуючого в оману і боротьби проти сканерів
портів (тільки звичайне TCP-сканування, '-sT'):

# Iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# Iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# Iptables -A INPUT -p tcp -m tcp -j TARPIT

Ці правила створюють видимість системи, в якій відкриті всі порти, однак при спробі підключення до будь-якого з них (крім 80 і 25) з'єднання будуть «подвисать». Того ж результату, але без «провисших» з'єднань, можна домогтися за допомогою дії DELUDE, яке правильно відповідає на всі спроби ініціації з'єднання, але посилає RST-пакет у відповідь на всі інші пакети. Для ще більшого заплутування атакуючого ти можеш використовувати дію CHAOS, яке випадковим чином активує одне з двох описаних вище дій.

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

Боротьба з витоком ресурсів

При використанні дії TARPIT обов'язково додавай в конфіг наступне правило, інакше «провисшие» з'єднання будуть з'їдати ресурси при обробці підсистемою conntrack:

# Iptables -t raw -I PREROUTING -p tcp --dport 25 -j NOTRACK

Покажи цю статтю друзям:

Схожі статті