欢迎阅读我们关于如何安装 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 容器中。