Ich möchte über einen Zwischenserver (Bastion, Jump, Gateway) eine SSH-Verbindung zu einem Remote-Privathost herstellen. Dieser Befehl funktioniert einwandfrei:
ssh gateway ssh private
Mit diesem ~/.ssh/config-Setup:
Host gateway
User gateway-user
HostName XX.XX.XX.XX
RequestTTY force
Wie kann ich dies in meiner ~/.ssh/config implementieren? Ich habe zahlreiche Iterationen von ProxyCommand ohne Erfolg ausprobiert. Ich möchte die Identitätsdatei auf dem Gateway-Host verwenden, um auf private Hosts zuzugreifen. Ich möchte Folgendes tun können:
ssh private
Ich kenne die hier beschriebene Technik, allerdings muss dafür mein öffentlicher Schlüssel auf allen privaten Hosts vorhanden sein, was ich aber nicht möchte:
http://www.lorrin.org/blog/2014/01/10/one-liner-ssh-via-jump-box-using-proxycommand/
Antwort1
Konfigurieren Sie zunächst Ihre SSH-Schlüssel auf dem Gateway, damit Sie per SSH auf Private zugreifen können. Erstellen Sie dann auf Ihrem Client ein separates privates/öffentliches Schlüsselpaar, das Sie zur Authentifizierung auf dem Gateway verwenden. Beispiel ssh-keygen -t rsa -f id_gateway
:
Verwenden Sie dann auf dem Gateway die command=
Syntax in Ihrer Datei authorized_keys. Ihr Eintrag könnte beispielsweise folgendermaßen aussehen:
command="sh -c 'ssh private ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3....
Weitere Informationen finden Sie in der Manpage von sshd command="command"
. Fügen Sie dieser Zeile unbedingt den Schlüssel id_gateway.pub hinzu. .ssh/config
Fügen Sie dann auf Ihrem Client einen Eintrag wie diesen hinzu:
Host private
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Jetzt sollten Sie von Ihrem Client aus ssh private
direkt auf und zugreifen können. Dies funktioniert sogar für scp
und sftp
.
Extra-Guthaben
Wenn Sie dies für mehrere Server verwenden möchten, aber nur einen öffentlichen Schlüssel auf dem Gateway verwalten möchten, können Sie den folgenden Trick verwenden. sshd
Standardmäßig können nur bestimmte Variablen aus der lokalen Umgebung empfangen werden. Eine davon ist , LC_PAPER
die selten für irgendetwas verwendet wird. Daher können wir sie verwenden, um den Hostnamen des Servers wie folgt zu übergeben:
Ändern Sie zunächst den öffentlichen Schlüsseleintrag in
command="sh -c 'ssh $LC_PAPER ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3...
Fügen Sie dann auf Ihrem Client Ihrer .bashrc
Datei (oder der von Ihnen verwendeten Shell) eine Funktion hinzu, die folgendermaßen aussieht:
ssh_proxy() {
LC_PAPER=$1 /usr/bin/ssh $*
}
Erstellen Sie dann bei Bedarf einen Alias für:
alias ssh=ssh_proxy
Fügen Sie abschließend Host
Abschnitte .ssh/config
wie den oben gezeigten hinzu. Beispiel:
Host private2
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Jetzt sollten Sie dazu in der Lage sein, ssh private
und zwar ssh private2
mit nur einem öffentlichen Schlüssel auf dem Gateway.