Quiero enviar ssh a un host privado remoto utilizando un servidor intermedio (bastión, salto, puerta de enlace). Este comando funciona bien:
ssh gateway ssh private
Con esta configuración ~/.ssh/config:
Host gateway
User gateway-user
HostName XX.XX.XX.XX
RequestTTY force
¿Cómo puedo implementar esto en mi ~/.ssh/config? Probé numerosas iteraciones de ProxyCommand sin suerte. Quiero utilizar el archivo de identidad ubicado en el host de la puerta de enlace para acceder a hosts privados. Quiero poder hacer:
ssh private
Conozco la técnica que se describe aquí, pero requiere que mi clave pública esté en todos los hosts privados, pero no quiero eso:
http://www.lorrin.org/blog/2014/01/10/one-liner-ssh-via-jump-box-using-proxycommand/
Respuesta1
Primero, configure sus claves ssh en la puerta de enlace para que pueda utilizar ssh en privado. Luego, en su cliente, cree un par de claves pública y privada independiente que utilice para autenticarse en la puerta de enlace. P.ej ssh-keygen -t rsa -f id_gateway
.
Luego, en la puerta de enlace, utilice la command=
sintaxis de su archivo autorizado_keys. Por ejemplo, su entrada podría verse así:
command="sh -c 'ssh private ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3....
Busque en la página de manual de sshd para command="command"
obtener más información. Asegúrese de agregar la clave id_gateway.pub a esta línea. Luego, en .ssh/config
tu cliente, agrega una entrada como esta:
Host private
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Ahora, desde su cliente debería poder ssh private
ingresar directamente. Esto incluso funciona para scp
y sftp
.
Crédito adicional
Si desea utilizar esto para varios servidores, pero solo desea administrar una clave pública en la puerta de enlace, puede utilizar el siguiente truco. sshd
De forma predeterminada, solo permite recibir ciertas variables del entorno local. Uno de ellos es LC_PAPER
el que rara vez se utiliza para nada. Entonces podemos usarlo para pasar el nombre de host del servidor de la siguiente manera:
Primero, cambie la entrada de clave pública a
command="sh -c 'ssh $LC_PAPER ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3...
Luego, en su cliente, agregue una función a su .bashrc
archivo (o cualquier shell que use) que se vea así:
ssh_proxy() {
LC_PAPER=$1 /usr/bin/ssh $*
}
Luego crea un alias si quieres:
alias ssh=ssh_proxy
Finalmente, agregue Host
secciones .ssh/config
como la que se muestra arriba. Por ejemplo:
Host private2
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Ahora debería poder hacerlo ssh private
con ssh private2
solo una clave pública en la puerta de enlace.