Fernzugriff und Dateiübertragung mit SSH

LinuxBeginner
Jetzt üben

Einführung

SSH ermöglicht einen verschlüsselten Zugriff über die Kommandozeile auf ein anderes Linux-Konto. SCP verwendet dieselbe Authentifizierung und Transportverbindung, um Dateien zu kopieren. Bei der ersten Verbindung sollte der Hostschlüssel des Servers sicher überprüft werden. Bei späteren Verbindungen kann ein persönlicher Schlüssel verwendet werden, sodass das Kontopasswort nicht jedes Mal erneut übertragen werden muss.

In diesem Labor verwenden Sie das isolierte Konto remoteuser auf localhost als entfernten Host. Obwohl sich beide Konten auf derselben Trainings-VM befinden, verhalten sich das SSH-Protokoll, die Authentifizierungsabfragen, das entfernte Home-Verzeichnis und die Dateiübertragungen wie in einem grundlegenden Ablauf zwischen zwei Hosts. Der standardmäßige SSH-Zugangsweg für labex wird nicht verändert.

SSH-Ziel untersuchen

In diesem Schritt identifizieren Sie den SSH-Client, lösen den Zielnamen auf, bestätigen einen lauschenden Server und zeigen den öffentlichen Hostschlüssel an.

Wechseln Sie in den lokalen Arbeitsbereich:

cd /home/labex/project/ssh-lab

Zeigen Sie die Version des OpenSSH-Clients an. Das Programm schreibt seine Version auf die Standardfehlerausgabe, daher kombiniert 2>&1 diese mit der Standardausgabe:

ssh -V 2>&1

Lösen Sie das lokale Ziel mithilfe der systemweiten Namensdienstkonfiguration auf:

getent hosts localhost

Bestätigen Sie, dass ein SSH-Server auf dem TCP-Port 22 lauscht:

sudo ss -ltnp | grep ':22'

ssh-keyscan ruft öffentliche Hostschlüssel ab, ohne eine Anmeldung durchzuführen. Leiten Sie den ED25519-Schlüssel an ssh-keygen -lf - weiter, um seinen Fingerabdruck anzuzeigen:

ssh-keyscan -t ed25519 localhost 2>/dev/null | ssh-keygen -lf -

Vergleichen Sie in einer realen Umgebung diesen Fingerabdruck mit einem vertrauenswürdigen Wert des Administrators, bevor Sie ihn akzeptieren. Speichern Sie anschließend eine kompakte Zusammenfassung des Ziels:

printf 'target=localhost\nport=22\nuser=remoteuser\n' > ssh-target.txt
cat ssh-target.txt

Erste entfernte Shell öffnen

In diesem Schritt überprüfen Sie einen Hostschlüssel, authentifizieren sich mit einem Passwort, untersuchen das entfernte Konto und schließen anschließend die entfernte Shell.

Stellen Sie die Verbindung im Format user@host her:

ssh remoteuser@localhost

Da bei der Einrichtung alle bisherigen Hostschlüsseleinträge für localhost entfernt wurden, fragt SSH, ob Sie dem angezeigten Fingerabdruck vertrauen. Vergleichen Sie ihn mit dem Ergebnis aus Schritt 1 und geben Sie anschließend ein:

yes

Geben Sie an der Passwortabfrage Folgendes ein:

RemoteLab123!

Während der Eingabe wird das Passwort nicht angezeigt. Nach der Anmeldung gehört die Eingabeaufforderung zu remoteuser, nicht zu labex. Überprüfen Sie die entfernte Identität, den Hostnamen und das aktuelle Verzeichnis:

whoami
hostname
pwd

Erstellen Sie im Home-Verzeichnis des entfernten Kontos eine Markierungsdatei:

mkdir -p ~/ssh-lab
printf 'connected as %s\n' "$(whoami)" > ~/ssh-lab/connected.txt

Schließen Sie die entfernte Shell und kehren Sie zur lokalen Eingabeaufforderung von labex zurück:

exit

Der Befehl exit beendet nur die entfernte Shell. Das lokale Terminal bleibt geöffnet.

Einen entfernten Befehl ausführen

In diesem Schritt führen Sie Befehle auf dem entfernten Host aus, ohne eine dauerhaft geöffnete interaktive Shell zu verwenden, und speichern deren Ausgabe lokal.

Wechseln Sie bei Bedarf zurück in den lokalen Arbeitsbereich:

cd /home/labex/project/ssh-lab

Setzen Sie nach dem Host einen in Anführungszeichen eingeschlossenen Befehl. SSH führt ihn auf dem entfernten Host aus und gibt die Ausgabe in Ihrem lokalen Terminal aus:

ssh remoteuser@localhost 'whoami; uname -srm; uptime'

Geben Sie bei der Abfrage RemoteLab123! ein. Die Semikolons trennen die Befehle, die von der entfernten Shell interpretiert werden.

Führen Sie einen zweiten entfernten Befehl aus und leiten Sie die zurückgegebene Ausgabe in eine lokale Datei um:

ssh remoteuser@localhost 'printf "remote_user=%s\nremote_home=%s\n" "$(whoami)" "$HOME"' > remote-context.txt

Geben Sie das Passwort erneut ein. Die Umleitung > wird von Ihrer lokalen Shell verarbeitet, daher wird remote-context.txt im lokalen Arbeitsbereich angelegt:

cat remote-context.txt

Die Datei sollte remoteuser und /home/remoteuser ausweisen.

Eine Datei mit SCP übertragen

In diesem Schritt laden Sie eine lokale Datei hoch, überprüfen sie auf dem entfernten Host und laden sie unter einem neuen lokalen Namen wieder herunter.

Erstellen Sie ein lokales Konfigurationsbeispiel:

cd /home/labex/project/ssh-lab
printf 'mode=training\nport=8080\n' > app.conf

SCP verwendet für entfernte Pfade das Format user@host:path. Laden Sie die Datei in das vorbereitete entfernte Verzeichnis incoming hoch:

scp app.conf remoteuser@localhost:/home/remoteuser/incoming/app.conf

Geben Sie bei der Abfrage RemoteLab123! ein. Überprüfen Sie den entfernten Dateiinhalt über SSH:

ssh remoteuser@localhost 'cat /home/remoteuser/incoming/app.conf'

Geben Sie das Passwort erneut ein. Vertauschen Sie nun Quelle und Ziel, um die Datei herunterzuladen:

scp remoteuser@localhost:/home/remoteuser/incoming/app.conf downloaded-app.conf

Geben Sie das Passwort ein und vergleichen Sie anschließend das lokale Original mit der heruntergeladenen Kopie:

cmp app.conf downloaded-app.conf && echo "The files match"

Ein Verzeichnis rekursiv übertragen

In diesem Schritt verwenden Sie den rekursiven SCP-Modus, um einen Verzeichnisbaum auf das entfernte Konto zu kopieren.

Erstellen Sie einen kleinen lokalen Projektbaum:

cd /home/labex/project/ssh-lab
mkdir -p site/assets
printf '<h1>SSH transfer practice</h1>\n' > site/index.html
printf 'body { color: navy; }\n' > site/assets/style.css

Die Option -r kopiert Verzeichnisse und deren Inhalte rekursiv:

scp -r site remoteuser@localhost:/home/remoteuser/incoming/

Geben Sie bei der Abfrage RemoteLab123! ein. Listen Sie den entfernten Verzeichnisbaum mit einem einmaligen SSH-Befehl auf:

ssh remoteuser@localhost 'find /home/remoteuser/incoming/site -type f -printf "%P\n" | sort'

Geben Sie das Passwort erneut ein. Sie sollten assets/style.css und index.html sehen.

Einen persönlichen SSH-Schlüssel erzeugen

In diesem Schritt erstellen Sie ein eigenes ED25519-Schlüsselpaar und überprüfen dessen Berechtigungen und Fingerabdruck.

Ein Schlüsselpaar besteht aus einem privaten Schlüssel, der bei Ihnen verbleibt, und einem öffentlichen Schlüssel, der auf einem entfernten Konto installiert werden kann. Erzeugen Sie einen eigenen Übungsschlüssel ohne Passphrase, damit die automatische Validierung ihn verwenden kann:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/labex_remote_ed25519 -N '' -C 'labex-remote-practice'

Mit der Option -t wählen Sie den Algorithmus aus, -f legt die Datei fest, -N '' setzt eine leere Übungs-Passphrase und -C fügt eine Bezeichnung hinzu. Für Produktionsschlüssel sollte normalerweise eine starke Passphrase verwendet werden, sofern dies nicht durch Anforderungen an die Automatisierung ausgeschlossen ist.

Überprüfen Sie die beiden Dateien und ihre Berechtigungen:

ls -l ~/.ssh/labex_remote_ed25519 ~/.ssh/labex_remote_ed25519.pub

Der private Schlüssel sollte ausschließlich für labex lesbar sein. Die Datei .pub ist dafür vorgesehen, weitergegeben zu werden. Zeigen Sie den Fingerabdruck des öffentlichen Schlüssels an:

ssh-keygen -lf ~/.ssh/labex_remote_ed25519.pub

Kopieren oder veröffentlichen Sie niemals den privaten Schlüssel.

Öffentlichen Schlüssel installieren und verwenden

In diesem Schritt installieren Sie den öffentlichen Schlüssel für remoteuser, stellen eine Verbindung ohne Passwortabfrage her und überprüfen die schlüsselbasierte Dateiübertragung.

ssh-copy-id fügt einen öffentlichen Schlüssel mit geeigneten Berechtigungen an ~/.ssh/authorized_keys des entfernten Kontos an:

ssh-copy-id -i ~/.ssh/labex_remote_ed25519.pub remoteuser@localhost

Geben Sie für diese letzte passwortbasierte Aktion RemoteLab123! ein. Testen Sie den dedizierten privaten Schlüssel mit -i:

ssh -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost 'printf "key authentication works\n" > ~/ssh-lab/key-authenticated.txt; cat ~/ssh-lab/key-authenticated.txt'

Dieser Befehl sollte nicht nach dem Passwort des entfernten Kontos fragen. Verwenden Sie dieselbe Identität für SCP:

scp -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost:~/ssh-lab/key-authenticated.txt key-authenticated.txt
cat key-authenticated.txt

Die heruntergeladene Datei sollte key authentication works enthalten. Der Hostschlüssel authentifiziert den Server, während Ihr privater Schlüssel Sie gegenüber dem entfernten Konto authentifiziert. Beide Schlüssel lösen unterschiedliche Vertrauensprobleme.

Zusammenfassung

Sie haben einen SSH-Hostschlüssel überprüft, eine entfernte Shell geöffnet und beendet, einmalige entfernte Befehle ausgeführt und den Unterschied zwischen lokaler Umleitung und entfernter Befehlsausführung kennengelernt. Außerdem haben Sie Dateien mit SCP hoch- und heruntergeladen sowie ein Verzeichnis rekursiv kopiert.

Darüber hinaus haben Sie ein eigenes ED25519-Schlüsselpaar erzeugt, den privaten Schlüssel geschützt, ausschließlich den öffentlichen Schlüssel installiert und dieselbe Identität für passwortlose SSH- und SCP-Verbindungen verwendet. Damit beherrschen Sie die wichtigsten Grundlagen für eine sichere Administration entfernter Systeme.