In diesem kurzen Post geht es darum, wie man mit der Hilfe des Nginx den Zugang zur Web-Adresse mit Passwort sperrt. In Nginx ist die Lösung nicht weniger attraktiv als in Apache, oder auch noch besser – Geschmacksache.

In der Konfigdatei, in Location, muss man nur die Datei nennen, in der sich die Passworte befinden.
Da sind zwei Beispiele fürs Sperren des File-Ordners:
        location ^~ /files/ {
            root   /path/to/server;
            autoindex    on;
            autoindex_exact_size  off;
            auth_basic "Hello, please login";
            auth_basic_user_file /usr/nginx/passwords;
            access_log   /usr/nginx/logs/files.log   download;
        }
und des Admin-URL-Teils mit der zusätzlichen Beschränkung nach IP:
        location ^~ /admin/ {
            fastcgi_pass unix:/home/project/server.sock;
            include  conf/fastcgi.conf;
            allow 11.11.0.0/16;
            allow 22.22.22.22;
            deny all;
            auth_basic "Hello, Admin, please login";
            auth_basic_user_file /usr/nginx/adminpassword;
            access_log   /usr/nginx/logs/admin.log  main;
        }
Mit der Hilfe standardisierter Utility von Apache kann man einen Benutzer hinzufügen:
htpasswd -b passwords NewUser NewPassword
In der Datei sieht das Schreiben mit dem verschlüßelten Passwort so aus:
NewUser:P47ghZ4kloG78: Your Can Comment Here
Gegen das Knacken des Passworts schützt man sich gleichzeitig mit zwei Methoden, die sich auf iptables basieren:
  • Blockierung IP zeitweilig, wenn die Menge der Anfragen pro Sekunde eine vernünftige Menge übersteigt.
  • Das Log der mißlungenden Versuchen des Eintippen des Passworts führen, es mit der Script jede Minute prüfen und IP in iptables eintragen
Für erstes Fall ist es genügend die Regeln zu schaffen:
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW
            -m recent --name bhttp --set
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW
            -m recent --name bhttp --update --seconds 120 
            --hitcount 360 -j DROP
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -j ACCEPT
Man kann auch TARPIT statt DROP nutzen, um das Leben den Verbrechern schwieriger zu machen :)

Für zweites Fall hat man in Konfig hinzuzufügen:
        location /401.html {
            root   /usr/nginx;
            access_log   /usr/nginx/logs/denied.log  error401;
        }
Das Format error 401 habe ich z.B. so aussehend:
log_format error401  '$remote_addr - $remote_user [$time_local] '
                     '$status "$request"';
Nun tragen sich alle falschen Versuche in Einzellog ein, das wir mit cron bearbeiten können:
*/1 * * * * root /usr/nginx/parser401.pl >/dev/null 2>&1
z.B. mit so einem Script: parser401.pl Script prüft das Log und falls mehr als 4 Versuche des falschen Eintippens des Passworts entdeckt, blockiert diesen IP.
Gibt es welche Ideen?

14 Votes | Average: 4.6 out of 514 Votes | Average: 4.6 out of 514 Votes | Average: 4.6 out of 514 Votes | Average: 4.6 out of 514 Votes | Average: 4.6 out of 5 (14 votes, average: 4.6 out of 5)
Loading ... Loading ...

Top Posts: