FREEDOM. FRIENDS. FEATURES. FIRST.
페도라 한국 사용자 모임

[Tip]웹 방화벽 Mod_Security2의 설치와 활용

게시판 Tech/Tip [Tip]웹 방화벽 Mod_Security2의 설치와 활용

  • This topic has 0개 답변, 1명 참여, and was last updated 6 years, 7 months 전에 by 난해주님. This post has been viewed 28 times
  • 만든이
    게시글
  • #12234
    난해주님
    참가자
    • 게시글114
    • 댓글337
    • 총합451
    • ★★
    @workman729

    음...! 이번에 후배 한 녀석이 SQL 인젝션 공격에 의한 피해를 입었나 봅니다.

    아마도 Kisa에서 배포하고 있는 mod_security 룰셋을 이용하고 있었다고 합니다만
    사실 룰셋을 신뢰성을 의심할 수 있는 여지가 많은 데 후배의 요청도 있고 해서 Mod_Security에 대한 팁을 적어 봅니다.

    저는 개인적으로 서버와 관련해서는 컴파일한 버전을 선호하므로 이에 기반해서 설명해 드리고자 합니다.
    소스 파일과 룰셋 파일은 아래 링크를 참조해서 다운 받으시기 바랍니다.

    소스 파일: http://www.modsecurity.org/download.html
    룰셋 파일: https://github.com/SpiderLabs/owasp-modsecurity-crs

    일단 컴파일 전에 아파치의 컴파일 하실 때 "--enable-uniq-id"와 "--enable-mods-shared=all" 옵션을 주셔서 설치하셔야 함을 유념하시기 바랍니다.

    ## Mod Security2의 컴파일 설치 ###

    컴파일에 필요한 추가적인 라이브러리로 libapr-devel, libapr-util-devel, libpcre-devel, libxml2-devel,  liblua5.1-devel, libcurl-devel 등이 필요합니다. lua는 반드시 5.1 버전으로 설치하시기 바랍니다.(5.2는 지원되지 않음)

    설치 후 다음의 옵션으로 컴파일 하시기 바랍니다. (각각의 라이브러리를 모두 컴파일 설치하셨다면 경로를 변경하시기 바랍니다.)

    # ./configure --with-apxs=/usr/local/apache/bin/apxs --with-pcre=/usr/bin/pcre-config --with-apr=/usr/bin/apr-1-config --with-apu=/usr/bin/apu-1-config

    이후 make, make install 하시면 설치가 완료 됩니다.

    ### Mod Security2의 OWASP 룰셋의 설치 ###

    위의 링크에서 룰셋 파일을 다음과 같이 다운로드 합니다.
    # cd /usr/local/apache/conf
    # sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs
    # sudo mv owasp-modsecurity-crs/ crs/
    # cd crs/
    # sudo mv modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf

    설정 파일을 열어서 다음과 같이 기본 설정하시고 로그 설정등을 추가하시기 바랍니다.

    # sudo vi modsecurity_crs_10_setup.conf
    SecRuleEngine On
    SecRequestBodyAccess On
    SecResponseBodyAccess On
    SecStatusEngine On
    SecResponseBodyMimeType (null) text/html text/plain text/xml
    SecResponseBodyLimit 524288
    SecRequestBodyLimit 13107200
    SecRequestBodyNoFilesLimit 131072
    SecAuditEngine RelevantOnly
    SecAuditLogType Serial
    SecAuditLogParts ABCFHZ
    SecAuditLogType concurrent
    SecAuditLogStorageDir /usr/local/apache/logs/audit_log
    SecAuditLog /usr/local/apache/logs/audit_log/modsec_audit.log
    SecAuditLogRelevantStatus ^(?:5|4(?!04))
    SecArgumentSeparator "&"
    SecCookieFormat 0
    SecDataDir /tmp
    SecTmpDir /tmp
    SecUploadDir /tmp
    SecUploadKeepFiles Off
    SecDebugLog /usr/local/apache/logs/debug_log/modsec-debug.log
    SecDebugLogLevel 3
    SecAuditLogDirMode 0777
    SecAuditLogFileMode 0777
    SecPcreMatchLimit 50000
    SecPcreMatchLimitRecursion 50000
    ~~~ 중략 ~~~
    SecDefaultAction "phase:2,log,auditlog,deny,status:403,tag:'SLA 24/7'"

    SecDefaultAction 설정에 유의 하시기 바라며, KISA에서 배포하는 룰셋의 설정과는 차이가 있으며 이 룰셋은 최신 버전에선 에러가 발생함을 주의하시기 바랍니다.

    위의 셋팅 옵션의 자세한 설정과 설명은 아래 링크된 매뉴얼을 참조하시기 바랍니다.
    메뉴얼: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual

    저장 후 터미널에서 아래와 같이 룰셋을 설치합니다.

    # for f in `ls base_rules/` ; do sudo ln -s /usr/local/apache/conf/crs/base_rules/$f activated_rules/$f ; done
    # for f in `ls optional_rules/ | grep comment_spam` ; do sudo ln -s /usr/local/apache/conf/crs/optional_rules/$f activated_rules/$f ; done
    # ls -l activated_rules

    ### 아파치 설정과 모듈 설정 ###

    모듈과 방화벽 운영에 필요한 기본적인 설정을 아래와 같이 해 주시면 됩니다.

    # sudo vi httpd.conf
    LoadModule xml2enc_module modules/mod_xml2enc.so (주석 제거, 순서에 주의)
    LoadModule unique_id_module modules/mod_unique_id.so (주석 제거)
    LoadModule security2_module modules/mod_security2.so  (모듈 추가)
    ~~~~ 중략 ~~~~
    <IfModule security2_module>
    Include conf/crs/modsecurity_crs_10_setup.conf
    Include conf/crs/activated_rules/*.conf
    </IfModule>

    위의 내용이 기본적인 설정 내용입니다만 phpMyAdmin을 이용하는 경우 방화벽에 의해 차단될 수 있으므로  phpMyAdmin의 경로를 지정하여 SecRuleEngine 아래와 같이 해제해 주시면 이상 없이 사용 가능합니다. (방법은 여러 가지 입니다만 .htacces 설정 하기도 귀찮아서 user-dir 옵션을 이용하여 저는 일괄적으로 처리 합니다만 설치 방법에 따라 달라질 수 있으므로 경로를 변경해 주시면 됩니다.)

    <Directory /home/*/public_html/phpMyAdmin>
        SecRuleEngine Off
    </Directory>

    저장 후 방화벽 로그를 기록하기 위해 logs 디렉토리에 아래와 같이 설정합니다. (보통 개인적인 선호도에 따라 로그의 활용 방법도 달라질 수 있으므로 꼭 똑같이 설정하실 필요는 없습니다.)

    # cd /usr/local/apache/logs
    # sudo mkdir debug_log
    # sudo mkdir audit_log
    # sudo chown -R nobody:nobody audit_log/
    # sudo chmod 777 audit_log/

    참고로 auditlog는 사고 발생시 매우 유용하므로 꼭 설정하시기 바랍니다.
    위의 소유자와 그릅은 httpd.conf의 설정을 그대로 참조하시면 됩니다.

    이상으로 기본적인 설치와 설정은 완료되었으며 아파치를 다시 시작해 주시면 방화벽이 동작합니다.
    추가적인 룰셋이 필요하다면 구글링을 통해 개인적으로 공부해 보시기 바랍니다.

    # sudo /etc/init.d/httpd restart

    경험상으로 Mod_Security2가 KISA에서 배포하는 Whistl 보다는 안정적이며 속도와 보안에서 보다 더 안정적인 것 같습니다.
    또한 OWASP의 공개 룰셋은 추가적인 룰셋 설정이 필요 없을 정도로 다양하고 휼륭합니다.
    물론 개인의 선호도에 따라 달라질 수 있겠지만 말입니다.

    참고로 KISA에서 배포한 룰셋만 적용하신 서버 관리자가 있다면 나중에 후회하지 마시고 OWASP의 공개 룰셋을 적극 활용하시기를 추천합니다.

  • 답변은 로그인 후 가능합니다.