[Howto] Secure your Webserver

djrick

Registered User
Hallöchen,

Da ich in letzter Zeit immer mal wieder lese, dass Server gesperrt werden wegen DDos oder weil sich jemand Zugang zum Server verschafft hat. Habe ich mir gedacht, ich schreibe mal ein kleines Howto, wie man seinen Server ein kleines bisschen sicherer macht.

Dieses Howto ist natürlich nicht das Maß aller Dinge und umfasst nicht einen 100%igen Schutz, aber ich denke, dass es ein guter Anfang ist.

Getestet ist das ganze unter Ubuntu 8.04. Wer ein anderes Betriebssystem hat, muss das ganze dann auf seine jeweilige Distribution übertragen, was aber nicht weiter schwer sein dürfte.

Ich gehe hier auf drei Sicherungspunkte ein:
  • Sicherung des Apache
  • Sicherung von SSH
  • Aussperren eines Angreifers

Sicherung des Apache Webserver
Um den Apache Webserverdienst gegen DDos zu schützen und ein bisschen sicherer zu machen bietet sich ein ganz bestimmtes Modul des Apache an:
mod_evasive
Die Installation ist denkbar einfach:
Code:
apt-get install libapache2-mod-evasive
fertig :)

Nun muss man noch die Konfiguration vornehmen, dazu fügt man folgenden Code in die /etc/apache2/apache2.conf ein:
Code:
<IfModule mod_evasive.c>
  #DOSHashTableSize gibt die Größe der Hashtabelle in Bytes an
  DOSHashTableSize 3097

  #DOSPageCount gibt die Anzahl der Seitenaufrufe eines Clients pro DOSPageInterval-Zeitintervall
  DOSPageCount 100

  #DOSSiteCount gibt die Anzahl der Seitenaufrufe auf einen Child-Prozess pro DOSSiteInterval-Zeitintervall
  DOSSiteCount 100

  #DOSPageIntervall und DOSSiteInterval werden in Sekunden angegeben
  DOSPageInterval 15
  DOSSiteInterval 15

  #DOSBlockingPeriod gibt die Sperrzeit in Sekunden an
  DOSBlockingPeriod 6000

  #DOSEmailNotify gibts die eMail Adresse an, an welche eine Warnmail geschickt wird
  DOSEmailNotify root@localhost

  #DOSSystemCommand führt bei einem Angriff weitere Programme/Scripte aus wenn gewünscht
  #DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"

  #DOSLogDir gibt das Verzeichnis an in dem das Modul seine Lock-Datei schreibt
  #Achtung: der Ordner sollte nur f�r root erreichbar sein
  DOSLogDir "/var/lock/mod_evasive"

  #DOSWhitelist beinhaltet eine Aufzählung aller IP-Adressen für die mod_evasive NICHT gilt
  #DOSWhitelist 127.0.0.1
</IfModule>
Durch die Kommentierung kann man leicht entnehmen welche Einstellungen bei dem jeweiligen Punkt vorgenommen werden müssen. Die richtigen Einstellungen müsst ihr für euer System selbst finden.

Jetzt noch ein: /etc/init.d/apache2 force-reload
und schon ist der Apache ein kleines bisschen sicherer.

Anmerkung: Ganz interessant ist auch noch der Befehl: DOSSystemCommand, damit könnte man theoretisch die IP an Iptables weitergeben und gleich blocken lassen, allerdings hab ich hierzu noch nicht wirklich was gefunden.

Sicherung von SSH
Auch immer sehr begerht: BruteForce Attaken auf den SSH Dienst eines Servers. Hier gibt es viele Möglichkeiten solche Attaken aufzuspüren und zu neutralisieren. Ich habe mich für den Einsatz von DenyHosts entschieden. Warum wird im Punkt 3 klar.
Die Installation von DenyHosts ist ebenfalls denkbar einfach unter Ubuntu:
Code:
apt-get install denyhosts
Kurz warten...FERTIG.

Jetzt müssen wir noch ein bisschen die Konfiguration bearbeiten:
Code:
nano /etc/denyhosts.conf
Hier obliegt es wieder dem Sysadmin sich einen Überblick über die Ausreichend kommentierten Optionen zu verschaffen, sehr wichtig ist:
Code:
BLOCK_SERVICE  = sshd
DENY_THRESHOLD_INVALID = 3
DENY_THRESHOLD_VALID = 3
DENY_THRESHOLD_ROOT = 3
SYNC_SERVER = http://xmlrpc.denyhosts.net:9911
Hierbei sei angemerkt, dass ich ein ziemlich paranoider Admin bin, und dass deswegen jeder der sich 3 mal vertippt gleich vom System geblockt wird. Sollte man sich oft vertippen dann sollte man die Werte vielleicht etwas erhöhen. Dann haben wir noch eingestellt, dass sich Denyhosts jede Stunde mit dem Denyhosts Server abgleicht und aus dem Internet eine Liste mit IPs holt, die bereits schon negativ in anderen Systemen aufgefallen sind. Diese Liste wird dann automatisch in /etc/hosts.deny eingetragen.
Also dann starten wir DenyHosts mal:
Code:
/etc/init.d/denyhosts restart
Und schon werden alle potetiellen Angreifer vom System ausgeschlossen.

Aussperren eines Angreifers
Nun zu dem Punkt, warum wir auf DenyHosts setzen und nicht auf Fail2Ban. Die Möglichkeit sich eine Liste mit IPs zu besorgen läßt uns die Möglichkeit offen, die potetiellen Angreifer direkt auszusperren bevor sich etwas machen, und nicht nur vom SSH Dienst sondern am besten direkt vom ganzen System.

Dazu erstellen wir zwei Scripte:
Code:
/usr/local/bin/denyiptables.sh
Inhalt:
Code:
#!/bin/bash

ROOT_UID=0


E_NOTROOT=67


if [ "$UID" != "$ROOT_UID" ]; then


echo "Must be root to run this script."


exit $E_NOTROOT


fi


iptables -F


echo "The following ips are blocked: " 1> /var/log/block.log


for x in `cat /etc/hosts.deny | grep -v ^# | cut -d : -f 2`; do


/usr/local/bin/deny.sh $x >> /var/log/block.log


done


exit 0;

Und:
Code:
/usr/local/bin/deny.sh
Inhalt:
Code:
#!/bin/bash


ROOT_UID=0


E_NOTROOT=67

if [ "$UID" != "$ROOT_UID" ]; then

echo "Must be root to run this script."

exit $E_NOTROOT

fi

iptables -I INPUT -s $1 -j DROP

if [ $? != 0 ]; then

echo "block did not work on $1"

exit 1;

fi

echo "$1 was blocked."

exit 0;

Nun noch die richtigen Rechte setzen:
Code:
chmod +x /usr/local/bin/deny.sh /usr/local/bin/denyiptables.sh
Was machen diese Scripts?
Sie durchsuchen die /etc/hosts.deny Datei (die Denyhosts mit "bösen" IPs füllt) und blocken via iptables diese IPs für das ganze System (also auch für den Webserver, Email etc...)

Nun wollen wir das aber nicht immer per Hand ausführen, sondern das soll Cron für uns übernehmen:
Als root:
Code:
crontab -e
Und dann folgendes Einfügen:
Code:
*/5 * * * *     /usr/local/bin/denyiptables.sh
Damit wird unser Script alle 5 min ausgefüht. Das sollte reichen :)


Somit haben wir den Server ein bisschen sicherer gemacht.

Weiterhin wollte ich auch noch auf die Instalation von: (D)DoS-Deflate eingehen, jedoch wars nicht möglich Ubuntu zu überreden dieses Script zu nutzen :)

Für Fragen und Anregungen bin ich jederzeit offen :)
 
Last edited by a moderator:
Bei mir will er den Mod evasive nicht installieren.

Hab Debian 4.0, hab gelesen das man es dort nicht über ATP installieren kann liegt das daran?

Bekomme Folgendes ausgegeben in der Konsole:

Reading package lists... Done
Building dependency tree... Done
E: Couldn't find package libapache2-mod-evasive

Mfg Blader
 
MOD: Full-Quote entfernt!
Ok alles klar. Dann werde ich darauf vorerst verzichten. Danke. :)

Gruß Blader
 
Last edited by a moderator:
Was ist eigentlich wenn ich bei denyhosts "BLOCK_SERVICE = all" mache. Was wird dann noch alles blockiert und ist das eventuell empfehlenswert oder total Unsinnig?

Gruß Blader
 
Komm darauf an.
Ich habs auf "ALL" stehen, weil ich mir denke: Jemand der mich per SSH sabotieren will soll erst gar nicht die Möglichkeit haben das per WWW auszuprobieren ;)
 
Ok, danke. Ja, ich hab's auch auf all gestellt, den der Grund leuchtet völlig ein. Hab auch jetzt alles installiert und hat auch wunderbar funktioniert.
Bis auf, wie gesagt, das Modul für den Apache Server das mod_evasive.

Gibt es noch ein anderes empfehlenswertes Modul was gegen DDos Angriffe schützt und ähnlich effektiv ist?

Gruß Blader
 
IMHO macht mod_evasive nur Sinn, wenn man es an die Firewall koppelt. Der Webserver ist nicht darauf ausgelegt Angriffe mit Fehlermeldungen zu beantworten. Vielmehr sollte die Firewall solche Verbindungen handeln, dafür wurde sie schliesslich entwickelt.

Unter FreeBSD kann man mit dem Befehl
Code:
pfctl -t bruteforce -T add %s
die IP-Adresse '%s' der Tabelle 'bruteforce' hinzufügen. Mit Hilfe des Tools 'Expiretable' wird diese dann in gewissen Abständen geleert.

Für Linux und IPTables gibt es solche Befehle sicherlich auch.
 
Hallo,

ich habe nach o.g. HowTo den ssh-Zugang abgesichert und das ganze mal einige Wochen laufenlassen.

Beim Blick in meine Logs habe ich folgenden Einträge mehrfach gefunden:
/usr/local/bin/denyiptables.sh: line 21: iptables: command not found
/usr/local/bin/deny.sh: line 17: iptables: command not found
/usr/local/bin/deny.sh: line 17: iptables: command not found

Die Meldungen beziehen sich auf folgende Codezeilen:
/usr/local/bin/denyiptables.sh: line 21
Code:
iptables -F
/usr/local/bin/deny.sh: line 17
Code:
iptables -I INPUT -s $1 -j DROP

Mein System ist Debian ETCH und Iptables (1.3.6.0debian1-5)
 
Interessant.

Oder war das ne Frage?

Ok, genug der Spielchen: Was sagt denn die Fehlermeldung aus?
iptables: command not found
Hinweis: Auf deutsch heisst das soviel wie "iptables: Befehl nicht gefunden".
 
Das sagt aus, dass die Befehle (-I -s -F) nicht bekannt sind.

Aber welche muss ich nutzen, damit die Meldungen nicht mehr kommt.
Ich habe die Meldung übrigens unter /var/mail/nobody gefunden.
In der Syslog steht dann folgender Eintrag:
Code:
May  1 17:00:01 v2758 /USR/SBIN/CRON[26193]: (root) CMD (/usr/local/bin/denyiptables.sh)
Die mir zeigt, dass das Cron ausgeführt wird.
 
Das sagt aus, dass die Befehle (-I -s -F) nicht bekannt sind.
Nicht ganz. -I -s und -F sind Parameter vom Befehl "iptables". Wenn der Befehl "iptables" nicht gefunden wurde, dann liegt das Problem wahrscheinlich woran?
 
Möchtest du damit sagen, dass Iptables nicht gestartet ist, bzw nicht gefunden wird?

Wie kann ich das am besten lösen, bzw heraus finden?
 
Nun, iptables ist ja kein Prozess. Wenn es also kein Prozess ist, dann ist es eine Anwendung. Und was machst, wenn eine Anwendung nicht gefunden wurde?

Unter Windows würdest du sie irgendwo im Internet suchen, herunterladen und installieren, richtig?

Du hast aber ein Linux. Linux ist schlau.

Was hältst du davon, einfach mal mit "apt" nach einem Paket "iptables" zu suchen und dieses dann zu installieren?

Jetzt fragst du dich vielleicht: "Wie suche ich nach einem Paket?"
Antwort: Per "apt-cache search <Paketname>", also hier "apt-cache search iptables"

Dann findet er bestimmt ne ganze Menge. Und dann installierst du das Paket. Wie das geht? Nun, mit "apt-get install iptables".

EDIT: Es kann natürlich sein, dass einfach der Pfad nicht stimmt. Dann müsstest du die Anwendung suchen und den Pfad im Skript anpassen. Wie man sucht sagt dir "man which".

EDIT2: Thorsten hat vorgesagt!
 
Vielen Dank an euch beide, eure Tipps haben mir geholfen.

Iptables ist installiert, der Fehler was die Pfadangabe.

Aber nun ist ein anderes Problem auf getaucht.

iptables: Memory allocation problem
Was ich mir aber nicht erklären kann:
Code:
# free
             total       used       free     shared    buffers     cached
Mem:        307200     142516     164684          0          0          0
-/+ buffers/cache:     142516     164684
Swap:            0          0          0
 
Back
Top