Encaminhamento de agente SSH usando nomes de usuário e chaves diferentes

18

Há uma pergunta muito semelhante que, se respondida, pode ter sido a resposta para essa pergunta. Infelizmente, é um caso de "não há necessidade de responder à pergunta que fiz porque o problema não era o que eu pensava que era".

A Instalação

  1. O servidor bastion.ec2 aceita uma conexão ssh da minha estação de trabalho viassh -i mykey.pem [email protected]
  2. O servidor service1.ec2 aceita conexões ssh apenas do bastion.ec2 viassh -i sharedkey.pem [email protected]

Os requisitos

  1. Ambas as teclas estão apenas na minha estação de trabalho, então não posso executar o segundo comando sem copiar a chave
  2. Por motivos de segurança, desejo usar o encaminhamento ssh-agent em vez de copiar as chaves ssh para o bastion.ec2

A solução

É aqui que você entra. Como posso encaminhar uma chave diferente para a segunda conexão?

Se shareduser tivesse mykey.pub, ~/.ssh/authorized_keysisso funcionaria:

ssh -i mykey.pem [email protected] ssh [email protected]

No entanto, não quero que todos os usuários tenham que colocar sua chave pública em todos os servidores.

Bruno Bronosky
fonte

Respostas:

21

Passo 1

Verifique se o seu agente local está pronto

Só porque você pode ssh no servidor bastião sem especificar o caminho da chave ou ser solicitada a senha, não significa que o seu agente ssh esteja executando e mantendo sua chave. Alguns sistemas operacionais modernos (por exemplo: OSX) lidam com isso para você.

Na sua máquina local

$ ssh-add -L
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13== ~/.ssh/mykey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13== ~/.ssh/sharedkey.pem

Figura 1

Isso significa que seu agente está em execução e possui sua chave.

$ ssh-add -L
The agent has no identities.

Figura 2

Isso significa que você não adicionou nenhuma chave ao seu agente. Corrija isso com:

ssh-add ~/.ssh/mykey.pem ~/.ssh/sharedkey.pem

fig.3

Passo 2

Verifique se o seu agente remoto está pronto

SSH no servidor bastião e repita a verificação das figuras 1 e 2 . No entanto, o erro que você tem mais chances de obter é o seguinte:

$ ssh-add -L
Could not open a connection to your authentication agent.

fig.4

Isso provavelmente significa que seu cliente SSH não está encaminhando sua conexão do agente de autenticação.

Você pode forçar isso com o -Asinalizador (desde que a configuração do sshd no servidor permita, que é o padrão ).

$ ssh -A bastion.ec2

fig.5

etapa 3

Verifique se você está usando as teclas certas

Se você adicionou chaves ao seu agente, ele está encaminhando e seu agente remoto lista suas chaves locais. Há apenas dois motivos prováveis ​​para você não estar obtendo uma conexão. Você não está usando a tecla certa ou não está usando o nome de usuário correto.

Envie a contrapartida pública para sua chave privada:

$ cd
$ cd .ssh
$ ssh-keygen -y -f mykey.pem
ssh-rsa ObahfCbvagGbLbhSbeHfvatEBG13
$ ssh-keygen -y -f sharedkey.pem
ssh-rsa LbhNerWhfgJnnlGbbPyrireEBG13

fig.6

Elas devem ser as mesmas que você estava vendo ssh-add -Laté ==o final.

Agora, de uma forma ou de outra, você precisa entrar na caixa na qual não está se conectando e ver o conteúdo do $HOME/.ssh/authorized_keysarquivo do usuário com o qual está tentando se conectar. Você precisa garantir que a chave pública que você produz com o comando acima esteja nesse arquivo em uma linha sozinha. Você não pode confiar que o sharedkey.pubque os cubos do Bro 2 lhe enviaram por e-mail está certo. Verificar! Isso pode exigir a contratação de alguém que possa fazer o SSH como usuário para obter o arquivo allowed_keys ou obter acesso root. Se você chegou até aqui e ainda não está funcionando, está além de usar atalhos.

Passo 4

Tornar mais fácil

Esperamos que as etapas acima tenham ajudado você. Agora, vamos fazer com que essa dor de cabeça desapareça enquanto você estiver usando esta estação de trabalho.

Configure seu ssh-client local

Host *
    # A lot of people put an IdentityFile line in this Host * section.
    # Don't do that unless you will use only 1 key everywhere forever.
    #IdentityFile id_rsa

Host bastion.ec2
    # You want to make sure you always forward your agent to this host.
    # But don't forward to untrusted hosts. So don't put it in Host *
    ForwardAgent yes
    # Go a head and put the IP here in case DNS ever fails you.
    # Comment it out if you want. Having it recorded is a good backup.
    HostName 172.31.0.1
    # You don't want to create a proxy loop later, so be explicit here.
    ProxyCommand none
    # SSH should try using all keys in your .ssh folder, but if you
    # know you want this key, being explicit speeds authentication.
    IdentityFile ~/.ssh/mykey.pem

# Connect effortlessly by hostname or IP address
# This assumes that your internal DNS uses the fake TLD ec2
# This assumes that 172.31.0.0 is your C-Class subnet
Host *.ec2 172.31.*
    # This command says proxy all ssh connections through bastion as if
    # you had done an ssh -A
    ProxyCommand ssh -W %h:%p bastion.ec2
    ForwardAgent yes
    # These next lines are documentation you leave as a love letter to
    # your future self when all else fails or you have to help a
    # coworker and decide to look at your own config.
    # ssh-add ~/.ssh/*.pem
    # ssh -At bastion.ecs ssh [email protected]

fig.7

Se você não tirar mais nada da fig.7 , deve ser o uso adequado de ProxyCommand& ForwardAgent.

Preencher automaticamente seu .bash_profile

Você não precisa fazer isso ssh-addmanualmente sempre que fizer login na sua máquina. ~/.bash_profileé um script que é executado sempre que você faz login **. Coloque a linha da fig. 3 lá e você deve sempre ter seu agente pronto.

** Não confunda isso com o .bashrcque é executado em cada novo terminal [interativo]. Seu agente continuará em execução, mesmo se você fechar todas as suas sessões de terminal. Não há necessidade de recarregar suas chaves

Alternativa ao uso de .bash_profile

Também criei uma essência que adiciona um OSX / macOS Launch Agent . Você pode usar esse método para iniciar sua ssh-agentinicialização. É muito fácil de instalar:

curl -sSL https://gist.github.com/RichardBronosky/429a8fff2687a16959294bcee336dd2a/raw/install.sh | bash
Bruno Bronosky
fonte
Passo 2: Você não pode forçar ForwardAgent yescom -Aque o anfitrião não permite isso.
dlamblin
Obrigado @dlamblin, adicionei as informações relevantes e um link para a documentação do sshd.
Bruno Bronosky
1

É aqui que você entra. Como posso encaminhar uma chave diferente para a segunda conexão?

Você não encaminha as chaves. Você encaminha o agente e ele pode ter chaves completamente independentes do que você está usando para autenticação no primeiro salto. Verifique as chaves no seu agente usando ssh-add -L.

Mas, melhor ainda, execute a conexão ProxyCommand ssh -W %h:%p [email protected], o que evitará a necessidade de encaminhar o agente, as opções de heap ou linha de comando e a necessidade de autenticação no host imediato.

Você pode simplesmente colocar isso na sua configuração (consulte man ssh_config).

Jakuje
fonte
1
Felizmente, eu realmente sei do que você está falando aqui, mas o usuário médio não. Você discute a semântica com sua coisa "você encaminha agentes, não chaves". Você me deu o suficiente para continuar, para que eu pudesse resolver isso, e quero lhe dar a chance de corrigir sua resposta antes de adicionar a minha. Dica: ssh-add mykey.pem sharedkey.pemdepois confirme com ssh-add -Lentãossh -At [email protected] ssh [email protected]
Bruno Bronosky