DDos Angriff Abwehren
Zunächst mal muss hierbei gesagt werden dass wenn schon ein DDoS Angriff
stattfindet es schwer sein wird es zu unterbinden, da hierbei meisten
der Server so stark belastet ist dass der Zugriff fast unmöglich ist.
Zunächst kann man sich anschauen was Netzwerk seitig abläuft.
Mit tcpdump -n wird alles angezeigt, egal auf welcher Netzwerkschnittstelle.
Mit tcpdump host 123.123.123.123 -n wird nur die eingegebene Server IP_Adresse aufgelöst.
Mittels IPables kann man dann Störenfriede aussperren.
iptables -I INPUT -s 123.123.123.123 -j DROP
So kann man bestimmte IPs aussperren, auch wenn sich die letzten Ziffen ändern.
iptables -I INPUT -s 123.123.0.0/16 -j DROP
Hierbei muss beachtet werden dass jede Ziffer die vorhanden ist 8bit sind, also in meinem Beispiel die ersten 123 wären 8bits, die nächsten 123
wären erneut 8bit und daher zusammengezählt insgesamt 16bit. Würde man
bei der ersten NULL in meinem Beispiel auch ein Ziffer haben wären es
erneut 8bit und daher dann 24bit gesamt.
Beispiel: iptables -I INPUT -s 123.123.123.0/24 -j DROP
Sperre wieder auflösen, bzw. IP aus iptables wieder herausnehmen:
iptables -D INPUT -s 123.123.123.123 -j DROP
Ganze IP-Adressen kann man auch hiermit aussperren:
/sbin/route add -host 123.123.123.123 reject
Es sollte aber auch vorgesorgt werden dass es schwieriger wird und daher sind noch ein paar weitere Aspekte ratsam.
Zum einem sollte das abspannen schon von Anfang an unterbunden werden,
damit man sich nicht aufs System vorbereiten kann, denn Angreifer
versuchen im Vorfeld das System auf Schwachstellen ab zu scannen.
Hierbei gibt es auch iptables regeln die man nutzen kann oder Tools/Programme wie z.B. das Portsentry.
Aber auch Fail2Ban und mod_evasive oder mod_Security können hier sehr behilflich sein.
Linux Server absichern
Root-Zugang unzugänglich machen
Zunächst richtet man ein User ein, damit man mittels User sich einloggt und erst als User sich Rootrechte verschafft.
Denn man sollte es unterbinden sich direkt als Root einloggen zu können.
1.Als Root angemeldet, können wir soviele Benutzer erstellen wie wir
wollen, in unserem Beispiel bleiben wir aber bei dem Benutzer "samp" .
Nun haben wir einen neuen Benutzer "samp" erstellt.
2. Jetzt benötigt der Benutzer "samp" noch ein Heimat Verzeichnis
3. Nun müssen wir dem Benutzer "samp" das Home-Verzeichnis zuweisen
inklusive allen Rechten, die er benötigt, um ausgeführt zu werden.
4. Um den Benutzer "samp" ein Passwort zuzuweisen
Nach dem Bestätigen wird man aufgefordert ein Passwort einzugeben und es zu wiederholen.
Ich rate hierbei ein sicheres Passwort zu nutzen, um Risiken durch Fremde zu vermeiden.
Jetzt kann man sich als User anmelden und mittels "su" + das Root Passwort in den Root Account wechseln.
Bitte bevor ihr weiter macht erst prüfen ob es geht und man aus dem User
Account auch in den Root Account wechseln kann, denn durch die nächste
Bearbeitung wird der direkte Root Zugang unterbunden.
Nun müssen wir noch die Konfigurationsdatei des SSH Zugangs bearbeiten und bearbeiten die Konfiguration mittels Editor "vi".
Hier verbenen wir einen eigenen Port, denn der Port sollte nicht auf Port22 bestehen bleiben.
# What ports, IPs and protocols we listen forPort 123456
Mit diesem Eintrag kann man eine bestimmte IP-Adresse zuweisen.
#ListenAddress ::ListenAddress 123.123.123.123
den meisten Anbiete bekommt man eine zweite IP-Adresse zum Paketpreis
dazu und dass ist sehr zu empfehlen. Denn die Domains laufen auf der
Server IP-Adresse und so ist es kein Problem Angriffe mittesl Server IP
oder Domains zu starten. Hat man eine IP-Adresse worauf keine Domain
laufen wird es schwierig werden diese zu ermitteln. Daher kann man in
solch einem Fall einfach die zweite IP in der Konfiguration verwenden
und wenn jemand es versucht der kennt nur die Domains und die IP worauf
die Domains sich beziehen. Das kann man noch soweit ausweiten dass man
mittels Iptables die Ports 20-21 für den FTP-Server auf der Server-IP
verbietet und falls notwendig diese nur auf der zweiten IP freigibt und
dann nur diese IP fürs FTP Zugang genutzt wird. Dass kann man auch
weiter ausbauen in dem man Plesk, Webmins und alles was mit der Server
Administration zu tun hat über die bekannte Server IP verbietet und nur
über die zweite IP frei gibt die nicht bekannt ist.
Da eine sehr gute Absicherung und selbst wenn eine zweite IP etwas kosten würde ich diesen Weg sehr empfehlen.
Es gibt noch einige gute Programme mit denen man sich zusätzlich
absichern kann, ich werde hierzu aber jetzt nur die Links der
Anleitungen einstellen, denn die Seiten die ich jetzt hier einstellen
beschreiben es schon sehr gut.
Um
noch kurz darauf einzugehen, beim Denyhosts werden Zugriffsversuche
gesperrt. Hierbei sollte man in der Konfiguration ALL auswählen denn
dann werden laut der Log Datei alle Zugriffsversuche die Fehlgeschlagen
sind geblockt.
Fail2Ban arbeitet auch so ähnlich und ist auch ein sehr mächtiges
Werkzeug dazu. Man kann in Fai2ban auch Zugriffe auf dem Mailserver
blocken oder auch auf dem DNS Server.
Mit PortSentry kann man verhindern dass das System nach offene Ports
abgescannt wird. Denn vor einem Angriff oder Zugriffsversuche versucht
man ein System zu durchsuchen um mehr Informationen über bestimmte Ports
zu erhalten.
Zu diesen Porgrammen kann man sich hier auch noch äußern oder Falls irgend welche Problem bestehen helfe ich gerne weiter.
Jetzt kommt natürlich noch der Mailserver, denn dieser muss nicht nur richtig konfiguriere sein,
damit man nicht abgewiesen wirdsondern der muss auch etwas abgesichert werden. Denn wir wollen ja
nicht dass der Server zur Spamschleuder wird und irgendwann sogar auf
einer
SpamBlacklist landet.
Was ich empfehlen kann ist dass der Server ein Hallo versendet, denn
viele Mailserver nehmen Mails nicht an wenn sie nicht begrüßt werden.
Das scheint jetzt Lustig rüber zu kommen aber Spammails beinhalten
meistens kein Helo und daher nimmt man diese Methode auch zur
Spamvermeidung an. Wir selber sollten dann auch den Mailserver so
konfigurieren dass wir ein Hallo haben wollen. Dann kann man den Serber
auch so konfigurieren dass Mails die auf der SpamBlacklist bestehen
nicht angenommen werden.
Man sollte sich dann noch überlegen eine eigene Firewall mittels
iptables einzurichten, damit die Ports gesperrt werden die nicht genutzt
werden.
So dann hoffe ich wiedermal etwas geholfen haben zu können.
DDoS mittels Iptables abwehren
Hier mal eine Möglichkeit mittels Iptables DDos Angriffe entgegen zu wirken.
Allerdings muss man dabei bedenken dass der Server trotz sperre
überlastet werden kann, denn es wird nur der Zutritt verwehrt, aber der
Traffic der dabei einsteht nicht verhindert.
Erste Regel - Limit NEW Datenverkehr auf Port 80
sudo iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT
Limit-burst "ist ein wenig verwirrend, aber es werden 200 neue
Verbindungen (Pakete wirklich) erlaubt, bevor die Grenze von 50 neue
Verbindungen (Pakete) pro Minute anliegt.
Zweite Regel - Grenze Verkehr gegründet
Diese Regel gilt für VERBINDUNG und etablierte den gesamten Datenverkehr
auf allen Ports, ist aber sehr liberal (und sollte daher keinen
Einfluss auf den Verkehr auf Port 22 oder DNS).
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
Hier werden innerhalb von pro Sekunden nur 50 Pakete erlaubt.
Habe es aber auch erst eingerichtet und noch nicht ausgestestet, daher
kann es sein dass die Werte noch etwas angepasst werden können.
Limit für Syn-Flood attacken:
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
Ungültige Tcp-Packete loggen und verwerfen:
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "Stealth Scan"
So dann noch mittels iptables-save abspeichern und mittels iptables-save> /etc/firewall.conf für den Serverstart sichern, denn mittels /sbin/iptables-restore < /etc/firewall.conf lade ich meine Firewall bei jedem Serverstart neu.
Mit Iptables Länder ausschließen
Das Script möchte ich hier nochmals einstellen.
Es muss aber falls noch nicht vorhanden das Verzeichnis "/etc/sysconfig/" angelegt oder halt im Script umbenannt werden.
In der ISO kann können dann mit einem Leerzeichen Abstand die Länderkennungen eingetragen werden.
Dann nur noch einmal die Woche ein cron laufen lassen, damit immer die IP-Adressen aktuell gehalten werden.
Das sind meine Länder die erstmals ausgeschlossen habe: "cn ru tw".
Mittels "iptables -L -n -v" kann man im Anschluss auslesen was für Regeln eingerichtet wurden.
#!/bin/bash ### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ### ISO="af cn" ### Set PATH ### IPT=/sbin/iptables WGET=/usr/bin/wget EGREP=/bin/egrep ### No editing below ### CBLIST="countrydrop" ZONEROOT="/var/iptables" IPTCBRESTORE="/etc/sysconfig/iptables.cb" ALLOWPORTS=80,443 MAXZONEAGE=7 DLROOT="http://www.ipdeny.com/ipblocks/data/countries" cleanOldRules(){ $IPT -L $CBLIST > /dev/null 2>&1 if [ $? = 0 ] ; then $IPT -D INPUT -j $CBLIST $IPT -D OUTPUT -j $CBLIST $IPT -D FORWARD -j $CBLIST fi TOPIP=`$IPT -L -n | grep Chain | cut -f 2 -d ' ' | grep '\-$CBLIST'` for i in $TOPIP do $IPT -F ${i} $IPT -X ${i} done $IPT -X $CBLIST } updateZoneFiles() { ZONEARCH=${ZONEROOT}/arch mkdir -p ${ZONEARCH} find ${ZONEROOT} -maxdepth 1 -mindepth 1 -ctime +${MAXZONEAGE} -exec mv {} ${ZONEARCH} \; for c in $ISO do # local zone file tDB=$ZONEROOT/$c.zone if [ -f $tDB ] ; then printf "Zone file %s is new enough - no update required.\n" $tDB else # get fresh zone file if it is newer than MAXZONEAGE days $WGET -O $tDB $DLROOT/$c.zone fi done oldzones=`find ${ZONEROOT} -mindepth 1 -maxdepth 1 -type f -exec basename {} \; | cut -f 1 -d '.'` # Archive old zones no longer blocked for z in $oldzones ; do archme=${c} for c in $ISO ; do if [ $c = $z ] ; then archme="X"; fi done if [ $archme = $z ] ; then mv ${archme} ${ZONEARCH} else printf "Working from previous zone file for %s\n" ${z} fi done } createIPTLoadFile() { printf "# Generated by %s on" $0 > ${IPTCBRESTORE} printf "%s " `date` >> ${IPTCBRESTORE} printf "\n*filter\n" >> ${IPTCBRESTORE} # Create CBLIST chain printf ":$CBLIST - [0:0]\n" >> ${IPTCBRESTORE} printf "%s INPUT -j $CBLIST\n" "-I" > ${IPTCBRESTORE}.tmp printf "%s OUTPUT -j $CBLIST\n" "-I" >> ${IPTCBRESTORE}.tmp printf "%s FORWARD -j $CBLIST\n" "-I" >> ${IPTCBRESTORE}.tmp if [ "Z${ALLOWPORTS}" = "Z" ] ; then printf "Blocking all traffic from country - no ports allowed\n" else printf "%s $CBLIST -p tcp -m multiport ! --dports ${ALLOWPORTS} -j RETURN\n" "-I">> ${IPTCBRESTORE}.tmp fi for c in $ISO do # local zone file tDB=$ZONEROOT/$c.zone # country specific log message SPAMDROPMSG="$c Country Drop" # Create drop chain for identified packets CBLISTDROP=${c}-${CBLIST}-DROP printf ":${CBLISTDROP} - [0:0]\n" >> ${IPTCBRESTORE} printf "%s ${CBLISTDROP} -j LOG --log-prefix "$SPAMDROPMSG"\n" "-A" >> ${IPTCBRESTORE}.tmp printf "%s ${CBLISTDROP} -j DROP\n" "-A" >> ${IPTCBRESTORE}.tmp # Load IP ranges into chains correlating to first octet BADIPS=$(egrep -v "^#|^$" $tDB) for ipblock in $BADIPS do topip=`echo $ipblock | cut -f 1 -d '.'` chainExists=`grep -c :${topip}-${CBLIST} ${IPTCBRESTORE}` if [ $chainExists = 0 ] ; then printf "Creating chain for octet %s\n" ${topip} printf ":$topip-$CBLIST - [0:0]\n" >> ${IPTCBRESTORE} sip=${topip}.0.0.0/8 printf "%s $CBLIST -s ${sip} -j $topip-$CBLIST\n" "-A" >> ${IPTCBRESTORE}.tmp fi printf " Adding rule for %s to chain for octet %s\n" ${ipblock} ${topip} printf "%s $topip-$CBLIST -s $ipblock -j ${CBLISTDROP}\n" "-A" >> ${IPTCBRESTORE}.tmp done done cat ${IPTCBRESTORE}.tmp >> ${IPTCBRESTORE} && rm -f ${IPTCBRESTORE}.tmp printf "COMMIT\n# Completed on " >> ${IPTCBRESTORE} printf "%s " `date` >> ${IPTCBRESTORE} printf "\n" >> ${IPTCBRESTORE} } directLoadTables() { # Create CBLIST chain $IPT -N $CBLIST $IPT -I INPUT -j $CBLIST $IPT -I OUTPUT -j $CBLIST $IPT -I FORWARD -j $CBLIST if [ "Z${ALLOWPORTS}" = "Z" ] ; then printf "Blocking all traffic from country - no ports allowed\n" else $IPT -I $CBLIST -p tcp -m multiport ! --dports ${ALLOWPORTS} -j RETURN fi for c in $ISO do # local zone file tDB=$ZONEROOT/$c.zone # country specific log message SPAMDROPMSG="$c Country Drop" # Create drop chain for identified packets CBLISTDROP=${c}-${CBLIST}-DROP $IPT -N ${CBLISTDROP} $IPT -A ${CBLISTDROP} -j LOG --log-prefix "$SPAMDROPMSG" $IPT -A ${CBLISTDROP} -j DROP # Load IP ranges into chains correlating to first octet BADIPS=$(egrep -v "^#|^$" $tDB) for ipblock in $BADIPS do topip=`echo $ipblock | cut -f 1 -d '.'` $IPT -L $topip-$CBLIST > /dev/null 2>&1 if [ $? = 1 ] ; then printf "Creating chain for octet %s\n" ${topip} $IPT -N $topip-$CBLIST sip=${topip}.0.0.0/8 $IPT -A $CBLIST -s ${sip} -j $topip-$CBLIST fi printf " Adding rule for %s to chain for octet %s\n" ${ipblock} ${topip} $IPT -A $topip-$CBLIST -s $ipblock -j ${CBLISTDROP} done done } loadTables() { createIPTLoadFile ${IPT}-restore -n ${IPTCBRESTORE} #directLoadTables } # create a dir [ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT # clean old rules cleanOldRules # update zone files as needed updateZoneFiles # create a new iptables list loadTables exit 0
Mit freundlichen Grüßen
Jaybinda