Como usar o Mac OS X Keychain com chaves SSH?

141

Entendo que, desde o Mac OS X Leopard, o Keychain suporta o armazenamento de chaves SSH. Alguém poderia explicar como esse recurso deve funcionar.

Eu tenho algumas chaves RSA que eu gerei armazenadas no meu diretório ~ / .ssh para acessar vários servidores. Não tenho senhas definidas nessas teclas. Atualmente, para fazer login nesses servidores, eu uso os seguintes comandos no Terminal:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
ssh usuário @ servidor

(Eu escrevi algumas funções do Bash para facilitar isso.)

Existe uma maneira melhor de fazer isso usando o chaveiro?

John Topley
fonte

Respostas:

16

Para que funcione, a $SSH_AUTH_SOCKvariável de ambiente deve ser apontada /tmp/launch-xxxxxx/Listeners. Isso deve ser feito automaticamente quando você efetua login. O ouvinte nesse soquete fala o protocolo ssh-agent.

Seus scripts bash estão iniciando seu próprio agente ssh ( ssh-agentortográfico, não ssh_agent) e substituindo o existente ssh-agentconfigurado para você no login.

Além disso, o objetivo principal das chaves é armazenar as senhas em suas chaves ssh, mas você diz que não possui senhas definidas nessas chaves, portanto, não tenho certeza do que você espera da integração das chaves.

Finalmente, quando você faz login pela primeira vez, provavelmente não verá um processo ssh-agent. Esse processo será iniciado automaticamente pelos serviços de inicialização na primeira vez que algo tentar ler esse soquete /tmp.

Rudedog
fonte
1
Obrigado. Então ainda terei que executar ssh-addpara adicionar minhas identidades RSA ao agente ssh padrão iniciado no logon?
John Topley
Você não precisa executar o ssh-add; O ssh-agent solicitará a senha da chave na primeira vez que você executar o ssh.
Rudedog
3
Ele está solicitando a senha toda vez que executo o ssh. O ponto é que eu não quero inserir nenhuma senha.
31511 John Topley
1
O que está solicitando a senha? Estou começando a suspeitar que é o servidor remoto que está solicitando a você, o que coloca sua declaração de que suas chaves não têm senhas em melhor perspectiva. Se você quiser ignorar a senha no servidor remoto, precisará adicionar sua chave pública $HOME/.ssh/authorized_keysnesse servidor. O ssh-agent + keychain do Mac OS é usado apenas para armazenar a senha das chaves ssh locais; não se destina a enviar senhas remotas através de conexões ssh existentes.
Rudedog
1
use ssh -vpara diagnosticar o que o ssh está fazendo. use também sshd -p 8900 -vno lado do servidor e ssh -v remote:8900para diagnosticar o que o sshd está fazendo.
Rudedog
252

Desde a versão Leopard do OS X, o ssh-agent está mais integrado ao Keychain. É possível armazenar as senhas de todas as suas chaves SSH com segurança no Keychain, a partir das quais o ssh-agent as lerá na inicialização. A conclusão é que é simples proteger suas chaves com senhas, mas nunca é necessário digitar a senha para usá-las! Aqui está como:

Inclua a frase secreta em cada chave ssh no chaveiro: (a opção -k carrega apenas chaves privadas simples, ignora certificados)

ssh-add -K [path/to/private SSH key]

(note que é um K maiúsculo)

Sempre que você reiniciar o seu Mac, todas as chaves SSH no seu chaveiro serão carregadas automaticamente. Você poderá ver as chaves no aplicativo Keychain Access, bem como na linha de comando via:

ssh-add -l
jeffmcc
fonte
ssh-add -lnão lista nenhuma tecla ao conectar remotamente (onde $ DISPLAY não está definido). Truques especiais precisam ser empregados aqui para usar o chaveiro (por exemplo, em superuser.com/questions/141044/… )
Ether
2
developer.apple.com/library/mac/documentation/Darwin/Reference/… Você também precisa da opção -K para armazenar senhas no chaveiro.
Neeme Praks
5
Se você instalou outra versão do SSH através de um sistema de pacotes como o Homebrew, é necessário usar um caminho absoluto como /usr/bin/ssh-add.
Ludovic Kuty
1
Curiosamente, no macOS Sierra, ele não solicita a senha após uma reinicialização, mas ssh-add -lretorna "O agente não tem identidades". ( ps auxinclui /usr/bin/ssh-agent -l).
Halil Özgür 23/11
4
Para o macOS Sierra, as coisas mudaram. Veja github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel
80

No macOS Sierra , o ssh-agent não carrega mais automaticamente as chaves ssh carregadas anteriormente quando você faz login na sua conta. Isso é intencional por parte da Apple, eles queriam se realinhar com a implementação principal do OpenSSH . [1]


Conforme explicado aqui , este é o método recomendado desde o macOS 10.12.2 :

  1. Adicione as seguintes linhas ao seu ~/.ssh/configarquivo:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Qualquer chave que você adicionar ao ssh-agent usando o ssh-add /path/to/your/private/key/id_rsacomando será automaticamente adicionada ao chaveiro e deverá ser carregada automaticamente na reinicialização.


O seguinte foi descontinuado (mantido para referência).

Para voltar ao comportamento anterior, você deseja executar o ssh-add -Acomando (que carrega automaticamente todas as chaves ssh que possuem frases secretas no seu conjunto de chaves) ao fazer login. Para fazer isso, siga estas etapas:

  1. Primeiro, adicione todas as chaves que você deseja carregar automaticamente no ssh-agent usando o ssh-add -K /absolute/path/to/your/private/key/id_rsacomando O -Kargumento garante que a frase-chave da chave seja adicionada ao chaveiro do macOS . Certifique-se de usar o caminho absoluto para a chave. Usar um caminho relativo fará com que o script iniciado automaticamente não encontre sua chave.

  2. Verifique se todas as suas chaves são mostradas como adicionadas ao digitar ssh-add -A.

  3. Crie um arquivo chamado com.yourusername.ssh-add.plistno ~/Library/LaunchAgents/com o conteúdo abaixo. Arquivos de lista como este são usados launchdpara executar scripts quando você faz login. [2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. Diga launchdpara carregar o arquivo plist você acabou de criar executando: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

E você deve estar tudo pronto.

Ricardo Sanchez-Saez
fonte
33

Existe uma maneira mais simples do que a resposta de Ricardo de manter sua senha entre as sessões / reinicializações do seu Mac com a versão 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Nota: altere o caminho para onde sua chave id_rsa está localizada.
  2. ssh-add -A
  3. Crie (ou edite, se existir) o seguinte ~/.ssh/configarquivo:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    Agora a senha é lembrada entre as reinicializações!

A Apple alterou intencionalmente o comportamento do ssh-agent no macOS 10.12 Sierra para não carregar mais automaticamente as chaves SSH anteriores, conforme observado nesta discussão do OpenRadar , Twitter e Nota técnica da Apple . A solução acima imitará o antigo comportamento do El Capitan e lembrará sua senha.

ChrisJF
fonte
2
Awesome, funciona como um encanto, IMHO muito mais limpo depois os outros e resolvido no lugar certo :)
GerardJP
10

Nota: para o macOS Sierra, consulte a resposta mais recente de ChrisJF .

A [resposta de Jeff McCarrell] [2] está correta, exceto que o comando para adicionar a frase secreta contém um traço em vez de um hífen, ou seja, em –Kvez de -Kcausar uma mensagem com efeito –K: No such file or directory. Deve ler-se:

ssh-add -K [path/to/private SSH key]
simonair
fonte
2
Este deve ser um comentário para a resposta a que você se refere e não uma nova resposta. Estamos falando de segurança aqui. Poderíamos sugerir que você deve estar digitando-o cuidadosamente para fora, em vez de cegamente copiar e colarssh-add -K
Phil_1984_
1
Usando um hífen com K, entendi illegal option -- K. K minúsculo está listado como uma opção.
Sam Dutton
Obrigado pelo feedback. Eu verifiquei apenas no MacOS Sierra: -K, ou seja, traço-de capital-K, ainda é válido
simonair
6

Eu suspeito que você não está usando o sshcomando padrão . Você sshinstalou via portas? Tente which sshver qual sshcomando você está usando.

Normalmente, ele deve exibir uma caixa de diálogo solicitando sua senha, se ainda não estiver armazenada no seu chaveiro.

Olly
fonte
Eu não estou usando portas.
John Topley
Obrigado pela informação :) Eu tive problemas porque estava usando o OpenSSH da Homebrew.
precisa saber é o seguinte
6

Eu tive um problema semelhante ao tentar fazer login usando um certificado ssh do cliente. Nesse caso específico, era para acessar um repositório git. Esta foi a situação:

  • A chave foi salva em ~/.ssh/
  • A chave privada possui uma senha.
  • A senha é armazenada no chaveiro de login do OS X. ~/Library/Keychains/login.keychain
  • A conexão foi a seguinte: meu servidor ->remoto mac mac ->git / ssh
  • Mac OS X 10.8.5

Quando me conectei ao mac remoto usando a área de trabalho remota, não tive nenhum problema. No entanto, ao conectar-me com o SSH no Mac remoto, sempre fui solicitado a senha do ssh. Os seguintes passos o resolveram para mim.

  1. security unlock-keychainA senha é armazenada no chaveiro de login. Isso o desbloqueia e permite ao ssh-agent acessá-lo.
  2. eval `ssh-agent -s`Inicia o ssh-agent para uso de shell. Ele obterá a senha do chaveiro e a utilizará para desbloquear a chave ssh privada.
  3. Estabeleça a conexão ssh / git e faça meu trabalho.
  4. eval `ssh-agent -k` Mate o agente ssh em execução.
  5. security lock-keychain Bloqueie o chaveiro novamente.
orkoden
fonte
1
Para que o # 2 trabalhe para mim dentro de um pseudônimo, eu tive que usar eval \$(ssh-agent)por Re: login remoto e chaveiro . Quando não estiver em um alias, eval $(ssh-agent)funciona ( sem a barra invertida $ ).
Travis
4

Veja também:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... adicionando esta nota à medida que mais detalhes foram solicitados: o comando "security" é capaz de importar chaves (e outras coisas) diretamente no Keychains. O bom é que, diferentemente do ssh-add, você pode especificar o chaveiro. Isso torna possível importar diretamente para o sistema Keychain ("man security" para saber como)

xaphod
fonte
1
Você poderia dar um pouco mais de detalhes a esta resposta, por favor? Obrigado.
Matthew Williams
1

A melhor solução pretendida pela Apple (desde o macOS 10.12.2) é descrita aqui

Então, faça o seguinte:

eco "UseKeychain yes" >> ~ / .ssh / config

Ben
fonte
1
O uso >>está em risco se você inserir o comando várias vezes. Melhor fazer uma edição manual do arquivo, conforme descrito pela resposta de ChrisJF .
Cœur
Sim, você está aí
Ben