Quero fazer ssh para um host privado remoto usando um servidor intermediário (bastion, jump, gateway). Este comando funciona bem:
ssh gateway ssh private
Com esta configuração ~/.ssh/config:
Host gateway
User gateway-user
HostName XX.XX.XX.XX
RequestTTY force
Como posso implementar isso em meu ~/.ssh/config? Tentei várias iterações do ProxyCommand sem sorte. Quero usar o arquivo de identidade localizado no host do gateway para acessar hosts privados. Eu quero ser capaz de fazer:
ssh private
Estou ciente da técnica descrita aqui, mas ela exige que minha chave pública esteja em todos os hosts privados, mas não quero isso:
http://www.lorrin.org/blog/2014/01/10/one-liner-ssh-via-jump-box-using-proxycommand/
Responder1
Primeiro, configure suas chaves ssh no gateway para que você possa usar ssh como privado. Em seguida, no seu cliente, crie um par de chaves privada/pública separado que você usa para autenticar no gateway. Por exemplo ssh-keygen -t rsa -f id_gateway
.
Em seguida, no gateway, use a command=
sintaxe em seu arquivoauthorized_keys. Por exemplo, sua entrada pode ser assim:
command="sh -c 'ssh private ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3....
Pesquise na página de manual do sshd para command="command"
obter mais informações. Certifique-se de adicionar a chave id_gateway.pub a esta linha. Em seguida .ssh/config
, no seu cliente, adicione uma entrada como esta:
Host private
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Agora, do seu cliente, você deve conseguir ssh private
entrar diretamente. Isso funciona até para scp
e sftp
.
Crédito extra
Se quiser usar isso para vários servidores, mas quiser gerenciar apenas uma chave pública no gateway, você pode usar o seguinte truque. sshd
por padrão, permite apenas que certas variáveis sejam recebidas do ambiente local. Um deles é LC_PAPER
que raramente é usado para alguma coisa. Portanto, podemos usá-lo para passar o nome do host do servidor da seguinte forma:
Primeiro, altere a entrada da chave pública para
command="sh -c 'ssh $LC_PAPER ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3...
Em seguida, no seu cliente, adicione uma função ao seu .bashrc
arquivo (ou qualquer shell que você use) semelhante a esta:
ssh_proxy() {
LC_PAPER=$1 /usr/bin/ssh $*
}
Em seguida, crie um alias para, se desejar:
alias ssh=ssh_proxy
Por fim, adicione Host
seções .ssh/config
como a mostrada acima. por exemplo:
Host private2
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway
Agora você deve conseguir fazer ssh private
isso ssh private2
com apenas uma chave pública no gateway.