본문으로 건너뛰기

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

도입 순서:

  1. DetectionOnly로 시작 → 로그 분석 → 오탐 확인
  2. 오탐 규칙 제외 설정
  3. 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