본문 바로가기

오픈소스 활용기 - ModSecurity



개발자 용식이는 오늘 취약점 점검툴을 이용해서 배포하려는 사이트를 분석해봤습니다.
결과를 보니, 해결해야 하는 취약점의 숫자가 좀 많습니다. ㅡ.ㅡ, SW 개발자에게 웹어플리케이션의 보안 영역은 항상 머리가 아픈 부분이죠.  기능개발도 힘든데, 보안까지 처리하라니 산넘어 산입니다. 좋은 방법이 없을까요?


이 글에서 소개하는 ModSecurity를 적용하시면 서버측에서 접근하는 패킷에 대한 룰셋을 사용하여, 룰셋에 발견되는 경우는 자동으로 차단해 주기 때문에, SW개발자는 마음놓고 개발에 집중할 수 있습니다.

ModSecurity는  웹서버 apache의 모듈로 작동하는 공개SW 웹어플리케이션 방화벽입니다.
ModSecurity의 설치법에 대해서는 KISA 홈페이지 를 방문해보시면. 한글로 된 가이드가 있으므로 따라하실 수 있습니다. (소스코드 설치를 원하시면 위 링크된 가이드에서 컴파일에 대한 과정을 설명한 내용을 참고하시기 바랍니다.)

저는 최근에는 부득이한 경우가 아니라면, 소스컴파일을 하지 않고, 설치한 패키지에 대한 운영상의 편리함을 생각해서 가능하면 apt, yum, rpm 등의 자동회된 설치방식을 사용합니다.

소스컴파일이 아니라 yum을 이용하여 ModSecurity를 설치하시려면 다음과 같이 진행하시면 됩니다. (원문 url : http://portugalcode.com/index.php?topic=2850.0;wap2)

1) mod_security 설치
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
위 명령으로 epel repository가 잘 설치되었다면

yum install mod_security
를 실행합니다.

두어번 의존패키지 설치를 묻는데 y를 눌러주면 설치는  끝납니다.(너무쉽죠?)


2) 방화벽에서 사용할 룰셋의 생성
설치를 마쳣으면 아파치 환경설정 디렉토리안의 mod_security.conf 파일을 확인합니다..

ModSecurity 방화벽에서 적용할 룰셋은 자신이 직접 만들어서 사용가능 하지만, 언제 룰셋을 배우고 익혀서 사용합니까?.  그냥 KISA에서 배포하는 룰셋을 다운로드 받아서 사용하도록 하겠습니다.
룰셋 다운로드 : http://toolbox.krcert.or.kr/ > ModSecurity 자료실 > 차단샘플 룰 을 찾아서 다운로드.

다운받은 룰셋을 yum 설치시 생성된 디렉토리에 복사합니다.
아래의 modsecurity_kisa.conf 파일이 다운로드 받은 룰셋입니다.
룰셋의 설정에 대한 자세한설명은 KISA홈페이지를 이용하거나 파일내의 주석을 참고하세요


참고) 저의 경우 RPM 패키지에서 제공되는 설정을 그대로 사용해서 kisa에서 배포하는 설정을 복사한 후 , 바로 룰셋을 적용하니 웹사이트가 열리지 않았습니다. 로그를 보면서 확인해본 결과
/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_50_outbound.conf 파일의 설정이 문제를 일으켰고. 이 파일을 제거하고 서비스에 적용했을때 이상없는 서비스가 가능했습니다.


3) 설치 후 적용 확인
설치 및 룰셋의 설정이 완료되었으면 제대로 동작하는지 확인합니다.
modsecurity 로그파일에 아래와 같은 로그가 남는경우
ModSecurity: Failed to access DBM file "E:/tmp/resource": The system cannot find the path specified

로그를 확인하니 오류메세지가 보여서 구글링한 결과
기본설치시 제공되는 modsecurity_crs_10.config.conf 의 설정에 아래의 내용을 추가해야 한다는것을 알았습니다.
웹서버가 접근가능한 경로를 하나 생성해서 아래와 같은 내용을 추가해주어야 한다.
vi /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf

SecUploadDir /var/www/tmp
SecDataDir /var/www/tmp
SecTmpDir /var/www/tmp

웹서버를 재시작하면 이제 방화벽이 작동하게 됩니다.

룰셋이 작동하는 상태를 확인하려면 환경설정파일에서 지정한 로그파일을 확인하면 됩니다.
다운받은 룰셋을 아무수정없이 사용하는경우라면 로그파일은 아파치설치디렉토리/logs/modsec_audit.log 에 남게 되고,
파일의 내용을 확인하면 아래처럼 룰셋이 작동되고 있는 상태가 보여집니다.

지금까지는 룰셋이 작동되기는 하지만, 차단시키지 않고 있는 상태입니다.
정상적인 작동여부를 확인하고, 자신이 원하는 형태로 룰셋이 적용되는것을 확인한 후, 반드시 환경설정파일에서 pass 부분을 deny 로 변경해야 차단이 시작됩니다.

방화벽을 적용했더니 작동안되는 부분이 있다면 항의가 많겠죠? 실 서버에 적용시에는 당연히 방화벽으로 인한 서비스의 중단이 없도록 정상적인 서비스를 방해하는 룰셋이 있다면 반드시 확인하고 사용해야 합니다.

변경 전
SecDefaultAction "pass,log,auditlog,phase:2,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase"

변경 후
SecDefaultAction "deny,log,phase:2,status:406,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase"

여기까지 하면 방화벽의 설치는 끝났습니다.

4) 기타
로그파일의 비대해지는 것을 방지하기 위해서 로그를 날짜별로 나누어서 보관하는것이 좋겠죠.
KISA에서 제공하는 FAQ를 보니 잘 설명되어있어서 그대로 적용했습니다. 아래 링크에서 상세내용을 확인할 수 있습니다
http://toolbox.krcert.or.kr > ModSecurity FAQ > 로그파일의 사이즈가 너무 큰데 이를 날짜나 시간별로 분할할 수 없나요?

KISA에서 제공하는 룰셋의 주요 점검 항목
  • PHP 인젝션 취약 공격 방지(공개 게시판 솔루션 대상 공격 포함)
  • 명령어 실행 방지
  • XSS 공격 방지
  • SSI 인젝션 관련 공격 차단
  • 악성 프로그램 봇, User-Agent
  • 검색엔진 Recon/Google 이용한 해킹 방지
  • PHPMyAdmin 관련 공격 취약점 적용
  • SQL Injection 공격 차단
  • WebShell 공격 방지
  • Tomcat 취약점 이용한 공격 방지



기타) 적용 후 추가한 내용
# dir|page 가 들어가 있으면서 https가 요청되는 경우가 fckeditor 에서 발생하기 때문에 수정
SecRule REQUEST_URI "(dir|page|)" chain
#SecRule REQUEST_URI "=(http|https|ftp):/"
SecRule REQUEST_URI "=(https|ftp):/"
SecRule REQUEST_URI "shell_exec(" "msg:'PHP Injection Attacks'"

공개SW 웹방화벽 mod_security를 이용해서  여러분의 어플리케이션을 보호해보시는 것이 어떨까요?