Как настроить ModSecurity с Apache в Ubuntu 14.04 и Debian 8

Вступление

ModSecurity - это бесплатный брандмауэр веб-приложений (WAF), который работает с Apache, Nginx и IIS. Он поддерживает гибкий механизм правил для выполнения простых и сложных операций и поставляется с базовым набором правил (CRS), который имеет правила для внедрения SQL, межсайтовый скриптинг, трояны, плохие пользовательские агенты, перехват сеансов и множество других эксплойтов. Для Apache он загружается как дополнительный модуль, который упрощает установку и настройку.

Предпосылки

Чтобы следовать этому уроку, вам понадобится:

Шаг 1 - Установка ModSecurity

На этом этапе мы установим ModSecurity.

Сначала обновите индексные файлы пакета.

sudo apt-get update

Затем установите ModSecurity.

sudo apt-get install libapache2-mod-security2 -y

Вы можете проверить, что модуль ModSecurity был загружен с помощью следующей команды.

sudo apachectl -M | grep --color security2

Если вывод показывает + security2_module (shared) +, это означает, что модуль был загружен.

Установка ModSecurity включает рекомендуемый файл конфигурации, который необходимо переименовать.

sudo mv /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

Наконец, перезагрузите Apache.

sudo service apache2 reload

Новый файл журнала для ModSecurity будет создан в каталоге журналов Apache по адресу + / var / log / apache2 / modsec_audit.log +.

Шаг 2 - Настройка ModSecurity

Из коробки ModSecurity ничего не делает, потому что ему нужны правила для работы. На этом этапе мы сначала включим некоторые директивы конфигурации.

Чтобы найти и заменить директивы конфигурации на этом шаге, мы будем использовать + sed +, редактор потоков. Вы можете прочитать https://www.digitalocean.com/community/tutorial_series/using-sed [+ sed + серия руководств], чтобы узнать больше об этом инструменте.

Основные директивы для включения

Файл конфигурации ModSecurity по умолчанию установлен на «+ DetectionOnly », который регистрирует запросы в соответствии с правилами и ничего не блокирует. Это можно изменить, отредактировав файл ` modsecurity.conf ` и изменив директиву ` SecRuleEngine +`. Если вы пробуете это на рабочем сервере, измените эту директиву только после тестирования всех ваших правил.

sudo sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /etc/modsecurity/modsecurity.conf

Директива + SecResponseBodyAccess + определяет, буферизуются ли тела ответов (т.е. прочитано ModSecurity). Это необходимо, только если требуется обнаружение и защита от утечки данных. Поэтому, оставив его включенным, вы израсходуете ресурсы Droplet, а также увеличите размер файла журнала, поэтому мы отключим его.

sudo sed -i "s/SecResponseBodyAccess On/SecResponseBodyAccess Off/" /etc/modsecurity/modsecurity.conf

Дополнительные директивы для изменения

Есть и другие директивы, которые вы можете настроить, отредактировав + / etc / modsecurity / modsecurity.conf +. Директивы + SecRequestBodyLimit + и + SecRequestBodyNoFilesLimit + ограничивают максимальный объем данных, которые можно публиковать в вашем веб-приложении.

В частности, директива + SecRequestBodyLimit + определяет максимальный размер данных POST. Если клиент отправит что-то большее, сервер ответит ошибкой 413 Request Entity Too Large. Если в вашем веб-приложении нет файлов для загрузки, это значение можно оставить как есть. Предварительно сконфигурированное значение, указанное в файле конфигурации, составляет 13107200 байт (12,5 МБ). Если вы хотите изменить это значение, найдите следующую строку + modsecurity.conf +:

Необязательное изменение директивы modsecurity.conf

SecRequestBodyLimit

Точно так же + SecRequestBodyNoFilesLimit + ограничивает размер данных POST минус загрузка файлов. Это значение должно быть как можно ниже, чтобы снизить вероятность атак типа «отказ в обслуживании» (DoS), когда кто-то отправляет тела запросов очень больших размеров. Предварительно сконфигурированное значение в файле конфигурации составляет 131072 байта (128 КБ). Если вы хотите изменить это значение, найдите следующую строку + modsecurity.conf +:

Необязательное изменение директивы modsecurity.conf

SecRequestBodyNoFilesLimit

Директива, которая влияет на производительность сервера, это + SecRequestBodyInMemoryLimit +. Эта директива не требует пояснений; он определяет, сколько данных «тела запроса» (POST-данных) должно храниться в памяти (ОЗУ), а все остальное будет помещено на жесткий диск (как при обмене). Поскольку капли используют SSD, это не является большой проблемой. Тем не менее, это может быть изменено, если у вас есть оперативная память, чтобы сэкономить. Предварительно сконфигурированное значение для этой директивы - 128 КБ. Если вы хотите изменить это значение, найдите следующую строку + modsecurity.conf +:

Необязательное изменение директивы modsecurity.conf

SecRequestBodyInMemoryLimit

Шаг 3 - Тестирование SQL-инъекции

Перед настройкой некоторых правил мы создадим скрипт PHP, который уязвим для внедрения SQL-кода, чтобы протестировать защиту ModSecurity.

Во-первых, откройте приглашение MySQL.

mysql -u root -p

Здесь создайте базу данных MySQL с именем * sample * и подключитесь к ней.

create database ;
connect ;

Затем создайте таблицу, содержащую некоторые учетные данные - имя пользователя * sammy * и пароль * пароль *.

create table users(username VARCHAR(100),password VARCHAR(100));
insert into users values('sammy','password');

Наконец, выйдите из командной строки MySQL.

quit;

Затем создайте скрипт входа в корневой каталог документов Apache.

sudo nano /var/www/html/login.php

Вставьте следующий PHP-скрипт в файл. Обязательно измените пароль MySQL в приведенном ниже сценарии на тот, который вы установили ранее, чтобы сценарий мог подключаться к базе данных:

/var/www/html/login.php

<html>
<body>
<?php
   if(isset($_POST['login']))
   {
       $username = $_POST['username'];
       $password = $_POST['password'];
       $con = mysqli_connect('localhost','root','','sample');
       $result = mysqli_query($con, "SELECT * FROM `users` WHERE username='$username' AND password='$password'");
       if(mysqli_num_rows($result) == 0)
           echo 'Invalid username or password';
       else
           echo '<h1>Logged in</h1><p>This is text that should only be displayed when logged in with valid credentials.</p>';
   }
   else
   {
?>
       <form action="" method="post">
           Username: <input type="text" name="username"/><br />
           Password: <input type="password" name="password"/><br />
           <input type="submit" name="login" value="Login"/>
       </form>
<?php
   }
?>
</body>
</html>

Этот скрипт отобразит форму входа. Откройте браузер и перейдите к + http: /// login.php +, чтобы увидеть его. Если вы введете правильную пару учетных данных, например, sammy в поле * Имя пользователя * и пароль в поле * Пароль *, вы увидите сообщение * Это текст, который отображается только при входе в систему с действительными учетными данными *. Если вы вернетесь к экрану входа в систему и будете использовать неверные учетные данные, вы увидите сообщение * Неверное имя пользователя или пароль *.

Следующая задача - попробовать SQL-инъекцию, чтобы обойти страницу входа. Введите следующее для поля имени пользователя.

Имя пользователя SQL-инъекции

' or true --

Обратите внимание, что после + - + должен быть пробел, чтобы эта инъекция работала. Оставьте поле пароля пустым и нажмите кнопку входа. Скрипт показывает сообщение, предназначенное для аутентифицированных пользователей! На следующем этапе мы предотвратим это.

Шаг 4 - Настройка правил

На этом шаге мы настроим некоторые правила ModSecurity.

Включение CRS

Чтобы упростить задачу, существует множество правил, которые уже установлены вместе с ModSecurity. Они называются CRS (Core Rule Set) и находятся в каталоге + / usr / share / modsecurity-crs +. Чтобы загрузить эти правила, нам нужно настроить Apache для чтения файлов + .conf + в этих каталогах, поэтому откройте файл + security2.conf + для редактирования.

sudo nano /etc/apache2/mods-enabled/security2.conf

Добавьте две следующие директивы, выделенные красным, внутри перед последней строкой в ​​файле (+ </ IfModule> +).

Обновлен security2.conf

       IncludeOptional /etc/modsecurity/*.conf


</IfModule>

Сохраните и закройте файл.

Исключая каталоги / домены (необязательно)

Иногда имеет смысл исключить конкретный каталог или имя домена, если на нем запущено приложение, такое как phpMyAdmin, так как ModSecurity будет блокировать запросы SQL. Также лучше исключить административные серверные части приложений CMS, таких как WordPress. Если вы читаете этот учебник на новом сервере, вы можете пропустить этот шаг.

Чтобы отключить ModSecurity для полного VirtualHost, поместите следующие директивы внутри блока + <VirtualHost> […​] </ VirtualHost> + в его файле виртуального хоста.

<IfModule security2_module>
   SecRuleEngine Off
</IfModule>

Для пропуска определенного каталога (например, + / var / www / wp-admin):

<Directory "">
   <IfModule security2_module>
       SecRuleEngine Off
   </IfModule>
</Directory>

Если вы не хотите полностью отключать ModSecurity в каталоге, используйте директиву + SecRuleRemoveById +, чтобы удалить конкретное правило или цепочку правил, указав его идентификатор.

<LocationMatch "">
   <IfModule security2_module>
       SecRuleRemoveById
   </IfModule>
</LocationMatch>

Активация правила SQL-инъекций

Далее мы активируем файл правил внедрения SQL. Необходимые файлы правил должны быть связаны с каталогом + activ_rules +, который похож на каталог Apache + mods-enabled +. Перейдите в каталог + activ_rules +.

cd /usr/share/modsecurity-crs/activated_rules/

Затем создайте символическую ссылку из файла + modsecurity crs_41_sql_injection_attacks.conf.

sudo ln -s ../base_rules/modsecurity_crs_41_sql_injection_attacks.conf .

Наконец, перезагрузите Apache, чтобы правила вступили в силу.

sudo service apache2 reload

Теперь откройте страницу входа, которую мы создали ранее, и попробуйте использовать тот же запрос SQL-инъекции в поле имени пользователя. Поскольку на шаге 2 мы изменили директиву + SecRuleEngine + на + On +, появляется ошибка * 403 Forbidden *. (Если + SecRuleEngine + оставить для опции + DetectionOnly +, внедрение будет успешным, но попытка будет зарегистрирована в файле + modsec_audit.log +.)

Поскольку этот скрипт входа в PHP предназначен только для тестирования ModSecurity, вы должны удалить его сейчас, когда тест завершен.

sudo rm /var/www/html/login.php

Шаг 5 - Написание ваших собственных правил

В этом разделе мы создадим цепочку правил, которая блокирует запрос, если определенные слова, обычно связанные со спамом, вводятся в форме HTML.

Сначала мы создадим пример сценария PHP, который получает ввод из текстового поля и отображает его обратно пользователю. Откройте файл с именем + from.php для редактирования.

sudo nano /var/www/html/form.php

Вставьте следующий код:

/var/www/html/form.php

<html>
   <body>
       <?php
           if(isset($_POST['data']))
               echo $_POST['data'];
           else
           {
       ?>
               <form method="post" action="">
                       Enter something here:<textarea name="data"></textarea>
                       <input type="submit"/>
               </form>
       <?php
           }
       ?>
   </body>
</html>

Пользовательские правила могут быть добавлены в любой из файлов конфигурации или помещены в каталоги ModSecurity. Мы разместим наши правила в отдельном новом файле под названием + modsecurity_custom_rules.conf +.

sudo nano /etc/modsecurity/.conf

Вставьте следующее в этот файл. Два слова, которые мы блокируем: * заблокированное слово1 * и * заблокированное слово2 *.

modsecurity_custom_rules.conf

SecRule REQUEST_FILENAME "form.php" "id:'400001',chain,deny,log,msg:'Spam detected'"
SecRule REQUEST_METHOD "POST" chain
SecRule REQUEST_BODY "@rx (?i:(|))"

Синтаксис + SecRule +: + SecRule ПЕРЕМЕННЫЙ ОПЕРАТОР [ДЕЙСТВИЯ] +. Здесь мы использовали действие цепочки для сопоставления переменных + REQUEST_FILENAME + с + form.php +, + REQUEST_METHOD + с + POST + и + REQUEST_BODY + с регулярным выражением + (@ rx) + string ` + (blockedword1 | blockedword2) + . `+? I: + делает нечувствительное к регистру совпадение. При успешном совпадении всех этих трех правил + ACTION должен запретить и войти в систему с помощью` + msg «Обнаружен спам». + `Действие цепочки стимулирует логическое И для соответствия всем трем правилам.

Сохраните файл и перезагрузите Apache.

sudo service apache2 reload

Откройте + http: /// form.php + в браузере. Если ввести текст, содержащий заблокированное слово1 или заблокированное слово2, вы увидите страницу 403.

Поскольку этот скрипт формы PHP предназначен только для тестирования ModSecurity, вы должны удалить его сейчас, когда тест завершен.

sudo rm /var/www/html/form.php

Заключение

Из этого руководства вы узнали, как установить и настроить ModSecurity, а также добавить пользовательские правила. Чтобы узнать больше, вы можете проверить official документацию ModSecurity.

Related