Thu 12 Apr 2007
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:
Für zweites Fall hat man in Konfig hinzuzufügen:
Gibt es welche Ideen?
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 NewPasswordIn der Datei sieht das Schreiben mit dem verschlüßelten Passwort so aus:
NewUser:P47ghZ4kloG78: Your Can Comment HereGegen 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
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>&1z.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?
English
Deutsch
Русский

August 7th, 2008 at 8:40 a.m.
Thanks a lot for this! It was really helpful for me.