Вступление
ModSecurity - это бесплатный брандмауэр веб-приложений (WAF), который работает с Apache, Nginx и IIS. Он поддерживает гибкий механизм правил для выполнения простых и сложных операций и поставляется с базовым набором правил (CRS), который имеет правила для внедрения SQL, межсайтовый скриптинг, трояны, плохие пользовательские агенты, перехват сеансов и множество других эксплойтов. Для Apache он загружается как дополнительный модуль, который упрощает установку и настройку.
Предпосылки
Чтобы следовать этому уроку, вам понадобится:
-
Ubuntu 14.04 или Debian 8 Droplet.
-
Стандартная учетная запись пользователя с привилегиями sudo, которую вы можете настроить, следуя начальному учебному пособию по настройке сервера для Ubuntu 14.04 или Debian 8.
-
Стек LAMP, который можно установить, следуя инструкциям для https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14 -04 [Ubuntu 14.04] или Debian 8.
Шаг 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.