5 SSH Tricks und Tricks und mehr

Bild



In diesem Artikel werden nützliche Tricks und Befehle bei der Arbeit mit SSH beschrieben. Nämlich:



  • Verwendung der Zwei-Faktor-Authentifizierung für SSH-Verbindungen.
  • Sichere Verwendung von "Agent Forwarding".
  • Beenden einer blockierten Sitzung.
  • Wir lassen das Terminal beim Verlassen oder Trennen offen.
  • ( Zoom!).




Es gibt fünf Möglichkeiten, es zu aktivieren.



1. Wir aktualisieren OpenSSH und verwenden Hardware-Token. Im Februar dieses Jahres wurde OpenSSH um Unterstützung für FIDO U2F-Token (Universal Second Factor) erweitert. Was soll ich sagen - das ist großartig, aber es gibt eine Einschränkung.



Der Punkt ist, dass das Update neue Schlüsseltypen hinzufügt, um Token zu unterstützen. Diese Funktion kann jedoch nur verwendet werden, wenn Client und Server auf Version 8.2 oder höher aktualisiert werden. Sie können die aktuelle Version des Clients mit dem Befehl ssh -V überprüfen. Für den Remote-Server lohnt es sich, nc [Servername] 22 zu verwenden.



Außerdem wurden zwei neue Schlüsseltypen hinzugefügt - ecdsa-sk und ed25519-sk. Es gibt auch Zertifikate für sie. Um Schlüsseldateien zu erstellen, müssen Sie ein Token einfügen und den Befehl ausführen



$ ssh-keygen -t ecdsa-sk -f ~ / .ssh / id_ecdsa_sk.



Was macht sie? Erstellt öffentliche und private Schlüssel, die an das U2F-Token gebunden sind. Der private Schlüssel auf dem Token wird verwendet, um den privaten Schlüssel zu entschlüsseln, der auf der Festplatte gespeichert ist.



Eine andere Möglichkeit besteht darin, ein Kennwort für Schlüsseldateien als zweiten Faktor festzulegen. Tatsache ist, dass OpenSSH mit einer anderen Generierungsoption arbeitet - sk. Somit werden Schlüsseldateien auf einem Hardware-Token gespeichert und sind immer bei Ihnen. Um einen residenten Schlüssel zu erstellen, müssen Sie den folgenden Befehl verwenden:



$ ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_ecdsa_sk.


Um die Schlüsseldatei auf einen neuen Computer zu übertragen, müssen Sie das Medium einlegen und den Befehl $ ssh-add -K ausführen. Denken Sie daran - das Token muss bei der Verbindung aktiviert werden.



2. Wir verwenden PIV + PKCS11 und Yubikey. Für den Fall, dass Sie eine Verbindung zu Computern herstellen müssen, auf denen frühere Versionen des SSH-Servers installiert sind, gibt es eine andere Option. Hier finden Sie eine detaillierte Anleitung für U2F + SSH mit PIV / PKCS11 . Ein bisschen knifflig, aber es lohnt sich.



3. Der dritte Weg ist die Verwendung des Yubikey-Mittels. Hier ist der SSH-Agent für die Yubikeys selbst , der von Filipo Valsorda erstellt wurde.



4. Berühren Sie ID und sekey. Eine andere Möglichkeit ist die Verwendung von Sekey- ein Open Source Agent. Es speichert private Schlüssel im sicheren Enklavensystem für MacOS und ermöglicht es Ihnen, die Touch ID-Signaturfunktion auszulösen.



5. Verwenden Sie abschließend Single Sign On SSH. Hier ist die Setup- Anleitung . Der Vorteil von Single Sign On SSH besteht darin, dass der Benutzer die Sicherheitsrichtlinie des Kontoanbieters durchsetzen kann, einschließlich der Unterstützung der Multi-Faktor-Authentifizierung.



Sichere Schlüsselweiterleitung (Agentenweiterleitung)



Wofür wird die Schlüsselweiterleitung verwendet? Für Remote-Host-Zugriff auf den lokalen SSH-Benutzeragenten. Tatsache ist, dass, wenn der SSH-Client die Schlüsselweiterleitung verwendet (ssh -A wird am häufigsten aktiviert), während der Verbindung 2 Kanäle vorhanden sind. Die erste ist eine interaktive Benutzersitzung, die zweite ist ein Schlüsselweiterleitungskanal.



Der lokale SSH-Agent erstellt einen IPC-Socket, der über diesen Kanal eine Verbindung zum Remote-Host herstellt. Dies ist sehr gefährlich, da der Root-Benutzer auf dem Remote-Host Zugriff auf den lokalen SSH-Agenten des Verbindungsbenutzers hat. Somit kann es verwendet werden, um im Namen dieses Benutzers auf Netzwerkressourcen zuzugreifen. Und wenn Sie mit einem Standard-SSH-Agenten arbeiten, werden Sie das Problem nicht herausfinden. Mit einem U2F-Schlüssel oder Sekey kann dieses Problem jedoch behoben werden.



Im Allgemeinen können Sie den Schlüssel weiterleiten. Es wird jedoch empfohlen, diese Methode nicht häufig und für alle Ihre Verbindungen zu verwenden. Es ist ratsam, es nur zu verwenden, wenn der Benutzer mit der Situation vertraut ist.



Abmelden von einer blockierten SSH-Sitzung



SSH-Sitzungen frieren häufig aufgrund von Netzwerkproblemen, Kontrollverlust eines laufenden Programms oder einer Escape-Sequenz des Terminals ein, die die Tastatureingabe blockiert. Es gibt verschiedene Möglichkeiten, eine blockierte Sitzung zu beenden:



1. Automatisch, wenn das Netzwerk getrennt wird. Fügen Sie dazu der SSH-Konfigurationsdatei .ssh / config

Folgendes

hinzu
: ServerAliveInterval 5 ServerAliveCountMax 1



In diesem Fall überprüft ssh die Verbindung, indem in regelmäßigen Abständen Echoanforderungen an den Remote-Host gesendet werden. Sie werden durch den Parameter ServerAliveInterval festgelegt. Wenn mehr unbeantwortete Anforderungen als ServerAliveCountMax vorliegen, schließt SSH die Verbindung.



2. Unterbrechen Sie die Sitzung. ssh verwendet das Zeichen ~ als Standard-Escape-Sequenz. Der Befehl ~ schließt die aktuelle Verbindung und kehrt zum Terminal zurück.



Auch die ~? Zeigt die gesamte Liste der Befehle an, die in der aktuellen Sitzung verwendet werden können. Wenn Sie mehrere Layouts installiert haben, müssen Sie die Taste ~ zweimal drücken, um ein Zeichen zu senden.



Lassen Sie das Terminal auf dem Remote-Host geöffnet



Es gibt zwei Möglichkeiten, die Sitzung beim Wechseln zwischen Netzwerken zu speichern.



1. Verwenden von Mosh oder Eternal Terminal



Wenn Sie eine zuverlässige und nicht schließende Verbindung benötigen, auch wenn Sie zwischen Netzwerken wechseln, gibt es einen Ausweg - Sie müssen Mosh - Mobile Shell verwenden. Mosh bezieht sich auf eine sichere Shell, die SSH zum Initialisieren einer Sitzung verwendet (Handshake). Danach wechselt sie zu ihrem eigenen verschlüsselten Kanal, der sehr stabil ist. Beispielsweise können verschiedene Situationen behandelt werden, darunter Unterbrechungen, Änderungen der IP-Adresse des Geräts, große Verzögerungen bei der Datenübertragung usw. Dies alles ist UDP und dem von Mosh verwendeten Synchronisierungsprotokoll zu verdanken.



Um damit zu arbeiten, müssen Sie es zunächst sowohl auf dem Server als auch auf dem Client installieren und die Ports 60000 bis 61000 für eingehenden UDP-Verkehr auf Ihrem Remote-Host öffnen. Danach müssen Sie nur noch mosh user @ server eingeben, um eine Verbindung herzustellen.



Mosh arbeitet auf der Ebene von Terminalbildschirmen und Tastenanschlägen, was viele Vorteile gegenüber SSH bietet, das einen binären Datenstrom von normalen E / A zwischen Clients und dem Server überträgt. Wenn Sie nur den Terminalbildschirm und die Tastenanschläge synchronisieren müssen, wird die unterbrochene Verbindung viel schneller wiederhergestellt. Dieselbe SSH muss in einem Puffer gespeichert und alles gesendet werden, aber Mosh muss nur Tastenanschläge speichern und den letzten Status des Terminalfensters mit dem Client synchronisieren.



2. Verwenden von tmux. Es lohnt sich, einen Terminal-Multiplexer namens tmux zu verwenden, um bei Bedarf eine Verbindung herzustellen und die Verbindung zu trennen, während dieselbe Sitzung auf dem Remote-Host beibehalten wird . Für den Fall, dass die SSH-Verbindung unterbrochen wird, müssen Sie die Verbindung erneut herstellen und tmux attach eingeben. Der Benutzer kehrt dann zur tmux-Sitzung zurück.



Es bietet außerdem mehrere zusätzliche Funktionen, darunter Registerkarten und Bedienfelder wie im macOS-Terminal sowie die Möglichkeit, mit einem anderen Benutzer mit dem Terminal zu arbeiten. Mit Byobu, einem Paket mit vielen praktischen Funktionen und Tastaturkürzeln, können Sie noch mehr erreichen. Es wird mit Ubuntu ausgeliefert und kann unter MacOS mit Homebrew ausgeführt werden.



Freigabe eines Remote-Terminals



Es gibt Situationen, in denen Sie eine SSH-Sitzung gemeinsam nutzen müssen, z. B. beim Lösen komplexer Probleme mit Servern. Der beste Weg, dies zu tun, ist mit tmux. Um das Problem zu lösen, müssen Sie Folgendes tun:



  • Stellen Sie sicher, dass tmux auf dem Server in der DMZ installiert ist (oder an dem Ort, zu dem Sie eine Verbindung herstellen möchten).
  • Beide Benutzer müssen über SSH mit demselben Konto eine Verbindung zum Server herstellen.
  • Einer der Benutzer muss tmux ausführen, um eine tmux-Sitzung zu erstellen.
  • Der zweite Benutzer führt den Befehl tmux attach aus.
  • Alles ist fertig!


Wenn Sie Mehrbenutzersitzungen optimieren müssen , sollten Sie tmate verwenden . Dies ist eine verbesserte Gabel von tmux.



Fachberatung



Wir haben uns entschlossen, die Übersetzung mit unseren eigenen Tipps zu ergänzen - wir hoffen, dass sie auch nützlich sind. Maxim Klochkov , Senior Consultant im Network Solutions Center von Jet Infosystems und Lehrer des Cybersecurity Profession-Kurses bei Skillbox, berichtete über seine nützlichen Erfahrungen .



TCP-Portweiterleitung



Ssh hat zwei nützliche Optionen: -L und -R.



Der Parameter -L organisiert einen offenen TCP-Port auf unserem lokalen Computer, wenn wir versuchen, eine TCP-Verbindung herzustellen, an die diese Verbindung transparent an den SSH-Tunnel weitergeleitet wird, und dann eine Verbindung von einem Remotecomputer hergestellt wird.



Dem Parameter -L folgt ein Argument in der folgenden Form:



ssh -L XXX:server1:YYY login@server2


Hier ist Server2 der Remote-Server, auf den wir über ssh zugreifen. Login ist der Benutzername, unter dem wir uns beim Remote-Server anmelden. XXX ist die Portnummer, die auf dem lokalen Computer organisiert werden muss. Server1 ist der Host, an den wir die Verbindung von diesem Port weiterleiten müssen und schließlich ist JJJ der Port, an den diese Verbindung weitergeleitet werden soll.



Schauen wir uns zwei Beispiele an.



Beispiel 1.



  1. Wir befinden uns auf dem Server spb.company1.ru und möchten eine Webanwendung testen, die unter central-db.company1.ru auf die Datenbank zugreift
  2. Diese Datenbank ist nur auf dem Server moscow.company1.ru an Port 9999 verfügbar
  3. Wir organisieren die Weiterleitung des lokalen Ports 55555 an die Datenbank über den SSH-Tunnel wie folgt : SSH- L 55555: central-db.company1.ru: 9999 login@moscow.company1.ru
  4. Danach stellen wir eine Webanwendung auf unserem lokalen Server bereit und geben nicht central-db.company1.ru:9999 als Basis an, sondern localhost: 55555 - diese Verbindung wird an den Server moscow.company1.ru weitergeleitet, und dieser Server stellt die Verbindung her mit einer Datenbank auf dem Host central-db.company1.ru, Port 9999


Beispiel 2.



  1. Wir befinden uns auf dem Server spb.company1.ru und möchten dem Kunden eine Testwebsite unter moscow.company1.ru, Port 5000, zeigen.
  2. Es gibt keinen Zugriff auf diese Site aus dem Internet, es gibt nur internen Zugriff von demselben Host, auf dem sie bereitgestellt wird, d. H. Von moscow.company1.ru
  3. Wir organisieren die Weiterleitung des lokalen Ports 80 durch den SSH-Tunnel wie folgt : SSH-L 80: localhost: 5000 login@moscow.company1.ru
  4. Wenn der Benutzer nun über den Link spb.company1.ru in den Browser eintritt , wird die Verbindung über den SSH-Tunnel an den Server moscow.company1.ru weitergeleitet, und dieser Server stellt bereits eine Verbindung zur Adresse localhost: 5000 her, d. H. Zu unserem Testweb -Seite? ˅.


Der Parameter -R organisiert einen offenen TCP-Port auf dem Remote-Server. Wenn versucht wird, eine TCP-Verbindung herzustellen, wird diese Verbindung transparent an den SSH-Tunnel weitergeleitet und anschließend eine Verbindung vom lokalen Server hergestellt.



Dem Parameter -R folgt ein Argument in der folgenden Form:



ssh -R XXX:server1:YYY login@server2


Hier ist Server2 der Remote-Server, auf den wir über ssh zugreifen. Login ist der Benutzername, unter dem wir uns beim Remote-Server anmelden. XXX ist die Portnummer, die auf dem Remote-Server organisiert werden muss. Server1 ist der Host, an den wir die Verbindung vom Remote-Server weiterleiten müssen und schließlich ist JJJ der Port, an den diese Verbindung weitergeleitet werden soll.



Schauen wir uns zwei Beispiele an.



Beispiel 1.



  • Wir befinden uns auf dem Server moscow.company1.ru, und von diesem Server aus ist eine Datenbank auf dem Server central-db.company1.ru an Port 9999 verfügbar.
  • Wir stellen eine Webanwendung auf dem Server spb.company1.ru bereit, und auf die Datenbank kann von diesem Server aus nicht zugegriffen werden.
  • Wir organisieren die Portweiterleitung vom spb.company1.ru-Server zur Datenbank wie folgt: ssh -R 55555: central-db.company1.ru: 9999 login@spb.company1.ru
  • Danach stellen wir unsere Webanwendung auf dem Server spb.company1.ru bereit, geben jedoch nicht central-db.company1.ru:9999 als Basis an, da dieser Server nicht für uns verfügbar ist, sondern localhost: 55555 - diese Verbindung wird an unseren lokalen Server weitergeleitet Maschine durch einen SSH-Tunnel, und dann stellt die lokale Maschine eine Verbindung zum Server central-db.company1.ru, Port 9999, her.


Beispiel 2.



  • Wir befinden uns auf dem Server moscow.company1.ru und haben eine Testwebsite auf unserem Server auf Port 5000 bereitgestellt.
  • Diese Testwebsite ist nur lokal verfügbar, Verbindungen aus dem Internet sind nicht zulässig. Wir möchten diese Website jedoch einem Kunden demonstrieren, der über einen Webbrowser auf den Server spb.company1.ru zugreifen kann
  • Wir organisieren die Portweiterleitung vom Server spb.company1.ru wie folgt: ssh -R 80: localhost: 5000 login@spb.company1.ru
  • Wenn der Benutzer nun über den Link spb.company1.ru in den Browser eintritt , wird die Verbindung über den SSH-Tunnel an unseren lokalen Server moscow.company1.ru weitergeleitet und von dort aus eine Verbindung zu localhost: 5000 - also zu unserem Testweb hergestellt Seite? ˅.


Welche Tricks kannst du teilen?



Zu diesem Thema:






All Articles