Usando a diretiva IdentityFile em ssh_config quando o AgentForwarding estiver em uso

15

É possível especificar chaves encaminhadas usando a diretiva IdentityFile em .ssh / config?

Encontrei essa peculiaridade ao tentar implantar algum código via Capistrano / GIT em nosso servidor de produção. As minhas chaves GIT, pessoal e do meu trabalho, são sempre carregadas no meu agente SSH e, por acaso, minha chave pessoal foi adicionada ao agente primeiro. Eu uso o encaminhamento de agente ao implantar com o Capistrano, portanto, quando o host tentou autenticar a operação `git pull`, falhou com o seguinte erro:

ERRO: Permissão para `algum repo` negada ao` seu usuário`.

porque ele tentou se autenticar usando minha chave pessoal git antes de tentar a chave apropriada (que veio mais tarde no agente ssh) e assumiu que eu estava acessando um repositório externo que não tenho permissão para acessar. Possivelmente, posso apenas dar ao meu usuário pessoal acesso a todos os repositórios de trabalho, mas na minha máquina local, posso solucionar esse problema definindo domínios personalizados em .ssh / config da seguinte maneira:

Host personal.github.com
Nome do host github.com
Usuário git
IdentityFile ~ / .ssh / some_key

Host work.github.com
Nome do host github.com
Usuário git
IdentityFile ~ / .ssh / some_other_key

e assim o git nunca fica confuso. É possível criar regras .ssh / config para chaves encaminhadas em minhas caixas de produção para que eles sempre saibam qual chave usar ao extrair um novo código? Basicamente, eu quero ser capaz de fazer:

Host work.github.com
Nome do host github.com
Usuário git
IdentityFile some_forwarded_key

Obrigado!

skryl
fonte

Respostas:

22

Você pode usar a parte pública de uma chave para especificar qual chave privada você deseja usar do agente encaminhado. Isso requer a criação de um arquivo extra (a parte pública da chave) em quaisquer máquinas "intermediárias" (máquinas para as quais você encaminha o seu agente ssh local ).

  1. Organize para que a máquina intermediária tenha uma cópia da parte pública da chave desejada em um local conveniente (por exemplo ~/.ssh/some_other_key.pub).

    De qualquer máquina que já tenha a parte pública da chave:

    scp some_other_key.pub intermediate:.ssh/
    

    ou, na máquina intermediária:

    ssh-add -L | grep something_unique > ~/.ssh/some_other_key.pub
    

    Você pode editar a parte “comentário” à direita da chave pública para identificar melhor a origem / proprietário / objetivo da chave (ou tentar ocultar a mesma).

  2. Use o nome do caminho para o arquivo de chave pública acima com -iou IdentityFile.

  3. Você também pode precisar usar IdentitiesOnly yes(in .ssh/configou -o) para impedir que o ssh tente oferecer identidades adicionais do seu agente encaminhado.

Chris Johnsen
fonte
Essa é a única coisa que funcionou para mim em outras 10 soluções.
Tracy Fu
1
Brincando com isso, percebi que se você colocar a chave pública associada à chave privada que deseja usar no ~ / .ssh / id_rsa.pub na máquina intermediária, ela será usada por padrão, sem necessidade de configuração em ~ / .ssh / config.
precisa saber é o seguinte
Obrigado Chris e bschlueter! I agora se conectar com: ssh someserver -t "ssh-add -L | grep something_unique> ~ / .ssh / id_rsa.pub; cd alguma outra pasta / /; o bash --login"
blablabla
Quando tento isso, ssh -v -T ...o servidor aceita a chave pública, mas o ssh diz No such identity: /home/name/.ssh/id_rsa: No such file or directorye, posteriormente, a autenticação falha. Eu tenho o ForwardAgent ativado em todas as minhas configurações. Qual poderia ser o problema?
Lars Nyström