Use uma chave encaminhada específica do agente SSH?

30

Digamos que eu tenha uma chave para o Github, junto com outras chaves. Adicionei muitas chaves ao meu agente ssh ( ssh-add -Lretorna muitas linhas) no meu computador doméstico A. No meu .ssh/config, configurei qual chave usar com qual host, por exemplo,

ssh -T -vvv [email protected] 2>&1 | grep Offering

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

Apenas uma chave é oferecida, conforme o esperado. Mas, depois de fazer o ssh para algum host B ForwardAgent yese repetir o mesmo comando, recebo

debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.linode2
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.helium
debug1: Offering RSA public key: /Users/doxna/.ssh/id_rsa.github

ou seja, tenta todas as minhas chaves. Isso é problemático, pois apenas um número limitado de chaves pode ser tentado antes do retorno dos servidores Too many authentication failures. Então, eu tentei editar .ssh/configno host B para incluir

Host github.com
  IdentityFile /Users/doxna/.ssh/id_rsa.github
  IdentitiesOnly yes

mas não recebo ofertas importantes, mas sim

debug2: key: /Users/doxna/.ssh/id_rsa.github ((nil))

o que eu acho que significa que a chave não foi encontrada (?) E, afinal, a chave está localizada no meu computador doméstico A, não no host B, então a questão é como se referir a ela no host B? Espero ter conseguido explicar a pergunta.

danmichaelo
fonte

Respostas:

28

Você teve a ideia certa. A única parte que está faltando é que o arquivo apontado por IdentityFiledeve existir. Ele não precisa conter uma chave privada, basta ter a chave pública disponível.

No host B, você pode extrair a chave pública do agente digitando ssh-add -L | grep /Users/doxna/.ssh/id_rsa.github > ~/.ssh/id_rsa.github.pube apontar para esse arquivo de~/.ssh/config

Kasperd
fonte
Para sua informação, o nome da chave pública não importa. Ele selecionará a chave adequada do agente com base no conteúdo.
Akostadinov
@akostadinov True. Se você apontar sshpara um arquivo de chave pública sem nenhum arquivo de chave privada associado, ele deve apenas ler a chave pública do arquivo e fazer com que o agente use a chave privada correspondente para gerar a assinatura.
kasperd
Isso efetivamente salva sua chave no host B! Consulte a resposta abaixo de @ mc0e para obter uma solução que não salva a chave no servidor.
Pitt
2
@ Pitt Não, não. Ele armazena apenas a chave pública . E isso não é um problema, pois nunca se esperava que a chave pública fosse mantida em segredo. O encaminhamento de agente fornece ao host acesso para usar a chave enquanto o encaminhamento do agente estiver em vigor, mas o agente nunca enviará a chave secreta em nenhum lugar.
kasperd
@kasperd, você não precisa de uma cópia real da chave privada enquanto tiver uma conexão ativa com um agente de usuário com a chave. Como root, você pode acessar as conexões do agente de outros usuários conectados.
Mc0e 03/0318
5

Boa resposta do @Kasperd, mas observe também que, se o Host B estiver comprometido ou se você não confiar em todos os que possuem privilégios de root, ainda estará expondo todas as suas chaves a abuso enquanto estiver logado nesse host.

Portanto, uma abordagem melhor pode ser encaminhar apenas o acesso às chaves necessárias. Talvez tente o ssh-agent-filterque está nos repositórios debian / Ubuntu ou no github .

Edição: Decidi em ssh-identvez de ssh-agent-filterencaminhar chaves seletivamente, embora não seja uma experiência tão suave quanto se poderia esperar.

mc0e
fonte
1
From @kasperd's comment on his answer: "it doesn't. It only stores the public key. And that is not a problem as the public key was never expected to be kept secret in the first place. Agent forwarding gives the host access to use the key as long as the agent forwarding is in place, but the agent will never send the secret key anywhere"
Bdoserror
1
@Bdoserror Como root, você pode abusar da conexão ssh-agent enquanto o usuário associado estiver conectado. Você apenas copia as SSH_*variáveis ​​de ambiente e efetua o login onde quer que queira usar a chave, apesar de nunca ter uma cópia real.
Mc0e 03/0318
Para esclarecer: essa resposta está realmente errada - enquanto o cenário de abuso do mc0e é real, não tem nada a ver com salvar a chave pública - se o host intermediário estiver comprometido, sua conexão do agente poderá ser usada para autenticar com sua chave privada, independentemente de salvar ou não a chave pública no host intermediário. Sua chave privada não será comprometida, e o salvamento da chave pública não será mais fácil, pois qualquer invasor que tenha uma conexão com o agente poderá solicitar as chaves públicas de qualquer maneira.
Restabelecer Monica
@ Marc-Lehmann releu o que escrevi. Se você encaminhar chaves, elas serão expostas, mas você pode limitar quais chaves serão encaminhadas.
mc0e 29/07
Eu passo o que você escreveu - por favor, trate a substância de nossos comentários, não a pessoa. O problema é que sua resposta está simplesmente errada porque pressupõe, enquanto você escreve, que as chaves "são encaminhadas" para o host remoto. Isso não acontece e as próprias chaves não são expostas.
Restabelecer Monica