Die meisten von euch werden den Raspberry mit dem eigenen Netzwerk verbunden haben. Dies bedeutet meistens auch, dass er mit dem Internet verbunden ist. Ist dies der Fall, sollte man einige Einstellungen machen und Standartkonfigurationen ändern. In diesem Beitrag erkläre ich euch, wie ihr die Sicherheit eures Raspberrys im Internet erhöht.
Trotz diesen Änderungen ist natürlich keine 100%ige Sicherheit gewährleistet. Man ist jedoch schon einiges besser gegen Angriffen aus dem Internet abgesichert. Dennoch sollten regelmäßig Updates des Systems durchgeführt werden um immer aktuelle Sicherheitsupdates zu bekommen.
Contents
Passwort des Benutzers Pi ändern
Das Standard Passwort des Benutzers „Pi“ ist „raspberry“. Viele vergessen, das Standardpassowrt zu ändern und geben dem Hacker somit einen ersten Anhaltspunkt um auf euer System zugreifen zu können. Man sollte das Passwort also möglichst direkt nach der Ersteinrichtung ändern.
passwd
Das Passwort sollte aus mindestens 8 Zeichen, aus Groß- und Kleinbuchstaben sowie aus Sonderzeichen bestehen.
Benutzer „Pi“ löschen und durch neuen ersetzen
Um den Raspberry noch weiter abzusichern, kann man den Standardbenutzer „Pi“ löschen und durch einen neuen Benutzer ersetzen.
sudo useradd –m neuerBenutzer –G sudo
Erstellt den neuen Benutzer „neuerBenutzer“ und fügt ihn direkt der Gruppe „sudo“ zu. Dies ist nötig, damit der Benutzer später auch Befhle als root ausführen kann bzw. darf.
sudo passwd neuerBenutzer
Vergibt dem Benutzer ein neues Passwort, welches natürlich nach den oben genannten Kriterien gewählt werden sollte.
Nun solltet ihr euch mit dem neu angelegten Benutzer per SSH einloggen. Der nun nicht mehr benötigte Benutzer „Pi“ kann gelöscht werden.
sudo deluser –remove-home pi
SSH-Zugang absichern
Die Standartkonfiguration vom SSH-Zugang ist nicht gerade vorteilhaft für einen sicheren Raspberry. Um dies zu ändern bearbeiten wir die Konfigurationsdatei.
sudo nano /etc/ssh/sshd_config
Da wir uns nur mit unserem angelegten Benutzer einloggen werden können wir den Zugang mit dem root-Account deaktivieren. Hierzu setzen wir den Eintrag PermitRootLogin auf no
PermitRootLogin no
Da Standartmäßig Port 22 für den SSH-Zugang freigegeben ist, ist dieser Port die erste Anlaufstelle für Hacker. Um den Angriff etwas schwieriger zu gestalten, sollten wir den Port ändern. Der Port sollte größer 1023 sein. Ändern kann man dies, genauso wie den root-Login, in der Konfigurationsdatei indem man die Zeile „Port 22“ ändert. Zum Beispiel:
Port 1045
Um das wilde herumprobieren von Benutzernamen und Passwörter (sogenannte Brute Force Angriffe) zu unterbinden installieren wir das Paket „fail2ban“. Dies sperrt IP-Adressen nach einer voreingestellten Anzahl von Fehlversuchen.
sudo apt-get install fail2ban
Bei den Standarteinstellungen werden nun Angreifer nach 3 Fehlversuchen innerhalb von 10 Minuten für 10 Minuten gesperrt. Geändert kann dies unter /etc/fail2ban/jail.conf
sudo nano /etc/fail2ban/jail.conf
Regeln für die Firewall einrichten
Der Raspberry stellt Standardmäßig eine Firewall zur Verfügung. Es sind jedoch keine Regeln eingerichtet. Der Raspberry nimmt also jede Netzwerkverbindung an.
Ich persönlich verwende folgende Regeln (einfach in die SSH-Verbindung kopieren):
Erlauben von lokalen Verbindungen:
sudo iptables -A INPUT -i lo -j ACCEPT
nicht eindeutige Pakete verwerfen:
sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP sudo iptables -A INPUT -f -j DROP sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
Datenverbindungen erlauben die zu einer bereits bestehenden Verbindung gehören:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
SSH erlauben (Port entsprechend anpassen)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Sollte auf dem Raspberry eine FHEM-Installation laufen, ist es wichtig die Ports in der Firewall einzutragen:
sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8083 -j ACCEPT sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8084 -j ACCEPT sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8085 -j ACCEPT
Zum Schluss sollten dann alle anderen Verbindungen blockiert werden:
sudo iptables -A INPUT -j REJECT
Wichtig: Diese Regel muss zum Schluss eingetragen werden. Alle danach eingetragene Regeln werden nämlich ignoriert.
Nun müssen die Regeln noch abgespeichert werden:
sudo sh -c "iptables-save > /etc/network/iptables"
Alle aktiven Regeln könnt ihr euch wie folgt anzeigen lassen:
sudo iptables –L
Es gibt jedoch noch ein kleines Problem. Nach einem Neustart des Systems werden die Regeln nicht wieder automatisch aktiviert. Um dies zu umgehen erstellen wir uns ein ausführbares Skript, welches die Regeln nach einem Neustart wieder aktivieren:
sudo touch /etc/network/if-pre-up.d/iptables
Es wird eine Datei erstellt, welche mit folgendem Befehl ausführbar gemacht wird:
sudo chmod +x /etc/network/if-pre-up.d/iptables
Die auszuführende Datei wird nun bearbeitet
sudo nano /etc/network/if-pre-up.d/iptables
damit die Regeln nach einem Neustart aktiviert werden:
#!/bin/sh /sbin/iptables-restore /etc/network/iptables
Mit „Strg+X“, „Y“ und „Enter“ abspeichern. Nach einem Neustart werden nun die Regeln automatisch wieder aktiviert.
Optionale Firewall-Regeln
Je nach Anwenderfall müssen natürlich noch weitere Regeln definiert werden. Je nachdem welche benötigt werden einfach kopieren und in eure SSH-Sitzung einfügen.
# FTP-Zugriff aktivieren sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT # Samba Server erlauben sudo iptables -A INPUT -p udp -m state --state NEW -m udp --dport 137 -j ACCEPT sudo iptables -A INPUT -p udp -m state --state NEW -m udp --dport 138 -j ACCEPT sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 139 -j ACCEPT sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 445 -j ACCEPT # HTTP & HTTPS – Webzugriff erlauben sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT # TightVNC Server erlauben sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 5901 -j ACCEPT # XRDP Server erlauben sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 3389 -j ACCEPT
Anschließend wieder abspeichern:
sudo sh -c "iptables-save > /etc/network/iptables"
Sollte bereits der Eintrag für das Sperren der übrigen Verbindungen eingetragen sein, so müssen weitere Einträge manuell vor diesem eingetragen werden. Am besten geschieht dies über den nano-Editor:
sudo nano /etc/network/iptables
Wichtig ist hier die Zeile „reject-with icmp-port-unreachable“. Diese muss als letzte stehen:
Weitere Befehle:
Anzeigen der Regeln:
sudo iptables -L
Regeln auf Standard zurücksetzen:
sudo iptables -F
Weitere Infos hier (Ubuntu Wiki)
Hallo, nachdem ich der Anleitung gefolgt bin komme ich nicht mehr per SSH auf meinen Raspi. Da ich dort keinen Bildschirm und keine Tastatur angeschlossen habe, wie kann ich die Einstellungen zurücksetzen ohne das komplette System neu aufsetzen zu müssen?
Hallo Jörg,
ich habe alle Schritte nochmal auf meiner Testumgebung durchgeführt. Alles hat funktioniert. Auch die SSH-Verbindung ist weiterhin möglich.
Ich vermute deshalb, dass bei dir bei der Firewall-Konfiguration etwas schief gegangen ist. Wichtig ist, dass der korrekte Port für die SSH-Verbindung in die Firewall eingetragen ist.
Solltest du zum Beispiel den SSH-Port geändert haben, dann muss dieser geänderte Port auch entsprechend in die Firewall eingetragen sein.
sudo iptables -A INPUT -p tcp –dport 22 -j ACCEPT
Dann zum Beispiel Port 1450 statt 22. Aber dieser Hinweis hilft dir ja nun leider recht wenig 😉 Ich muss dir leider sagen, dass der einfachste Weg, dass Anschließen einer Tastatur/Maus ist. Eine weiterer Weg ist natürlich der, dass man die SD-Karte vom Raspberry in einen Computer / Laptop steckt. Unter Windows wird dafür jedoch ein Programm benötigt, damit das Filesystem von Linux erkannt wird. Hier wird alles gut erklärt:
https://www.howtoforge.com/access-linux-partitions-from-windows
Wenn man auf das Dateisystem zugreifen kann, dann kann man ja die Firewallkonfiguration löschen bzw. ändern –> /etc/network/iptables
Gruß Daniel
Hallo Daniel,
nachdem ich nun mit ein wenig Herumprobieren das SSL-Problem gelöst habe (anderer Kommentar), habe ich nun versucht, diese Anleitung abzuarbeiten. Leider sind mir ein paar Fehler unterlaufen, die nun Konsequenzen haben.
1. Ich wollte den „pi“-User löschen, als ich noch als „pi“ angemeldet war. Viele Fehlermeldungen, da ein bestimmter Prozess noch lief, anscheinend aber keine direkten Konsequenzen, mal abgesehen von einem zerschossenen Useraccount.
2. Ich habe die sshd_config-Datei angepasst und gespeichert, danach wollte ich fail2ban installieren. Diverse Fehlermeldungen bei der Installation, weil einige Ordner nicht gefunden waren (habs leider nicht geloggt), scheint aber irgendwie geklappt zu haben
3. Neustart, versucht über SSH als root einzuloggen: ging nicht (logischerweise, habs ja abgeschaltet)
4. mit neuem Nutzernamen angemeldet,
sudo iptables -A INPUT -i lo -j ACCEPT
ausgeführt, das hier erhalten:
Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus:
#1) Resprektieren Sie die Privatsphäre anderer.
#2) Denken Sie nach bevor Sie tippen.
#3) Mit großer Macht kommt große Verantwortung.
[sudo] password for root:
_______________________________________________________________
Ein Passwort aber ich meiner Meinung nach für root nie gesetzt (war früher login without password), alle meine Standardpasswörter (falls ich doch irgendwann mal eines gesetzt hatte) gehen nicht. Damit kann ich den Rest nicht durchführen.
5. Den pi an einen Monitor angeschlossen, dort wollte ich die Konsole aufrufen
–>Neuerdings eine Passwortabfrage beim Start. Mein neu erstellter User mit dem dazugehörigen Passwort geht, hat aber natürlich keine root Rechte. Die interne Konsole hat die selben Einschränkungen wie die Externe.
6. sshd_config-Datei über den Filebrowser geöffnet
–>alter Stand mit root–>no password
7. Eine Menge Fragezeichen
Ich wäre dir für deine erneute Hilfe wieder mal dankbar.
MfG Sebastian
Hallo Sebastian,
das löschen eines angemeldeten Benutzers war natürlich nicht so sinnvoll. Aber davon mal abgesehen 😉
So wie es aussieht hat der neu angelegte Benutzer keine root Rechte, deswegen meckert er rum als du die Firewall einrichten wolltest und fragt nach einem root-Passwort. Der root-Benutzer hat jedoch normalerweise kein Passwort und muss deswegen erst gesetzt werden.
Mit dem Befehl „sudo su“ wechselst du zum root-Benutzer und kannst dann mit „passwd“ ein root-Passwort setzen.
Die ganzen Fehlermeldungen erscheinen vermutlich weil der neue Benutzer keine root-Rechte hat, wie du bereits erwähnt hast. Dennoch müsste er Befehle mit root-Rechte ausführen können, der neue Benutzer wurde ja der Gruppe „sudo“ hinzugefügt (sudo useradd –m neuerBenutzer –G sudo).
Ich würde nun erstmal für den root-Benutzer ein Passwort setzen und dann überprüfen in welchen Gruppen der neu angelegte Benutzer ist, dies geht mit dem Befehl „id“. Sollte sich dieser noch nicht in der „sudo“ Gruppe befinden, dann mit dem Befehle „sudo usermod -aG sudo neuerBenutzer“.
Danach kannst du ja dann nochmal probieren die iptables zu setzen bzw. zu bearbeiten.
Gruß Daniel
Hallo Daniel,
danke für den Hinweis aber so weit komme ich ja gar nicht erst. Egal welchen su Befehl ich eingebe, es erscheint sofort:
„Wir gehen davon aus, dass der lokale Systemadministrator Ihnen die
Regeln erklärt hat. Normalerweise läuft es auf drei Regeln hinaus:
#1) Resprektieren Sie die Privatsphäre anderer.
#2) Denken Sie nach bevor Sie tippen.
#3) Mit großer Macht kommt große Verantwortung.
[sudo] password for root:“
________________________________________________________________________
Ich habe jetzt mal versucht, die SD-Karte über einen Ext-Reader einzubinden, was auch soweit klappt. Leider finde ich die verdammte cmdline.txt-Datei nicht, in der ich das Passwort zurücksetzen könnte. Ich suche schon in der versteckten root-Partition aber die Datei ist nicht zu finden. Auch andere Methoden (siehe hier http://raspberrypi.stackexchange.com/questions/37666/noobs-reset-password-debian) scheinen hoffnungslos zu sein.
Ich werde wohl ein manuelles Backup vom fhem-Ordner ziehen müssen und den pi neu aufsetzen…
MfG Larimow
Hallo Daniel,
wie geht es weiter, wenn ich auf die Config-Datei mit sudo nano /etc/ssh/sshd_config komme? Wo kann ich PermitRootLogin no ändern bzw. eintragen.
Wenn ich PermitRootLogin no als neue Zeile hinzufügen soll (ist das so?), ist mir nicht klar, wie ich das dann abspeichern kann bzw. wie ich mich in dem Menü bewegen kann (Seite vor etc.).
Mit einer Googlesuche bin ich auf eine Hilfe gekommen, die mir aber og. Fragen leider nicht beantwortet: https://www.thomas-krenn.com/de/wiki/SSH_Root_Login_unter_Debian_verbieten
Ich weiß, dass sind Basics, Anfängerfragen …. 😉
Hallo Tom,
so genau verstehe ich dein Problem nicht. Wenn ich mit dem Befehl:
sudo nano /etc/ssh/sshd_config
den Editor öffne um die Datei „sshd_config“ zu bearbeiten, dann befindet sich der Eintrag „#Authentication“ in dieser Datei. Es muss keine neue Zeile hinzugefügt werden.
Dort kann man dann ganz einfach den Eintrag „PermitRootLogin no“ auf „PermitRootLogin yes“ ändern. Um zu dieser Zeile zu gelangen kann man sich mit den Pfeiltasten durch die Zeilen bewegen. Durch ganze Seiten kann man mit „STRG+Y“ bzw. „STRG+V“ blättern.
Hat man den Eintrag geändert, dann kann mit „STRG+O“ die Datei speichern (Bestätig durch „Enter“) und dann mit „STRG+X“ den Editor beenden.
Hoffe ich konnte bisschen Licht ins Dunkle bringen 😉
Gruß Daniel
Hallo Daniel,
ja, du hast sehr viel Licht ins Dunkle gebracht 😉
Herzlichen Dank und einen schönen vierten Advent, Tom