본문 바로가기

IT 실무

[웹방화벽] 리눅스 서버에 ModSecurity 간단히 설치하고 테스트하기 (feat. AWS EC2)

반응형

얼마 전 개인 프로젝트의 트래픽을 분석하다 보니 트래픽의 상당량이 SQL 인젝션 등의 단순 공격 트래픽인 것으로 확인되었다. 내가 운영하는 서비스가 Java 기반인지 PHP 기반인지 확인도 안하고 그냥 무작위로 날리는 공격이다. phpmyadmin을 조회하기도 하고 tomcat 설정 파일을 읽기도 한다. 자동 공격 툴을 돌리는 것으로 추정된다. 당연히 먹히는 공격은 하나도 없다.

 

다만 이런 공격들 사이에서 실제 게시판에 글이 써지거나 서비스 호출이 되어 버려서 사이트에 불필요한 트래픽을 발생시키거나 사이트가 지저분해지는 경우가 있다. 이를 위해 침입탐지/차단 시스템, 즉 방화벽이나 IDS/IPS, WAF 등을 설치하는 것이 좋겠지만 엔터프라이즈 서비스도 아니고 이런 개인 취미용 서비스에 적용하기엔 비용적인 부담이 크다.

 

이럴 때 간단히 사용 가능한 것이 공개용 WAF이다. 대표적으로 modsecurity, castle, webknight 등이 있다. 리눅스 시스템의 경우 modsecurity가 가장 흔하게 사용된다. OWASP에서 공식적으로 룰을 관리해주는 공신력 있는 도구이고, 무척 가볍고 효과적이다. 설치 또한 아주 간단하므로 아래 내용을 순서대로 따라하기만 하면 쉽게 설치할 수 있다.

 

참고로 사용하는 서버 환경이나 사용하고자 하는 버전, 사용 방식에 따라서 설치법이나 설정 법이 꽤나 달라질 수 있다. 여기선 요즘 가장 많이 사용할 것으로 추정되는 아마존의 EC2 서버 CentOS, Apache 환경을 기준으로 가장 간단한 설정법을 알아보겠다.

Yum을 통한 모드시큐리티 설치

git에서 최신 소스코드를 다운받아서 빌드를 해주는 방식도 있으나, 설치의 편의성도 그렇고 향후 업데이트 등의 관리를 위해서도 나는 가급적 yum을 사용한다. 가장 stable한 버전으로 설치된다고 어느정도 보장되는 부분도 있다.

EC2의 기존 레파지토리에선 modsecurity가 없으므로 아래와 같이 epel을 활성화시키면서 설치를 해줘야 한다.

 

sudo yum install mod_security –enablerepo=epel

 

설치가 완료되고 나면 아래와 같은 주요한 디렉터리, 설정파일들이 생긴다.

  • /etc/httpd/conf.d/mod_security.conf
    • 아파치에서 사용되는 modsecurity의 가장 메인 설정파일이다.
  • /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf 
    • 룰셋에 대한 설정파일이다. CRS란 Core Rule Set을 의미한다.
  • /var/log/httpd/modsec_debug.log 
    • 디버깅용 에러 메시지를 확인할 수 있다. 첫 적용 이후 잘 동작하는지 확인하는데 쓰인다. 물론 운영 중에도 이슈가 생기면 자주 확인하게 된다.
  • /var/log/httpd/modsec_audit.log 
    • 모드시큐리티가 호출되는 로그를 모니터링할 수 있다.

 

모드시큐리티를 설치하고 나면 자동으로 활성화 상태로 기본 설정파일이 만들어진다. 아래 설정파일에서 SecRuleEngine on 이라는 문구를 확인할 수 있다. 단순 설치만 해두고 일단 꺼두고 싶다면 이를 off로 해둬야 한다. 

 

more /etc/httpd/conf.d/mod_security.conf

 

물론 새로운 모듈이 설치된 것이므로 아파치를 재기동 해야 실제 동작이 시작된다. 그 전에, 설치된 직후에는 동작만 되지 실제 룰셋이 하나도 적용되어 있지 않으므로 룰셋을 추가해주고 재기동을 해야 한다. 아래 내용을 이어서 확인하자

 

모드시큐리티 OWASP 룰셋 다운받아 설정하기

OWASP(Open Web Application Security Project)라는 공신력 있는 기관에서 룰셋을 관리하고 있다. 룰셋은 이 기관 말고도 다른 곳에서도 얼마든지 만들어서 배포하고 내가 커스트마이징할 수도 있지만, 우리는 일단 이 공신력 있는 기관의 룰셋을 다운받아 그대로 적용할 것이다.

 

룰셋은 github에서 관리되므로 그대로 다운받으면 된다. 아래와 같이 wget을 하면 master 이라는 이름의 압축 파일이 다운로드 될 것이다. 압축을 풀어주자.

 

cd ~
sudo wget https://github.com/coreruleset/coreruleset/zipball/master
sudo unzip -q master

 

압출이 풀리면 coreruleset으로 시작하는 디렉터리가 생긴다. 룰셋이 담겨 있는 파일들이다. 이를 httpd 하위 폴더로 옮겨줄 것이다. 파일이 많으므로 httpd 하위에 modsecurity-crs라는 폴더를 만들어서 이곳으로 옮겨준다. 이 경로는 바뀌어도 되지만 그럼 이 튜토리얼 아래에 있는 설정 경로들도 맞추어서 수정해줘야 한다.

 

cd /etc/httpd
sudo mv ~/coreruleset-coreruleset-* modsecurity-crs

 

이렇게 하면 modsecurity-crs라는 룰셋 폴더가 만들어지고, 안에 들어가보면 설정파일들을 비롯만 많은 룰들이 존재하는 것을 확인할 수 있다. 여기 crs-setup.conf.example 가 있는데, 이는 설정 파일의 예시이다. 실제 아파치에서 설정 파일을 읽으려면 conf.example이 아닌 .conf파일이 필요하다. 아래와 같이 만들어줄 수 있다.

 

cd modsecurity-crs
sudo cp crs-setup.conf.example crs-setup.conf

 

 

이렇게 설정파일까지 만들었으면, 이제 mod_security.conf 파일을 찾아가서 우리가 설치해준 룰셋과 설정파일들의 경로를 알려줄 차례이다. 설정 파일을 열어보자.

 

 cd /etc/httpd/conf.d
 sudo vi mod_security.conf

 

설정 파일 상단 즈음에 # ModSecurity Core Rules Set configuration 이라는 섹션이 있다. 그 부분을 아래와 같이 대체해준다. 이미 내용이 있다면 그 아래에 추가해도 된다.

 

IncludeOptional modsecurity-crs/crs-setup.conf
IncludeOptional modsecurity-crs/rules/*.conf

 

우리가 위에서 만들었던 디렉터리이다. crs-setup.conf 는 우리가 .example을 복사해서 만들었던 것이고, rules 아래의 설정 파일들은 우리가 만든적은 없지만 이미 존재하고 있는 파일들이다. 만약 crs 폴더 하위에 rules라는 이름의 디렉터리가 없다면 저대로 넣으면 안된다. 버전에 따라서 local_rules이나 base_rules 등으로 나누어져있을 수도 있다. 이 경우 그 디렉터리 이름으로 맞추어 넣자.

 

정상 동작 테스트

자 이렇게 하면 내가 현재 사용하는 버전에서는 모든 준비가 완료된 것이다. 

 

이제 httpd를 리스타트 시켜주면 modsecurity가 적용이 된 웹서비스가 실행이 될 것이다. 우리 웹방화벽이 잘 돌고 있는지 간단히 테스트를 해보자.

 

아래와 같이 우리의 웹사이트 도메인(혹은 IP)에 ? 이하의 간단한 공격 코드를 보내봐 주면 차단이 잘 이루어지는지 확인이 가능하다. 차단이 잘 이루어진다면 403 에러가 나야한다.

 

http://웹사이트도메인.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1

 

반응형