Ich habe zu Hause einen Raspberry Pi, den ich mit meinem Heimnetzwerk verbunden habe. Ich verwende ihn, um einen VPN-Server und einen SSH-Tunnel zu betreiben, und gelegentlich greife ich per SSH darauf zu, um Wartungsarbeiten durchzuführen.
Ist es eine schlechte Idee, Ports (TCP) auf meinem Router geöffnet zu haben, damit ich mich von unterwegs aus mit meinem Pi verbinden kann? Ich verwende nicht den üblichen Port 22, sondern einen zufällig ausgewählten Port. Wenn ich jedoch meine IP-Adresse mit „ nmap
on“ scanne pentest-tools.com
, sehe ich den offenen Port, den ich für SSH ausgewählt habe. Mein Pi ist passwortgeschützt, und meines Wissens nach befinden sich darauf keine vertraulichen Daten oder Kreditkartennummern. Da ich ihn aber für VPN oder SSH-Tunneling verwende, können vertrauliche Daten darüber übertragen werden. Ist es also schlecht, diesen SSH-Port auf meinem Router geöffnet zu haben? Kann jemand meinem Heimnetzwerk schaden, indem er diesen Port öffnet, da mein Pi immer eingeschaltet ist und auf diesen Port lauscht?
Antwort1
Aus Sicherheitsgründen fallen mir noch drei weitere Methoden ein.
A: Verwenden Sie die Authentifizierung mit öffentlichem Schlüssel
Um die Sicherheit zu erhöhen, können Sie Ihren SSH-Server so einrichten, dass er eine Authentifizierung mit öffentlichem Schlüssel verwendet. Das bedeutet, dass die Verbindung entweder zusätzlich zu oder anstelle eines starken Passworts nur geöffnet wird, wenn der SSH-Client den privaten Schlüssel bereitstellt, der mit dem öffentlichen Schlüssel auf dem Server übereinstimmt. Selbst wenn ein Angreifer irgendwie an den öffentlichen Schlüssel gelangen könnte, könnte er den privaten Schlüssel daraus nicht wiederherstellen. Dadurch wird Ihr Port jedoch nicht vor Port-Scannern verborgen.
B: Verwenden Sie einen anderen Port
Darüber hinaus habe ich gute Erfahrungen in Bezug auf weniger Port-Scans gemacht, indem ich den SSH-Server so konfiguriert habe, dass er auf einem anderen Port als 22 lauscht. Die entsprechende Standardkonfigurationsoption in /etc/ssh/sshd_config
lautet
Port 22
Sie können das beispielsweise in 54322 ändern:
Port 54322
Denken Sie daran, den SSH-Server anschließend neu zu starten. Abhängig von dem Linux auf Ihrem Raspberry könnte dies einer der folgenden sein:
# service sshd restart
# systemctl restart sshd
(Das #
Zeichen soll hier in meinen Beispielen, wenn es nicht in einer Datei steht, einen Root-Prompt kennzeichnen.)
Keine Sorge, Ihre aktuelle SSH-Sitzung bleibt aktiv. Es könnte einen Versuch wert sein, eine zweite SSH-Sitzung auf Port 54322 zu öffnen, um zu sehen, ob die Anmeldung noch funktioniert. Denken Sie daran,
- Stellen Sie Ihren SSH-Client auf den neuen Port ein
- Leiten Sie ggf. den neuen Port in Ihrem Internet-Router an den Raspberry Pi weiter
C: Schließen Sie den Port und öffnen Sie ihn nur auf Ihre Anforderung
Wenn Sie „dem Internet“ wirklich nicht zeigen möchten, dass Sie diesen Port geöffnet haben, sehen Sie sich beispielsweise Port-Knocking-Daemons an knockd
. Diese Programme überwachen von Ihnen definierte (geschlossene) Ports und öffnen nach einer ebenfalls von Ihnen definierten Knocking-Sequenz einen anderen Port, beispielsweise Ihren SSH-Port. Von einem Mobiltelefon oder Laptop aus initiieren Sie die Knocking-Sequenz, und der Knock-Daemon auf Ihrem Raspberry Pi öffnet Ihren SSH-Port, der vorher überhaupt nicht sichtbar war.
Genauer gesagt fügt Portknocking Ihrer iptables
Konfiguration eine Zeile hinzu. Diese Zeile öffnet den Port auf Ihrem Raspberry. Das bedeutet auch, dass der SSH-Port vorher geschlossen werden muss iptables
. Und das bedeutet, dass Sie sich nicht über SSH anmelden können.
Ein Beispiel knockd.conf
könnte so aussehen:
[openclosessh]
sequence = 1000,2020,3015,65432
seq_timeout = 15
tcpflags = syn
start_command = /usr/local/bin/knockd-open.sh %IP%
cmd_timeout = 30
stop_command = /usr/local/bin/knockd-close.sh %IP%
Denken Sie auch daran, die zu sperrenden Ports von Ihrem Internet-Router an Ihren Raspberry weiterzuleiten.
Die entsprechenden Öffnen/Schließen-Skripte könnten beispielsweise so aussehen:
#!/bin/bash
# /usr/local/bin/knockd-open.sh
# adds two lines at the top of iptables which allow all incoming and outgoing traffic on tcp port 54322
iptables -I INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -I OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
Und
#!/bin/bash
# /usr/local/bin/knockd-close.sh
# deletes those two lines again
iptables -D INPUT -s $1 -p tcp --dport 54322 -j ACCEPT
iptables -D OUTPUT -d $1 -p tcp --sport 54322 -j ACCEPT
Denken Sie daran, beide Skripte mit ausführbar zu machen chmod +x /usr/local/bin/knockd*
. Außerdem sollten Sie den Knockd-Dienst mit einem der folgenden starten und aktivieren:
# service knockd start && update-rc.d knockd enable
# systemctl start knockd && systemctl enable knockd
Insbesondere wenn Sie das Klonen auf einem Remotecomputer durchführen, auf den Sie keinen Konsolenzugriff haben, möchten Sie möglicherweise atd
alle Änderungen automatisch rückgängig machen und/oder den Raspberry im Falle von Konfigurationsfehlern neu starten.
Da iptables nicht automatisch über Neustarts hinweg gespeichert werden, könnten Sie in einem Beispiel root sein (über su
) und
# at now + 5 minutes
> reboot
> (hit ctrl-d)
# ./script-which-closes-iptables.sh
Ein Beispiel ./script-which-closes-iptables.sh
könnte so aussehen (denken Sie daran, es mit ausführbar zu machen chmod +x
)
#!/bin/bash
# allow everything on the loopback interface
iptables -A INPUT -i lo -j ACCEPT
# allow only related or established incoming ssh sessions
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --dport 54322 -j ACCEPT
# allow outgoing related or established ssh sessions
iptables -A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -m tcp --sport 54322 -j ACCEPT
# allow everything on the loopback interface
iptables -A OUTPUT -o lo -j ACCEPT
# drop everything else in and out
iptables -P INPUT DROP
iptables -P OUTPUT DROP
Wenn Ihre SSH-Sitzung jetzt beendet wird, wird der Raspberry in 5 Minuten neu gestartet. Wenn Ihre SSH-Sitzung noch aktiv ist, widerrufen Sie den ausstehenden Neustart mit
# atq
15 reboot
# atrm 15
Wenn Ihre SSH-Sitzung noch aktiv ist, versuchen Sie, sich über eine zweite SSH-Sitzung anzumelden. Das sollte nicht funktionieren. Verwenden Sie dann Ihr Mobiltelefon und klopfen Sie die Ports an, die Sie in konfiguriert haben /etc/knockd.conf
. Versuchen Sie anschließend erneut, sich über eine zweite SSH-Sitzung anzumelden. Diesmal sollte es funktionieren.
Dann können Sie Ihre iptables so einrichten, dass sie einen Neustart beibehalten. Auf Ihrem System müssen Sie möglicherweise ein Paket installieren über
# apt-get install iptables-persistent
Speichern Sie Ihre iptables mit
# iptables-save > /etc/iptables/iptables-rules
und aktivieren Sie den iptables-Dienst mit
# systemctl enable iptables
Antwort2
Wenn Ihr Raspberry Pi über ein sicheres Passwort und eine starke SSH-Sicherheit verfügt, ist alles in Ordnung. Angreifer können mit SSH nichts anfangen, wenn sie sich nicht anmelden oder es ausnutzen können. Den Port werden sie jedoch mit Sicherheit finden.
Historische Anmerkung: In der VergangenheitEs gab ein Problemmit der SSH-Konfiguration; der automatisch generierte Schlüssel war vorhersehbar. Das wurde behoben.
Wenn AngreiferTunWenn sie SSH-Zugriff erlangen, besitzen sie das Gerät. Dann können sie es verwenden, um böse Dinge zu tun, wieARP-Vergiftung, wodurch sie unverschlüsselte Daten, die Ihr Netzwerk passieren, erfassen und ändern können. Sie könnten den Pi auch als Ausgangspunkt für Angriffe auf Ihre anderen Hosts verwenden. Der Pi ist ein Computer wie jeder andere und Sie müssen darauf achten, ihn zu sichern.