SSH-Tunneling als Verschlüsselung und Authentifizierung für lokalen Dienst

SSH-Tunneling als Verschlüsselung und Authentifizierung für lokalen Dienst

Hintergrund:

Auf meinem Server läuft ein Dienst, der auf einem Domain-Socket auf /srv/socketeingehende Verbindungen wartet und dann mit dem verbundenen Benutzer interagiert. Bitte beachten Sie, dass ich diesen Dienst geschrieben habe (in C++), sodass ich das Verhalten des Dienstes ganz einfach ändern kann. Derzeit führt dieser Dienst keine Authentifizierung oder Berechtigungsprüfung durch (wie Sie gleich sehen werden, muss sich dies ändern). Einige Entwickler (etwa fünf bis zehn), mit denen ich zusammenarbeite, benötigen von Computern irgendwo anders im Internet Zugriff auf diesen Dienst (und nur auf diesen Dienst). Da dieser Dienst ihnen ziemlich viele Berechtigungen gibt, möchte ich, dass die Authentifizierung so stark wie möglich ist und die Verbindung verschlüsselt wird. Die grundlegende Frage, die ich habe (um jedes XY-Problem zu vermeiden), lautet: Wie richte ich das ein?

Idee und Fragen dazu:

Meine ursprüngliche Idee war, meine eigene Authentifizierung bereitzustellen und dann TLS zur Verschlüsselung zu verwenden (natürlich indem ich den Dienst auf einem externen Port verfügbar mache). Das Schreiben meiner eigenen Authentifizierung führt jedoch wahrscheinlich zu Sicherheitsmängeln und das Einrichten der Verbindung für den Betrieb über TLS wird mühsam sein.

Meine zweite Idee war dann, einfach SSH zu verwenden. SSH hat bereits eine sehr starke Authentifizierung und Verschlüsselung und tut im Grunde, was ich brauche. Leider bin ich mir nicht ganz sicher, wie ich das einrichten soll. Erstens möchte ich den Entwicklern natürlich keinen vollständigen Shell-Zugriff gewähren, also werde ich ihre Standard-Shell ändern /bin/false(wie in einigen anderen Antworten auf dieser und verwandten Websites). Aber dann müssen sie immer noch in der Lage sein, eine Verbindung zum entsprechenden Socket herzustellen. Ich habe mir SSH-Tunneling angesehen, aber das scheint nicht das zu sein, was ich brauche, und andere Suchen nach Dingen ähnlich wie „SSH als Proxy“ zeigen alle ähnliche, aber nicht identische Probleme. Was ist hier das Richtige? Natürlich könnte ich eine benutzerdefinierte ausführbare Datei schreiben, die als „Shell“ fungiert und diese Benutzer einfach mit meinem Dienst verbindet, aber auch dieser Code ist sicherheitsrelevant und ich möchte es nach Möglichkeit vermeiden, meinen eigenen zu schreiben.

Best-Case-Szenario:

Im Idealfall würde ich mir wünschen, dass Folgendes passiert:

  1. Der Benutzer führt einen Befehl auf seinem Client aus.
  2. Es wird eine verschlüsselte Verbindung zu einem Proxy-Dienst auf meinem Server hergestellt und der Benutzer authentifiziert sich gegenüber diesem Dienst (im Idealfall handelt es sich dabei um einen etablierten Dienst, der als einigermaßen sicher gilt).
  3. Der Proxy-Dienst öffnet eine Verbindung zu meinem Dienst, leitet den Benutzernamen (oder eine Benutzerkennung) weiter und stellt die Verbindung zum Client her.

Wie kann ich dabei am besten vorgehen?

Antwort1

Ich weiß, dass deine Frage schon eine Weile her ist, aber falls du immer noch interessiert bist, schau dir meinePostzum Thema Serverfehler. Obwohl das Problem dort nichts mit Ihrer Anforderung zu tun hat, könnte meine vorgeschlagene Lösung direkt relevant sein. Ich hatte gehofft, auf diesen Beitrag einige Antworten von Experten zu erhalten, die sich mit den Sicherheitsauswirkungen besser auskennen als ich, aber das ist nicht passiert.

Der Beitrag ist etwas lang, um ihn hier wiederzugeben, aber kurz zusammengefasst ist dies das Konzept:

  • Richten Sie SSH so ein, dass so viele Authentifizierungsmechanismen erforderlich sind, wie Sie benötigen/tolerieren können, z. B. Kennwort + Schlüssel + OTP usw.
  • Stellen Sie die Benutzer-Shell auf /sbin/nologin( /sbin/nologinwird vorgezogen gegenüber /bin/false) ein.
  • Verwenden Sie sshrc auf dem Server, um ein Skript aufzurufen, wenn der Benutzer sich über ssh verbindet (authentifiziert). Das Skript kann alles tun, was Sie brauchen, z. B. Ihren Dienst starten

Im obigen Setup authentifizieren sich Ihre Benutzer über SSH. Nach der Authentifizierung /etc/ssh/sshrcführt es das Notwendige für Ihren Dienst aus und /sbin/nologintrennt die SSH-Sitzung nach der Authentifizierung ordnungsgemäß, da sie nicht mehr benötigt wird.

Sie können mit dem Skript in sshrc nach Herzenslust herumexperimentieren. Beginnen Sie beispielsweise, ohne dass für Ihren Dienst Ports geöffnet sind. Sobald sich ein Benutzer authentifiziert, kann das sshrc-Skript im Handumdrehen einen Port für die IP des Benutzers in Ihrer Firewall öffnen.

Bitte beachten Sie:Das Obige setzt voraus, dass Sie wirklich, wirklich wissen, was Sie in Bezug auf die SSH-Konfiguration tun. Obwohl es mehrere gut getestete SSH-Implementierungen gibt, können viele davon leicht falsch konfiguriert werden, was erhebliche Auswirkungen auf die Sicherheit hat. Außerdem empfehle ich für die SSH-Authentifizierung dringend, immer Schlüssel + (mindestens eine Sache, die der Benutzer weiß, z. B. Passwort oder OTP, idealerweise beides) zu verwenden.

verwandte Informationen