이건 매우 상급 이니까. 아 해봐야지 하고 덤볐다가는 멘탈 붕괴가 무엇인지 느끼게 해준다 =ㅅ=a
apache web server 에 mod_security를 도입하고 OWASP 룰셋를 적용한다음에 관리하는 방법까지 이다.
먼저 mod_security 를 설치 를 위한 의존성 프로그램 을 설치한다.
|
~]# yum install gcc make httpd-devel libxml2 pcre-devel libxml2-devel curl-devel git |
그후 다운 로드 및 설치.
|
~]# cd /opt/ ~]# wget https://www.modsecurity.org/tarball/2.8.0/modsecurity-2.8.0.tar.gz ~]# tar xzfv modsecurity-2.8.0.tar.gz ~]# cd modsecurity-2.8.0 ~]# ./configure ~]# make ~]# make install |
그다음 httpd.conf 에 불러오는 설정을 해야 겠지요 ‘ㅅ’a
물론 Include 경로를 자신이 운영하는 웹서버 경로에 바꿔야 하는걸 잊지 말자.
|
LoadModule security2_module modules/mod_security2.so <IfModule security2_module> Include conf/mod_security-crs/activated_rules/*.conf </IfModule> |
음 mod_security 설치는 되었다.
이제 룰셋 적용부분.. http://www.modsecurity.org/rules.html
공식 사이트에서는 아래와 같이 두가지 를 추천하고 있다.
무료 – OWASP ModSecurity Core Rule Set (CRS)
유료 – Commercial Rules from Trustwave SpiderLabs
물론 다른 방화벽 업체에서도 룰셋 제공을 하고 있다.
무료 – Comodo Web Application Firewall (CWAF)
여시서는 OWASP 룰셋을 적용할 예정이다.
OWASP 는 (The Open Web Application Security Project) 오픈소스 웹 애플리케이션 보안 프로젝트 이다 자세한 설명은 http://ko.wikipedia.org/wiki/OWASP 요기서 참조 ‘ㅅ’a
|
## 이부분은 자신의 웹서버 경로에 맞게 수정이 필요하겠다. ~]# cd /usr/local/apache/conf ~]# git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git ~]# cd owasp-modsecurity-crs ~]# cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf |
여기까지가 설치 완료는 아니고 사용할 룰셋을 익티베이트 룰셋 폴더에 심볼링 링크를 건다.
|
~]# cd ./activated_rules ~]# ln -s ../modsecurity_crs_10_setup.conf modsecurity_crs_10_setup.conf ~]# for f in `ls ../base_rules/`;do ln -s ../base_rules/$f $f;done ~]# for f in `ls ../optional_rules|grep comment_spam`;do sudo ln -s ../optional_rules/$f $f;done |
이후 owasp-modsecurity-crs 요 폴더를 자신의 httpd.conf 에서 불러 오도록 하면 되겠다.
호환성에 염두하지 않고 보안 적인 취약점을 막기 위해 제작된 룰셋이기 때문에
바로 돌리면 사이트가 안뜬다 -_-;;
먼저 php.ini 수정이 필요하다.
|
[Pcre] ;PCRE library backtracking limit. ; http://php.net/pcre.backtrack-limit pcre.backtrack_limit=10000000 ;PCRE library recursion limit. ;Please note that if you set this value to a high number you may consume all ;the available process stack and eventually crash PHP (due to reaching the ;stack size limit imposed by the Operating System). ; http://php.net/pcre.recursion-limit pcre.recursion_limit=10000000 |
modsecurity_crs_10_setup.conf 파일에 아래부분을 추가 한다.
|
SecPcreMatchLimit 5000 SecPcreMatchLimitRecursion 5000 SecRuleEngine On SecRequestBodyAccess On SecResponseBodyAccess On SecResponseBodyMimeType (null) text/html text/plain text/xml SecResponseBodyLimit 5242880 SecRequestBodyNoFilesLimit 5242880 SecDataDir /tmp SecTmpDir /tmp |
SecRuleEngine On -> DetectionOnly 로 설정하면 감시만 하고 실제 차단은 하지 않는다.
다만 이 디텍트모드에서 기존 사이트 운영중인것에서 걸리는 룰셋을 수정 하거나 해제 해야 한다.
httpd.conf 를 수정한다.
|
<IfModule security2_module> Include conf/owasp-modsecurity-crs/activated_rules/*.conf <Location "/wp-includes"> SecRuleRemoveById 300015 300016 300017 950907 950005 950006 960008 960011 960904 </Location> <Location "/wp-admin/post.php"> SecRuleRemoveById 950907 950005 950006 960008 960011 960904 </Location> </IfModule> |
위와 같이 SecRuleRemoveById 으로 제거를 할수 있으며 디렉토리 혹은 파일명까지 지정하여 사용할 수 있다.
혹은 아래와 같이 가상호스트에서 특정 호스트만 룰셋(SecRuleEngine Off)적용을 끄거나 특정룰만 제거(SecRuleRemoveById)할 수도 있다.
Ajax 를 사용하는 경우 SecRequestBodyAccess On, SecResponseBodyAccess On 두개의 옵션 때문에
Ajax 가 비정상 동작을 할수 있는데 이것역시 Location 혹은 VirtualHost 에서 각기 Off 가 가능하다.
|
<VirtualHost *:80> SecRuleEngine Off SecRequestBodyAccess Off SecResponseBodyAccess Off SecRuleRemoveById 970903 DocumentRoot /home/abc/www ServerName domain.com CustomLog logs/access_log vcommon </VirtualHost> |
정리 하자면 사용할수 있는것은 아래 4가지 이며.
SecRuleEngine Off
SecRequestBodyAccess Off
SecResponseBodyAccess Off
SecRuleRemoveById 룰셋ID
이 일부 혹은 전체 끄는 옵션을을 VirtualHost 혹은 LocationMatch 안에 넣어 일부 허용만 할 수 있다.
아래는 이러한 룰셋을 분석하기 위해 아파치의 error_log 를 분석하기 위한 명령어 이다.
|
~]# grep ModSecurity /usr/local/apache/logs/error_log|sed -e 's#^.*\[id "\([0-9]*\).*hostname "\([a-z0-9A-Z.-_]*\)"\].*uri "#\1\t\2#'|cut -d\" -f1|grep -v 'ModSecurity'|sort|uniq -c|sort -n |
모드 시큐리티는 apache / nginx 에 도입이 가능하다.
다만 nginx 는 테스트 결과 룰셋에 걸리는 웹접근이 이루어 질때 메모리 및 CPU 가 과다 사용이 되고
kernel – oom – killer 에 의해 프로세스가 강제 종료되는 사례가 발생하였다.
nginx 에서의 모드시큐리티 사용은 좀더 두고 봐야 할것이라고 생각된다.