Поиск по сайту:

Установите ModSecurity с Apache в контейнере Docker


На этой странице

  1. Требования
  2. Начало работы
  3. Установить Docker
  4. Создайте Dockerfile для ModSecurity.
  5. Создайте образ Apache ModSecurity и запустите контейнер
  6. Подтвердить ModSecurity
  7. Заключение

ModSecurity — это бесплатный и самый популярный брандмауэр веб-приложений (WAF) с открытым исходным кодом, который защищает ваше веб-приложение от широкого спектра атак уровня 7. Он был разработан для мониторинга веб-сервера Apache, регистрации и фильтрации запросов. Он поставляется с основным набором правил, который обнаруживает и останавливает несколько атак, включая SQL-инъекции, межсайтовые сценарии, трояны, плохие пользовательские агенты, перехват сеансов и многое другое.

В этом руководстве я покажу вам, как установить ModSecurity 3 с Apache внутри контейнера Docker.

Требования

  • Сервер под управлением Ubuntu 20.04.
  • На вашем сервере настроен пароль root.

Начиная

Во-первых, рекомендуется обновить вашу систему до последней версии. Вы можете обновить его с помощью следующей команды:

apt-get update -y

Как только ваша система будет обновлена, вам нужно будет установить некоторые зависимости для вашей системы. Вы можете установить их все с помощью следующей команды:

apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y

После установки всех зависимостей можно переходить к следующему шагу.

Установить Докер

Далее вам нужно будет установить Docker CE в вашу систему. По умолчанию последняя версия Docker не включена в стандартный репозиторий Ubuntu. Поэтому вам нужно будет добавить официальный репозиторий Docker в APT.

Сначала загрузите и добавьте ключ Docker GPG с помощью следующей команды:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

Затем добавьте репозиторий Docker CE в список источников APT с помощью следующей команды:

echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker-ce.list

После добавления репозитория обновите репозиторий с помощью следующей команды:

apt-get update -y

После обновления репозитория установите последнюю версию Docker CE с помощью следующей команды:

apt-get install docker-ce -y

После установки Docker CE проверьте установленную версию Docker CE с помощью следующей команды:

docker --version

Вы должны получить следующий результат:

Docker version 20.10.6, build 370c289

Вы также можете проверить состояние службы Docker с помощью следующей команды:

systemctl status docker

Вы должны получить следующий результат:

? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-05-16 06:49:29 UTC; 38s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 8964 (dockerd)
      Tasks: 8
     Memory: 40.6M
     CGroup: /system.slice/docker.service
             ??8964 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.365433228Z" level=warning msg="Your kernel does not support swap memory li>
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.365916961Z" level=warning msg="Your kernel does not support cgroup blkio w>
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.366112111Z" level=warning msg="Your kernel does not support cgroup blkio w>
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.366653374Z" level=info msg="Loading containers: start."
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.498790388Z" level=info msg="Default bridge (docker0) is assigned with an I>
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.576691602Z" level=info msg="Loading containers: done."
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.610542206Z" level=info msg="Docker daemon" commit=8728dd2 graphdriver(s)=o>
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.611668583Z" level=info msg="Daemon has completed initialization"
May 16 06:49:29 ubunt4 systemd[1]: Started Docker Application Container Engine.
May 16 06:49:29 ubunt4 dockerd[8964]: time="2021-05-16T06:49:29.690496888Z" level=info msg="API listen on /run/docker.sock"
lines 1-21/21 (END)

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

Создайте Dockerfile для ModSecurity

Далее вам нужно будет создать Dockerfile для установки ModSecurity внутри контейнера Ubuntu.

Сначала измените каталог на /opt и создайте файл modsec_rules.conf с помощью следующей команды:

cd /opt
nano modsec_rules.conf

Добавьте следующие строки:

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"

Сохраните и закройте файл, затем создайте другой файл с помощью следующей команды:

nano 000-default.conf

Добавьте следующие строки:

<VirtualHost *:80>
	modsecurity on
	modsecurity_rules_file /etc/apache2/modsecurity.d/modsec_rules.conf 
	ServerAdmin 
	DocumentRoot /var/www/html
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Сохраните и закройте файл, когда закончите. Dockerfile скопирует вышеуказанные файлы в контейнер Docker в процессе сборки.

Наконец, создайте Dockerfile с помощью следующей команды:

nano Dockerfile

Добавьте следующие строки:

# Install Modsecurity in a Docker container;
FROM ubuntu:latest
ARG DEBIAN_FRONTEND=noninteractive
# update/upgrade your system
RUN apt-get update -y

# Install Required Dependencies
RUN apt-get 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 
RUN wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.4/modsecurity-v3.0.4.tar.gz

# Extract the Downloaded File
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

Сохраните и закройте файл, когда закончите.

Приведенный выше файл загрузит образ Ubuntu, установит все зависимости, загрузит ModSecurity, скомпилирует его и настроит Apache для работы с ModSecurity.

На данный момент Dockerfile готов. Теперь вы можете перейти к следующему шагу.

Создайте образ Apache ModSecurity и запустите контейнер

Теперь измените каталог на /opt и создайте образ Docker для Apache ModSecurity с помощью следующей команды:

cd /opt
docker build .

После завершения процесса сборки вы должны получить следующий вывод:

Step 13/17 : 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
 ---> Running in 00dfa2a5cd23
Cloning into '/etc/apache2/modsecurity.d/owasp-crs'...
Removing intermediate container 00dfa2a5cd23
 ---> b38c1d874d2f
Step 14/17 : RUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.old
 ---> Running in 12c9e6d2c559
Removing intermediate container 12c9e6d2c559
 ---> 899e26019297
Step 15/17 : ADD 000-default.conf /etc/apache2/sites-available/
 ---> eb11751afd6c
Step 16/17 : EXPOSE 80
 ---> Running in 2f4ba47e2b66
Removing intermediate container 2f4ba47e2b66
 ---> dd59b0ac7c7c
Step 17/17 : CMD apachectl -D FOREGROUND
 ---> Running in 98b8cc77df0f
Removing intermediate container 98b8cc77df0f
 ---> f603dbc38018
Successfully built f603dbc38018

Теперь вы можете перечислить все образы докеров, используя следующую команду:

docker images

Вы должны получить следующий результат:

REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
           f603dbc38018   32 seconds ago   2.48GB
ubuntu       latest    7e0aa2d69a15   3 weeks ago      72.7MB

Теперь выберите первый идентификатор изображения из приведенного выше вывода и запустите контейнер Apache ModSecurity с помощью следующей команды:

docker run --name modsec-apache -ditp 80:80 f603dbc38018

Вы должны получить следующий результат:

40eb0e77e61635c3cee2bfaffbd9489bc7d20aa3e1befb52749de079aaadb528

Теперь вы можете проверить работающий контейнер с помощью следующей команды:

docker ps

Вы должны получить следующий результат:

CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                               NAMES
40eb0e77e616   f603dbc38018   "/bin/sh -c 'apachec…"   17 seconds ago   Up 15 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   modsec-apache

Как видите, контейнер ModSecurity запущен и прослушивает порт 80.

Проверить ModSecurity

На данный момент контейнер 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>

Вы должны увидеть ошибку «403 Forbidden». Потому что ModSecurity заблокировал вышеуказанный запрос.

Вы также можете проверить журнал Apache для получения дополнительной информации.

Для этого сначала подключитесь к контейнеру с помощью следующей команды:

docker exec -it modsec-apache /bin/bash

После подключения вы должны получить следующую оболочку:

:/#

Теперь проверьте журнал Apache с помощью следующей команды:

tail -f /var/log/apache2/error.log

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

[Sun May 16 07:24:54.456327 2021] [mpm_event:notice] [pid 15:tid 140204464299072] AH00489: Apache/2.4.41 (Ubuntu) configured -- resuming normal operations
[Sun May 16 07:24:54.456352 2021] [core:notice] [pid 15:tid 140204464299072] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND'
[Sun May 16 07:25:36.680515 2021] [:error] [pid 16:tid 140204216108800] [client 172.17.0.1:45298] 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 "162114993662.860969"] [ref "o1,6v10,7t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"]

Заключение

Поздравляем! вы успешно установили ModSecurity внутри контейнера Docker. Надеюсь, теперь у вас достаточно знаний для реализации этого решения в среде Docker. Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы.