Προαπαιτούμενα
Βήμα 1: Ενημερώστε το σύστημα
Βήμα 2: Εγκατάσταση εξαρτήσεων
Βήμα 3: Μεταγλώττιση ModSecurity
Βήμα 4: Μεταγλώττιση του Nginx
Βήμα 4: Διαμόρφωση ModSecurity και Nginx
Βήμα 5: Δοκιμάστε το ModSecurity
Το ModSecurity είναι μια ενότητα ανοιχτού κώδικα τείχους προστασίας διαδικτυακών εφαρμογών (WAF) που είναι ιδανική για την προστασία των Apache, Nginx και IIS από διάφορες επιθέσεις στον κυβερνοχώρο που στοχεύουν πιθανές ευπάθειες σε διάφορες εφαρμογές Ιστού
Σε αυτό το άρθρο, θα εγκαταστήσουμε και θα διαμορφώσουμε το ModSecurity για Nginx σε CentOS 7, Debian 8 και Ubuntu 16.04.
Προαπαιτούμενα
- Μια ενημερωμένη εγκατάσταση του CentOS 7, του Debian 8 ή του Ubuntu 16.04 64-bit.
- Σύνδεση ως
root.
Βήμα 1: Ενημερώστε το σύστημα
Ακολουθώντας αυτόν τον οδηγό , ενημερώστε τον πυρήνα και τα πακέτα του διακομιστή σας στην πιο πρόσφατη διαθέσιμη έκδοση.
Βήμα 2: Εγκατάσταση εξαρτήσεων
Για να μπορέσετε να μεταγλωττίσετε το Nginx και το ModSecurity με επιτυχία, πρέπει να εγκαταστήσετε πολλά πακέτα λογισμικού ως εξής.
α) Στο 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
β) Στο Debian 8 ή στο 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
Βήμα 3: Μεταγλώττιση ModSecurity
Λόγω αρκετών αστάθειών που αναφέρθηκαν στο κύριο υποκατάστημα ModSecurity για Nginx, προς το παρόν, συνιστάται επίσημα να χρησιμοποιείτε την πιο πρόσφατη έκδοση του nginx_refactoringκλάδου όποτε είναι δυνατόν.
Κατεβάστε το nginx_refactoringυποκατάστημα του ModSecurity για Nginx:
cd /usr/src
git clone -b nginx_refactoring https://github.com/SpiderLabs/ModSecurity.git
Μεταγλώττιση ModSecurity:
α) Στο 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
Σημείωση: οι δύο sedπαραπάνω εντολές χρησιμοποιούνται για την αποτροπή μηνυμάτων προειδοποίησης κατά τη χρήση νεότερων εκδόσεων automake.
β) Στο Debian 8 ή στο Ubuntu 16.04:
cd ModSecurity
./autogen.sh
./configure --enable-standalone-module --disable-mlogc
make
Βήμα 4: Μεταγλώττιση του Nginx
Κατεβάστε και καταργήστε την αρχειοθέτηση της πιο πρόσφατης σταθερής έκδοσης του Nginx που βρίσκεται Nginx 1.10.3τη στιγμή της σύνταξης:
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
α) Στο CentOS 7:
Πρώτα, πρέπει να δημιουργήσετε έναν αποκλειστικό χρήστη nginxκαι μια αποκλειστική ομάδα nginxγια το Nginx:
groupadd -r nginx
useradd -r -g nginx -s /sbin/nologin -M nginx
Στη συνέχεια, μεταγλωττίστε το Nginx ενώ ενεργοποιείτε τις μονάδες ModSecurity και 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
Τροποποιήστε τον προεπιλεγμένο χρήστη του Nginx:
sed -i "s/#user nobody;/user nginx nginx;/" /usr/local/nginx/conf/nginx.conf
β) Στο Debian 8 ή στο Ubuntu 16.04:
Αρχικά, θα πρέπει να χρησιμοποιήσετε τον υπάρχοντα χρήστη www-dataκαι την υπάρχουσα ομάδα www-data.
Στη συνέχεια, μεταγλωττίστε το Nginx ενώ ενεργοποιείτε τις μονάδες ModSecurity και 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
Τροποποιήστε τον προεπιλεγμένο χρήστη του Nginx:
sed -i "s/#user nobody;/user www-data www-data;/" /usr/local/nginx/conf/nginx.conf
Μετά την επιτυχή εγκατάσταση του Nginx, τα σχετικά αρχεία θα βρίσκονται στη διεύθυνση:
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"
μπορείτε να δοκιμάσετε την εγκατάσταση με:
/usr/local/nginx/sbin/nginx -t
Εάν τίποτα δεν πάει στραβά, η έξοδος θα πρέπει να είναι:
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
Για τη διευκόλυνσή σας, μπορείτε να ρυθμίσετε ένα αρχείο μονάδας συστήματος για το 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
Προχωρώντας προς τα εμπρός, μπορείτε να ξεκινήσετε/σταματήσετε/επανεκκινήσετε το Nginx ως εξής:
systemctl start nginx.service
systemctl stop nginx.service
systemctl restart nginx.service
4.1 Διαμόρφωση Nginx:
vi /usr/local/nginx/conf/nginx.conf
Βρείτε το ακόλουθο τμήμα μέσα στο http {}τμήμα:
location / {
root html;
index index.html index.htm;
}
Εισαγάγετε τις παρακάτω γραμμές στο location / {}τμήμα:
ModSecurityEnabled on;
ModSecurityConfig modsec_includes.conf;
#proxy_pass http://localhost:8011;
#proxy_read_timeout 180s;
Το τελικό αποτέλεσμα θα πρέπει να είναι:
location / {
ModSecurityEnabled on;
ModSecurityConfig modsec_includes.conf;
#proxy_pass http://localhost:8011;
#proxy_read_timeout 180s;
root html;
index index.html index.htm;
}
Αποθήκευση και έξοδος:
:wq!
Σημείωση: Η παραπάνω διαμόρφωση Nginx είναι μόνο ένα δείγμα διαμόρφωσης για τη χρήση του Nginx ως διακομιστή ιστού και όχι αντίστροφου διακομιστή μεσολάβησης. Εάν χρησιμοποιείτε το Nginx ως αντίστροφο διακομιστή μεσολάβησης, αφαιρέστε τον #χαρακτήρα στις δύο τελευταίες γραμμές και κάντε τις κατάλληλες τροποποιήσεις σε αυτές.
4.2 Δημιουργήστε ένα αρχείο με το όνομα /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
Σημείωση: Η παραπάνω διαμόρφωση θα εφαρμόσει όλους τους βασικούς κανόνες του OWASP ModSecurity στον owasp-modsecurity-crs/rules/κατάλογο. Εάν θέλετε να εφαρμόσετε μόνο επιλεκτικούς κανόνες, θα πρέπει να αφαιρέσετε τη include owasp-modsecurity-crs/rules/*.confγραμμή και, στη συνέχεια, να καθορίσετε τους ακριβείς κανόνες που χρειάζεστε μετά το βήμα 4.5.
4.3 Εισαγωγή αρχείων διαμόρφωσης 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 Τροποποίηση του /usr/local/nginx/conf/modsecurity.confαρχείου:
sed -i "s/SecRuleEngine DetectionOnly/SecRuleEngine On/" /usr/local/nginx/conf/modsecurity.conf
4.5 Προσθήκη αρχείων 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
Βήμα 5: Δοκιμάστε το ModSecurity
Ξεκινήστε το Nginx:
systemctl start nginx.service
Ανοίξτε τη θύρα 80 για να επιτρέψετε την εξωτερική πρόσβαση:
α) Στο CentOS 7:
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --reload
β) Στο 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
γ) Στο Ubuntu 16.04:
ufw allow OpenSSH
ufw allow 80
ufw default deny
ufw enable
Κατευθύνετε το πρόγραμμα περιήγησής σας στο:
http://203.0.113.1/?param="><script>alert(1);</script>
Χρησιμοποιήστε το grepγια να λάβετε μηνύματα σφάλματος ως εξής:
grep error /usr/local/nginx/logs/error.log
Η έξοδος θα πρέπει να περιλαμβάνει πολλά μηνύματα σφάλματος παρόμοια με:
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"]
Αυτό είναι. Όπως βλέπετε, η ενότητα ModSecurity καταγράφει με επιτυχία αυτήν την επίθεση σύμφωνα με την προεπιλεγμένη πολιτική ενεργειών της. Εάν θέλετε να κάνετε περισσότερες προσαρμοσμένες ρυθμίσεις, ελέγξτε προσεκτικά και επεξεργαστείτε /usr/local/nginx/conf/modsecurity.confκαι /usr/local/nginx/conf/owasp-modsecurity-crs/crs-setup.confαρχεία.