ubuntu 18.04, apache2 mod-security2 설치 및 설정.

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번 참고하여 문제를 해결하였다.

답글 남기기

Your email address will not be published.