악의적 인 Apache 연결을 끊는 규칙이 필요합니다 -m string –string “cgi” –algo bm

웹 서버의 80을 제외한 포트의 모든 트래픽을 삭제합니다.

iptables에 이와 같은 규칙이 있습니다.

iptables -A INPUT -p tcp -m tcp --dport 80 -m string --string "cgi" --algo bm --to 1000 -j DROP

더 많은 사람이 공유 할 수 있습니까? 나는 항상 나쁜 해커들이 여전히 업데이트하고 있다는 것을 알고 있지만 그들 중 일부는 항상 같은 코드로 시작합니다. 일부 기준에 따라 연결을 끊어야합니다. 다음은 일부 Apache 로그입니다 (ips는 제거하지만 각 공격은 동일합니다).

공격 1 : 이것은 무엇을하려고하는지 모르겠지만 같은 IP에서 50 번 만듭니다.

GET / HTTP/1.1  301 224 -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22
GET / HTTP/1.1  302 3387    -   Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.152 Safari/537.22

공격 2 : 서버에 대한 정보 만 얻으려고합니다.

GET / HTTP/1.1  301 224 http://myip:80/ Go-http-client/1.1
GET / HTTP/1.1  302 3228    http mywebsite  Go-http-client/1.1
GET /es/ HTTP/1.1   200 40947   https mywebsite Go-http-client/1.1

공격 3 : 로그인 페이지 취약점에 접근하려고합니다.

GET /userlogin/login.aspx HTTP/1.1  302 186 -   -

공격 4 : 첫 번째 요청에서 cgi에 액세스하려고합니다 (이를 삭제하려면 첫 번째 iptables 규칙 참조).

GET /hndUnblock.cgi HTTP/1.0    302 186 -   Wget(linux)
GET /tmUnblock.cgi HTTP/1.0 302 186 -   Wget(linux)

나는이 새로운 공격이 지난 12 시간 동안 만 이루어진 서버에 대해 매우 새롭다.



답변

업데이트 : 현재 답변이 완전히 업데이트되었습니다.

이 토론 에 따르면 WWW Security Assistant 라는 GitHub 리포지토리를 만들었습니다 . ask_ubuntu이 답변에 전념 하는 지점 이 있습니다. 이전에 여기서 사용 가능했던 모든 참조 는 문자 제한으로 인해 제거됩니다. GitHub에서 사용 가능합니다.

다음은 Ubuntu 16.04 내에서 Apache2 보안을 강화하는 방법 인 완전한 메커니즘과 관련된 몇 가지 방법을 간과 한 것입니다.

내용의 테이블:

  • WWAS (WWW Security Assistant Script) ► IP 테이블
  • IPtables – 기본 구성 – 저장 및 복원
  • Apache2 용 ModEvasive
  • ModEvasive ► WSAS ► IP 테이블
  • Apache2 용 ModSecurity 2.9
  • ModSecurity OWASP 핵심 규칙 세트 3.x
  • ModSecurity 규칙 허용 목록
  • ModSecurity 규칙 ► WSAS ► IP 테이블
  • ModSecurity 및 Apache 로그 파일
  • ModSecurity 로그 파일 ► Fail2Ban ► Iptables
  • ModSecurity GuardianLog ► HTTPD Guardian ► WSAS ► IP 테이블
  • ModSecurity GuardianLog ► HTTPD 사용자 정의 분석 ► WSAS ► IP 테이블

또한 항상 HTTPS를 사용하는 것이 좋다고 가정 해 봅시다.

WWW 보안 도우미 스크립트 ► IP 테이블

다음은 스크립트 www-security-assistant.bash입니다. 악의적 인 IP 주소를 처리하는 데 도움이 될 수 있습니다. 스크립트에는 두 가지 모드가 있습니다.

자동 모드

Apache의 외부 프로그램 mod_security이 악성 $IP주소를 제공하는 경우 이 경우 스크립트를 호출하는 구문은 다음과 같아야합니다.

www-security-assistant.bash <ip-address> Guardian
www-security-assistant.bash <ip-address> ModSecurity
www-security-assistant.bash <ip-address> ModEvasive
www-security-assistant.bash <ip-address> a2Analyst

이 모드에서 스크립트는 두 가지 작업 단계를 제공 하며 모든 작업 에 대해 관리자 에게 전자 메일보냅니다 .

  • 첫 번째 단계 : 처음 몇 개의 ‘범죄’에 대해 소스 의 값과 동일한 기간 동안 소스 $IP차단됩니다$BAN_TIME . 이 모드는 명령을 사용합니다 at.

  • 두 번째 단계 : 특정 범죄의 숫자 $IP가의 값과 같을 $LIMIT때이 $IP주소는 IP 테이블을 통해 영구적 으로 금지 되며에 추가됩니다 $BAN_LIST.

수동 모드

이 모드는 다음 옵션을 허용합니다.

  • www-security-assistant.bash <ip-address> --DROP "log notes"

    파일에 항목을 작성 /var/www-security-assistant/iptables-DROP.list하고 다음과 같은 규칙을 생성합니다.

    iptables -A GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --DROP-CLEAR "log notes"

    파일에 항목을 작성하고 /var/www-security-assistant/iptables-DROP-CLEAR.list, 특정 Iptables 규칙을 제거하고 $IP, 기록에서 다음을 제거 합니다 $BAN_LIST.

    iptables -D GUARDIAN -s $IP -j DROP
    
  • www-security-assistant.bash <ip-address> --ACCEPT "log notes"

    파일에 항목 만 작성합니다 /var/www-security-assistant/iptables-ACCEPT.list.

  • www-security-assistant.bash <ip-address> --ACCEPT-CHAIN "log notes"

    파일에 항목을 작성 /var/www-security-assistant/iptables-ACCEPT.list하고 다음과 같은 규칙을 생성합니다.

    iptables -A GUARDIAN -s $IP -j ACCEPT
    

의존성

스크립트는 다음 섹션에서 설명 iptables-save.sh하는 iptables체인을 사용 GUARDIAN합니다. 그것은 안에 몇 개의 파일을 생성하고 유지합니다 $WORK_DIR:

  • www-security-assistant.history -이전 IP의 범죄에 대한 데이터를 포함합니다.
  • www-security-assistant.mail -스크립트가 보낸 마지막 이메일의 내용.
  • iptables-ACCEPT.list; iptables-DROP.list그리고 iptables-DROP-CLEAR.list.

이메일을 보내려면 스크립트를 최소한으로 구성해야합니다.

sudo apt install s-nail mutt mailutils postfix
sudo dpkg-reconfigure postfix  # For General type: Internet Site
echo 'Test passed.' | mail -s Test-Email email@example.com

구성된 HTTPS 서비스가 있으면 Postfix 서비스 내에서 TLS 인증서를 사용할 수 있습니다.

또한 스크립트는 at다음을 사용합니다 sudo apt install at.

설치

  • 작업 디렉토리를 만들고 호출하자 /var/www-security-assistant. 다운로드 www-security-assistant.bash하여 실행 가능하게하십시오.

    sudo mkdir /var/www-security-assistant
    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/www-security-assistant.bash -O /var/www-security-assistant/www-security-assistant.bash
    sudo chmod +x /var/www-security-assistant/www-security-assistant.bash
  • 확인 www-security-assistant.bash사용자 정의 명령으로 사용할 수 :

    sudo ln -s /var/www-security-assistant/www-security-assistant.bash /usr/local/bin/
  • 를 통해 비밀번호없이 www-data실행할 수있는 권한을 부여하십시오 . 다음 명령을 사용 하여 추가 ‘ ‘규칙을 사용하여 새 파일을 안전하게 작성하고 편집 하십시오 .www-security-assistant.bashsudosudoers

    sudo visudo -f /etc/sudoers.d/www-security-assistant

    파일 안에 다음 줄을 추가하십시오-파일을 저장하고 종료하십시오 :

    www-data ALL=(ALL) NOPASSWD: /var/www-security-assistant/www-security-assistant.bash
  • 조정 www-security-assistant.bash. 적어도 변수 값을 변경하십시오 $EMAIL_TO.

건강 진단

  • 자신을 $AGENT나타내고 자동 모드가 제대로 작동하는지 확인하십시오.

    www-security-assistant.bash 192.168.1.177 Guardian

    그런 다음 전자 메일을 확인하고을 입력 한 iptables -L GUARDIAN -n다음 파일을 검토 www-security-assistant.history하고 www-security-assistant.mail. 위의 명령 5 번 실행하고 파일을 검토 iptables-DROP.list하고 iptables-CURRENT.conf.

  • 수동 모드가 제대로 작동하는지 확인하십시오. 화이트리스트에 로컬 호스트를 추가하십시오.

    www-security-assistant.bash 127.0.0.1 --ACCEPT "Server's localhost IP"

    그런 다음 파일을 확인하십시오 iptables-ACCEPT.list.

이 학습서의 나머지 부분은 www-security-assistant시스템과 통합하는 방법 입니다.

IPtables – 기본 구성 – 저장 및 복원

기본 구성

다음 규칙을 추가하기 전에이 설명서 를 읽으십시오 .

sudo iptables -F

sudo iptables -I INPUT 1 -i lo -j ACCEPT
sudo iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# This rule may lock you out of the system!
sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT ACCEPT

다음 작업을 수행하기 전에 새 SSH 연결을 열고 시스템에 로그인하여 모든 것이 제대로 작동하는지 확인하십시오!

저장 및 복원

이것은 iptables시스템의 정지-시작 (또는 재부팅) 과정 에서 coning을 저장하고 복원하는 사용자 지정 스크립트를 통해 달성 할 수 있습니다 . (UFW를 사용하여 IPtables 규칙을 설정하는 경우이 단계는 필요하지 않습니다.)

printf '#!/bin/sh\n/sbin/iptables-save > /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-save.sh
printf '#!/bin/sh\n/sbin/iptables-restore < /var/www-security-assistant/iptables-CURRENT.conf\nexit 0\n' | sudo tee /var/www-security-assistant/iptables-restore.sh
sudo chmod +x /var/www-security-assistant/iptables-restore.sh /var/www-security-assistant/iptables-save.sh
sudo ln -s /var/www-security-assistant/iptables-save.sh /etc/network/if-post-down.d/iptables-save
sudo ln -s /var/www-security-assistant/iptables-restore.sh /etc/network/if-pre-up.d/iptables-restore

새로운 체인 만들기

호출 된 새 체인을 작성하고 체인에 GUARDIAN번호 3으로 삽입하십시오 INPUT.

sudo iptables -N GUARDIAN
sudo iptables -I INPUT 3 -j GUARDIAN

건강 진단

시스템을 재부팅하고 구성을 확인하십시오. 사용하시기 바랍니다 sudo systemctl reboot(강제 옵션을 사용하지 마십시오 reboot -f). 시스템이 온라인 상태가되면 새로 생성 된 체인이 존재하는지 확인할 수 있습니다.

sudo iptables -L GUARDIAN -n

Apache2 용 ModEvasive

ModEvasive는 HTTP DoS 또는 DDoS 공격 또는 무차별 대입 공격시 Apache가 회피 조치를 제공하는 회피 기동 모듈입니다. 더 읽어보기 …

설치

  • 모듈을 설치하고 활성화하십시오 :

    sudo apt install libapache2-mod-evasive
    sudo a2enmod evasive
  • 로그 디렉토리를 작성하여 다음에 액세스 할 수있게하십시오 www-data.

    sudo mkdir -p /var/log/apache2_mod_evasive
    sudo chown www-data /var/log/apache2_mod_evasive
  • 기본 구성을 조정 – 구성 파일에서 특정 지시문을 주석 해제하고 편집하십시오.

    /etc/apache2/mods-enabled/evasive.conf
  • Apache를 다시 시작하십시오 sudo systemctl restart apache2.service.

건강 진단

  • 서버에서 웹 페이지를 열고 브라우저 창을 집중적으로 몇 번 새로 고치십시오 (를 누르십시오 F5) . 403 Forbidden 오류 메시지가 표시 되어야합니다 . 로그 디렉토리에 새로운 잠금 파일이 생성됩니다. 이 IP 주소에서 추가 위반을 감지하려면이 파일을 삭제해야합니다.

ModEvasive ► WSAS ► IP 테이블

여기서 우리는 위 섹션에서 생성 mod_evasive된를 iptables통해 대화 하도록 구성 할 것 www-security-assistant.bash입니다.

  • /etc/apache2/mods-available/evasive.conf이 방법으로 편집하십시오 :

    <IfModule mod_evasive20.c>
        DOSHashTableSize    3097
        DOSPageCount        9
        DOSSiteCount        70
        DOSPageInterval     2
        DOSSiteInterval     2
        DOSBlockingPeriod   10
    
        #DOSEmailNotify     your@email.foo
        DOSLogDir           "/var/log/apache2_mod_evasive"
        DOSSystemCommand    "sudo /var/www-security-assistant/www-security-assistant.bash %s 'ModEvasive' 'AutoMode' >> /var/www-security-assistant/www-security-assistant.execlog 2>&1"
    </IfModule>
  • 로그 파일을 작성하고 Apache를 다시 시작하십시오.

    sudo touch /var/www-security-assistant/www-security-assistant.execlog && sudo chown www-data /var/www-security-assistant/www-security-assistant.execlog

우리는을 통해 DDoS 공격을 시뮬레이션 할 수 있습니다이 구성을 테스트하기 위해 F5방법을, 위에서 언급 한, 또는 우리는 같은 명령을 사용할 수 있습니다 ab, hping3

주의 :iptables WSAS에서 사용되는 규칙은 SSH 연결을 포함하여 소스의 모든 연결을 삭제 하므로 주의 하십시오 $IP. 테스트하는 동안 서버에 연결하는 백업 방법이 좋습니다. HTTP / HTTPS 포트에서만 작동하도록이 규칙을 변경할 수 있습니다.

Apache2 용 ModSecurity 2.9

ModSecurity 는 자체적으로 거의 보호 기능을 제공하지 않는 웹 응용 프로그램 방화벽 엔진입니다. 유용하게 사용하려면 ModSecurity를 ​​규칙으로 구성해야합니다. Trustwave의 Spider Labs는 사용자가 즉시 ModSecurity를 ​​최대한 활용할 수 있도록 무료로 인증 된 규칙 세트를 제공합니다 .

설치

  • 모듈을 설치하고 활성화하십시오 :

    sudo apt install libapache2-mod-security2
    sudo a2enmod security2
  • 구성 파일을 작성하십시오.

    sudo cp /etc/modsecurity/modsecurity.conf 권장 /etc/modsecurity/modsecurity.conf

    /etc/modsecurity/modsecurity.conf주의 깊게 읽고 편집하십시오 ! 최소한 다음 지시문을 추가하거나 변경하십시오.

    # -- Rule engine initialization ----------------------------------------------
    SecRuleEngine On
    
    # -- Debug log configuration -------------------------------------------------
    SecDebugLogLevel 2
    SecDebugLog "/var/log/apache2_mod_security/modsec_debug.log"
    
    # -- Audit log configuration -------------------------------------------------
    SecAuditLog "/var/log/apache2_mod_security/modsec_audit.log"
    
    # -- Guardian log configuration -------------------------------------------------
    SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
  • 이 파일 /etc/apache2/mods-enabled/security2.conf/etc/modsecurity/modsecurity.confApache 구성과 관련 이 있습니다. 이 단계에서 security2.conf다음과 같이 보일 것입니다 :

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
    </IfModule>
  • 로그 디렉토리를 작성하십시오.

    sudo mkdir -p /var/log/apache2_mod_security
  • 설정 로그 회전. 먼저 구성 파일을 작성하십시오.

    sudo cp /etc/logrotate.d/apache2 /etc/logrotate.d/apache2-modsec

    그런 다음이 방법으로 새 ​​파일을 편집하십시오.

    /var/log/apache2_mod_security/*.log {  }
  • Apache를 다시 시작하십시오.

건강 진단

  • 에 추가 구성 파일을 작성하고 /etc/modsecurity예를 들어 호출 한 z-customrules.conf후 다음 규칙을 컨텐츠로 추가하십시오.

    # Directory traversal attacks
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109"

    서버를 다시 시작하십시오 sudo systemctl restart apache2.service.. 브라우저를 열고을 입력하십시오 https://example.com/?abc=../. 결과 : 403 Forbidden . /var/log/apache2_mod_security자세한 내용 은 로그 파일을 확인 하십시오.

  • 물건을 더 재미있게 만들기 위해 스크립트 issues.php를 귀하의 적절한 위치에 배치하십시오 DocumentRoot(여기서는이 장소가 있다고 가정합니다 /var/www/html).

    sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/appendix/var/www/html/issues.php -O /var/www/html/issues.php

    그런 다음 다음 방법으로 위 규칙을 수정하십시오.

    # Directory traversal attacks with redirection (or use URL instead of URI: redirect:'https://example.com/issues.php')
    SecRule REQUEST_URI "../" "t:urlDecodeUni, deny, log, id:109, redirect:'/issues.php'"

    Apache를 다시 시작한 다음 브라우저를 열고 https://example.com/?abc=../;-)를 입력하십시오 . 아이디어는 SE의 스크립트에서 빌 렸습니다 BotLovin.cs.

  • /etc/modsecurity/z-customrules.conf다시 한 번 편집 하고 규칙을 주석 처리 (비활성화)합니다. 이것은 테스트 예제 일 뿐이며 다음 섹션에서 설명하는 OWASP CRS에 의해 설명됩니다.

  • 다음은 모든 wp-admin페이지 요청 을 리디렉션 하지만 특정 IP 주소의 요청을 제외한 다른 예입니다 (참고 chain).

    # Block wp-admin access
    SecRule REQUEST_URI "^/wp-admin" "id:108, log, deny, status:403, t:lowercase, chain, redirect:'/issues.php'"
        SecRule REMOTE_ADDR "!@ipMatch 192.168.1.11,99.77.66.12"

    여기에는 (1) deny, status:403과 (2)의 두 가지 파괴적인 행동이 redirect:'/issues.php'있습니다. 실제로 deny조치에 의해 대체되므로 조치 가 필요하지 않습니다 redirect.

ModSecurity OWASP 핵심 규칙 세트 3.x

Ubuntu 16.04에서는 CSR 2.x를 설치할 수 있습니다 apt install modsecurity-crs. 여기서는 CSR 3.x 를 설치합니다 . 자세한 지침은 설치 설명서에 나와 있습니다 ( git필수).

설치

  • 폴더에서 CSR을 복제하십시오 /usr/share/modsecurity-crs.3.

    sudo git clone https://github.com/SpiderLabs/owasp-modsecurity-crs /usr/share/modsecurity-crs.3
  • GeoIP 데이터베이스를 업그레이드하고 자동 갱신합니다. (GeoIP DB는 더 이상 CRS에 포함되지 않습니다. 대신 정기적으로 다운로드하는 것이 좋습니다.)이 스크립트 util/upgrade.py는이 기능을 제공합니다. cron-에서 다음과 같이 사용할 수 있습니다 sudo crontab -e.

    0 2 * * * /usr/share/modsecurity-crs.3/util/upgrade.py --geoip --crs --cron >> /var/log/apache2_mod_security/owasp-crs-upgrade.log 2>&1
  • 구성 파일을 작성하십시오.

    sudo cp /usr/share/modsecurity-crs.3/crs-setup.conf{.example,}
    sudo cp /usr/share/modsecurity-crs.3/rules/REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf{.example,}
    sudo cp /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf{.example,}

    이 파일들을주의 깊게 읽고 편집하십시오! 최소한 SecGeoLookupDB지시문의 주석을 해제하십시오 .

    SecGeoLookupDB util/geo-location/GeoIP.dat
  • Apache의 구성을 적용하십시오. /etc/apache2/mods-available/security2.conf이 방법으로 편집하십시오 :

    <IfModule security2_module>
        SecDataDir /var/cache/modsecurity
        IncludeOptional /etc/modsecurity/*.conf
        IncludeOptional /usr/share/modsecurity-crs.3/crs-setup.conf
        IncludeOptional /usr/share/modsecurity-crs.3/rules/*.conf
    </IfModule>

    파일을 저장 한 다음 Apache를 다시 시작하십시오.

ModSecurity 규칙 허용 목록

ModSecurity 규칙의 화이트리스트는 다음 ModSec 지시문을 통해 수행 할 수 있으며, 시스템 전체 또는 가상 호스트 구성 내에서 특정 디렉토리 또는 위치 일치를 위해 전체적으로 사용할 수 있습니다.

SecRuleRemoveById
SecRuleRemoveByMsg
SecRuleRemoveByTag
SecRuleUpdateTargetById
SecRuleUpdateTargetByMsg
SecRuleUpdateTargetByTag
SecRuleUpdateActionById

mod_security2PhpMyAdmin을 비활성화 합니다. /etc/phpmyadmin/apache.conf이 방법으로 변경하십시오 :

<Directory /usr/share/phpmyadmin>
    <IfModule security2_module>
        SecRuleEngine Off
    </IfModule>
</Directory>

특정 디렉토리에 대한 특정 규칙을 비활성화하십시오.

<Directory /var/www/html>
    <IfModule security2_module>
        SecRuleRemoveById 973301
    </IfModule>
</Directory>

전역 적으로 규칙을 비활성화합니다. 이를 위해 Apache 구성 파일 어딘가에 지시문을 추가해야합니다 /etc/modsecurity/z-customrules.conf.

  • 전체 Apache 구성 내에서 규칙을 비활성화하십시오.

    SecRuleRemoveById 973301 950907
  • ModSecurity를 ​​통과 할 수 있도록 IP 주소를 화이트리스트에 추가하십시오.

    SecRule REMOTE_ADDR "@ipMatch 192.168.110.1" "phase:1,nolog,allow,ctl:ruleEngine=Off,ctl:auditEngine=Off"
  • 디렉토리 일치 내 규칙을 사용 중지합니다.

    <Directory /var/www/mediawiki/core>
        SecRuleRemoveById 973301 950907
    </Directory>
  • 위치 일치 내에서 ID별로 규칙 동작 업데이트 :

    <LocationMatch "/index.php.*">
        SecRuleUpdateActionById 973301 "pass"
        SecRuleUpdateActionById 950907 "pass"
    </LocationMatch>

위의 예에서 우리는 가정 973301950907우리의 웹 응용 프로그램의 정상 작동을 방해 규칙 ID가 있습니다. 의 분석을 통해 이와 같은 규칙을 찾을 수 있습니다 modsec_audit.log.

ModSecurity 규칙 ► WSAS ► IP 테이블

다음은 사용자 정의 SecRules를 작성하는 방법과 WWAS (WWW Security Assistant Script)를 호출하는 방법에 대한 몇 가지 예입니다.

초기 설정

추가 시작 스크립팅이 필요합니다 modsecurity-assistant.sh. 그 이유는 ModSecurity의 exec동작이 너무 단순하고 제한적인 구문을 가지고 있기 때문입니다 .

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/modsecurity-assistant.sh -O /var/www-security-assistant/modsecurity-assistant.sh
sudo chmod +x /var/www-security-assistant/modsecurity-assistant.sh

스크립트 내부를 보면 ModSecurity에서 내 보낸 변수가 거의 없습니다. 이들은 : $REQUEST_URI, $ARGS, $SERVER_NAME, $REMOTE_ADDR, $REMOTE_HOST$UNIQUE_ID. 다른 변수는 스크립트 내부에 설명되어 있습니다.

사용자 정의 규칙을 작성하고이를 통해 스크립트를 호출하십시오.

먼저 요청 URI에 블랙리스트에 포함 된 단어가 포함되어있을 때 실행될 modsecurity-assistant.sh(및 호출 www-security-assistant.bash) 규칙을 작성해 보겠습니다 . /etc/modsecurity/z-customrules.conf아래 줄을 열고 아래에 추가하십시오.

# REQUEST_URI words blacklist
#
SecRule REQUEST_URI "@pmFromFile /var/www-security-assistant/modsecurity-uri-black.list" \
    "id:150, log, t:lowercase, chain, \
    drop, deny, status:403, redirect:'/issues.php'"
    SecRule REMOTE_ADDR "!@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
        "setenv:REMOTE_HOST=%{REMOTE_HOST}, \
         setenv:ARGS=%{ARGS}, \
         exec:/var/www-security-assistant/modsecurity-assistant.sh"
  • REQUEST_URI-이 변수에는 현재 요청의 전체 URI가 포함됩니다. 규칙은 더 넓습니다.SecRule REQUEST_URI|ARGS|REQUEST_BODY ...

  • @pmFromFilemodsecurity-uri-black.list각 특정 문구 나 단어가 새 줄에 배치되는 문구 목록이 포함 된 파일 을 읽습니다 . 로그 파일에서 흥미로운 단어와 문구를 수집 할 수 있습니다. 패턴 목록과 패턴 목록 사이에 특정 일치 항목 이 있으면 REQUEST_URI규칙이 적용됩니다. 파일이 비어있을 수 있지만 파일을 작성 ( touch)해야합니다.

  • log작업을 수행하면이 규칙에 대한 로그 파일에 로그 항목이 생성됩니다 id:150.

  • drop, deny(포함 status) 및 redirect작업은 파괴적인 작업 그룹에 속하며 규칙의 시작 부분에 있어야합니다 chain(체인이있는 경우). 두 번째 작업은 첫 번째 작업보다 우선하고 세 번째 작업은 두 번째 작업보다 우선하므로 수행 할 작업을 선택하고 다른 작업을 삭제할 수 있습니다.

  • chainaction은 체인의 다음 규칙을 호출합니다. 두 번째 규칙에는 없습니다 id.

  • REMOTE_ADDR 요청의 IP 주소를 포함합니다.

  • @ipMatchFromFilemodsecurity-ip-white.listIP 주소의 화이트리스트를 포함 하는 파일 이 새 줄로 분리됩니다. CIDR 항목도 허용됩니다. 때문에 파괴적인 행동이 항상 적용됩니다 체인의 선두 규칙에 위치하고 있지만 특정 IP이 화이트리스트에있을 때 exec조치가 적용되지 않습니다. 파일이 비어있을 수 있지만 파일을 작성 ( touch)해야합니다.

  • exec액션은 외부 스크립트를 호출합니다. 이 작업은 중단 되지 않으며 현재 규칙이 true를 반환하면 실행됩니다. 이 조치가 적용되면 원격 IP는 스크립트를 통해 처리됩니다.

  • setenv이 조치는 특정 내부 변수 =%{...} 를 envvar로 내 보내며 내 보낸 이름은 내부 변수 와 다를 수 있습니다. 일부 변수는 수동으로 내 보내야하고 다른 변수는 자동으로 내 보내야합니다. 작은 버그 setenv:REQUEST_URI=%{REQUEST_URI}일 수 있습니다 ( 예 : 같은 이름을 가진 수동 내보내기 는 내 보낸 변수의 빈 값을 유발할 수 있습니다).

건강 진단

서버에 Joomla가 없다고 가정하고 파일을 편집하고 modsecurity-uri-black.listcontent 행을 추가하십시오 /joomla. 그런 다음 브라우저에 입력하십시오 https://exemple.com/joomla. Iptables를 통해 리디렉션되고 차단되어야합니다. 기록을 지우고 sudo www-security-assistant.bash <your-ip> --DROP-CLEAR 'some note'IP를 추가 한 modsecurity-ip-white.list후 다시 연습하십시오. 이제 리디렉션되어야하지만 차단되지 않아야합니다.

스크립트를 OWASP Core Rule Set 3.x와 연결

이를 위해 Anomaly Mode Rules (949110 및 959100) 의 기본 동작을 업데이트합니다 . 이를 위해 파일을 편집하고 /usr/share/modsecurity-crs.3/rules/RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf다음 행을 맨 아래에 추가하십시오.

# -- Anomaly Mode - Update actions by ID -----
#

SecRuleUpdateActionById 949110 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

SecRuleUpdateActionById 959100 "t:none, drop, deny, status:403, redirect:'/issues.php', \
     setenv:REMOTE_HOST=%{REMOTE_HOST}, setenv:ARGS=%{ARGS}, \
     exec:/var/www-security-assistant/modsecurity-assistant.sh"

# -- Anomaly Mode - Whitelist some URI and IP addresses -----
#

SecRule REQUEST_URI "^/wp-admin/admin-ajax.php*|^/index\.php\?title=.*&action=(submit|raw&ctype=text/javascript|raw&ctype=text/css)$" \
    "id:'999010', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

SecRule REMOTE_ADDR "@ipMatchFromFile /var/www-security-assistant/modsecurity-ip-white.list" \
    "id:'999020', t:none, phase:1, pass, \
     ctl:ruleRemoveById=949110, \
     ctl:ruleRemoveById=959100"

건강 진단

구성 변경 사항을 적용하기 위해 Apache를 다시 시작하거나 다시로드하는 것을 잊지 마십시오. 테스트하는 동안 정기적으로 기록을 지우는 것을 잊지 마십시오. 그렇지 않으면 영구적으로 차단 될 수 있습니다 🙂

디렉토리 순회 공격을 시뮬레이션하십시오.

https://example.com/?abc=../../../                         # This should be redirected and blocked
https://example.com/wp-admin/admin-ajax.php?abc=../../../  # This should pass because of the whitelist rule

SQL 인젝션 공격 시뮬레이션 :

https://example.com/?username=1'%20or%20'1'%20=%20'1&password=1'%20or%20'1'%20=%20'1
https://example.com/index.php?username=1'%20or%20'1'%20=%20'1'))/*&password=foo

ModSecurity 및 Apache 로그 파일

Apache 웹 서버는 서버 관리자에게 작동 방식에 대한 중요한 정보를 제공하도록 구성 할 수 있습니다. 관리자에게 피드백을 제공하는 주요 방법은 로그 파일을 사용하는 것입니다. 더 읽어보기 …

ModSecurity 에는 강력한 로깅 메커니즘이 있습니다. 지시문에 의해 SecGuardianLog외부 스크립트와 함께 작동하도록 특별히 설계된 로그 피드를 제공합니다.

현재와 작업에 알려진 유일한 도구 보호자 로깅 입니다
httpd-guardian의 일부입니다, 아파치 아파치 도구 프로젝트 . 이 httpd-guardian도구는 서비스 거부 공격을 방어하도록 설계되었습니다. 그것은 blacklist tooliptables 기반 방화벽과 상호 작용 하기 위해를 사용하여 문제의 IP 주소를 동적으로 블랙리스트에 추가합니다. 더 읽어보기 …

ModSecurity 로그 파일 ► Fail2Ban ► Iptables

Apache 로그 파일의 데이터 구문 분석을 위해 Fail2Ban을 설정할 수 있습니다. modsec_audit.log아마도 최선의 선택 일지 모르지만에 대해 이야기하는 섹션도 참조하십시오 SecGuardianLog.

주의 가지고 있음 SecAuditLogRelevantStatus에이 /etc/modsecurity/modsecurity.conf주석을. 그렇지 않으면 404 오류 페이지를 수신하는 모든 사람이 fail2ban에 의해 차단됩니다.

SecAuditEngine RelevantOnly
#SecAuditLogRelevantStatus "^(?:5|4(?!04))"

현재 Fail2Ban은이 프로젝트에서 구현되지 않았습니다.

ModSecGuardianLog ► HTTPD-Guardian ► WSAS ► IPtables

httpd-guardian-요청을 모니터링하여 DoS 공격 탐지 Apache Security, Copyright (C) 2005 Ivan Ristic-파이프 로깅 메커니즘을 통해 모든 웹 서버 요청을 모니터링하도록 설계되었습니다. 그것은 각 IP 주소에서 보낸 요청 수를 추적합니다 … httpd-guardian은 IP 주소를 차단하기 위해 경고를 보내거나 스크립트를 실행할 수 있습니다 …

이 스크립트는 Apache2 로깅 메커니즘 또는 ModSecurity (더 나은) 와 함께
사용할 수 있습니다 .

현재 상황에서 설치 및 설정

다운로드 httpd-guardian하여 실행 가능하게하십시오.

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-guardian.pl -O /var/www-security-assistant/httpd-guardian.pl
sudo chmod +x /var/www-security-assistant/httpd-guardian.pl

98-119스크립트를 WSAS 스크립트와 연결하는 방법을 보려면 행 을 읽으십시오 .

Apache 구성 ( /etc/modsecurity/modsecurity.conf) 내에서 다음 변경 사항을 적용한 후 다시 시작하십시오.

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"

건강 진단

스크립트를 테스트하려면 ModEvasive를 비활성화하고 ( sudo a2dismod evasive나중에 활성화해야 함을 잊지 마십시오) Apache를 다시 시작하십시오. 그런 다음 tailexec 로그 :

tail -F /var/www-security-assistant/www-security-assistant.execlog

그리고 다른 인스턴스에서 DoS 공격을 수행하십시오 (예 ab: 다음과 같은 방식으로 사용).

for i in {1..20}; do (ab -n 200 -c 10 https://example.com/ &); done

ModSecGuardianLog ► 사용자 정의 분석 ► WSAS ► IP 테이블

여기에 httpd-custom-analyze.bash특별한 스크립트 는 아니지만 좋은 예제가 될 수 있는 간단한 스크립트 가 있습니다. 그 기능은 스크립트 본문에 설명되어 있습니다.

설치 및 설정

다운로드 httpd-custom-analyze.bash하여 실행 가능하게하십시오.

sudo wget https://raw.githubusercontent.com/pa4080/www-security-assistant/ask_ubuntu/httpd-custom-analyze.bash -O /var/www-security-assistant/httpd-custom-analyze.bash
sudo chmod +x /var/www-security-assistant/httpd-custom-analyze.bash

Apache 구성 ( /etc/modsecurity/modsecurity.conf) 내에서 다음 변경 사항을 적용 하고 다시 시작하십시오.

#SecGuardianLog /var/log/apache2_mod_security/modsec_guardian.log
#SecGuardianLog "|/var/www-security-assistant/httpd-guardian.pl"
SecGuardianLog "|/var/www-security-assistant/httpd-custom-analyze.bash"
  • 임계 값에 도달하면 스크립트가 WSAS를 호출합니다 (읽기 행 86및) 35.

  • httpd-스크립트가 동시에 작동하게 하려면 두 스크립트를 모두 편집 modsecurity.conf하고 파이프하십시오 SecGuardianLog.

  • 테스트를 수행하려면 위 섹션의 팁을 따르십시오.


답변

pa4080이이 모든 것을 스스로 관리하는 데 도움이되는 상세하고 유용한 답변을 제공한다는 것을 알고 있습니다. 혼자서 문제를 해결하는 것은 기분이 좋지만 시간이 오래 걸릴 수도 있습니다 .

  1. 무료 DDoS 보호 기능을 제공 하므로 Cloudflare에 익숙해 지십시오 .
  2. 현재 Apache 만 사용하는 경우 NGINX가로드 균형을 맞추는 방법을 배우십시오. NGINX는 여기여기에 표시된 Apache로드 밸런싱에 유용 합니다 .
  3. 문서 보안에 대한 Apache의 팁을 검토하십시오 .