티스토리 뷰
룰 활성화
SecRuleEngine On | Off | DetectionOnly
ModSecurity 기능을 활성화(enable) 시킨다.
|
감사로그
감사 로깅에 대한 설정을 구성한다.
트랜젝션만 로깅 |
감사로그 경로
SecAuditLog logs/modsec_audit.log
감사 로그 파일의 경로를 정의한다.
|
감사로그 항목 정의
SecAuditLogParts
ex) SecAuditLogParts ABCFHZ
A | audit log header (필수) |
B | request header |
C | request body (request body가 존재하고 modsecurity가 request body를 검사하도록 설정되어 있는 경우에만) |
D | 보류중, response header의 중개 (현재 지원 안 됨) |
E | response body 중간 단계(현재 modsecurity가 response body를 검사하며 감사 로깅 엔진이 이를 저장하게끔 설정되어 있는 경우에만) |
F | 최종 response header(마지막 컨텐츠 전달 과정에서 아파치에 의해 매번 추가 되는 날짜와 서버 헤더를 제외한) |
G | 실제 response body(현재 지원 안됨) |
H | 감사 로그 트레일러 |
I | 이 옵션은 C를 대체하는 옵션이다. multipart/form-data 인코딩이 사용되었을때를 제외한 모든 경우엔 C와 같은 데이터를 기록한다. |
J | 보류중, 이 옵션은 multipart/form-data 인코딩을 사용하는 파일 업로드에 대한 정보를 포함할 때 효과가 있다. |
Z | 로그의 끝을 의미한다. (필수) |
SecAuditLogRelevantStatus REGEX
감사로깅의 목적과 관련된 response 상태코드의 값을 설정한다.
|
SecAuditLogType Serial | Concurrent
감사로깅 구조의 타입을 설정한다.
이 방식은 로그파일을 원격 ModSecurity Console host로 보낼 때 사용하는 방식이다. |
기본동작
SecDefaultAction
SecDefaultAction "log, auditlog, deny, status:403, phase:2, t:lowercase"
룰이 매칭되면 기본적으로 취할 행동을 정의한다. 1.9.x 버전의 SecFilterDefaultAction을 떠올리면 이해가 쉬운데 2.1.x 버전에서는 옵션들이 더욱 다양해졌다. 룰이 특정 액션들에 대한 개별 룰을 적용하거나 다른 SecDefaultAction이 정의되어있지 않다면 최초 지정된 SecDefaultAction의 설정을 따른다. 위의 예는 룰이 매칭 되었을 때 차단하며 로그를 남기고, 403 상태코드 페이지를 보여주며 필터링 단계는 “2”이다. 기본적으로 대문자는 모두 소문자로 바뀌어 필터링 된다 |
추가적인 Action
Disruptive actions | ModSecurity가 데이터를 중간에서 가로챌 때 일어나는 행위이다. 하나의 체 인에 첫 번째 룰에만 나타낼 수 있다. allow, deny, drop 등이 있다. |
Non-Disruptive actions | 어디에나 나타낼 수 있다. capture, ctl, exec, initcol 등이 있다. |
Flow actions | 하나의 체인에 첫 번째 룰에만 나타낼 수 있다. chain 이 있다. |
Meta-data actions | 하나의 체인에 첫 번째 룰에만 나타낼 수 있다. id, rev, severity, msg가 있다. |
Data actions | 전면적으로 수동적이고 다른 행위에서 사용된 데이터를 운반하는 역할뿐이다. |
action
allow | 룰에 매칭되면 처리를 멈추고 트랜젝션을 허가한다. |
auditlog | 감사로그에 트랜젝션을 기록한다. |
capture | 정규표현식과 함께 사용되었을 때 capture 액션은 정규표현식의 사본을 만들고 |
chain | 두개의 룰을 연관지어 허용하고 싶을 때 사용할 수 있다. |
ctl | ctl 액션은 트랜잭션을 최신화하기 위한 설정 옵션이다. 다음과 같은 옵션들이 들어갈 수 있다. requestBodyProcessor responseBodyAccess responseBodyLimit ruleEngine |
deny | 룰이 일치할 경우 요청 처리를 차단한다. status action이 명시되어 있지 않으면 ModSecurity는 “HTTP 403 error code"를 반환한다. |
drop | FIN 패킷을 보내 TCP 연결을 끊어서 연결을 종료시킨다. |
exec | 필터가 일치하면 파라미터를 지원하는 외부 스크립트/바이너리를 실행시킨다. |
id | 룰이나 체인에 unique ID를 할당한다. |
log | 필터가 일치하였을 때 로그를 남긴다. |
msg | 룰이나 체인에 사용자 메시지를 지정한다. |
noauditlog | 필터가 일치하였을 때 해당 트랜젝션을 audit log에 기록하는 기준으로 하지 않는다. |
nolog | 에러와 감사로그에서 나타나는 일치 현상을 방지한다. |
pass | 요청에 대한 응답을 하기 전에 정의된 수 milliseconds 동안 중지시킨다. child process가 무력화되는 경우가 발생할 수 있다. |
phase | 룰이나 체인이 속하게 되는 1~5 까지의 처리 단계 ※ 잘못된 phase를 지정하지 않게 유의해야 한다. 대상 변수가 무의미 할 수 있다. 변수나 정규식이 false negative를 일으킨다면 올바른 작동이다. 그러나 악성 데이터를 처리하지 못하는 것은 잘못된 phase를 지정했기 때문이다. |
proxy | 필터가 일치하면 트랜젝션을 가로채어 프록시가 구동중인 다른 웹서버로 요청을 포워딩한다. |
redirect | 필터가 일치하면 사용자를 주어진 URL로 리다이렉트 시킨다. 그렇지 않다면 302 상태 코드를 사용한다. |
skip | 필터가 일치하면 하나 이상의 룰이나 체인을 건너뛸 수 있다. |
status | deny 나 redirect 액션에서 사용될 상태코드 값을 지정한다. |
t | 이 액션은 룰에 지정된 연산자가 실행되기 전 변수에 지정된 변형 함수에 사용될 수 있다. |
지시자
SecRule
SecRequestBodyAccess On | Off
Request 값에서 Body 부분에 대한 처리를 어떻게 할 것인지 구성한다. |
SecRequestBodyLimit
ModSecurity가 Request Body 크기로 할당할 수 있는 메모리 최대 크기를 설정한다. |
SecResponseBodyAccess On | Off
Response 값에서 Body 부분에 대한 처리를 어떻게 할 것인지 구성한다. 있지않으면, response body를 검사할 수 없다. |
SecResponseBodyLimit 524228
ModSecurity가 Response Body 크기로 할당할 수 있는 메모리 최대 크기를 설정한다. |
SecReponseBodyMimeType mime/type
Response 값에서 Body 값을 버퍼링할 MIME 타입을 설정한다. |
SecReponseBodyMimeTypesClear
ResponseBody의 버퍼링을 위해 Mime 타입의 목록을 지우며, 처음에 위치시킨다. |
사용자 Rule 정의
SecRule은 ModSecurity의 핵심 지시자이다. 데이터 분석과 액션 실행의 기본이 된다.
① 변수(Variables)
② 연산자(Operator)
③ 행위(Actions) action이 작용되게 된다. 액션은 위에서 설명하였다. |
SecRuleInheritance On | Off
상위 문맥으로부터 룰을 상속받을지 안 받을지 설정하기 위한 지시자이다. |
SecRuleRemoveById
상위 문맥과 룰이 일치하면 일치한 룰을 제거한다. 파라미터는 RULE ID나 하나의 범위가 될 수도 있다. |
SecRuleRemoveByMsg
상위 문맥과 룰이 일치하면 일치한 룰을 제거한다. |
SecServerSignature "Netscape-Enterprise/6.0"
응답 헤더의 "Server:" 토큰을 바꿔 표시한다. |
SecDebugLog /path/to/modsec-debug.log
ModSecurity의 디버그 로그의 경로를 설정한다. |
SecDebugLogLevel |0|1|2|3|4|5|6|7|8|9
디버그 로그의 상세 수준을 결정한다.
않는다. 1 에러만(요청값) 로깅 2 경고 수준 3 공지 수준 4 트랜젝션의 처리과정 상세 5 4와 동일하나 각 처리의 부분별 정보가 포함 9 모두 로깅, 디버깅 정보를 상세히 포함 |
SecDataDir /path/to/dir
영구적 데이터를 저장할 경로를 지정한다.(IP주소, Session 값 등) |
SecTmpDir /path/to/dir
임시 파일이 생성될 디렉토리를 설정한다. 디스크를 스왑하기 위한 영역이다. (메모리 크기는 SecRequestBodyInMemoryLimit 지시자에 의해 설정된 크기이다.) |
SecUploadDir /path/to/dir
가로챈 파일을 저장하기 위한 디렉토리를 설정한다. |
SecUploadKeepFiles On | Off | RelevantOnly
트랜젝션이 처리된 후에 가로챈 파일을 유지할 것인지 아닌지를 설정한다. |
트래픽 감사 예외 IP 설정
형 식 SecRule REMOTE_ADDR "허용할 IP" allow,ctl:ruleEngine=off 사 용
위 설정은 예외처리를 해주지만 그에 대한 로그는 동일하게 기록된다. 취약점 점검 서비스를 통해 다량의 로그 발생시에는 Action 지시자에 nolog를 추가해주면 로그가 기록되지 않는다. |
Request body 접근
SecRequestBodyAccess(phase:2)
Response body 접근
SecResponseBodyAccess(phase:4)
룰셋 예제 파일들 참고
https://www.owasp.org/index.php/Category:OWASP_ModSecurity_Core_Rule_Set_Project
참고자료
KISA 한국 정보 보호 진흥원 / 인터넷 침해사고 대응지원센터 "ModSecurity를 활용한 아파치 웹서버 보안 강화 안내서"
'Security' 카테고리의 다른 글
passive fingerprinting (0) | 2015.06.12 |
---|---|
DDOS 공격 100G MRTG 그래프 (0) | 2015.06.12 |
mod_security 문법 예제들... (0) | 2015.06.12 |
리눅스 보안 설정 스크립트 (0) | 2015.06.12 |
openvpn 셋팅 및 운영 (0) | 2015.06.12 |
- Total
- Today
- Yesterday
- php
- gitlab
- pptp
- galera
- 인증서
- cURL
- ntp
- 베이어다이나믹
- HAProxy
- glusterfs
- WAF
- iptables
- virtualbox
- centos8
- OpenVPN
- kvm
- 리눅스
- GeoIP
- SSL
- ssh
- mod_security
- softether
- IPSEC
- MySQL
- NGINX
- Apache
- centOS7
- mariadb
- L2TP
- yum
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |