ubuntu 18.04, apache2 mod-security2 설치 및 설정.
1. 설치.
$ sudo apt install libapache2-mod-security2
2. 아파치 웹서버를 다시 실행하고 security2 모듈이 작동중인지 확인한다.
재실행.
$ sudo systemctl restart apache2
모듈 확인
$ sudo apachectl -M | grep -i security security2_module (shared)
3. 설정.
ModSecurity 모듈이 작동하려면 rule(규칙)이 필요하다. 이 규칙에 의해 웹서버와의 통신이 처리되는 방법이 결정된다.
ModSecurity는 설정에 의해서 스크립트를 전달, 삭제,리다이렉트, 실행하거나 세션중에 상태코드를 표시할 수도 있다.
/etc/modsecurity/modsecurity.conf-recommended 파일이 기본 설정 파일인데, 이 파일의 이름을 modsecurity.conf로 바꾸거나 복사하여 사용한다.
$ sudo cp -a /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
SecRuleEngine을 On 으로 바꾸기 위해 복사한 파일을 수정한다. 감사 로그부분도 변경한다.
$ sudo vi /etc/modsecurity/modsecurity.conf
#SecRuleEngine DetectionOnly SecRuleEngine On ... #SecAuditLogParts ABDEFHIJZ SecAuditLogParts ABCEFHJKZ
변경사항을 적용하기위해 아파치 웹서버를 다시 시작한다.
4. 최신 규칙의 유지
/usr/share/modsecurity-crs 에 ModSecurity의 기본 규칙이 위치한다. 이 규칙들은 github에서 다운로드하여 최신 상태로 유지할 수 있다.
위의 디렉토리 이름을 변경한다.
$ sudo mv /usr/share/modsecurity-crs/ /usr/share/modsecurity-crs.orig
github에서 최신 규칙을 복사한다.
$ sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/share/modsecurity-crs
다운로드한 샘플 설정파일을 복사하여 사용한다.
$ sudo cp /usr/share/modsecurity-crs/crs-setup.conf.example /usr/share/modsecurity-crs/crs-setup.conf
아파치 웹서버에서 규칙을 사용하기 위해서 security2.conf 파일에 아래 두 줄을 추가해 준다.
$ sudo vi /etc/apache2/mods-available/security2.conf <IfModule security2_module> ... IncludeOptional /usr/share/modsecurity-crs/owasp-crs.load # add below 2 lines IncludeOptional /usr/share/modsecurity-crs/*.conf IncludeOptional /usr/share/modsecurity-crs/rules/*.conf </IfModule>
변경 내용을 적용하기위해 아파치웹서버를 다시 시작한다.
$ sudo systemctl restart apache2
5. 어플리케이션별로 규칙 제외하기
보통 많이 사용하는 어플리케이션에 대해 OWASP CRS에 포함된 제외 규칙을 사용할 수 있다.
아래 설정 파일에서 해당 어플리케이션을 제외하도록 한다.
$ sudo vi /usr/share/modsecurity-crs/crs-setup.conf # # Modify and uncomment this rule to select which application: # # SecAction \ # "id:900130,\ # phase:1,\ # nolog,\ # pass,\ # t:none,\ # setvar:tx.crs_exclusions_cpanel=1,\ # setvar:tx.crs_exclusions_drupal=1,\ # setvar:tx.crs_exclusions_dokuwiki=1,\ # setvar:tx.crs_exclusions_nextcloud=1,\ # setvar:tx.crs_exclusions_wordpress=1, # setvar:tx.crs_exclusions_xenforo=1"
이 부분에서 워드프레스에 대해 규칙을 제외하고자 한다면 아래와 같이 작성한다. 콤마(,)와 따옴표(“)에 주의하자.
SecAction \ "id:900130,\ phase:1,\ nolog,\ pass,\ t:none,\ setvar:tx.crs_exclusions_wordpress=1"
설정을 변경하였으므로, 설정이 이상없는지 확인하고 웹서버를 다시 시작한다.
$ sudo apachectl configtest Syntax OK $ sudo systemctl restart apache2
하나의 웹서버에서 여러개의 어플리케이션을 실행중이라면, 아래 두번째 문서를 참고하여 도메인별로 제외규칙을 설정해야한다.
6. whitelist에 ip 등록하기.
그럼에도 불구하고 관리자페이지의 특정 기능을 사용하는데 문제가 발생할 수 있다. 이런 경우 특정 IP 주소에대히 security rule을 적용하지 않도록 할 수 있다.
REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf 파일에 IP 주소를 등록하면 된다. 기본 제공되는 파일을 복사하여 사용한다.
$ sudo cp -ar /usr/share/modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example /usr/share/modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
위 파일에서 아래와 같은 부분을 찾는다. (주석처리되어 있다.)
$ sudo vi /usr/share/modsecurity-crs/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf # ModSec Rule Exclusion: Disable Rule Engine for known ASV IP # SecRule REMOTE_ADDR "@ipMatch 192.168.1.100" \ # "id:1000,\ # phase:1,\ # pass,\ # nolog,\ # ctl:ruleEngine=Off"
등록하고자 하는 IP 주소를 확인하고(192.168.100.10 이라 가정하면), 아래와 같이 작성한다.
SecRule REMOTE_ADDR "@ipMatch 192.168.1.100" \ "id:1000,\ phase:1,\ pass,\ nolog,\ ctl:ruleEngine=Off"
한줄로 작성하려면, 뒤쪽의 \를 제거하고 이어쓰면 된다.
SecRule REMOTE_ADDR "@ipMatch 192.168.100.10" "id:1000,phase:1,pass,nolog,ctl:ruleEngine=Off"
특정 IP 대역(192.168.100/24)을 등록하려면,
SecRule REMOTE_ADDR "^192\.168\.100\.*" "id:1000,phase:1,pass,nolog,ctl:ruleEngine=Off"
설정을 확인하고, 웹서버를 다시 시작하면 적용된다.
IP 주소를 추가하고 싶다면 위의 위의 규칙에 id를 증가하여야 한다. 예를 들면,
SecRule REMOTE_ADDR "192\.168\.100\.*" "id:1000,phase:1,pass,nolog,ctl:ruleEngine=Off" SecRule REMOTE_ADDR "@ipMatch 10.10.10.10" "id:1001,phase:1,pass,nolog,ctl:ruleEngine=Off"
참고문서:
1. https://hostadvice.com/how-to/how-to-setup-modsecurity-for-apache-on-ubuntu-18-04/
2. https://www.linuxbabe.com/security/modsecurity-apache-debian-ubuntu
기타사항: modsecurity2를 사용할때, 특수문자가 포함된 비밀번호를 사용하면 SQL injection 공격으로 인식하거나 특정 url은 forbidden 되거나 하는 문제가 발생했다. 5번, 6번 참고하여 문제를 해결하였다.