ModSecurity는 php인젝션 및 패턴 탐지용 아파치 모듈입니다.

아파치에서 php를 쓴다면 필수적으로 설치해야 하는 보안 모듈이라고 생각합니다.

http://modsecurity.org/documentation.html

이 포스팅은 아파치 기준으로 적지만, 모드시큐리티 홈페이지 레퍼런스 매뉴얼을 보면 Nginx나 IIS에도 설치할 수 있는 듯합니다. 구글링 해가면서 설치하시는 것을 추천합니다.


또... phpMyAdmin 으로 DB를 백업/복원할 때는 mod security 를 잠시 해제하는 것을 추천합니다.


우선, 터미널 창에서 아래 명령어를 입력하여 패키지를 최신 것으로 유지합니다.

sudo apt-get update

sudo apt-get upgrade


▲ sudo apt-cache search modsecurity

라고 입력해서 모드시큐리티 패키지의 이름을 정확하게 파악하고,

sudo apt-get install libalache2-mod-sechrity2

확인된 패키지 이름을 입력해서 패키지를 설치합니다. CRS(Core Rule Set)가 의존성 패키지로 깔리네요.

기본 패키지만으로도 기본은 한다는 얘기.


▲ 설치 직후 /etc/modsecurity/ 디렉토리로 들어가서 ll 명령어로 리스트를 조회해보면 modsecurity.conf-recommend 파일이 있을 겁니다.

sudo cp modsecurity.conf-recommend modsecurity.conf

라고 입력하여 환경설정 파일로 복사해주고,

sudo gedit /etc/modsecurity/modsecurity.conf

처럼 입력해서 에디터로 modsecurity.conf 파일을 수정 시도합니다.


▲ SecRuleEngine DectionOnly

를 주석처리해주고(# 붙임),

SecRuleEngine On

이라고 추가 후 저장+빠져나옵니다.


▲ sudo service apache2 restart

라고 입력하여 아파치 서비스를 재시작하면 modsecurity.conf 의 수정사항이 반영됩니다.


(나중에 mod_security 를 잠시 멈추고 싶다면 /etc/modsecurity/modsecurity.conf 에서 SecRuleEngine On 부분을 주석처리하고(# 붙임) SecRuleEngine DectionOnly 부분을 주석 해제한 다음 저장+빠져나와서 아파치 서비스를 재시작하면 됩니다. 복구는 역순!)


▲ sudo apache2ctl -M | grep -i security

위 명령어는 mod_security 가 잘 돌아가고 있는지를 확인합니다.

security2_module (shared)

처럼 뜨면 정상 작동하고 있는 거고,

AH00558 에러가 127.0.1.1 과 관련해서 뜨긴 하는데, VirtualHost 쓰는 대부분의 환경에서는 별 지장 없는 문제입니다. 넘어가면 되고, 정 해결을 원한다면 구글링해 보세요. 쉽게 해결될 겁니다.


▼ 위의 명령어가 번거롭다면 phpinfo 페이지에서 Loaded Modules 항목에 mod_security2 가 떠있는지를 확인해도 됩니다. 만약 접속 시도시 phpinfo.php 파일이 있는데도 403 Forbidden 에러가 뜬다면 mod security 를 잠시 DectionOnly 상태로 바꾸고 재접속해보세요.



코어 룰 셋(CRS)이 기본으로 설치되어 돌아간다고 했죠?

이것은 설정 파일들을 뜯어보면 쉽게 확인할 수 있습니다.


▲ /etc/apache2/mods_enabled/security2.conf 파일을 열어보면 owasp-crs.load 파일을 포함하라고 되어있고,


▲ /usr/share/modsecurity-crs/owasp-crs.load 파일을 열어보면 crs 관련 경로들이 나오는 것을 봤을 때, CRS가 돌아가고 있음을 알 수 있죠.


우분투 16.04 처음 나왔을 때부터 글 작성 시점까지 써보니까 apt-get 으로 crs가 2번 정도 업그레이드된 것 같긴 합니다. 최신 룰 셋 적용에 대한 욕심이 없다면 이쯤에서 멈추는 게 편합니다.ㅋ




Core Rule Set을 Github 버전(최신)으로 업데이트하기


귀찮은 작업입니다.ㅋ

하지만 보안 관련 사건이 크게 터졌을 경우에는 git에서 최신 룰셋을 받아서 적용하면 보안에 도움이 될 겁니다.


▲ git 을 설치한 적이 없다면

sudo apt-get install git

이라고 입력하여 설치합니다.


▲ sudo mv /usr/share/modsecurity-crs /usr/share/modsecurity-crs.bak

기존의 /usr/share/modsecurity-crs 디렉토리를 mv 명령어로 이름을 바꾸는 식으로 백업합니다.

(나중에 필요없어지면 sudo rm -rf /usr/share/modsecurity-crs.bak 처럼 입력하여 지워주세요.)


▲ sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git /usr/share/modsecurity-crs

git clone 명령어로 /usr/share/modsecurity-crs 디렉토리에 최신 룰셋을 받습니다. 디렉토리는 자동 생성됩니다.


▲ cd /usr/share/modsecurity-crs/

라고 쳐서 ll 명령어로 디렉토리 내용을 조회해봤더니

crs-setup.conf.example 파일이 있네요.


▲ sudo cp crs-setup.conf.example crs-setup.conf

라고 입력하여 conf 파일을 생성해줍니다.


sudo gedit /etc/apache2/mods-enabled/security2.conf

그리고 에디터로 /etc/apache2/mods-enabled/security2.conf 파일을 수정 시도합니다.


▲ owasp-crs.load 부분은 주석처리하고(# 삽입),

IncludeOptional /usr/share/modsecurity-crs/*.conf

IncludeOptional /usr/share/modsecurity-crs/rules/*.conf

</IfModule> 위에 위의 두 줄을 추가합니다.


참고로, 백업했던 /usr/share/modsecurity-crs.bsk/owasp-crs.load 파일을 열어서 비교해보면 같은 부분/다른 부분에 대한 감이 잡히실 거예요.


▲ crs-setup.conf 파일은 이제부터 /usr/share/modsecurity-crs/ 경로에서 불러올 거니까 차이가 없고,

/usr/share/modsecurity-crs/rules/ 에서 룰을 불러오는 것은 똑같고,

REQUEST-900-블라블라 파일과 RESPONSE-999-블라블라 파일에 대한 설정이 빠졌는데,

/usr/share/modsecurity-crs/rules/ 디렉토리에 들어가보면 REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example 파일과 RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example 파일이 있을 겁니다. sudo cp 명령어나 sudo mv 명령어로 example만 빼주면 owasp-crs.load 파일에서의 설정과 똑같아질테니, 원하시는 대로 적용해서 쓰시면 됩니다.


각설하고,


▲ sudo service apache2 restart

아파치 서비스를 재시작해주면 업데이트한 Core Rule Set이 적용됩니다.


이후 같은 방식으로 유지/보수하면 됩니다.


끝.


p.s.

/usr/share/modsecurity-crs/

/etc/modsecurity/crs/

두 디렉토리는 중요하다는 것을 배웠습니다. ^^



※ 참고한 글들

http://modsecurity.org/documentation.html

https://2buntu.com/articles/1571/installing-lamp-modsecurity-modsecurity-crs-on-ubuntu-1604/

https://hostadvice.com/how-to/how-to-setup-modsecurity-for-apache-on-ubuntu-18-04/

https://hostpapasupport.com/fix-http-image-upload-error-wordpress/

이외에도 많습니다.


----------------------------------------------------------



워드프레스 ModSecurity 충돌 문제 해결



▲ mod_security 설치 후 워드프레스 /wp-admin/post.php 403 문제가 발생하거나 본문에 미디어 추가가 안되는 문제를 겪었습니다. 알아보고 해결 방법을 적습니다.


https://www.digitalocean.com/community/tutorials/how-to-set-up-modsecurity-with-apache-on-ubuntu-14-04-and-debian-8

https://www.enteroa.com/tag/mod_security/

위 링크들의 글을 보면 일부 경로에서 modsecurity 룰셋 작동을 멈추게 하는 방법들이 나옵니다.

RuleEngine 전체를 Off 시키는 방법은 (보안에 그만큼 취약할 것이므로) 제 취향이 아니라 언급하지 않겠고,

SecRuleRemoveById 명령어로 특정 룰의 ID를 입력하여 해당 룰의 작동을 멈추는 방식이 좋아 보였습니다.


문제를 일으킨 Rule의 ID를 어떻게 찾아낼지가 관건인데,

하나하나 찾아봤습니다.


/etc/modsecurity/modsecurity.conf 파일에서 .log 파일들의 위치를 찾아보니 /var/log/apache2/modsec_audit.log 파일이 보이던데, audit이 "검사" 정도의 뜻이니까... 이 파일은 관련이 없을 것 같습니다.

/etc/apache2/mods-enabled/security2.conf 파일에는 .log 와 관련된 내용이 없고...

Mod Security 관련 설정 파일에서 단서를 못 찾았으니, Apache 설정 파일에서 단서를 찾아봅니다.

/etc/apache2/apache2.conf 파일을 gedit로 열어서 Ctrl+F 누르고 .log 입력해봤더니 ErrorLog ${APACHE_LOG_DIR}/error.log 라는 문구가 보이고, /etc/apache2/envvars 파일을 gedit로 열어서 Ctrl+F 누르고 LOG_DIR 입력해봤더니 export APACHE_LOG_DIR=/var/log/apache2$SUFFIX 라는 문구가 보이네요.

/etc/apache2/sites-enabled/ 디렉토리에서 conf 파일을 뒤져서 VirtualHost에 할당한 ErrorLog 파일의 경로를 찾아봅니다. 이게 진짜겠죠!


▲ 제 경우는 /var/log/apache2/error-www.jimnongtest2.top.log 파일이겠네요.


에디터로 에러 로그 파일을 열어봅니다. 그리고 찾기(Ctrl+F)로 modsecurity 라고 쳐서 찾아봅니다. 구축한 홈페이지에 접속했을 때 modsecurity 관련 에러가 생긴 시간을 기준으로 살펴보면 됩니다. 제일 아래서부터 훑어 올라오며 찾으면 쉽겠죠?


▲ 문제가 생긴 rule 파일의 라인과 ID가 보이네요!

ID를 메모해두세요. (저는 941160, 949110, 980130 세 개가 계속 나왔습니다.)

문제가 생긴 워드프레스 파일 경로도 보이네요. 메모해두세요.


▲ https://www.enteroa.com/2015/02/07/195/

사실, 위 링크에서 보기 좋게 추출할 수 있는 터미널 명령어를 공개하셨는데... 제가 초보자라 입력하기 힘들더군요.ㅠㅠ


아무튼,


▲ 본인의 아파치 conf 파일에 이런 식으로 구성해서 추가합니다.

<Directory>, <Files>, <Location> 중 원하는 섹션을 골라서 에러 로그에 있던 경로를 입력해주면 되는데, 저는 /wp-admin/admin-ajax.php 와 /wp-admin/post.php 파일만 골라서 인식시키는 표현법을 몰라서 (무식하게) <Location> 을 썼습니다.

아파치 섹션 지시어에 대한 문서는 https://httpd.apache.org/docs/2.4/ko/sections.html 에 있습니다. 참고하세요.


저장하고 빠져나온 다음 터미널 창에서

sudo service apache2 restart

라고 입력하여 아파치 서비스를 재시작합니다.

그리고 구축한 워드프레스 사이트에 접속해서 에러 났던 작업을 다시 해보세요.

다른 작업들도 해보면서 에러가 발생하는지 살피고, 에러가 나면 에러로그 살펴서 SecRuleRemoveByID 에 ID를 추가하는 식으로 문제를 해결합니다.


진짜 끝!

반응형