安装 ModSecurity 3 Apache 在 Docker 容器中

欢迎阅读我们关于如何安装 ModSecurity 3 的指南 Apache 在 Docker 容器中。 Libmodsecurity (Modsecurity v3),是由 Trustwave 的 SpiderLabs 开发的开源、跨平台 Web 应用程序防火墙 (WAF)。 它是对 ModSecurity v2 的完全重写,它提供了一种强大的基于事件的编程语言,可以保护 Web 应用程序免受各种攻击,例如 SQL 注入、跨站点脚本 (XSS)、本地文件包含、远程文件包含 e. tc。 它还允许进行 HTTP 流量监控、日志记录和实时分析。

安装 ModSecurity 3 Apache 在 Docker 容器中

为了在 Docker 容器中安装 ModSecurity 3,我们将根据我们之前关于如何安装 ModSecurity 3 的教程创建我们自己的 Docker 镜像,链接如下;

安装 LibModsecurity Apache 在 Debian 10 上

安装 LibModsecurity Apache 在 Ubuntu 20.04 上

配置 LibModsecurity Apache 在 CentOS 8 上

在 CentOS 8 上使用 Nginx 配置 LibModsecurity

安装 Docker

在您各自的基础操作系统中,您需要安装 Docker。 在我们的指南中,我们使用 Ubuntu 20.04 服务器来托管 Docker 容器。 因此,运行以下命令在 Ubuntu 20.04 上安装 Docker。

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

安装 Docker CE 和其他工具,包括 containerd.io, 一个开放可靠的容器运行时。

apt install docker-ce docker-ce-cli containerd.io

创建 Dockerfile

由于我们将基于 Modsecurity 安装命令构建我们的 Modsecurity 容器,因此您需要创建一个 Dockerfile。 Dockerfile 是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。

vim Dockerfile

将以下内容粘贴到 Dockerfile 中。

我们将使用一个 Ubuntu 镜像来创建我们的 Modsecurity 容器,因此,安装指南中的命令,Install LibModsecurity with Apache 在 Ubuntu 20.04 上,使用。

# 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 后,您现在可以从中构建映像。

确保 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 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  May 06 05:19:08 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:08.455064769Z" level=warning msg="Your kernel does not support CPU realtime scheduler" May 06 05:19:08 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:08.455517885Z" level=warning msg="Your kernel does not support cgroup blkio weight" May 06 05:19:08 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:08.455936526Z" level=warning msg="Your kernel does not support cgroup blkio weight_device" May 06 05:19:08 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:08.456858801Z" level=info msg="Loading containers: start." May 06 05:19:09 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:09.970095995Z" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. D> May 06 05:19:10 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:10.589619449Z" level=info msg="Loading containers: done." May 06 05:19:11 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:11.360156761Z" level=info msg="Docker daemon" commit=8728dd2 graphdriver(s)=overlay2 version=20.10.6 May 06 05:19:11 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:11.362448498Z" level=info msg="Daemon has completed initialization" May 06 05:19:12 kifarunix.com systemd[1]: Started Docker Application Container Engine. May 06 05:19:12 kifarunix.com dockerd[8542]: time="2021-05-06T05:19:12.141070774Z" level=info msg="API listen on /run/docker.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 [email protected] 	DocumentRoot /var/www/html 	ErrorLog ${APACHE_LOG_DIR}/error.log 	CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> EOL

您现在可以继续构建 docker 镜像。

要使用 Dockerfile 构建 Docker 镜像,只需使用 docker build <path to Dockerfile>.

docker build .

我使用了 dot (.) 表示我的 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

您已成功构建 Modsecurity 3 Apache 在 Docker 镜像上。

列出当前可用的图像;

docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE <none>       <none>    229edcf62162   2 hours ago   2.48GB ...

我们的 ModSecurity 3 docker 镜像 ID 是, 229edcf62162.

运行 ModSecurity 3 Apache Docker 容器

您现在可以使用上面创建的镜像创建一个 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 设置了作为 docker 容器运行的 ModSecurity。

您可以测试 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 docker 容器使用任何地址;

因此,要测试容器中 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

日志现在应该写入 /var/log/apache2 在主机上。

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"]

这就是关于如何安装 ModSecurity 3 Apache 在 Docker 容器中。