Установите ModSecurity с Apache в контейнере Docker
На этой странице
- Требования
- Начало работы
- Установить Docker
- Создайте Dockerfile для ModSecurity.
- Создайте образ Apache ModSecurity и запустите контейнер
- Подтвердить ModSecurity
- Заключение
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 SIZEf603dbc38018 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. Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы.