Cài đặt ModSecurity với Apache trong Docker Container

theanh

Administrator
Nhân viên
ModSecurity là tường lửa ứng dụng web (WAF) miễn phí, mã nguồn mở và phổ biến nhất, bảo vệ ứng dụng web của bạn khỏi nhiều cuộc tấn công Lớp 7. Nó được thiết kế để giám sát máy chủ web Apache, ghi nhật ký và lọc các yêu cầu. Nó đi kèm với Bộ quy tắc cốt lõi phát hiện và ngăn chặn một số cuộc tấn công bao gồm SQL injection, cross-site scripting, Trojan, tác nhân người dùng xấu, chiếm quyền điều khiển phiên và nhiều hơn nữa.

Trong hướng dẫn này, tôi sẽ chỉ cho bạn cách cài đặt ModSecurity 3 với Apache bên trong vùng chứa Docker.

Yêu cầu​

  • Máy chủ chạy Ubuntu 20.04.
  • Mật khẩu gốc được cấu hình trên máy chủ của bạn.

Bắt đầu​

Trước tiên, bạn nên cập nhật hệ thống của mình lên phiên bản mới nhất. Bạn có thể cập nhật bằng lệnh sau:
Mã:
apt-get update -y
Sau khi hệ thống của bạn được cập nhật, bạn sẽ cần cài đặt một số phần phụ thuộc vào hệ thống. Bạn có thể cài đặt tất cả chúng bằng lệnh sau:
Mã:
apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common -y
Sau khi tất cả các phần phụ thuộc đã được cài đặt, bạn có thể tiến hành bước tiếp theo.

Cài đặt Docker​

Tiếp theo, bạn sẽ cần cài đặt Docker CE vào hệ thống của mình. Theo mặc định, phiên bản Docker mới nhất không có trong kho lưu trữ mặc định của Ubuntu. Vì vậy, bạn sẽ cần thêm kho lưu trữ chính thức của Docker vào APT.

Đầu tiên, hãy tải xuống và thêm khóa GPG của Docker bằng lệnh sau:
Mã:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
Tiếp theo, hãy thêm kho lưu trữ CE của Docker vào danh sách nguồn APT bằng lệnh sau:
Mã:
echo "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker-ce.list
Sau khi kho lưu trữ được thêm vào, hãy cập nhật kho lưu trữ bằng lệnh sau:
Mã:
apt-get update -y
Sau khi kho lưu trữ được cập nhật, hãy cài đặt phiên bản Docker CE mới nhất bằng lệnh sau:
Mã:
apt-get install docker-ce -y
Sau khi cài đặt Docker CE, hãy xác minh phiên bản Docker CE đã cài đặt bằng lệnh sau:
Mã:
docker --version
Bạn sẽ nhận được kết quả đầu ra sau:
Mã:
Docker phiên bản 20.10.6, bản dựng 370c289
Bạn cũng có thể kiểm tra trạng thái của dịch vụ Docker bằng lệnh sau:
Mã:
systemctl status docker
Bạn sẽ nhận được kết quả đầu ra sau:
Mã:
? docker.service - Docker Application Container Engine Đã tải: đã tải (/lib/systemd/system/docker.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đang chạy) kể từ CN 2021-05-16 06:49:29 UTC; 38 giây trướcĐược kích hoạt bởi: ? docker.socket Tài liệu: https://docs.docker.com PID chính: 8964 (dockerd) Nhiệm vụ: 8 Bộ nhớ: 40,6M CGroup: /system.slice/docker.service ??8964 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.365433228Z" level=warning msg="Hạt nhân của bạn không hỗ trợ bộ nhớ hoán đổi li>16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.365916961Z" level=warning msg="Hạt nhân của bạn không hỗ trợ cgroup blkio w>16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.366112111Z" level=warning msg="Hạt nhân của bạn không hỗ trợ cgroup blkio w>16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.366653374Z" level=info msg="Đang tải container: bắt đầu."16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.498790388Z" level=info msg="Cầu nối mặc định (docker0) được gán với một I>16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.576691602Z" level=info msg="Đang tải container: xong."16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.610542206Z" level=info msg="Docker daemon" commit=8728dd2 graphdriver(s)=o>16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.611668583Z" level=info msg="Daemon đã hoàn tất quá trình khởi tạo"16 tháng 5 06:49:29 ubuntu2004 systemd[1]: Đã khởi động Docker Application Container Engine.16 tháng 5 06:49:29 ubuntu2004 dockerd[8964]: time="2021-05-16T06:49:29.690496888Z" level=info msg="API listen on /run/docker.sock"lines 1-21/21 (END)
Sau khi hoàn tất, bạn có thể tiến hành bước tiếp theo.

Tạo Dockerfile cho ModSecurity​

Tiếp theo, bạn sẽ cần tạo Dockerfile để cài đặt ModSecurity bên trong vùng chứa Ubuntu.

Đầu tiên, hãy thay đổi thư mục thành /opt và tạo tệp modsec_rules.conf bằng lệnh sau:
Mã:
cd /opt
nano modsec_rules.conf
Thêm các dòng sau:
Mã:
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"
Lưu và đóng tệp, sau đó tạo tệp khác bằng lệnh sau:
Mã:
nano 000-default.conf
Thêm các dòng sau:
Mã:
 modsecurity trên 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
Lưu và đóng tệp khi bạn hoàn tất. Dockerfile sẽ sao chép các tệp trên vào vùng chứa Docker trong quá trình xây dựng.

Cuối cùng, tạo Dockerfile bằng lệnh sau:
Mã:
nano Dockerfile
Thêm các dòng sau:
Mã:
# Cài đặt Modsecurity trong vùng chứa Docker;TỪ ubuntu:latestARG DEBIAN_FRONTEND=noninteractive# cập nhật/nâng cấp hệ thống của bạnCHẠY apt-get update -y# Cài đặt các phụ thuộc bắt buộcCHẠY 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# Tải xuống LibModsecurityCHẠY wget https://github.com/SpiderLabs/ModSecurity/releases/download/v3.0.4/modsecurity-v3.0.4.tar.gz# Giải nén tệp đã tải xuốngCHẠY tar xzf modsecurity-v3.0.4.tar.gz && rm -rf modsecurity-v3.0.4.tar.gz# Biên dịch và cài đặt LibModsecurityCHẠY cd modsecurity-v3.0.4 && \ ./build.sh && ./configure && \ make && make install# Cài đặt ModSecurity-Apache ConnectorCHẠY cd ~ && git clone https://github.com/SpiderLabs/ModSecurity-apacheCHẠY cd ~/ModSecurity-apache && \ ./autogen.sh && \ ./configure --with-libmodsecurity=/usr/local/modsecurity/ && \ make && \ make install# Tải Mô-đun Apache ModSecurity ConnectorCHẠY echo "LoadModule security3_module /usr/lib/apache2/modules/mod_security3.so" >> /etc/apache2/apache2.conf# Cấu hình ModSecurityCHẠY 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.confTHÊM modsec_rules.conf /etc/apache2/modsecurity.d/# Cài đặt OWASP ModSecurity Core Rule Set (CRS) trên UbuntuCHẠY 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# Kích hoạt ModSecurityRUN mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.oldADD 000-default.conf /etc/apache2/sites-available/EXPOSE 80CMD apachectl -D FOREGROUND
Lưu và đóng tệp khi bạn hoàn tất.

Tệp trên sẽ tải xuống hình ảnh Ubuntu, cài đặt tất cả các phần phụ thuộc, tải xuống ModSecurity, biên dịch và cấu hình Apache để hoạt động với ModSecurity.

Lúc này, Dockerfile đã sẵn sàng. Bây giờ bạn có thể tiến hành bước tiếp theo.

Xây dựng Apache ModSecurity Image và Khởi động Container​

Bây giờ, hãy thay đổi thư mục thành /opt và xây dựng Docker image cho Apache ModSecurity bằng lệnh sau:
Mã:
cd /opt
docker build .
Sau khi quá trình xây dựng hoàn tất, bạn sẽ nhận được đầu ra sau:
Mã:
Bước 13/17: CHẠY 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 ---> Đang chạy trong 00dfa2a5cd23Đang sao chép vào '/etc/apache2/modsecurity.d/owasp-crs'...Đang xóa vùng chứa trung gian 00dfa2a5cd23 ---> b38c1d874d2fBước 14/17: CHẠY mv /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/000-default.conf.old ---> Đang chạy trong 12c9e6d2c559Đang xóa vùng chứa trung gian 12c9e6d2c559 ---> 899e26019297Bước 15/17: THÊM 000-default.conf /etc/apache2/sites-available/ ---> eb11751afd6cBước 16/17: EXPOSE 80 ---> Đang chạy trong 2f4ba47e2b66Đang xóa vùng chứa trung gian 2f4ba47e2b66 ---> dd59b0ac7c7cBước 17/17: CMD apachectl -D FOREGROUND ---> Đang chạy trong 98b8cc77df0fĐang xóa vùng chứa trung gian 98b8cc77df0f ---> f603dbc38018Đã xây dựng thành công f603dbc38018
Bây giờ bạn có thể liệt kê tất cả các hình ảnh docker bằng lệnh sau:
Mã:
hình ảnh docker
Bạn sẽ nhận được kết quả đầu ra sau:
Mã:
REPOSITORY TAG IMAGE ID CREATED SIZE  f603dbc38018 32 giây trước 2,48GBubuntu latest 7e0aa2d69a15 3 tuần trước 72,7MB
Bây giờ, hãy chọn id hình ảnh đầu tiên từ kết quả đầu ra ở trên và khởi động vùng chứa Apache ModSecurity bằng lệnh sau:
Mã:
docker run --name modsec-apache -ditp 80:80 f603dbc38018
Bạn sẽ nhận được kết quả đầu ra sau:
Mã:
40eb0e77e61635c3cee2bfaffbd9489bc7d20aa3e1befb52749de079aaadb528
Bây giờ, bạn có thể xác minh chạy container bằng lệnh sau:
Mã:
docker ps
Bạn sẽ nhận được kết quả sau:
Mã:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES40eb0e77e616 f603dbc38018 "/bin/sh -c 'apachec…" 17 giây trước Đã hoạt động 15 giây 0.0.0.0:80->80/tcp, :::80->80/tcp modsec-apache
Như bạn thấy, container ModSecurity đã được khởi động và đang lắng nghe trên cổng 80.

Xác minh ModSecurity​

Lúc này, container ModSecurity đang chạy. Bây giờ, đã đến lúc kiểm tra xem các quy tắc ModSecurity có chặn các yêu cầu độc hại hay không.

Để thực hiện, hãy mở terminal của bạn và chạy lệnh sau:
Mã:
curl localhost?doc=/bin/ls
Bạn sẽ thấy đầu ra sau:
Mã:
403 Forbidden[HEADING=1]Forbidden[/HEADING]
Bạn không có quyền truy cập vào tài nguyên này.
Máy chủ Apache/2.4.41 (Ubuntu) tại Cổng 80 của máy chủ cục bộ
Bạn sẽ thấy lỗi "403 Forbidden". Vì ModSecurity đã chặn yêu cầu trên.

Bạn cũng có thể kiểm tra nhật ký Apache để biết thêm thông tin.

Để thực hiện, trước tiên, hãy kết nối với vùng chứa bằng lệnh sau:
Mã:
docker exec -it modsec-apache /bin/bash
Sau khi kết nối, bạn sẽ nhận được shell sau:
Mã:
root@40eb0e77e616:/#
Bây giờ, hãy kiểm tra nhật ký Apache bằng lệnh sau:
Mã:
tail -f /var/log/apache2/error.log
Bạn sẽ thấy rằng ModSecurity đã chặn yêu cầu độc hại:
Mã:
[Chủ Nhật, ngày 16 tháng 5 năm 2021 lúc 07:24:54.456327] [mpm_event:notice] [pid 15:tid 140204464299072] AH00489: Đã cấu hình Apache/2.4.41 (Ubuntu) -- tiếp tục hoạt động bình thường[Chủ Nhật, ngày 16 tháng 5 năm 2021 lúc 07:24:54.456352] [core:notice] [pid 15:tid 140204464299072] AH00094: Dòng lệnh: '/usr/sbin/apache2 -D FOREGROUND'[Chủ Nhật, ngày 16 tháng 5 năm 2021 lúc 07:25:36.680515] [:error] [pid 16:tid 140204216108800] [client 172.17.0.1:45298] ModSecurity: Cảnh báo. Đã khớp "Toán tử `PmFromFile' với tham số `unix-shell.data' với biến `ARGS:doc' (Giá trị: `/bin/ls' ) [tệp "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf"] [dòng "496"] [id "932160"] [rev ""] [msg "Thực thi lệnh từ xa: Đã tìm thấy mã shell Unix"] [dữ liệu "Dữ liệu đã khớp: tìm thấy bin/ls trong ARGS:doc: /bin/ls"] [mức độ nghiêm trọng "2"] [phiên bản "OWASP_CRS/3.2.0"] [maturity "0"] [độ chính xác "0"] [thẻ "application-multi"] [thẻ "language-shell"] [thẻ "platform-unix"] [thẻ "attack-rce"] [thẻ "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"]

Kết luận​

Xin chúc mừng! Bạn đã cài đặt thành công ModSecurity bên trong vùng chứa Docker. Tôi hy vọng bây giờ bạn đã có đủ kiến thức để triển khai giải pháp này trong môi trường Docker. Hãy thoải mái hỏi tôi nếu bạn có bất kỳ câu hỏi nào.
 
Back
Bên trên