ModSecurity WAF: OWASP CRS 적용 가이드
ModSecurity는 오픈소스 웹 애플리케이션 방화벽(WAF)으로, HTTP 요청/응답을 검사해 SQL Injection, XSS, 파일 업로드 공격 등 OWASP Top 10 취약점을 차단합니다.
ModSecurity 설치
Nginx용 ModSecurity
# Ubuntu 22.04+
sudo apt install libmodsecurity3 libmodsecurity-dev
# Nginx 모듈 (동적 모듈)
sudo apt install libnginx-mod-security2
# 또는 소스 컴파일:
# git clone --depth 1 -b v3/master https://github.com/SpiderLabs/ModSecurity
# ./build.sh && ./configure && make && sudo make install
# 모듈 활성화 확인
nginx -V 2>&1 | grep ModSecurity
Apache용 ModSecurity
# Ubuntu
sudo apt install libapache2-mod-security2
sudo a2enmod security2
sudo systemctl restart apache2
# 설치 확인
apache2ctl -M | grep security2
# security2_module (shared)
OWASP Core Rule Set (CRS) 설치
# CRS 다운로드 (최신 버전)
cd /etc/nginx # 또는 /etc/modsecurity
sudo git clone --depth 1 https://github.com/coreruleset/coreruleset.git /etc/modsecurity/crs
# 기본 설정 파일 복사
sudo cp /etc/modsecurity/crs/crs-setup.conf.example \
/etc/modsecurity/crs/crs-setup.conf
sudo cp /usr/share/modsecurity-crs/modsecurity.conf-recommended \
/etc/modsecurity/modsecurity.conf
ModSecurity Nginx 설정
# /etc/nginx/nginx.conf — http 블록
http {
# ModSecurity 활성화
modsecurity on;
# 설정 파일 경로
modsecurity_rules_file /etc/nginx/modsecurity/main.conf;
}
# /etc/nginx/modsecurity/main.conf
# 기본 ModSecurity 설정 포함
Include /etc/modsecurity/modsecurity.conf
# OWASP CRS 설정 포함
Include /etc/modsecurity/crs/crs-setup.conf
# CRS 규칙 파일 포함
Include /etc/modsecurity/crs/rules/*.conf
탐지 모드 vs 방어 모드
# /etc/modsecurity/modsecurity.conf
# 탐지 모드 (Detection Only): 공격 탐지만, 차단 안 함
SecRuleEngine DetectionOnly
# 방어 모드 (Prevention): 공격 탐지 + 차단
SecRuleEngine On
# 비활성화
SecRuleEngine Off
도입 순서:
DetectionOnly로 시작 → 로그 분석 → 오탐 확인- 오탐 규칙 제외 설정
On으로 전환
오탐(False Positive) 처리
정상 요청이 차단될 때 특정 규칙을 제외합니다.
# /etc/modsecurity/custom-exclusions.conf
# 특정 규칙 ID 비활성화
SecRuleRemoveById 942100 # SQL Injection 탐지 규칙 (오탐 시)
SecRuleRemoveById 941100 # XSS 탐지 규칙
# 특정 URI에서 규칙 제외
SecRule REQUEST_URI "@beginsWith /api/editor/" \
"id:1001,phase:1,pass,nolog,\
ctl:ruleRemoveById=941100"
# 특정 파라미터에서 규칙 제외 (body 내 HTML 파라미터)
SecRuleUpdateTargetById 941100 "!ARGS:content"
# IP 화이트리스트 (내부 개발 서버)
SecRule REMOTE_ADDR "@ipMatch 10.0.0.0/8" \
"id:1000,phase:1,allow,nolog,ctl:ruleEngine=Off"
ModSecurity 로그 분석
# 감사 로그 위치 (기본)
cat /var/log/modsec_audit.log
# 차단된 요청 확인
grep "Access denied" /var/log/modsec_audit.log | head -20
# 발동된 규칙 ID 빈도 분석
grep "id \"" /var/log/modsec_audit.log | \
grep -o 'id "[0-9]*"' | sort | uniq -c | sort -rn | head -20
# Nginx error 로그에서도 확인
grep "ModSecurity" /var/log/nginx/error.log | tail -20
CRS 파라노이아 레벨
OWASP CRS는 4단계 파라노이아 레벨을 제공합니다.
# /etc/modsecurity/crs/crs-setup.conf
# Paranoia Level 설정
# 1: 기본 (오탐 적음, 권장 시작점)
# 2: 더 많은 규칙 (일부 오탐 가능)
# 3: 엄격 (운영환경 주의)
# 4: 최고 (매우 많은 오탐, 특수 환경용)
SecAction \
"id:900000,\
phase:1,\
nolog,\
pass,\
t:none,\
setvar:tx.paranoia_level=1"
Apache ModSecurity 설정
# /etc/apache2/mods-available/security2.conf
<IfModule security2_module>
# 설정 파일 포함
IncludeOptional /etc/modsecurity/*.conf
# OWASP CRS
IncludeOptional /etc/modsecurity/crs/crs-setup.conf
IncludeOptional /etc/modsecurity/crs/rules/*.conf
</IfModule>
# 특정 가상 호스트에서 ModSecurity 비활성화
<VirtualHost *:443>
ServerName internal.example.com
# 이 VirtualHost에서만 ModSecurity 비활성화
SecRuleEngine Off
</VirtualHost>
ModSecurity 성능 튜닝
# /etc/modsecurity/modsecurity.conf
# 감사 로그 최소화 (성능 향상)
SecAuditEngine RelevantOnly # 차단된 요청만 기록
SecAuditLogParts ABIJDEFHZ # 필요한 파트만
# 요청 바디 검사 크기 제한
SecRequestBodyLimit 13107200 # 12.5 MB
SecRequestBodyNoFilesLimit 131072 # 128 KB (파일 제외 바디)
# 응답 바디 검사 (성능 비용 큼, 필요할 때만)
SecResponseBodyAccess Off # 기본 비활성화
# 규칙 엔진 병렬화
SecPcreMatchLimit 500000
SecPcreMatchLimitRecursion 500000