Броня для сайтів

Зміст статті
Веб-програми, що відрізняються різноманітністю та високою інтерактивністю, сьогодні являють собою велику проблему безпеки. Адже, за статистикою, більшість сучасних атак спрямовані саме на веб-сервіси, і звичні інструменти, що працюють на мережному рівні, їх не можуть зупинити. Тому спеціальні рішення, що дозволяють захистити веб-сайти, потрібні як ніколи. Для невеликих проектів комерційні рішення зазвичай дуже дороге задоволення, тому поява чергового open source WAF сама по собі подія.
Проект Shadow Daemon
Очевидно, найкраще захищатися від атак на веб-програми правильно написаним кодом, але навіть у тих проектах, де приділяють серйозну увагу тестуванню, постійно знаходять і будуть знаходити вразливості. Модулі, написані сторонніми розробниками, взагалі потенційний пролом у безпеці. Не секрет, що помилки виявляють навіть у аддонах, призначених для захисту сайтів. Підвищуючи безпеку вони самі виявляються проблемою. У цьому випадку WAF (Web Application Firewall) стає чи не єдиною перешкодою, яка не дозволяє хакеру виконати свої дії.
У чорному списку за допомогою регулярних виразів здійснюється пошук відомих атак у вхідних даних. Кожен фільтр має вагу, що задає певне значення неблагонадійності запиту. Значення всіх фільтрів підсумовується і порівнюється з граничним значенням. Якщо показник запиту більший за встановлений поріг, запит класифікується як загроза. Чорний список хоч і виявляє більшість алгоритмів атак, але не гарантує повну безпеку. Завжди є ймовірність, що буде підібрано запит, який пройде фільтри. Чорні спискиобов'язково мають бути включені.
Білий список визначає, як мають виглядати нормальні вхідні дані. Якщо під запит не знайдеться відповідне правило, його буде віднесено до загрози. Якщо знайдено правило, алгоритм перевіряє набір символів, чи дотримується запит обмеження довжини. Це дозволяє виявити будь-яку атаку з досить низьким порогом хибних спрацьовувань.
Третій компонент - алгоритм цілісності (integrity), що звіряє контрольну суму запиту та правила за наявності правила у білому списку (якщо його немає, то запит однозначно розглядається як загроза). Словник хешей містить алгоритми та відповідні їм значення файлу сценарію, що виконується. Білий список і integrity можна спочатку не використовувати, щоб переконатися, що все працює нормально.
Shadow Daemon побудований за модульним принципом, коли підсистема захоплення (connector), аналізу (демон shadowd) та інтерфейс розділені для кращої гнучкості, розширюваності та забезпечення безпеки. Необов'язковий веб-інтерфейс дозволяє досліджувати атаки у найдрібніших подробицях. У комплект входять скрипти, які можуть бути використані для надсилання звітів електронною поштою та ротації журналів. Якщо потрібно просто захистити сайт, не вникаючи в деталі і не підлаштовуючи Shadow Daemon роботу, то інтерфейс можна не ставити.
Конектор «підключається» до інтерпретатора і перехоплює з'єднання між веб-сервером і додатком і передає TCP (в JSON-форматі) демону shadowd IP, ідентифікатори введення/шляху, вхідні дані, хеш та іншу інформацію. У відповідь отримує один із шести статусів від OK: 1 до CRITICAL_ATTACK: 6 та масив ідентифікаторів входу. На даний момент доступні конектори, що забезпечують роботу з програмами, написаними на PHP, Perl і Python, планується додати інші мови.
Веб-програми можуть відрізнятися за налаштуваннями, і загальні правила можуть не підходити для всіх. Тому в SD реалізовані профілі, що дозволяють вказати специфічні кожному за хоста установки. Загалом краще використовувати профіль для кожної програми.

Установка Shadow Daemon
Для встановлення демона shadowd проект пропонує вихідні тексти та пакети для Debian/Ubuntu та Red Hat/CentOS. Для Ubuntu доступний і репозиторій. Крім того, можна використовувати образ Docker, у цьому випадку отримуємо відразу повністю налаштовану та готову до роботи систему.
Переходимо до настроювання бази даних. В даний час підтримується PostgreSQL або MySQL. У /usr/share/shadowd лежать шаблони, потрібно лише вибрати та імпортувати відповідний. Імпортуємо шаблон для MySQL:

Ставимо конектор для PHP.
Налаштовуємо конектор для PHP, щоб Shadow Daemon почав захищати систему. Нічого не потрібно компілювати, просто копіюємо вміст src в будь-яке зручне місце, але треба переконатися, що веб-сервер може прочитати файли.
Тепер слід повідомити PHP про новий скрипт. Залежно від ситуації, це можна зробити кількома способами. Якщо захист потрібний для всіх сайтів, прописуємо в php.ini: