Ο απόλυτος οδηγός για την ασφάλεια, τη σκλήρυνση και τη βελτίωση της απόδοσης του διακομιστή Web Nginx


Με βάση τα υπέροχα πράγματα που έχετε ακούσει για το Nginx, ίσως αποφασίσατε να το δοκιμάσετε. Μπορεί να σας άρεσε τόσο πολύ που σκέφτεστε να αντικαταστήσετε τις εγκαταστάσεις σας Apache με Nginx αφού διαβάσετε μερικά από τα άρθρα σχετικά με το θέμα που έχουμε δημοσιεύσει σε αυτόν τον ιστότοπο.

Αν ναι, είμαι βέβαιος ότι θα καλωσορίσετε αυτόν τον οδηγό με ανοιχτές αγκάλες, καθώς πρόκειται να καλύψουμε 12 συμβουλές για να αυξήσετε την ασφάλεια των διακομιστών σας Nginx (από την ενημέρωση του Nginx μέχρι χρησιμοποιώντας τη χρήση TLS και την ανακατεύθυνση HTTP σε HTTPS), και θα σημειώσετε ότι μερικά από αυτά μοιάζουν πολύ με αυτό που θα κάνατε με τον Apache.

Μην χάσετε:

Περιβάλλον δοκιμών Nginx

Θα χρησιμοποιήσουμε το ακόλουθο περιβάλλον σε αυτόν τον οδηγό:

  1. Debian GNU/Linux 8.1 (jessie).
  2. Διεύθυνση IP: 192.168.0.25 (tecmintlovesnginx.com) και 192.168.0.26 (nginxmeanspower.com), όπως περιγράφεται στην IP -βασισμένη ενότητα εικονικών κεντρικών υπολογιστών στο
    1. Πώς να ρυθμίσετε εικονικούς κεντρικούς υπολογιστές βάσει ονόματος και IP (μπλοκ διακομιστών) με το Nginx

    Έχοντας αυτό κατά νου, ας ξεκινήσουμε.

    ΣΥΜΒΟΥΛΗ #1: Διατηρήστε το Nginx ενημερωμένο

    Τη στιγμή που γράφεται αυτό το άρθρο, οι πιο πρόσφατες εκδόσεις Nginx στα αποθετήρια CentOS (σε EPEL) και Debian είναι 1.6.3 και 1.6.2-5, αντίστοιχα.

    Αν και η εγκατάσταση λογισμικού από τα αποθετήρια είναι ευκολότερη από τη μεταγλώττιση του προγράμματος από τον πηγαίο κώδικα, αυτή η τελευταία επιλογή έχει δύο πλεονεκτήματα: 1) σας επιτρέπει να δημιουργήσετε επιπλέον μονάδες στο Nginx (όπως το mod_security) και 2) θα παρέχει πάντα μια νεότερη έκδοση από τα αποθετήρια (1.9.9 από σήμερα). Οι σημειώσεις έκδοσης είναι πάντα διαθέσιμες στον ιστότοπο του Nginx.

    Μην χάσετε:

    ΣΥΜΒΟΥΛΗ #2: Αφαιρέστε τις περιττές μονάδες στο Nginx

    Για να αφαιρέσετε ρητά λειτουργικές μονάδες από το Nginx κατά την εγκατάσταση από την πηγή, κάντε:

    # ./configure --without-module1 --without-module2 --without-module3
    

    Για παράδειγμα:

    # ./configure  --without-http_dav_module --withouthttp_spdy_module 
    

    Όπως πιθανότατα θα μαντέψετε, η αφαίρεση λειτουργικών μονάδων από προηγούμενη εγκατάσταση Nginx από την πηγή απαιτεί την εκ νέου εκτέλεση της μεταγλώττισης.

    Μια λέξη προσοχής: Οι οδηγίες διαμόρφωσης παρέχονται από λειτουργικές μονάδες. Βεβαιωθείτε ότι δεν απενεργοποιείτε μια ενότητα που περιέχει μια οδηγία που θα χρειαστείτε στην πορεία! Θα πρέπει να ελέγξετε τα έγγραφα του nginx για τη λίστα των οδηγιών που είναι διαθέσιμες σε κάθε ενότητα προτού λάβετε απόφαση για την απενεργοποίηση λειτουργικών μονάδων.

    ΣΥΜΒΟΥΛΗ #3: Απενεργοποιήστε την Οδηγία server_tokens στο Nginx

    Η οδηγία server_tokens λέει στο Nginx να εμφανίζει την τρέχουσα έκδοσή του σε σελίδες σφαλμάτων. Αυτό δεν είναι επιθυμητό, καθώς δεν θέλετε να μοιραστείτε αυτές τις πληροφορίες με τον κόσμο για να αποτρέψετε επιθέσεις στον διακομιστή ιστού σας που προκαλούνται από γνωστά τρωτά σημεία στη συγκεκριμένη έκδοση.

    Για να απενεργοποιήσετε την οδηγία server_tokens, ορίστε το εάν είναι απενεργοποιημένο μέσα σε ένα μπλοκ διακομιστή:

    server {
        listen       192.168.0.25:80;
        server_tokens        off;
        server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
        access_log  /var/www/logs/tecmintlovesnginx.access.log;
        error_log  /var/www/logs/tecmintlovesnginx.error.log error;
            root   /var/www/tecmintlovesnginx.com/public_html;
            index  index.html index.htm;
    }
    

    Επανεκκινήστε το nginx και επαληθεύστε τις αλλαγές:

    ΣΥΜΒΟΥΛΗ #4: Αρνηθείτε τους πράκτορες χρηστών HTTP στο Nginx

    Ένας παράγοντας χρήστη HTTP είναι ένα λογισμικό που χρησιμοποιείται για τη διαπραγμάτευση περιεχομένου έναντι ενός διακομιστή ιστού. Αυτό περιλαμβάνει επίσης ρομπότ και προγράμματα ανίχνευσης κακόβουλου λογισμικού που μπορεί να καταλήξουν να επηρεάσουν την απόδοση του διακομιστή ιστού σας σπαταλώντας πόρους του συστήματος.

    Για να διατηρείτε πιο εύκολα τη λίστα των ανεπιθύμητων πρακτόρων χρηστών, δημιουργήστε ένα αρχείο (/etc/nginx/blockuseragents.rules για παράδειγμα) με τα ακόλουθα περιεχόμενα:

    map $http_user_agent $blockedagent {
            default         0;
            ~*malicious     1;
            ~*bot           1;
            ~*backdoor      1;
            ~*crawler       1;
            ~*bandit        1;
    }
    

    Στη συνέχεια, τοποθετήστε την ακόλουθη γραμμή πριν από τον ορισμό του μπλοκ διακομιστή:

    include /etc/nginx/blockuseragents.rules;
    

    Και μια δήλωση if για να επιστρέψει μια απάντηση 403 εάν η συμβολοσειρά του παράγοντα χρήστη βρίσκεται στη μαύρη λίστα που ορίζεται παραπάνω:

    Κάντε επανεκκίνηση του nginx και όλοι οι πράκτορες χρήστη των οποίων η συμβολοσειρά ταιριάζει με τα παραπάνω θα αποκλειστούν από την πρόσβαση στον διακομιστή ιστού σας. Αντικαταστήστε το 192.168.0.25 με την IP του διακομιστή σας και μη διστάσετε να επιλέξετε μια διαφορετική συμβολοσειρά για το διακόπτη --user-agent του wget:

    # wget http://192.168.0.25/index.html
    # wget --user-agent "I am a bandit haha" http://192.168.0.25/index.html 
    

    ΣΥΜΒΟΥΛΗ #5: Απενεργοποιήστε τις ανεπιθύμητες μεθόδους HTTP στο Nginx

    Γνωστές και ως ρήματα, οι μέθοδοι HTTP υποδεικνύουν την επιθυμητή ενέργεια που πρέπει να γίνει σε έναν πόρο που εξυπηρετείται από το Nginx. Για κοινούς ιστότοπους και εφαρμογές, θα πρέπει να επιτρέπετε μόνο τα GET, POST και HEAD και να απενεργοποιείτε όλα τα άλλα.

    Για να το κάνετε αυτό, τοποθετήστε τις ακόλουθες γραμμές μέσα σε ένα μπλοκ διακομιστή. Μια απάντηση 444 HTTP σημαίνει μια κενή απόκριση και χρησιμοποιείται συχνά στο Nginx για να παραπλανήσει τις επιθέσεις κακόβουλου λογισμικού:

    if ($request_method !~ ^(GET|HEAD|POST)$) {
       return 444;
    }
    

    Για δοκιμή, χρησιμοποιήστε το curl για να στείλετε ένα αίτημα ΔΙΑΓΡΑΦΗ και να συγκρίνετε την έξοδο με το πότε στέλνετε ένα κανονικό GET:

    # curl -X DELETE http://192.168.0.25/index.html
    # curl -X POST http://192.168.0.25/index.html 
    

    ΣΥΜΒΟΥΛΗ #6: Ορίστε περιορισμούς μεγέθους buffer στο Nginx

    Για να αποτρέψετε επιθέσεις υπερχείλισης buffer κατά του διακομιστή ιστού Nginx, ορίστε τις ακόλουθες οδηγίες σε ένα ξεχωριστό αρχείο (δημιουργήστε ένα νέο αρχείο με το όνομα /etc/nginx/conf.d/buffer.conf, για παράδειγμα):

    client_body_buffer_size  1k;
    client_header_buffer_size 1k;
    client_max_body_size 1k;
    large_client_header_buffers 2 1k;
    

    Οι παραπάνω οδηγίες θα διασφαλίσουν ότι τα αιτήματα που γίνονται στον διακομιστή ιστού σας δεν θα προκαλέσουν υπερχείλιση buffer στο σύστημά σας. Για άλλη μια φορά, ανατρέξτε στα έγγραφα για περισσότερες λεπτομέρειες σχετικά με το τι κάνει το καθένα από αυτά.

    Στη συνέχεια, προσθέστε μια οδηγία συμπερίληψης στο αρχείο διαμόρφωσης:

    include /etc/nginx/conf.d/*.conf;
    

    ΣΥΜΒΟΥΛΗ #7: Περιορίστε τον αριθμό των συνδέσεων κατά IP στο Nginx

    Για να περιορίσετε τις συνδέσεις μέσω IP, χρησιμοποιήστε τις οδηγίες limit_conn_zone (σε περιβάλλον http ή τουλάχιστον εκτός του μπλοκ διακομιστή) και limit_conn (σε πλαίσιο http, μπλοκ διακομιστή ή τοποθεσίας).

    Ωστόσο, λάβετε υπόψη ότι δεν καταμετρώνται όλες οι συνδέσεις – αλλά μόνο εκείνες που έχουν ένα αίτημα που υποβάλλεται σε επεξεργασία από τον διακομιστή και έχει διαβαστεί ολόκληρη η κεφαλίδα του αιτήματος.

    Για παράδειγμα, ας ορίσουμε τον μέγιστο αριθμό συνδέσεων σε 1 (ναι, είναι υπερβολή, αλλά θα κάνει τη δουλειά μια χαρά σε αυτήν την περίπτωση) σε μια ζώνη που ονομάζεται addr (μπορείτε να το ορίσετε σε ό,τιδήποτε όνομα που επιθυμείτε):

    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 1;
    

    Μια απλή δοκιμή με το Apache Benchmark (Perform Nginx Load) όπου πραγματοποιούνται συνολικές συνδέσεις 10 με ταυτόχρονες αιτήσεις 2 θα μας βοηθήσει να δείξουμε την άποψη μας:

    # ab -n 10 -c 2 http://192.168.0.25/index.html
    

    Δείτε την επόμενη συμβουλή για περισσότερες λεπτομέρειες.

    ΣΥΜΒΟΥΛΗ #8: Ρύθμιση αρχείων καταγραφής οθόνης για το Nginx

    Αφού εκτελέσετε τη δοκιμή που περιγράφεται στην προηγούμενη συμβουλή, ελέγξτε το αρχείο καταγραφής σφαλμάτων που έχει οριστεί για το μπλοκ διακομιστή:

    Μπορεί να θέλετε να χρησιμοποιήσετε το grep για να φιλτράρετε τα αρχεία καταγραφής για αποτυχημένα αιτήματα που υποβλήθηκαν στη ζώνη προσθήκηr που ορίζεται στη ΣΥΜΒΟΥΛΗ #7:

    # grep addr /var/www/logs/tecmintlovesnginx.error.log --color=auto
    

    Ομοίως, μπορείτε να φιλτράρετε το αρχείο καταγραφής πρόσβασης για πληροφορίες που σας ενδιαφέρουν, όπως:

    1. IP πελάτη
    2. Τύπος προγράμματος περιήγησης
    3. Τύπος αιτήματος HTTP
    4. Ζητήθηκε πόρος
    5. Μπλοκ διακομιστή που απαντά στο αίτημα (χρήσιμο εάν πολλοί εικονικοί κεντρικοί υπολογιστές καταγράφονται στο ίδιο αρχείο).

    Και λάβετε τα κατάλληλα μέτρα εάν εντοπίσετε οποιαδήποτε ασυνήθιστη ή ανεπιθύμητη δραστηριότητα.

    ΣΥΜΒΟΥΛΗ #9: Αποτρέψτε το Hotlinking εικόνας στο Nginx

    Το hotlinking εικόνας συμβαίνει όταν ένα άτομο εμφανίζει σε έναν άλλο ιστότοπο μια εικόνα που φιλοξενείται στη δική σας. Αυτό προκαλεί αύξηση στη χρήση του εύρους ζώνης σας (για το οποίο πληρώνετε) ενώ το άλλο άτομο εμφανίζει με χαρά την εικόνα σαν να ήταν ιδιοκτησία του/της. Με άλλα λόγια, είναι διπλή απώλεια για εσάς.

    Για παράδειγμα, ας υποθέσουμε ότι έχετε έναν υποκατάλογο με το όνομα img μέσα στο μπλοκ διακομιστή σας, όπου αποθηκεύετε όλες τις εικόνες που χρησιμοποιούνται σε αυτόν τον εικονικό κεντρικό υπολογιστή. Για να αποτρέψετε άλλους ιστότοπους να χρησιμοποιούν τις εικόνες σας, θα χρειαστεί να εισαγάγετε το ακόλουθο μπλοκ τοποθεσίας στον ορισμό του εικονικού κεντρικού υπολογιστή σας:

    location /img/ {
      valid_referers none blocked 192.168.0.25;
       if ($invalid_referer) {
         return   403;
       }
    }
    

    Στη συνέχεια, τροποποιήστε το αρχείο index.html σε κάθε εικονικό κεντρικό υπολογιστή ως εξής:

    192.168.0.26

    192.168.0.25

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=”utf-8″>
    <title>Nginx means power</title>
    </head>
    <body>
    <h1>Nginx means power!</h1>
    <img src=”http://192.168.0.25/img/nginx.png” />
    </body>
    </html>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=”utf-8″>
    <title>Tecmint loves Nginx</title>
    </head>
    <body>
    <h1>Tecmint loves Nginx!</h1>
    <img src=”img/nginx.png” />
    </body>
    </html>

    Τώρα περιηγηθείτε σε κάθε ιστότοπο και όπως μπορείτε να δείτε, η εικόνα εμφανίζεται σωστά στο 192.168.0.25 αλλά αντικαθίσταται από μια απάντηση 403 στο 192.168.0.26 ισχυρό>:

    Σημειώστε ότι αυτή η συμβουλή εξαρτάται από το απομακρυσμένο πρόγραμμα περιήγησης που στέλνει το πεδίο Παραπομπή.

    ΣΥΜΒΟΥΛΗ #10: Απενεργοποιήστε το SSL και ενεργοποιήστε μόνο το TLS στο Nginx

    Όποτε είναι δυνατόν, κάντε ό,τι χρειάζεται για να αποφύγετε το SSL σε οποιαδήποτε από τις εκδόσεις του και χρησιμοποιήστε το TLS. Τα ακόλουθα ssl_protocols θα πρέπει να τοποθετηθούν σε περιβάλλον διακομιστή ή http στο αρχείο εικονικού κεντρικού υπολογιστή σας ή αποτελούν ξεχωριστό αρχείο μέσω μιας οδηγίας συμπερίληψης (ορισμένοι χρησιμοποιούν ένα αρχείο με το όνομα ssl.conf , αλλά εξαρτάται αποκλειστικά από εσάς):

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    

    Για παράδειγμα:

    ΣΥΜΒΟΥΛΗ #11: Δημιουργήστε πιστοποιητικά στο Nginx

    Πρώτα απ 'όλα, δημιουργήστε ένα κλειδί και ένα πιστοποιητικό. Μη διστάσετε να χρησιμοποιήσετε διαφορετικό τύπο κρυπτογράφησης εάν θέλετε:

    # openssl genrsa -aes256 -out tecmintlovesnginx.key 1024
    # openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr
    # cp tecmintlovesnginx.key tecmintlovesnginx.key.org
    # openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key
    # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt
    

    Στη συνέχεια, προσθέστε τις ακόλουθες γραμμές μέσα σε ένα ξεχωριστό μπλοκ διακομιστή για να προετοιμαστείτε για την επόμενη συμβουλή (ανακατεύθυνση http --> https) και μετακινήστε τις οδηγίες που σχετίζονται με το SSL στο νέο μπλοκ:

    server {
        listen 192.168.0.25:443 ssl;
        server_tokens off;
        server_name  tecmintlovesnginx.com www.tecmintlovesnginx.com;
        root   /var/www/tecmintlovesnginx.com/public_html;
        ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt;
        ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    }
    

    Στην επόμενη συμβουλή θα επαληθεύσουμε πώς ο ιστότοπός μας χρησιμοποιεί πλέον ένα αυτο-υπογεγραμμένο πιστοποιητικό και TLS.

    ΣΥΜΒΟΥΛΗ #12: Ανακατευθύνετε την κυκλοφορία HTTP σε HTTPS στο Nginx

    Προσθέστε την ακόλουθη γραμμή στο πρώτο μπλοκ διακομιστή:

    return 301 https://$server_name$request_uri;
    

    Η παραπάνω οδηγία θα επιστρέψει μια απάντηση 301 (Μετακινήθηκε μόνιμα), η οποία χρησιμοποιείται για μόνιμη ανακατεύθυνση URL κάθε φορά που υποβάλλεται αίτημα στη θύρα 80 του εικονικού κεντρικού υπολογιστή σας και θα ανακατευθύνει το αίτημα στο μπλοκ διακομιστή που έχουμε προστέθηκε στην προηγούμενη συμβουλή.

    Η παρακάτω εικόνα δείχνει την ανακατεύθυνση και επιβεβαιώνει το γεγονός ότι χρησιμοποιούμε TLS 1.2 και AES-256 για κρυπτογράφηση:

    Περίληψη

    Σε αυτό το άρθρο έχουμε μοιραστεί μερικές συμβουλές για την ασφάλεια του διακομιστή ιστού Nginx. Θα θέλαμε να ακούσουμε τη γνώμη σας και, εάν έχετε άλλες συμβουλές που θα θέλατε να μοιραστείτε με την υπόλοιπη κοινότητα, μη διστάσετε να μας ενημερώσετε στέλνοντάς μας μια σημείωση χρησιμοποιώντας την παρακάτω φόρμα σχολίων.