개발 블로그

[웹 보안] WAF(ModSecurity) 설치 및 적용 본문

Study/Web Security

[웹 보안] WAF(ModSecurity) 설치 및 적용

카메얀짱 2026. 5. 26. 18:38

🐢 안녕하세요, 카메입니다.
다름이 아니라, 원래 저번 포스트에서 여러 방어 기법을 적용한 후 과제를 마무리 하려고 하였는데요, 제가 만든 예시 이긴 하지만 취약점이라고 여겨졌던 부분이 코드의 일부를 살짝 수정하니까 공격을 차단할 수 있었다는 부분에서 큰 흥미를 느꼈습니다. 해서, 일반적으로 배울 수 있었고 쉽게 접할 수 있었던 앞선 방어 기법들 (Prepared Statement, 입력값 검증/필터링 등등)을 제외한 새로운 방어 기법도 다뤄보고 싶다는 생각을 하게 되었습니다.
 
결국, 그런 과정 속에서 저는 WAF (ModSecurity) 라는 방어 기법도 포함해 보기로 하였습니다.
 
실습 전에, WAF (ModSecurity) 가 무엇인지 먼저 알고 넘어가야 겠습니다.
 

WAF (Web Application Firewall) 이란?

웹 방화벽(Web Application Firewall, WAF)이란 일반적인 네트워크 방화벽(Firewall)과는 달리 웹 애플리케이션 보안에 특화되어 개발된 솔루션입니다.
웹 방화벽의 기본 역할은 SQL Injection, Cross-Site Scripting(XSS) 등과 같은 웹 공격을 탐지하고 차단하는 역할을 합니다. 웹 방화벽은 직접적인 웹 공격 대응과 정보 유출 방지 솔루션, 부정 로그인 방지 솔루션, 웹 사이트 위변조 방지 솔루션 등으로 활용이 가능합니다.
웹 방화벽의 주요 기능은 웹 방화벽은 HTTP의 Request/Response 메시지 내용을 분석, Positive 정책과 Negative 정책을 혼용하여 탐지 기능을 수행하게 됩니다.
트러스트 웨이브 사에서 만든 웹 어플리케이션 방화벽 (WAF)입니다. -- ModSecurity
 
출처 | https://dyoerr9030.tistory.com/entry/Modsecurity%EB%9E%80

 

[Modsecurity] Modsecurity란?

Modsecurity에 대해 공부하기 전에 먼저 웹 방화벽에 대해서 알아야 한다. 웹 방화벽 웹 방화벽(Web Application Firewall, WAF)이란, 일반적인 네트워크 방화벽(Firewall)과는 달리 웹 애플리케이션 보안에 특

dyoerr9030.tistory.com

 
 
어느 정도 WAF와 ModSecurity 가 뭘 의미하는지는 알았으니, 해당 방화벽을 설치하여 방어 기법을 실행해봅시다.


Step 1: ModSecurity 설치

sudo apt install libapache2-mod-security2 -y

 
설치 후에 모듈을 활성화하고 Apache를 재시작합니다.

sudo a2enmod security2
sudo systemctl restart apache2

 
Step 2: ModSecurity 기본 설정 활성화
기본 설정 파일을 복사해서 활성화 합니다.

sudo cp /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf

 
설정 파일을 열어서 탐지 모드를 차단 모드로 변경합니다.

sudo nano /etc/modsecurity/modsecurity.conf

 
Ctrl + W로 SecRuleEngine을 검색해서 SecRuleEngine DetectionOnly 를 SecRuleEngine On 로 변경합니다.

SecRuleEngine DetectionOnly -> SecRuleEngine On

 
DetectionOnly는 탐지만 하고 차단은 안 하는 모드이고 On으로 바꿔야 실제로 공격을 차단합니다.
 
Step 3: SQL Injection 탐지 룰 추가
ModSecurity에 SQL Injection을 탐지하는 커스텀 룰을 추가합니다.

sudo nano /etc/modsecurity/custom_rules.conf
# SQL Injection 탐지 룰
SecRule ARGS|ARGS_NAMES|REQUEST_URI "@rx (?i)(union.*select|or\s+1\s*=\s*1|and\s+1\s*=\s*1|and\s+1\s*=\s*2|order\s+by\s+\d|substring|ascii|information_schema|drop\s+table|insert\s+into|delete\s+from)" \
    "id:1001,\
    phase:2,\
    deny,\
    status:403,\
    msg:'SQL Injection 공격 탐지',\
    log,\
    severity:CRITICAL"

 
Step 4: 룰 파일을 Apache에 연결
Apache의 ModSecurity 설정에 커스텀 룰 파일을 포함시켜야 합니다.

sudo nano /etc/apache2/mods-enabled/security2.conf

 
파일 안에서 </IfModule> 바로 위에 이 줄을 추가합니다.

IncludeOptional /etc/modsecurity/custom_rules.conf

 
추가하려고 했으나, 이미 해당 파일에 포함되어 있던 IncludeOptional /etc/modsecurity/*.conf 에서 모두 포괄할 수 있기 때문에 저는 따로 추가하지는 않았습니다.
 
그 후에 Apache를 재시작합니다.

sudo systemctl restart apache2

 
Step 5: WAF 동작 테스트
이제 원래 취약한 페이지에서 공격을 시도해 봅시다. 방어 코드가 없는 원본 페이지 임에도 WAF가 차단하는 것을 확인합니다.
 
테스트 1: http://localhost/login.php

  • 아이디: ' OR 1=1 -- / 비밀번호: aaa

 
-> 403 Forbidden 이 떴으므로 WAF가 차단한 것입니다.
 
테스트 2: http://localhost/search.php

  • 검색어: ' UNION SELECT 1,username,password,4 FROM users --

 
-> 403 Forbidden 이 떴으므로 WAF가 차단한 것입니다.
 
테스트 3: http://localhost/blind.php

  • ID: 1 AND 1=1

 
-> 403 Forbidden 이 떴으므로 WAF가 차단한 것입니다.


🐢 마무리
앞선 포스팅에서는 PHP 코들 직접 수정하여 방어 기법을 적용하였습니다. 하지만 실제 운영 환경에서는 이미 작성된 코드를 전부 수정하기 어려운 경우가 있을 수도 있습니다. 이러한 상황에 대비하여 코드 수정 없이도 웹 서버 단에서 공격을 차단할 수 있는 방법이 바로 WAF(Web Application Firewall) 입니다.
이번 포스팅에서는 Apache 웹 서버의 오픈소스 WAF 모듈인 ModSecurity를 설치하여 적용하였습니다. ModSecurity 설치 후 SecRuleEngine을 On으로 설정하여 차단 모드를 활성화하고 SQL Injection 패턴을 탐지하는 커스텀 룰을 작성하여 적용하였습니다. 해당 룰은 UNION SELECT, OR 1=1, SUBSTRING, ASCII 등 SQL Injection에서 주로 사용되는 키워드와 패턴을 정규표현식으로 탐지하며 해당 패턴이 감지되면 403 Forbidden 응답을 반환하여 요청을 차단하도록 설정하였습니다.
다만, WAF는 패턴 기반 탐지 방식이므로 룰에 정의되지 않은 새로운 우회 패턴에는 취약할 수 있다는 한계가 있습니다. 따라서 WAF 만으로는 모든 공격을 완벽하게 차단하기는 어려우며 앞서 사용했던 방어 기법이었던 Prepared Statement 와 같은 근본적인 코드 수준의 방어와 함께 사용하는 것이 가장 효과적인 보안 전략이라고 할 수 있겠습니다.