Добро пожаловать в наше руководство по установке ModSecurity 3 с Apache в контейнере Docker.
Libmodsecurity (Modsecurity v3) – это межплатформенный межсетевой экран веб-приложений с открытым исходным кодом (WAF), разработанный Trustwave SpiderLabs.
Это полная переработанная версия ModSecurity v2, которая предоставляет фаерволл на основе событий, который защищает веб-приложения от широкого спектра атак, таких как SQLi, межсайтовый скриптинг (XSS), включение локального файла, включение удаленного файла и т.д.
Он также позволяет отслеживать, регистрировать и анализировать HTTP-трафик в реальном времени.
Установка Docker
В вашей соответствующей базовой ОС вам необходимо установить Docker.
В нашем руководстве мы используем сервер Ubuntu 20.04 для размещения контейнеров Docker.
Таким образом, выполните приведенную ниже команду, чтобы установить Docker в Ubuntu 20.04.
apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker-ce.list
apt update
apt install docker-ce docker-ce-cli containerd.io
Создадим Dockerfile
Поскольку мы будем создавать наш контейнер Modsecurity на основе команд установки Modsecurity, вам необходимо создать Dockerfile.
Dockerfile – это текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки образа.
vim Dockerfile
Вставьте содержимое, показанное ниже в Dockerfile.
Мы будем использовать образ Ubuntu для создания нашего контейнера Modsecurity!
# Running Modsecurity in a Docker container;
FROM ubuntu:latest
ARG DEBIAN_FRONTEND=noninteractive
# Run system update/upgrade
RUN apt update -y && apt upgrade -y
# Install Required Build Tools and Dependencies
RUN apt install -y g++ flex bison curl apache2-dev \
doxygen libyajl-dev ssdeep liblua5.2-dev \
libgeoip-dev libtool dh-autoreconf \
libcurl4-gnutls-dev libxml2 libpcre++-dev \
libxml2-dev git wget tar apache2
# Download LibModsecurity Source Code
RUN wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.4/modsecurity-v3.0.4.tar.gz
# Extract the ModSecurity source code.
RUN tar xzf modsecurity-v3.0.4.tar.gz && rm -rf modsecurity-v3.0.4.tar.gz
# Compile and Install LibModsecurity
RUN cd modsecurity-v3.0.4 && \
./build.sh && ./configure && \
make && make install
# Install ModSecurity-Apache Connector
RUN cd ~ && git clone https://github.com/SpiderLabs/ModSecurity-apache
RUN cd ~/ModSecurity-apache && \
./autogen.sh && \
./configure --with-libmodsecurity=/usr/local/modsecurity/ && \
make && \
make install
# Load the Apache ModSecurity Connector Module
RUN echo "LoadModule security3_module /usr/lib/apache2/modules/mod_security3.so" >> /etc/apache2/apache2.conf
# Configure ModSecurity
RUN mkdir /etc/apache2/modsecurity.d && \
cp modsecurity-v3.0.4/modsecurity.conf-recommended /etc/apache2/modsecurity.d/modsecurity.conf && \
cp modsecurity-v3.0.4/unicode.mapping /etc/apache2/modsecurity.d/ && \
sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/apache2/modsecurity.d/modsecurity.conf
ADD modsec_rules.conf /etc/apache2/modsecurity.d/
# Install OWASP ModSecurity Core Rule Set (CRS) on Ubuntu
RUN git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /etc/apache2/modsecurity.d/owasp-crs && \
cp /etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf.example /etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf
# Activate ModSecurity
RUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.old
ADD 000-default.conf /etc/apache2/sites-available/
EXPOSE 80
CMD apachectl -D FOREGROUND
Определите базовый образ для контейнера Docker.
Это можно сделать с помощью команды инструкции FROM.
Образ будет извлечено из публичных репозиториев.
Установим ModSecurity 3 с Apache в контейнер Docker
Сборка ModSecurity 3 с Apache в образе Docker
После того, как вы настроили свой Dockerfile, теперь вы можете создать из него образ.
Убедитесь, что служба Docekr запущена:
systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2021-05-06 05:19:12 UTC; 1s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 8542 (dockerd)
Tasks: 8
Memory: 40.5M
CGroup: /system.slice/docker.service
└─8542 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Если нет, то запустите службу Docker, используя команду:
systemctl start docker
Прежде чем вы сможете создать образ, есть файлы, которые необходимо скопировать с хоста в соответствии с Dockerfile.
Это правила modsecuriry и файл конфигурации сайта Apache.
Таким образом создайте эти файлы:
cat > modsec_rules.conf << 'EOL'
Include "/etc/apache2/modsecurity.d/modsecurity.conf"
Include "/etc/apache2/modsecurity.d/owasp-crs/crs-setup.conf"
Include "/etc/apache2/modsecurity.d/owasp-crs/rules/*.conf"
EOL
cat > 000-default.conf << 'EOL'
<VirtualHost *:80>
modsecurity on
modsecurity_rules_file /etc/apache2/modsecurity.d/modsec_rules.conf
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOL
Теперь вы можете приступить к созданию образа!
Чтобы создать образ Docker с помощью Dockerfile, просто используйте docker build <путь к Dockerfile>.
docker build .
Я использовал точку (.), чтобы обозначить текущее местоположение моего Dockerfile.
Если его нет в текущем рабочем каталоге, используйте параметр -f, чтобы указать путь:
docker build -f /path/to/a/Dockerfile .
Пример вывода команды сборки;
...
Step 14/18 : RUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.old
---> Running in ac6525e24f7d
Removing intermediate container ac6525e24f7d
---> ec6d4457b765
Step 15/18 : ADD 000-default.conf /etc/apache2/sites-available/
---> 7c4201ccfd92
Step 16/18 : VOLUME /var/log/apache2
---> Running in 9919d9cf570d
Removing intermediate container 9919d9cf570d
---> aa45b6406512
Step 17/18 : EXPOSE 80
---> Running in 368fc959c99d
Removing intermediate container 368fc959c99d
---> 210d4c2df36e
Step 18/18 : CMD apachectl -D FOREGROUND
---> Running in dfea7e1352ee
Removing intermediate container dfea7e1352ee
---> 229edcf62162
Successfully built 229edcf62162
Выведем список доступных на данный момент образов:
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 229edcf62162 2 hours ago 2.48GB
...
Идентификатор нашего образа ModSecurity 3: 229edcf62162.
Запуск контейнера Docker ModSecurity 3
Теперь вы можете создать контейнер ModSecurity Docker на основе образа, созданного выше, с помощью команды docker run:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Например, мы можем запустить наш сервер Apache с контейнером ModSecurity, выполнив команду, показанную ниже;
docker run --name modsec3-apache -dp 80:80 229edcf62162
Приведенная выше команда запускает Apache с контейнером ModSecurity под названием modsec3-apache в фоновом режиме (-b) на основе созданного образа.
Он также открывает порт контейнера 80 на порт 80 на хост-сервере.
Листинг контейнеров;
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae4017bdaf23 229edcf62162 "/bin/sh -c 'apachec…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp modsec3-apache
Вы также можете перечислить запущенные контейнеры с помощью команды docker ps.
Вот и все.
Ваш Apache с ModSecurity, работающий как контейнер Docker, настроен.
Вы можете проверить, защищает ли ModSecurity теперь Apache, работающий в контейнере Docker, следующим образом.
Откройте порт 80/tcp на брандмауэре хоста;
ufw allow 80/tcp
Теперь на хосте выполните команду:
ss -altnp | grep :80
LISTEN 0 4096 0.0.0.0:80 0.0.0.0:* users:(("docker-proxy",pid=29372,fd=4))
LISTEN 0 4096 [::]:80 [::]:* users:(("docker-proxy",pid=29377,fd=4))
Итак, на хосте мы можем получить доступ к нашему контейнеру Apache/Modsecurity, используя любой адрес!
Следовательно, чтобы проверить эффективность ModSecurity в контейнере;
curl localhost?doc=/bin/ls
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
<hr>
<address>Apache/2.4.41 (Ubuntu) Server at localhost Port 80</address>
</body></html>
Вы можете войти в контейнер и проверить логи;
docker exec -it modsec3-apache /bin/bash
tail /var/log/apache2/error.log
[Thu May 06 17:12:15.526844 2021] [:notice] [pid 16:tid 139891014069312] ModSecurity: ModSecurity-Apache v0.1.1-beta configured.
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Thu May 06 17:12:15.592630 2021] [mpm_event:notice] [pid 16:tid 139891014069312] AH00489: Apache/2.4.41 (Ubuntu) configured -- resuming normal operations
[Thu May 06 17:12:15.592655 2021] [core:notice] [pid 16:tid 139891014069312] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND'
[Thu May 06 17:32:37.690656 2021] [:error] [pid 17:tid 139890944558848] [client 172.17.0.1:60688] ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:doc' (Value: `/bin/ls' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/ls found within ARGS:doc: /bin/ls"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "172.17.0.2"] [uri "/"] [unique_id "162032235753.217056"] [ref "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]
[Thu May 06 17:35:30.014353 2021] [:error] [pid 17:tid 139890927757056] [client 172.17.0.1:60692] ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:doc' (Value: `/bin/ls' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/ls found within ARGS:doc: /bin/ls"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "172.17.0.2"] [uri "/"] [unique_id "16203225307.958576"] [ref "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]
...
Вы также можете проверить логи с помощью команды docker logs.
Вы также можете настроить контейнер для хранения логов на хосте, используя параметр docker run –volume / -v.
docker run --name modsec3-apache -v /var/log/apache2:/var/log/apache2 -dp 80:80 229edcf62162
tail -f /var/log/apache2/error.log
[Thu May 06 17:55:35.007467 2021] [:notice] [pid 16:tid 139799054105664] ModSecurity: ModSecurity-Apache v0.1.1-beta configured.
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
[Thu May 06 17:55:35.066755 2021] [mpm_event:notice] [pid 16:tid 139799054105664] AH00489: Apache/2.4.41 (Ubuntu) configured -- resuming normal operations
[Thu May 06 17:55:35.066783 2021] [core:notice] [pid 16:tid 139799054105664] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND'
[Thu May 06 17:55:56.640042 2021] [:error] [pid 18:tid 139798870210304] [client 172.17.0.1:60700] ModSecurity: Warning. Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:doc' (Value: `/bin/ls' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [line "496"] [id "932160"] [rev ""] [msg "Remote Command Execution: Unix Shell Code Found"] [data "Matched Data: bin/ls found within ARGS:doc: /bin/ls"] [severity "2"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-shell"] [tag "platform-unix"] [tag "attack-rce"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/WEB_ATTACK/COMMAND_INJECTION"] [tag "WASCTC/WASC-31"] [tag "OWASP_TOP_10/A1"] [tag "PCI/6.5.2"] [hostname "172.17.0.2"] [uri "/"] [unique_id "162032375634.996239"] [ref "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]