티스토리 뷰

사전 요구 사항

1. Nginx latest 를 official repository 로부터 설치

    nginx.org/en/linux_packages.html#mainline

2. 사전요구 패키지 설치

    * Ubuntu

$ apt-get install -y apt-utils autoconf automaker build-essential git libcurl4-openssl-dev libgeoip-dev liblmdb-dev ibpcre++-dev lib tool libxml2-dev libyans-dev pkgconf wget zlib1g-dev

    * CentOS

$ yum groupinstall -y "Development Tools"

$ yum install -y http httpd-devel pure pure-devel libxml2 libxml2-devel curl curl-devel openssl openssl-devel pcre-devel


libmodsecurity 다운받고 컴파일

1. Clone GitHub repository

$ git clone --depth 1 -b v3/master --single-branch https://github.com/SpiderLabs/ModSecurity

2. CentOS 6.x 만 아래 단계 시행 (소스코드 컴파일 단계에서 macro `AM_PROG_AR' not found in library 오류 방지)

$ wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/monkeyiq:/centos6updates/CentOS_CentOS-6/noarch/automake-1.13.4-3.2.noarch.rpm


$ wget ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/monkeyiq:/centos6updates/CentOS_CentOS-6/noarch/autoconf-2.69-12.2.noarch.rpm


$ yum install -y autoconf-*.noarch.rpm automake-*.noarch.rpm

3. $ gcc --version 결과가 4.8.5 이상이 아니면

$ yum install -y centos-release-scl && yum install -y devtoolset-3-toolchain

$ source /opt/rh/devtoolset-3/enable

4. 소스코드 컴파일

$ cd ModSecurity

$ git submodule init && git submodule update && ./build.sh && ./configure && make && make install


Nginx connector 다운받고 컴파일​

1. Clone GitHub repository

$ git clone --depth 1 https://github.com/SpiderLabs/ModSecurity-nginx.git

2. Nginx 버젼 측정

$ nginx -v

nginx version: nginx/1.13.7

3. 버젼에 맞는 Nginx 소스코드 다운로드

$ wget http://nginx.org/download/nginx-1.13.7.tar.gz

$ tar xvzf nginx-1.13.7.tar.gz

4. 동적 모듈 컴파일하고 Nginx 디렉토리에 복사

$ cd nginx-1.13.7

$ ./configure --with-compat --add-dynamic-module=../ModSecurity-nginx

$ make modules

$ cp objs/ngx_http_modsecurity_module.so /etc/nginx/modules


Nginx 동적 모듈 로드

1. /etc/nginx/nginx.conf

user nginx;

worker_processes    auto;


load_module "modules/ngx_http_modsecurity_module.so";


error_log    /var/log/nginx/error.log  notice;

pid             /var/run/nginx.pid;

2. ModSecurity 설정

    1. 추천 설정 다운로드

$ mkdir /etc/nginx/modsec

$ wget -P /etc/nginx/modsec/ https://raw.githubusercontent.com/SpiderLabs/ModSecurity/master/modsecurity.conf-recommended

$ mv /etc/nginx/modsec/modsecurity.conf-recommended /etc/nginx/modsec/modsecurity.conf

    2. “detection only” 모드에서 actively dropping traffic 로 변경

$ sed -i 's/SecRuleEngine DetectionOnly/SecRuleEngine On/' /etc/nginx/modsec/modsecurity.conf

    3. SecRequestBodyInMemoryLimit 줄 제거

3. 테스트 rule 만들기

    1. $ vi /etc/nginx/modsec/main.conf

# Edit to set SecRuleEngine On

Include "/etc/nginx/modsec/modsecurity.conf"


# Basic test rule

SecRule ARGS:testparam "@contains test" "id:1234,deny,status:403"

4. 최종 Nginx 설정

    1. Nginx 사이트 설정에서 ModSecurity 활성

server {

    # …

    modsecurity on;

    modsecurity_rules_file /etc/nginx/modsec/main.conf;

}

    2. nginx 재로드

$ nginx -t && nginx -s reload

    3. 로그 확인

tail -f /var/log/modsec_audit.log

5. 테스트 해보기

    1. 403 보기 위해서 다음의 curl 명령

$ curl localhost?testparam=test

<h1>403 forbidden</h1>

    2. XSS 테스팅

$ curl localhost/?param="><script>alert(1);</script>

$ grep error /var/log/nginx/error.log

2017/02/15 14:07:54 [error] ModSecurity: Warning. detected XSS using libinjection.


ModSecurity: Audit 활성하고 Debug 로깅

    1. Nginx 사이트 “ModSecurity: Logging and Debugging” 문서

https://www.nginx.com/blog/modsecurity-logging-and-debugging/ 


Deploy the OWASP Core Ruleset (CRS)

    1. Nginx 사이트 “Enabling the OWASP CRS” 문서



참고


댓글