웹 서버의 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.bash
sudo
sudoers
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.conf
Apache 구성과 관련 이 있습니다. 이 단계에서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_security2
PhpMyAdmin을 비활성화 합니다. /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>
위의 예에서 우리는 가정 973301
및 950907
우리의 웹 응용 프로그램의 정상 작동을 방해 규칙 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 ...
-
@pmFromFile
modsecurity-uri-black.list
각 특정 문구 나 단어가 새 줄에 배치되는 문구 목록이 포함 된 파일 을 읽습니다 . 로그 파일에서 흥미로운 단어와 문구를 수집 할 수 있습니다. 패턴 목록과 패턴 목록 사이에 특정 일치 항목 이 있으면REQUEST_URI
규칙이 적용됩니다. 파일이 비어있을 수 있지만 파일을 작성 (touch
)해야합니다. -
이
log
작업을 수행하면이 규칙에 대한 로그 파일에 로그 항목이 생성됩니다id:150
. -
drop
,deny
(포함status
) 및redirect
작업은 파괴적인 작업 그룹에 속하며 규칙의 시작 부분에 있어야합니다chain
(체인이있는 경우). 두 번째 작업은 첫 번째 작업보다 우선하고 세 번째 작업은 두 번째 작업보다 우선하므로 수행 할 작업을 선택하고 다른 작업을 삭제할 수 있습니다. -
chain
action은 체인의 다음 규칙을 호출합니다. 두 번째 규칙에는 없습니다id
. -
REMOTE_ADDR
요청의 IP 주소를 포함합니다. -
@ipMatchFromFile
modsecurity-ip-white.list
IP 주소의 화이트리스트를 포함 하는 파일 이 새 줄로 분리됩니다. CIDR 항목도 허용됩니다. 때문에 파괴적인 행동이 항상 적용됩니다 체인의 선두 규칙에 위치하고 있지만 특정 IP이 화이트리스트에있을 때exec
조치가 적용되지 않습니다. 파일이 비어있을 수 있지만 파일을 작성 (touch
)해야합니다. -
exec
액션은 외부 스크립트를 호출합니다. 이 작업은 중단 되지 않으며 현재 규칙이 true를 반환하면 실행됩니다. 이 조치가 적용되면 원격 IP는 스크립트를 통해 처리됩니다. -
setenv
이 조치는 특정 내부 변수=%{...}
를 envvar로 내 보내며 내 보낸 이름은 내부 변수 와 다를 수 있습니다. 일부 변수는 수동으로 내 보내야하고 다른 변수는 자동으로 내 보내야합니다. 작은 버그setenv:REQUEST_URI=%{REQUEST_URI}
일 수 있습니다 ( 예 : 같은 이름을 가진 수동 내보내기 는 내 보낸 변수의 빈 값을 유발할 수 있습니다).
건강 진단
서버에 Joomla가 없다고 가정하고 파일을 편집하고 modsecurity-uri-black.list
content 행을 추가하십시오 /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 tool
iptables 기반 방화벽과 상호 작용 하기 위해를 사용하여 문제의 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를 다시 시작하십시오. 그런 다음 tail
exec 로그 :
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이이 모든 것을 스스로 관리하는 데 도움이되는 상세하고 유용한 답변을 제공한다는 것을 알고 있습니다. 혼자서 문제를 해결하는 것은 기분이 좋지만 시간이 오래 걸릴 수도 있습니다 .
- 무료 DDoS 보호 기능을 제공 하므로 Cloudflare에 익숙해 지십시오 .
- 현재 Apache 만 사용하는 경우 NGINX가로드 균형을 맞추는 방법을 배우십시오. NGINX는 여기 와 여기에 표시된 Apache로드 밸런싱에 유용 합니다 .
- 문서 보안에 대한 Apache의 팁을 검토하십시오 .