ModSecurity 활성화 및 룰 설정

ModSecurity 활성화와 룰 설정 방법

MosdSecurity 포스트 시리즈는 아래와 같이 구성되어 있으며 2개의 포스트로 구성되어 있습니다.

 

목차

- ModSecurity란, 특징(1)

- ModSecurity 다운로드 및 설치 방법(1)

- ModSecurity 활성화 및 Rule 설정(2)
  * 활성화방법
  * 기본환경 설정
  * 사용자 Rule설정
  * 기타

- 동작확인(2)

 

모드시큐리티 웹방화벽 기능을 적용하려면 httpd.conf 파일 내에서 설정을 해줘야 합니다.

KISA 문서의 설명에 따르면 2.x버전의 대부분의 지시자는 Virtual Host, Location, Location Match, Directory 등의 Apache 지시자 내에서도 사용할 수 있습니다. 

 

httpd.conf에서 설정을 추가하면 복잡해지니까 따로 mod_securiy.conf를 만들어서 httpd.conf에 인클루드 시키는 것이 더 좋습니다. 

 

룰을 추가한다는 것은 PC에 보안 프로그램을 설치하면 종종 이 프로그램들이 새로운 침입자 정보를 업데이트하는 것과 같습니다. ModSecurity는 공식 홈페이지에서 Core-Rule을 배포하고 있습니다. 이 밖에 다른 곳에서 룰을 받아 추가할 수 있다고 하구요. KrCERT 홈페이지에서도 룰을 받아 추가할 수 있다고 하니 참고해주세요.

 

기본 환경설정

 

현재 운영중인 서버에 설치된 Mod_security 의 config 파일에 설정된 내용을 중심으로 설명을 드립니다.

 

SeRuleEngline On/Off/DetectionOnly

 SecRuleEngine On

 

ModSecurity 기능을 활성화(enable) 시킵니다.

o On : 활성화

o Off : 비활성화

o DetectionOnly : 활성화는 하지만 차단하지 않고 탐지만 합니다.

 

 

SecAuditEngine On/Off/RelevantOnly

SecAuditEngine RelevantOnly

감사 로깅에 대한 설정을 구성합니다.

o On : 모든 트랜젝션 로깅

o Off : 로깅하지 않음

o RelevantOnly : Error 또는, Warning 의 트랜젝션, 그리고 SecAuditLogRelevantStatus에 정의된

상태코드와 일치하는 트랜젝션만 로깅 (모든 트랜젝션 로깅 보다는 이 설정이 기본)

# Default recommended configuration
    SecRuleEngine On
    SecRequestBodyAccess On
    SecRule REQUEST_HEADERS:Content-Type "text/xml" \
         "id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"
    SecRequestBodyLimit 13107200
    SecRequestBodyNoFilesLimit 131072
    SecRequestBodyInMemoryLimit 131072
    SecRequestBodyLimitAction Reject
    SecRule REQBODY_ERROR "!@eq 0" \
    "id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2"
    SecRule MULTIPART_STRICT_ERROR "!@eq 0" \
    "id:'200002',phase:2,t:none,log,deny,status:44,msg:'Multipart request body \
    failed strict validation: \
    PE %{REQBODY_PROCESSOR_ERROR}, \
    BQ %{MULTIPART_BOUNDARY_QUOTED}, \
    BW %{MULTIPART_BOUNDARY_WHITESPACE}, \
    DB %{MULTIPART_DATA_BEFORE}, \
    DA %{MULTIPART_DATA_AFTER}, \
    HF %{MULTIPART_HEADER_FOLDING}, \
    LF %{MULTIPART_LF_LINE}, \
    SM %{MULTIPART_MISSING_SEMICOLON}, \
    IQ %{MULTIPART_INVALID_QUOTING}, \
    IP %{MULTIPART_INVALID_PART}, \
    IH %{MULTIPART_INVALID_HEADER_FOLDING}, \
    FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'"

 

기본적으로  

다양한 설정들이 기본적으로 정의되어 있고, 서버 상황에 따라 메모리크기를 늘리거나 줄일 수도 있습니다.

로그가 쌓이는 경로도 지정할 수 있구요. 워낙 지시자가 많아서 자세한 내용은 modsecurity 홈페이지나 kisa 홈페이지에서 modsecuriy 관련 문서를 보시는 것이 훨씬 도움이 될 것 같습니다.

 

 

트래픽 감사 예외 IP 설정하는 방법

SecRule REMOTE_ADDR "허용할 IP" allow,ctl:ruleEngine=off

SecRule REMOTE_ADDR "221\.149\.161\.5" allow,ctl:ruleEngine=off
SecRule REMOTE_ADDR "211\.252\.151\.24" allow,ctl:ruleEngine=off
SecRule REMOTE_ADDR "211\.252\.151\.44" allow,ctl:ruleEngine=off

외부에서 취약점 점검 또는 모의 해킹을 할 때 점검트래픽과 공격 트래픽이 유사하여 공격으로 간주하고 차단을 한다고 합니다. 따라서 진단작업을 할 경우엔 먼저 감사예외 IP를 설정하고 이를 차단하지 않도록 조치해주어야 합니다.

 

예를 들면  KISA 에 나와 있는 것을 참고하여

221.149.161.5, 211.252.151.24, 211.252.151.44 이렇게3개의 아이피를 예외 아이피로 설정하려면 위와 같이 입력을 합니다(2.x에 해당)

 

예외처리를 해도 로그는 기록됩니다. 

 


***

4월 6일 업데이트

KISA 방식으로 넣으니 오류가 나서 

 SecRule REMOTE_ADDR "@IPMatch 1.2.3.4,1.2.3.5" phase:1,log,allow,ctl:ruleEngine=Off,id:55666 이런 방식으로

아이피를 허용하도록 예외처리 하니 작동.

Kisa에서 알려준 방식으로하면 service httpd restart가 안됨.


 

 

어떻게 동작하는가

보안모듈이 동작한다는 것은 공격을 외부로부터의 공격을 차단할 수 있다는 것입니다. 이내용은 Kisa의 문서를 참조하여 정리하도록 하겠습니다.

 

이미지 출처 Kisa Modesecurity

Kisa에서는 위와 같은 PHP에서 동작하는 제로보드 페이지를 예로, PHP injection 취약점을 이용 서버를 공격하여 이 서버의 패스워드를 출력시킨 화면입니다. 이를 방지하기 위해 모드시큐리티를 설치하고 방지를 하자 406에러 화면을 출력하고 차단한 것이 아래의 화면입니다.

 

이미지 출처 Kisa Modesecurity
이미지 출처 Kisa Modesecurity

에러페이지로 공격을 차단하고 로그를 기록한 화면입니다. 

위에 노란 표시가 있는 라인이 차단 메시지.

 

ModSecurity가 공개(오픈소스) 웹방화벽이지만 PHP Injection 이외에도 SQL Injection, XSS, Directory Traversal 공 격 등 다양한 웹 해킹 공격으로부터 서버를 보호할 수 있습니다. 

요즘은 아파치 서버 외에도 Nginx가 널리 사용되고 있는데요. Nginx 웹서버는 자체적으로 리버스 프록시 기능이 있어서 방화벽기능을 해준다고 하는데 그래도 앞단에서 서버로 들어오는 공격을 사전 차단해줄 수 있는 ModSecurity같은 웹방화벽을 설치하여 보안성을 높일 수 있다고 하니 Nginx를 사용하시는 분들도 고려해보시는 것도 좋을 것 같습니다.

 

*Nginx는 러시아 개발자가 아파치 서버의 동시접속자가 1만명이상일 때 효율성이 떨어지는 문제를 해결하기 위해 개발한 웹서버 소프트웽 입니다. 현재는 Nginx를 더 많이 쓰거나 아파치와 비슷한 숫자로 운영되고 있다고 하네요.

 

 

반응형

댓글

Designed by JB FACTORY