Last Updated on 4월 14, 2023 by Jade(정현호)
안녕하세요
이번 포스팅에서는 Nginx 사용 환경에서 오픈소스 웹 방화벽(WAF) 중 하나인 ModSecurity 를 사용하는 내용을 확인 해보려고 합니다.
Contents
ModSecurity
ModSecurity 는 웹 서비스의 공격을 실시간/효과적으로 차단할 수 있는 오픈소스 방화벽 모듈(WAF Mod_Security) 입니다
지원하는 웹서버로 Apache , IIS, Nginx 등을 지원 하고 있습니다.
제작사는 trustwave 이며 Apache License Version 2.0 라이센스 입니다
• 설치 환경
OS : CentOS 7.8 , Ubuntu 18.04 , CentOS 8.3
nginx : 1.19.4
ModSecurity : v3.0.4
CoreRuleSet : v3.3.2
* 설치는 root 유저 로 진행 하였습니다.
ModSecurity 다운로드 및 설치
사전 필요한 패키지 설치
컴파일 등을 위한 사전에 필요한 패키지 설치를 진행하도록 하겠습니다. 설치하는 모든 패키지가 ModSecurity 에만 필요한 것은 아니고 다른 포스팅 글과 연계되어 Nginx 이나 PHP 나 Apache 나 다른 라이브러리 컴파일 등에 필요한 여러 패키지에 대해서 함께 나열된 것이며 그외 유틸리티 도 같이 포함되어 있습니다.
• CentOS 7
[root]# yum -y install epel-release yum-utils [root]# yum install -y pcre pcre-devel \ libxml2 libxml2-devel curl curl-devel \ openssl openssl-devel pcre-devel gcc \ GeoIP GeoIP-data geoipupdate \ yajl-devel ssdeep-devel rsync \ lua-devel git lmdb-devel lmdb \ libtool automake
• CentOS 8(RHEL8/Oracle Linux 8)
[root]# dnf -y install dnf-plugins-core [root]# dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -- 아래는 사용중인 OS에 따라서 선택해서 설치를 진행 -- CentOS 8 Repoid (8.2.2004 and before) [root]# dnf config-manager --set-enabled PowerTools -- CentOS 8 Repoid (8.3.2011 and later) [root]# dnf config-manager --set-enabled powertools -- Oracle Linux 8 [root]# dnf config-manager --set-enabled ol8_codeready_builder -- RHEL 8 [root]# subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms [root]# dnf -y install ncurses ncurses-devel \ ncurses-libs openssl openssl-devel glibc \ bison make cmake readline gcc gcc-c++ wget \ autoconf automake libtool* libmcrypt* git \ patchelf libtirpc* numactl numactl-devel \ ncurses-compat-libs libaio libaio-devel \ telnet glances htop nano vi vim coreutils \ pcre pcre-devel curl curl-devel mailx postfix \ GeoIP GeoIP-data GeoIP-devel geoipupdate rsync \ lmdb lmdb-libs lmdb-devel bash-completion yajl-devel yajl \ ssdeep-devel ssdeep ssdeep-libs doxygen \ compat-lua-devel lua compat-lua
• Ubuntu
[root]# apt-get install bison build-essential \ ca-certificates curl dh-autoreconf doxygen \ flex gawk git iputils-ping libcurl4-gnutls-dev \ libexpat1-dev libgeoip-dev liblmdb-dev \ libpcre3-dev libpcre++-dev ssdeep wget \ libssl-dev libtool libxml2 libxml2-dev \ libyajl-dev lua5.3-dev zlibc \ zlib1g-dev geoip-database-extra \ libfuzzy2 libfuzzy-dev pkg-config
Source Code 다운로드
[root]# mkdir -p /root/pkg
[root]# cd /root/pkg
* 경로는 임의의 경로 입니다
[root]# git clone https://github.com/SpiderLabs/ModSecurity.git
설치(Config&Build)
[root]# cd ModSecurity
[root]# git submodule init
[root]# git submodule update
[root]# ./build.sh
[root]# ./configure --with-lmdb --with-ssdeep
[root]# make;make install
ModSecurity Dynamic 모듈 생성
Dynamic-module 생성을 위해 Nginx의 Source 와 Nginx Connector 를 다운 로드 받습니다
Nginx Source는 현재 사용중인 버전을 받으시면 됩니다 현재 포스팅 시스템에서 사용중인 버전은 1.19.4 입니다
현재 설치 되는 환경은 yum(rpm) / apt 으로 패키지 Nginx 가 설치된 상태 입니다
(TLS 1.3 적용을 위해 SRPM 으로 설치 하였습니다)
관련 된 내용은 아래 포스팅을 참조하시면 됩니다.
Connector 다운로드
[root]# cd /root/pkg
[root]# git clone https://github.com/SpiderLabs/ModSecurity-nginx.git
Nginx Source Code 다운로드
* Nginx 소스코드 다운은 지금 사용하는 소스코드의 버전에 맞게 다운받아서 사용하면 됩니다.
[root]# wget http://nginx.org/download/nginx-1.19.4.tar.gz
[root]# tar zxvf nginx-1.19.4.tar.gz
[root]# cd nginx-1.19.4
Module 생성
[root]# ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx
[root]# make modules
생성된 모듈을 Nginx 로 복사
[root]# cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules
Nginx 설정 변경
Nginx.conf 파일에 ModSecurity 관련 설정을 추가 합니다.
[참고] modsecurity_rules_file 와 modsecurity on 설정은 server block 별로도 가능합니다
nginx.conf 에 설정하는 이유는 모든 Server Block에 공통적으로 적용 받을 수 있기 때문에 Server Block 별 반복적인 내용 설정 하기 보다 nginx.conf 에 1회 설정을 하였습니다.
nginx.conf 수정
[root]# vi /etc/nginx/nginx.conf
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
load_module "modules/ngx_http_modsecurity_module.so"; <-- 추가
events {
<중략..>
#gzip on;
include /etc/nginx/conf.d/*.conf;
modsecurity_rules_file /etc/nginx/modsecurity.conf; <-- 추가
modsecurity on; <-- 추가
}
[주의] modsecurity.conf 파일을 Include 문으로 설정하면 아래처럼 에러가 발생합니다
modsecurity_rules_file 를 사용해야 합니다.
nginx: [emerg] unexpected end of file, expecting ";" or "}" in crs-setup.conf:
CoreRuleSet 설정
CoreRuleset 다운로드 및 Conf 파일 일부 수정, Nginx 에 설정 등에 대해서 확인 해 보도록 하겠습니다.
CoreRuleset 파일 다운로드
CoreRuleset 에 대한 최신 버전 정보는 아래 github 에서 내용을 확인 해보시면 됩니다.
Ruleset 파일을 다운로드 받도록 하겠습니다.
[root]# cd /etc/nginx [root]# wget https://github.com/coreruleset/coreruleset/archive/refs/tags/v3.3.2.zip [root]# unzip v3.3.2.zip
crs-setup.conf 내용 수정
[root]# cd coreruleset-3.3.2 [root]# cp crs-setup.conf.example crs-setup.conf [root]# vi crs-setup.conf
중간에 아래의 SecDefaultAction 를 주석 처리 하고(96~97라인)
#SecDefaultAction "phase:1,log,auditlog,pass"
#SecDefaultAction "phase:2,log,auditlog,pass
더 아래에 403 정책이 추가된 SecDefaultAction 을 주석을 해제 합니다.
# 116~117 라인
SecDefaultAction "phase:1,log,auditlog,deny,status:403"
SecDefaultAction "phase:2,log,auditlog,deny,status:403"
모두 완료 되었다면 저장 및 종료 합니다.
:wq!
[참고사항] 룰셋 적용관련 Nginx의 Process 에러 발생
[notice] signal 17 (SIGCHLD) received from 20515
[alert] worker process 20515 exited on signal 11
설치 과정에서 위와 같이 Nginx 프로세스의 에러가 발생 되었으며 테스트 결과 아래 2개의 룰셋의 영향을 받은 것으로 확인 하였습니다.
REQUEST-949-BLOCKING-EVALUATION.conf
REQUEST-910-IP-REPUTATION.conf
다만 설치하는 버전이나 환경에 따라서 문제가 없을 수도 있습니다.
ModSecurity 및 룰셋 설정을 모두 완료 후에 이와 같이 문제가 발생한다면 제외하는것을 고려해보시면 될것 같습니다.
포스팅 환경에도 환경에 따라서 에러가 발생된 경우도 있었으며 에러가 발생되지 않은 경우도 있었습니다.
진행 후 문제가 있다면 룰을 제외하는 편을 고려해보시고 처음에는 룰 제외 없이 시작해서 정상 유무를 확인해보시면 됩니다.
[root]# cd /etc/nginx/coreruleset-3.3.2/rules
[root]# mv REQUEST-949-BLOCKING-EVALUATION.conf REQUEST-949-BLOCKING-EVALUATION.conf.ori
[root]# mv REQUEST-910-IP-REPUTATION.conf REQUEST-910-IP-REPUTATION.conf.ori
unicode.mapping 파일 복사
unicode.mapping 파일은 처음에 다운로드 받은 ModSecurity 디렉토리에 있습니다.
[root]# cd /root/pkg/ModSecurity/
[root]# cp unicode.mapping /etc/nginx/coreruleset-3.3.2
modsecurity.conf 파일 생성
[root]# cd /etc/nginx
[root]# vi modsecurity.conf
파일을 생성 하면서 내용을 입력 하겠습니다.
아래 내용 입력합니다.
Include coreruleset-3.3.2/crs-setup.conf
Include coreruleset-3.3.2/rules/*.conf
SecRuleEngine On
SecAuditEngine On
SecAuditLog /var/log/nginx/modsec_audit.log
SecAuditLogRelevantStatus "^(?:5|4(?!04))"
SecUnicodeMapFile coreruleset-3.3.2/unicode.mapping 20127
SecAuditLogType Serial
SecAuditLogParts ABCFHZ
SecDataDir /tmp
SecStatusEngine On
Nginx 재시작 및 룰셋 적용 확인
Nginx 재시작
[root]# systemctl restart nginx
룰셋 적용 테스트
ModSecurity 룰셋 적용 테스트를 진행하도록 하겠습니다. 웹 브라우저에서 아래와 같이 입력 합니다.
http://IP주소/?a=<script>Test</script>
audit.log 에러는 아래와 같이 룰셋에 의해서 403 에러가 발생되었음이 확인 됩니다
[root]# tail -100f /var/log/nginx/modsec_audit.log
ModSecurity: Access denied with code 403 (phase 2).
detected XSS using libinjection.
[file "coreruleset-3.3.0/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"]
[line "37"] [id "941100"] [rev ""]
[msg "XSS Attack Detected via libinjection"]
[data "Matched Data: XSS data found within ARGS:a: <script>Test</script>"]
[severity "2"] [ver "OWASP_CRS/3.3.0"] [maturity "0"]
[accuracy "0"] [tag "application-multi"] [tag "language-multi"]
[tag "platform-multi"] [tag "attack-xss"] [tag "paranoia-level/1"]
[tag "OWASP_CRS"] [tag "capec/1000/152/242"] [hostname "192.168.0.62"]
[uri "/"]
[unique_id "1607522803"]
Conclusion
ModSecurity 는 오픈소스 웹 방화벽(WAF) 으로 많은 곳에서 사용되면서 계속적인 버전 업데이트가 이루어 지고 있습니다.
OWASP(The Open Web Application Security Project) 기반으로 룰셋도 계속적인 업데이트가 이루어지는 만큼 웹 서버에 꼭 설치를 해야하는 보안 솔루션 입니다.
Coreruleset 은 계속 업데이트 되고 있습니다. 아래 링크에서 정보를 확인 후 업데이트가 되면 업데이트 해주시면 됩니다.
• https://coreruleset.org/installation
• https://github.com/coreruleset/coreruleset
Reference
Reference Link
• SpiderLabs/ModSecurity-nginx
• Nginx wiki/extending/converting
• centminmod.com/nginx-failes-to-start-with-mod-security
• docs.nginx/nginx-plus-modsecurity-waf-trustwave-spiderlabs-rules
연관 된 다른글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io