Erste Schritte für Neulinge
Rootabsicherung und mehr
Inhalt
1. SSH
1.1. SSH - Port verlegen
1.2. SSH - Keys einrichten
1.3. Benachrichtigung bei SSH - Login
2. Rootupdates
3. MySQL
3.1. MySQL Portvelegung
3.2. MySQL - Fehlerlogging anschalten
3.3. Per MySQL-Programm connecten + neue Verbindung legen
3.4. MySQL - Verbindungen gezielt per iptables zulassen
4. Cronjobs
4.1. Einrichtung von Cronjobs
4.2. Beispiel eines Cronjobs mit Script
4.3. Löschen von Cronjobs
4.4. Schattenseiten von Cronjobs
5. Standarteditor ändern
6. iptables
6.1. iptables permanent machen
6.2. Einige Befehle der iptables
6.3. Webserver per iptables gegen DoS sichern
7. fail2ban
7.1. fail2ban konfigurieren
7. apache2
7.1. VirtualHosts
9. Teilen von Daten
9.1. Owncloud
1. SSH
1.1. SSH - Port verlegen
Den SSH - Port zu verlegen, ist nicht so schlimm und hat keine weitreichende Folgen, wie den SSH - Key einzurichten. Hier könnt Ihr Notfalls einen Portscan machen, sofern Ihr den Port vergesst.
Um ihn zu verlegen, müsst Ihr folgendes tun und verändern:
Quote:
|
sudo nano /etc/ssh/sshd_config
|
Dann ändert Ihr folgende Zeile:
Quote:
Den Port könnt Ihr auf Euren belieben ändern, doch solltet Ihr einen unbenutzten Port nehmen. Um die Änderung vollständig zu machen, noch folgendes in die Console hauen:
Quote:
Damit habt Ihr den Port geändert und müsst beim Einloggen immer den veränderten Port angeben.
1.2. SSH - Keys einrichten
SSH - Keys sind wie Fingerabdrücke - einzigartig. Dieses ist im Vergleich zum normalen Root+pw login sicherer, da der Root eine Kennung schickt, die den Schlüssel identifiziert. Durch ein Belegen eines Passwort auf dem Key ( = Passphrame) machen wir den Key sicherer, nicht die Keykennung vom Root.
Es gibt viele Gründe, den Login per SSH-Key nur noch zu erlauben. Es macht den Root sicherer, man muss diesen "Fingerabdruck" besitzen, um überhaupt raufzukommen. Ansonsten wird man permanent vom Root abgelehnt und durch Regeln in den apf / iptables kann eine IP permanent gebannt werden. Ein Mittel gegen DDoS / Bruteforce oder unangenehmen Spielern.
Kommen wir zur Einrichtung. Wir benötigen PuTTY in der Vollversion (Installer!).
Sofern wir es installiert haben, öffnen wir
PuTTYgen.
Sofern noch nicht ausgewählt, stellen wir auf SSH-2 RSA und die Zahlen der Bits auf 2048.
Danach klicken wir auf die Schaltfläche
Generate.
Damit wir ihn generieren, müssen wir über die Fläche dadrunter streichen. Egal wie, Hauptsache der Mauszeiger bewegt sich dortdrin.
Danach sieht unser Fenster so aus:
Wir brauchen nun folgende Sache, die habe ich mal umrahmt:
Den "ssh-rsa ..." benötigen wir, um diesen Key auf dem Root einzurichten. Dazu loggen wir uns auf unseren Root ein und machen folgendes:
Quote:
mkdir ~/.ssh
chmod 0700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 0644 ~/.ssh/authorized_keys
sudo nano ~/.ssh/authorized_keys
|
Nun kopieren wir alles ein, welches auf dem letzten Bild markiert wurde, sprich "ssh-rsa ...derrest..." und speichern es ab.
Nun habt Ihr erfolgreich einen SSH - Key eingebunden. Vergesst nicht, auf Save Publickey (das mit dem rsa-ssh etc) zu speichern und natürlich den Privatekey. Der Privatekey (.ppk) ist die Wichtigste Datei, denn ohne ihn kommt Ihr nicht mehr rauf, wenn Ihr den Passwortlogin ausgeschaltet habt.
Bevor Ihr weiter macht, testet es mit dem Key! Funktioniert es, könnt Ihr weitermachen.
Nun schalten wir den Passwortlogin aus. Dafür geben wir folgendes in die Console ein:
Quote:
|
sudo nano /etc/ssh/sshd_config
|
Um den Passwortlogin vollständig auszuschalten, ändern wir folgende Zeilen so ab:
Quote:
[...]
PasswordAuthentication no
[...]
UsePAM no
[...]
|
Abspeichern und freuen. Abschließend müssen wir den SSH restarten, um nun nur noch mit dem SSH-Key einloggen zu können.
Passwortlogin wird dadurch vollständig abgeschaltet! Im schlimmsten Falle könnt Ihr Euren Root neu aufsetzen.
Quote:
Geschafft! Loggt Ihr Euch nun mit Username und ohne Passphrame ein, so kommt eine Fehlermeldung. Ihr müsst Euch nun immer mit dem Passphrame einloggen, denn ohne Ihn verwehrt Euch der Root den Zugriff.
1.3. Benachrichtigung bei SSH - Login
Man teilt sich den Root und möchte gern wissen, wer unter welcher IP oder zu welchem Zeitpunkt auf den Root zugreift. Dieses können wir vielfältig machen, eines ist jedoch schnell und unkompliziert eingerichtet und der User bekommt von der "Aufnahme" des Logins nichts mit.
Bei einem Login schicken wir eine EMail vom Root an unsere Adresse. Dieses passiert automatisch, es zeichnet jeden Login mit.
Shellscript:
Code:
#!/bin/bash
echo "Login auf $(hostname) um $(date +%H:%M) am $(date +%Y-%m-%d)"
echo "Folgender Benutzer loggte sich ein: $USER"
echo
finger
Dieses Script speichern wir als shell-login.sh in /opt/ ab (es sieht dann so aus: /opt/shell-login.sh). Damit das Script ausgeführt wird, geben wir es die chmodrechte 755. Dieses tun wir wie folgt:
Code:
chmod 755 /opt/shell-login.sh
Damit das Script auch ausgeführt wird, müssen wir folgende Zeile in /etc/profile einfügen:
Code:
/opt/shell-login.sh | mailx -s "SSH Login auf Root XXXX" 
Loggt Euch nun via 2. Console oder WinSCP ein und ihr habt eine EMail in Eurem Postfach.
2. Rootupdates
Um den Root immer auf den neuesten Stand zu halten, reloaden wir alle Updatelisten und updaten die Packages, die wir darauf installierten. Das machen wir wie folgt in die Reihenfolge
Quote:
apt-get update
apt-get upgrade
|
Schon habt Ihr die Updates vollzogen. Ihr könnt es auch per Cronjob einrichten, doch habt Ihr dann nie die Kontrolle, was gerade geupdatet wurd.
3. MySQL
3.1. MySQL Portverlegung
Der Vorteil daran ist, dass der Standartport 3306 nicht instant von Bots etc. angegriffen wird. So kann man den Port z.B. auf 5541 verlegen, je nachdem, wie Ihr ihn am Besten meint. Ihr müsst in Scripts / Websites / Programmen (PServer etc.) den Port auch mit verlegen, sonst kommen Errors raus. Wie bei den SSH - Portvelegung, geht dieses relativ schnell und ist mit keinen nachtragenden Risiken verbunden.
Ihr öffnet folgende Datei:
/etc/mysql/my.cnf
Quote:
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
|
Das Fettgedruckte ändert Ihr in Euren beliebigen Port. Der angegebene neue Port darf nicht belegt sein! Nun restartet Ihr den MySQL - Server und er hört auf den neuen Port mit folgenden Befehl:
Quote:
service mysql restart
oder
/etc/init.d/mysql restart
|
3.2. MySQL - Fehlerlogging anschalten
Ein Errorlog kann viele Vorteile mit sich bringen. Wenn der MySQL - Server nicht anspringt oder es andere Errors gibt, so können diese in dem Errorfile nachgelesen werden. Dieser Schritt wird oft Debugging genannt.
Um den Errorlog zu aktivieren, müssen wir in der Datei
/etc/mysql/conf.d/mysqld_safe_syslog.cnf folgendes reinkopieren:
Quote:
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
[mysqld]
log_error=/var/log/mysql/mysql_error.log
|
Nun bekommt keinen Schreck, weil schonmal einen mysqld_safe drin steht. Die Datei sieht danach folgendermaßen aus:
Quote:
[mysqld_safe]
syslog
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
[mysqld]
log_error=/var/log/mysql/mysql_error.log
|
Mit einem Restart des MySQL - Servers haben wir es erfolgreich aktiviert und Ihr könnt den Errorlog in dem angegebenen Pfad in dem Log nachlesen. Restarten tut ihr folgendermaßen:
Quote:
service mysql restart
oder
/etc/init.d/mysql restart
|
3.3. Per MySQL-Programm connecten + neue Verbindung legen
Eine Verbindung von außen zuzulassen ist immer ein Sicherheitsrisiko. Dieses sollte jeden bewusst sein.
Um auf die Datenbank connecten zu können, müssen wir in der MySQL - Configdatei etwas abändern. Wir kommentieren die bind-address mit einer Raute aus. Wie folgt:
/etc/mysql/my-cnf
Danach restarten wir den MySQL - Server:
Code:
service mysql restart
Nun haben wir den Grundstein gelegt, nun machen wir uns ans Werk. Wir downloaden HeidiSQL oder SQLYog, ich werde anhand des zweiten Programm erklären. Die Schritte bleiben bei allen Gleich, da gibt es ggf. nur in der Benennung Unterschiede.
Wir öffnen SQLYog und tragen folgendes unter den Tab MySQL ein:
Danach gehen wir in den Tab SSH und tragen folgendes ein:
Nun klicken wir auf
Test Connection... und folgendes sollten wir zu sehen bekommen:
Sollten das angezeigt werden, klicken wir auf Connect. Nun legen wir einen neuen User an, das machen wir in SQL-Yog wie folgt:
Um uns einen User mit vollen Rechten zu erstellen, müssen wir folgendes machen:
Nun testet Ihr den erstellten Account, indem Ihr folgendes macht (Kein SSH aktivieren!!!):
Nun klickt Ihr wieder auf
Test Connection... und erhaltet Ihr wieder die Meldung, dass die Verbindung erfolgreich war, habt ihr einen Account von außen zugänglich gemacht.
3.4. MySQL - Verbindungen gezielt per iptables zulassen
Was sind iptables? Dieses wird in
diesem Kapitel erklärt.
Um einen Angriff auf den Port abzuwehren, können wir präventiv rangehen. Warum sollten wir etwas erst machen, wenn der Fall eintritt? Hier werden wir uns mit der Absicherung des MySQL - Port beschäftigen und nur denen es erlauben zu connecten, denen wir vertrauen.
Zuerst fügen wir die Ausnahme für den Localhost und unserer IPs, wie z.B. Webserver, hinzu (wir gehen vom Standartport 3306 aus, wenn Ihr den geändert habt, dann nehmt Euren geänderten), danach schließen wir den Port für alle anderen. Sie bekommen einen REJECT-Befehl und können somit nicht connecten.
Code:
iptables $ -A INPUT -i lo -p tcp --dport 3306 -j ACCEPT
$ iptables -A INPUT -p tcp --dport 3306 -s XX.XX.XXX.X -j ACCEPT
$ iptables -A INPUT -p tcp --dport 3306 -s XX.XXX.X.X -j ACCEPT
$ iptables -A INPUT -p tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable
Somit sichern wir den Port gegen unerlaubte Zugriffe von Bots oder Dosangriffen ab.
4. Cronjobs
Cronjobs sind zeitbasierte, wiederkehrende Aufgaben, die automatisch durch den cron-daemon ausgeführt werden. Beispiele sind Löschen von Logs oder Archivieren anderer Dateien.
4.1. Einrichtung von Cronjobs
Bei der Einrichtung müsst ihr optionaler ein Shellscript (.sh) zu liegen haben, welches ausgeführt werden soll. Dieses läuft automatisch zu der eingegeben Zeit ab, ohne Euer zutun.
Dieses ist ein Beispiel mehrerer Cronjobs.
Wir öffnen folgendermaßen den Crobtabeditor:
Nun haben wir in der Console es offen, wie wir es oben haben. Bevor wir nun uns an die Gelegenheit machen, erkläre ich Euch die 5 bzw. 6 Sachen vor dem Pfad/Befehl:
Code:
Minute Stunde Tag Monat Wochentag Benutzer Befehl
*/5 * * * * root /usr/bin/mycrontab.sh
* 5,11 * * * root /usr/bin/mycrontab.sh
* 14 3 * * root /usr/bin/mycrontab.sh
* 4 24 12 * root /usr/bin/mycrontab.sh
* * * * * root /usr/bin/mycrontab.sh
* * * * 4 root /usr/bin/mycrontab.sh
Für Euch stehen nun einige Zeilen da. Folgende Angaben müsst Ihr noch wissen:
Quote:
Minuten: 0-59
Stunden: 0-23
Tag: 1-31
Monat: 1-12
Wochentag: 0-7
0 – Sonntag
1 – Montag
2 – Dienstag
3 – Mittwoch
4 – Donnerstag
5 – Freitag
6 – Samstag
7 – Sonntag
|
Lösen wir mal anhand der Beispiele nun genau auf, was der Befehl nun macht.
Code:
*/5 * * * * root /usr/bin/mycrontab.sh
Jede 5 Minuten (bei */10 - Minuten) lässt er das Script durchlaufen.
Code:
*/5 5,11 * * * root /usr/bin/mycrontab.sh
Jede 5 Minuten zur Stunde 5 Uhr und 11 Uhr (5 Uhr, 5.05 Uhr, 5.10 Uhr... 11 Uhr, 11.05 Uhr... bis max X.55) lässt der Cron-Deamon das Script starten. In den anderen Stunden macht er nichts.
Code:
* 14 3 * * root /usr/bin/mycrontab.sh
Jeden 3. Tag im Monat um 14 Uhr startet das Script, an allen anderen Tagen nicht.
Code:
* 4 24 12 * root /usr/bin/mycrontab.sh
Jedes 24.12 um 4 Uhr startet das Script. Oder, wer es einfacher haben möchte: Das Script startet nur an Heiligabend um 4 Uhr.
Code:
* * * * 4 root /usr/bin/mycrontab.sh
Jeden Donnerstag startet das Script. Ansonsten bleibt es unausgeführt.
Damit die Script laufen, brauchen sie Berechtigungen. Passt Euer Script soweit an, dass die ausgeführt werden können.
Kommen wir noch zu einem Thema, welches man viel hinter crobjobs findet:
Wir schlüsseln mal auf, was das heißen soll:
Damit werden die standartmäßigen Ausgaben, die per EMail an den jeweiligen Sysemnutzer ins Nirvana verschickt und man bekommt keine Email.
Die normale Ausgabe als auch Fehler werden an die vorher angegebene Datei umgeleitet. Bei >/dev/null davor ins Nirvana.
Um den Crontab mit den Verwerfungsscript zu kombinieren, bedarf es keinerlei Hilfe mit zusätzlichen Zeichen. Im unseren Falle sähe es so aus:
Code:
* * * * 4 root /usr/bin/mycrontab.sh >/dev/null 2>&1
Es gibt auch einige Tricks, die wir Anwenden können, um viele Sternchen, Einsen und Nullen bei der Einrichtung zu sparen. Hier liste ich Euch sie auf:
| String | Bedeutung | Cron-Schreibweise |
|---|
| @reboot | einmalig, beim Start | |
| @daily | einmal pro Tag | 0 0 * * * |
| @midnight | einmal pro Tag | 0 0 * * * |
| @hourly | einmal pro Stunde | 0 * * * * |
| @weekly | einmal pro Woche | 0 0 * * 0 |
| @monthly | einmal im Monat | 0 0 1 * * |
| @annually | einmal im Jahr | 0 0 1 1 * |
| @yearly | einmal im Jahr | 0 0 1 1 * |
Ihr könnt übrigens auch den Benutzer weglassen, dann werden die standartmäßig vom Rootuser ausgelöst und ausgeführt (siehe Bild oben).
4.2. Beispiel eines Cronjobs mit Script
MySQL - Dumpscript (fusioncms.sh)
Code:
#!/bin/sh
DIR="/var/backups/fusioncms"
DATUM=`date '+%d-%m-%Y__%H-%M'`
mysqldump -uUSER -pPASS -h localhost --opt DATABASE > $DIR/fusion-${DATUM}.sql
gzip -9 --best $DIR/fusion-${DATUM}.sql
Dieses sieht in der Crontabeditor dann so aus:
Was dort steht, sollte jeden Klar sein. Wir ziehen und einen mysqldump mit dem User+PW von der Datenbank DATABASE und zippen es dann. Alles geschieht in unserem angegebenen Pfad.
Dieses Script wird jede 4 Stunden ausgeführt. Woran ich es erkenne, steht bei 5.1., wo ich genau eingehe, was wo was zu bedeuten hat.
Dieses ist ein Beispielscript von einem Server, der sich im Livebetrieb befindet. Man kann das Script erweitern, dass es autoamtisch alte Backups löscht oder jeden Monat einen Wipe in einen Ordner (z.B. nennt man ihn Mai / Juli / September) macht.
4.3. Löschen von Cronjobs
Beim Löschen gehen wir wie beim Einrichten vor, wir starten zuerst den Crontabeditor:
Danach löschen wir die Zeile, die wir nicht mehr drin haben wollen und speichern es ab. Schon habt ihr den Crontab gelöscht.
4.4. Schattenseiten von Cronjobs
Cronjobs sind sehr erleichternd, sie sparen uns eine menge Arbeit. Die führen Updates automatisch aus, machen Datenbankbackups oder reinigen alte Logfiles. Doch nehmen wir mal an, wir überlassen einen Fremden den Root. Wir haben einige Programme am Laufen, beispielsweise einen TeamSpeakserver und einen Privatserver. Nun wollen wir eine außenstehende Person noch einen Privatserver draufmachen lassen, er möchte jedoch rootrechte haben.
Zum Thema Rootrechte und wie man diese einschränkt wird später näher eingegangen. Doch hier sei gesagt - Rootrechte zu vergeben kann ganz übel ausgehen, ein Beispiel werde ich hier zeigen.
Wir lassen die außenstehende Person auf dem Root rauf. Dieser hat die Absicht, den Root in den Abgrund zu treiben. Er hat einige Möglichkeiten, die ich kurz erläutere:
- Anlegung neuer Rootuser per sudoers im Cronjob
- Anlegung eines Cronjobs zum Löschen von Dateien
- Dauerrestart des Roots per Cronjob
Es gibt natürlich noch viel mehr. Nehmen wir das dritte Beispiel, den Dauerrestart des Roots. Dieses Script ist schnell geschrieben und der Cronjob würde so aussehen:
Code:
@reboot /pfad/zur/datei/restart.sh >/dev/null 2>&1
Somit wird bei jedem Restart die Datei ausgeführt werden, die widerum den Restartbefehl ausführt. Man sieht, dass dadurch der Root im Kreislauf des Dauerrestarts wird. Aus diesem kommt man nicht wieder raus, außer, man hat vergessen, die Rechte zu geben oder einen Tippfehler drin. Ansonsten wird eine neue Rootinstallation fällig.
Wie Ihr seht, können Cronjobs sehr hilfreich sein oder, wie in dem Beispiel, sehr viel Schaden zufügen. Man darf daher niemals mit dem Rootaccount herumspielen oder ihn weitergeben, den Rootlogin am Besten ganz ausschalten. Auf dem Rootaccount kommt Ihr weiterhin, wenn Ihr Euch als normalen User einloggt und zum Rootuser switcht, da müsst Ihr dann das Passwort für den Rootuser eingeben.
5. Standarteditor ändern
Auf linuxbasierten Systemen stehen mehrere Editoren zur Verfügung. Im Kapitel 5 dieses Tutorials seht Ihr auf den Bildern 2 verschiedene. Doch wie ändere ich den Standarteditor, sodass ich bei dem Crontabeditor eher auf nano anstatt vim treffe?
Mit folgenden Befehlen könnt Ihr den Standarteditor wechseln:
Code:
export EDITOR=/usr/bin/nano
export EDITOR=/usr/bin/vim
export EDITOR=/usr/bin/pico
export EDITOR=/usr/bin/editor
export EDITOR=/usr/bin/joe
Alternativ könnt Ihr interaktiv mit diesem Befehl euren Standarteditor aussuchen:
Code:
update-alternatives --config editor
Mein Favorit ist nano, doch hier möchte ich Eure Meinung nicht beeinflussen.
6. iptables
iptables ist unter Linux die weit verbreiteste Firewall. Sie ist im besten Falle bei der Installation gleich mit bei, sodass die gleich einsetzbar ist.
iptables ist ein Userspace-Programm zur Konfiguration von Tabellen, die durch die Firefall im Linux-Kernel bereigestellt werden. Die Tabellen (tables) enthalten Ketten (chains) und Regeln (rules).
6.1. iptables permanent machen
Alle Einträge der iptables sind nur temporär. Nach einem Reboot werden die Tabellen geleert. Es gibt verschiedene Möglichkeiten, um dieses zu umgehen. Von Cronjobs über Handarbeit bis hin zu Paketinstallationen. Ich empfehle Euch ein Paket, welches wir so installieren;
Code:
apt-get install iptables-persistent
Mit diesem Paket werden die Firewallregeln unter /etc/iptables abgelegt, die nach einem Serverreboot neu eingelesen werden.
6.2. Einige Befehle der iptables
Um mit den iptables gut arbeiten zu können, müssen wir deren Befehle kennen oder wissen, wo diese stehen.
Um alle bestehende Regeln anzeigen zu lassen, geben wir folgendes in die Console ein:
Eine IPv4 - Adresse bannen:
Code:
iptables -A INPUT -s <IP-ADRESSE> -j DROP
-A INPUT: hängt die Regeln an die INPUT Chain an
-s : ist die zu bannende IP Adresse
-j DROP: gibt die Aktion an, die ausgeführt werden soll, wenn die Regel greift. In diesem Fall DROP (verwerfen)
REJECT ist die schönere Lösung von DROP. So wird ein imcp - Paket an den Client gesendet, der nicht unnötig lange auf einen TCP - Timeout warten muss.
Eine IPv4 - Adresse entbannen:
Code:
iptables -D INPUT -s <IP-ADRESSE> -j DROP
-D: Delete
iptables per Hand speichern:
Code:
iptables-save > iptablessave.txt
iptables per Hand aus der File einlesen:
Code:
iptables-restore < iptablessave.txt
Es gibt noch viele weitere Befehle, die nach Bedarf und Nachfrage ergänzt werden.
6.3. Webserver per iptables gegen DoS sichern
Dieses ist nur begrenzt lauffähig, um einen starken DoS oder gar einen DDoS abwehren zu können, kann nur der Provider mit einer besseren Firewall. Dieses soll das lokal Einstellbare anzeigen, was auch an die Grenzen von iptables herankommt.
Bei einem vermeintlichen DoS/DDoS Angriff sollten wir unseren Netzwerkverkehr anschauen und sehen, wo die meisten Verbindungen herkommen. Dieses machen wir wie folgt:
Hier sehr ihr eine lange Liste, teils sehr unübersichtlich. Bei einer gut besuchten Website können bis zu 100 Zeilen dort stehen, da wird es schwierig, den Überblick zu halten.
Einfacher geht es, wenn wir es etwas sortieren und und anzeigen lassen, wie viele Connection von einer IP kommt. Dies machen wir wie folgt in der Console:
Code:
netstat -ant | grep TIME_WAIT | awk '{ print $5}' | cut -d ":" -f 1 | sort | uniq -c
Dieses zeigt die Verbindungen zu dem Root an. Der IE soll ca. 8 Verbindungen gleichzeitig offen halten, bis max 30 Verbindungen nehmen wir als normal an. Alles darüber können wir genauer betrachten. Bedenkt bitte, dass auch VErbindungen zum Root, wie WinSCP, PuTTY oder Datenbankverbindungen auch angezeigt werden, schlussfolgert und bannt nicht zu voreilig und betrachtet es eine Zeit lang.
Bei einer Größenordnung ab 35 (mein Erfahrungswert) können wir es genauer Betrachten. Sollte diese IP immer mehr connections aufbauen, schließen wir diese vom Root aus. Dieses machen wir per Hand wie folgt:
Code:
iptables -A INPUT -p tcp -s $AngreiferIP --destination-port 80 -j DROP
--destination-port 80: Standartport des Webservers
Bei einem größeren Angriff können wir alles nicht mehr per Hand machen. Wir stellen es in den iptables so ein, dass sie automatisch entgegenwirken. Das spart Zeit und der Server wird lokal etwas entlastet. Wir geben folgendes ein:
Code:
# Set proofed limits for http 1.1 clients (1.0 does not use pipelining)
$ iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 8 -j DROP
$ iptables -I INPUT -p tcp -m state --state NEW --dport 80 -m recent --name gestempelt --set
$ iptables -I INPUT -p tcp -m state --state NEW --dport 80 -m recent --name gestempelt --update --seconds 15 --hitcount 15 -j DROP
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Folgendes machen die Befehle:
(1) Man sperrt jeden Host, der mehr als eine neue Verbindung/Sek aufbauen möchte, wenn 8 bestehen
(2) versieht jede neue Verbindung mit einem Stempel (hier: gestempelt)
(3) Verwirft alle Pakete von einem Host für 15 Sekunden, wenn mehr als 15 neue Verbindungen mit dem Stempel "gestempelt" aufgebaut wurden.
(4) Akzeptiert alle Verbindungen zum Webserver.
Mit dem Script automatisieren wir die Abwehr, jedoch testet das Script vorher und passt es auf Eure Bedürfnisse an!
7. fail2ban
Mit dem Dienst fail2ban könnt Ihr einige Dienste überwachen. Neben SSH, Apache und FTP könnt ihr auch Eure Mailserver damit belegen. Fail2Ban, wie der Name schon halb sagt, bannt User nach einer bestimmten Anzahl an fehlgeschlagenen Einlogversuchen automatisch vom Server.
7.1. fail2ban einrichten
Code:
apt-get install fail2ban
Nachdem wir das Paket gedownloadet haben, haben wir in der
/etc/fail2ban/ die Datei namens jail.conf. Da diese nach jedem Update neu geladen wird, kopieren wir diese zu unserer jail.local.
Code:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Alle Änderungen tun wir in der jail.local, nicht in der jail.conf! Dieses steht nebenbei auch in der Datei mit drin.
Nun tätigen wir einige Grundeinstellungen. Dazu ändern wir ziemlich am Dateikopf folgende Zeilen:
Code:
ignoreip = 127.0.0.1
bantime = 600
maxretry = 3
Die Bantime geben wir in Sekunden an. Je nachdem, wie hoch Ihr Eure Sicherheit haben wollt, könnt Ihr bis zu Stunden hochgehen.
Kommen wir zu den SSH - Einstellungen (Punkt [SSH] in der Datei):
Code:
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Hier könnt Ihr den Log und die maximalen Versuche ändern. Ihr könnt die Überwachung durch das ersetzen von
true auf
false ganz ausschalten.
8. apache2
Der apache2 ist unser Webserver. Über ihn gelangen alle Daten in die Außenwelt. Neben Apache gibt es nginx, welches die beiden Größten auf dem Markt sind. Was wir alles damit anstellen können, erkläre ich hier etwas genauer.
8.1. VirtualHosts
Über die VirtualHosts können wir Domains in spezifische Ordner gucken lassen. Ruft der USer die IP auf, können wir beispielsweise nur in /var/www gucken lassen. Nimmt er die Domain "deinedomain.de", können wir ihn beispielsweise den Ordner /var/www/domain/deinedomain.de verweisen.
Damit das Ganze funktioniert, liefert apache sogar ein Beispiel mit.
9. Teilen von Daten
Heute gibt es viele verschiedene Möglichkeiten, Daten miteinander zu Teilen. Sei es eine Source, (un-)wichtige Dokumente, Fotos, Tabellen usw., kommt die Frage auf, welches Programm man dazu nutzt. Am Einfachsten ist der FTP - Server. Doch darüber hinaus gibt es heutzutage git-Repositorys, Clouds oder ältere SVNs. Jedes ha Vor- und Nachteile, worüber man sich im Klaren sein muss.
Ich werde hier einige Möglichkeiten vorstellen, um Daten untereinander auzutauschen.
9.1. Owncloud
Bei Owncloud gibt es verschiedene Möglichkeiten, diese Einzurichten. Wir bevorzugen den Download über apt-get. Um dieses zu ermöglichen, müssen wir die Quellen in unser Downloadrepo einbinden.
Code:
echo 'deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_7.0/ /' >> /etc/apt/sources.list.d/owncloud.list
wget -qO - http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_7.0/Release.key | apt-key add -
Um diese Quelle endgültig in das System einzupflegen, müssen wir unsere Repository updaten.
Code:
apt-get update
apt-get dist-upgrade
Haben wir dieses getan, ist es nicht mehr weit zur Fertigstellung. Nun Downloaden wir das Paket. Voraussetzungen ist ein Apache-Server (Stichwort LAMP) sowie ein funktionierender MySQL-Server odr MariaDB.
Code:
apt-get update owncloud
Haben wir dieses getan, ist die Installation soweit schon fertig. Nun kommen wir zu dem Teil, welchen wir im Webbrowser tätigen.
Dafür öffnen wir

. Alternativ für eine Domain könnt Ihr die IP eintragen. Ihr werdet nun durch die Installation geführt.
Wichtig ist hierbei, eine Datenbank manuell anzulegen. Wie das geht, erfahrt Ihr weiter oben im MySQL - Tutorial.
Habt Ihr alles eingerichtet, könnt Ihr ein DesktopClient auf

downloaden. Dieses funktioniert nach kurzer Einrichtung (URL sowie Logindaten) wie Dropbox.
Zu guter Letzt müssen wir bei der ausführlichen Ausarbeitung dieses Textes auf Quellen verweisen.
Solltet Ihr einen Wunsch haben, äußert Ihn mir. Der Thread wird weiter bearbeitet und ggf. erweitert.
Mit freundlichen Grüßen
Crazy