ModSecurity este un modul firewall pentru aplicații web open source (WAF), care este excelent pentru protejarea Apache, Nginx și IIS împotriva diverselor atacuri cibernetice care vizează vulnerabilități potențiale în diverse aplicații web.
În acest articol, vom instala și configura ModSecurity pentru Nginx pe CentOS 7, Debian 8 și Ubuntu 16.04.
Cerințe preliminare
- O instalare actualizată de CentOS 7, Debian 8 sau 64-biți Ubuntu 16.04.
- Conectare ca
root.
Pasul 1: Actualizați sistemul
Urmând acest ghid , actualizați Kernel-ul și pachetele serverului dvs. la cea mai recentă versiune disponibilă.
Pasul 2: Instalează dependențe
Înainte de a putea compila Nginx și ModSecurity cu succes, trebuie să instalați mai multe pachete software după cum urmează.
a) Pe CentOS 7:
yum groupinstall -y "Development Tools"
yum install -y httpd httpd-devel pcre pcre-devel libxml2 libxml2-devel curl curl-devel openssl openssl-devel
shutdown -r now
b) Pe Debian 8 sau Ubuntu 16.04:
apt-get install -y git build-essential libpcre3 libpcre3-dev libssl-dev libtool autoconf apache2-dev libxml2-dev libcurl4-openssl-dev automake pkgconf
Pasul 3: Compile ModSecurity
Datorită mai multor instabilități raportate la ModSecurity pentru sucursala principală Nginx, deocamdată este recomandat să folosești cea mai recentă versiune a nginx_refactoringsucursalei ori de câte ori este posibil.
Descărcați secțiunea nginx_refactoringModSecurity pentru Nginx:
cd /usr/src
git clone -b nginx_refactoring https://github.com/SpiderLabs/ModSecurity.git
Compile ModSecurity:
a) Pe CentOS 7:
cd ModSecurity
sed -i '/AC_PROG_CC/a\AM_PROG_CC_C_O' configure.ac
sed -i '1 i\AUTOMAKE_OPTIONS = subdir-objects' Makefile.am
./autogen.sh
./configure --enable-standalone-module --disable-mlogc
make
Notă: cele două sedcomenzi de mai sus sunt utilizate pentru a preveni mesajele de avertizare atunci când utilizați versiuni mai noi de automatizare.
b) Pe Debian 8 sau Ubuntu 16.04:
cd ModSecurity
./autogen.sh
./configure --enable-standalone-module --disable-mlogc
make
Pasul 4: Compilați Nginx
Descărcați și anarchicați cea mai recentă versiune stabilă a Nginx, care este Nginx 1.10.3la momentul scrierii:
cd /usr/src
wget https://nginx.org/download/nginx-1.10.3.tar.gz
tar -zxvf nginx-1.10.3.tar.gz && rm -f nginx-1.10.3.tar.gz
a) Pe CentOS 7:
În primul rând, trebuie să creați un utilizator dedicat nginxși un grup dedicat nginxpentru Nginx:
groupadd -r nginx
useradd -r -g nginx -s /sbin/nologin -M nginx
Apoi compilați Nginx în timp ce activați modulele ModSecurity și SSL:
cd nginx-1.10.3/
./configure --user=nginx --group=nginx --add-module=/usr/src/ModSecurity/nginx/modsecurity --with-http_ssl_module
make
make install
Modificați utilizatorul implicit al Nginx:
sed -i "s/#user nobody;/user nginx nginx;/" /usr/local/nginx/conf/nginx.conf
b) Pe Debian 8 sau Ubuntu 16.04:
În primul rând, ar trebui să utilizați utilizatorul existent www-datași grupul existent www-data.
Apoi compilați Nginx în timp ce activați modulele ModSecurity și SSL:
cd nginx-1.10.3/
./configure --user=www-data --group=www-data --add-module=/usr/src/ModSecurity/nginx/modsecurity --with-http_ssl_module
make
make install
Modificați utilizatorul implicit al Nginx:
sed -i "s/#user nobody;/user www-data www-data;/" /usr/local/nginx/conf/nginx.conf
După instalarea cu succes a Nginx, fișierele aferente vor fi localizate la:
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
puteți testa instalarea cu:
/usr/local/nginx/sbin/nginx -t
Dacă nu merge nimic, rezultatul ar trebui să fie:
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
Pentru confortul dvs., puteți configura un fișier unitate de sistem pentru Nginx:
cat <<EOF>> /lib/systemd/system/nginx.service
[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
KillStop=/usr/local/nginx/sbin/nginx -s stop
KillMode=process
Restart=on-failure
RestartSec=42s
PrivateTmp=true
LimitNOFILE=200000
[Install]
WantedBy=multi-user.target
EOF
Mergând înainte, puteți porni / opri / reporni Nginx după cum urmează:
systemctl start nginx.service
systemctl stop nginx.service
systemctl restart nginx.service
4.1 Configurați Nginx:
vi /usr/local/nginx/conf/nginx.conf
Găsiți următorul segment din http {}segment:
location / {
root html;
index index.html index.htm;
}
Introduceți liniile de mai jos în location / {}segment:
ModSecurityEnabled on;
ModSecurityConfig modsec_includes.conf;
#proxy_pass http://localhost:8011;
#proxy_read_timeout 180s;
Rezultatul final ar trebui să fie:
location / {
ModSecurityEnabled on;
ModSecurityConfig modsec_includes.conf;
#proxy_pass http://localhost:8011;
#proxy_read_timeout 180s;
root html;
index index.html index.htm;
}
Salvează și închide:
:wq!
Notă: Configurația Nginx de mai sus este doar un exemplu de configurare pentru utilizarea Nginx ca server web, mai degrabă decât un proxy invers. Dacă utilizați Nginx ca proxy invers, îndepărtați #caracterul din ultimele două rânduri și modificați-le corespunzător.
4.2 Creați un fișier numit /usr/local/nginx/conf/modsec_includes.conf:
cat <<EOF>> /usr/local/nginx/conf/modsec_includes.conf
include modsecurity.conf
include owasp-modsecurity-crs/crs-setup.conf
include owasp-modsecurity-crs/rules/*.conf
EOF
Notă: Configurația de mai sus va aplica toate regulile de bază OWASP ModSecurity din owasp-modsecurity-crs/rules/director. Dacă doriți să aplicați numai reguli selective, ar trebui să eliminați include owasp-modsecurity-crs/rules/*.conflinia, apoi să specificați regulile exacte de care aveți nevoie după pasul 4.5.
4.3 Importați fișierele de configurare ModSecurity:
cp /usr/src/ModSecurity/modsecurity.conf-recommended /usr/local/nginx/conf/modsecurity.conf
cp /usr/src/ModSecurity/unicode.mapping /usr/local/nginx/conf/
4.4 Modificați /usr/local/nginx/conf/modsecurity.conffișierul:
sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /usr/local/nginx/conf/modsecurity.conf
4.5 Adăugați fișierele OWASP ModSecurity CRS (Core Rule Set):
cd /usr/local/nginx/conf
git clone https://github.com/SpiderLabs/owasp-modsecurity-crs.git
cd owasp-modsecurity-crs
mv crs-setup.conf.example crs-setup.conf
cd rules
mv REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf.example REQUEST-900-EXCLUSION-RULES-BEFORE-CRS.conf
mv RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf.example RESPONSE-999-EXCLUSION-RULES-AFTER-CRS.conf
Pasul 5: Test ModSecurity
Porniți Nginx:
systemctl start nginx.service
Deschideți portul 80 pentru a permite accesul exterior:
a) Pe CentOS 7:
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --reload
b) Pe Debian 8:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
touch /etc/iptables
iptables-save > /etc/iptables
c) Pe Ubuntu 16.04:
ufw allow OpenSSH
ufw allow 80
ufw default deny
ufw enable
Indicați browserul dvs. către:
http://203.0.113.1/?param="><script>alert(1);</script>
Utilizați greppentru a obține mesaje de eroare după cum urmează:
grep error /usr/local/nginx/logs/error.log
Rezultatul ar trebui să includă mai multe mesaje de eroare care sunt similare cu:
2017/02/15 14:07:54 [error] 10776#0: [client 104.20.23.240] ModSecurity: Warning. detected XSS using libinjection. [file "/usr/local/nginx/conf/owasp-modsecurity-crs/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf"] [line "56"] [id "941100"] [rev "2"] [msg "XSS Attack Detected via libinjection"] [data "Matched Data: found within ARGS:param: \x22><script>alert(1);</script>"] [severity "CRITICAL"] [ver "OWASP_CRS/3.0.0"] [maturity "1"] [accuracy "9"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-xss"] [tag "OWASP_CRS/WEB_ATTACK/XSS"] [tag "WASCTC/WASC-8"] [tag "WASCTC/WASC-22"] [tag "OWASP_TOP_10/A3"] [tag "OWASP_AppSensor/IE1"] [tag "CAPEC-242"] [hostname ""] [uri "/index.html"] [unique_id "ATAcAcAkucAchGAcPLAcAcAY"]
Asta e. După cum vedeți, modulul ModSecurity a înregistrat cu succes acest atac în conformitate cu politica sa de acțiune implicită. Dacă doriți să faceți mai multe setări personalizate, consultați cu atenție și editați /usr/local/nginx/conf/modsecurity.confși /usr/local/nginx/conf/owasp-modsecurity-crs/crs-setup.conffișiere.