Como usar o Mac OS X Keychain com chaves SSH?

133

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

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

eval 'ssh-agent'
ssh-add ~/.ssh/some_key_rsa
ssh user@server

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

Existe uma maneira melhor de fazer isso usando o Keychain?

    
por John Topley 28.12.2009 / 13:08

9 respostas

16

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

Seus scripts bash estão iniciando seu próprio agente ssh (escrito ssh-agent , não ssh_agent) e sobrescrevendo o ssh-agent existente que está configurado para você no login.

Além disso, o objetivo do keychain é armazenar as senhas em suas chaves ssh, mas você diz que não tem senhas definidas nessas chaves, então não tenho certeza do que você espera do keychain integração.

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

    
por 28.12.2009 / 18:37
245

A partir do lançamento do Leopard do OS X, o ssh-agent está mais integrado com o Keychain. É possível armazenar as passphrases de todas as suas chaves SSH de forma segura no Keychain, a partir do qual o ssh-agent as lerá na inicialização. O importante é que é simples proteger suas chaves com senhas, mas nunca precisar digitar a frase secreta para usá-las! Aqui está como:

Adicione a frase secreta a cada chave ssh para keychain: (a opção -k carrega somente 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 do seu chaveiro serão automaticamente carregadas. Você deve conseguir ver as chaves no aplicativo Acesso às Chaves, bem como na linha de comando:

ssh-add -l
    
por 11.04.2011 / 21:58
73

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

Como explicado aqui , este é o método recomendado desde macOS 10.12 .2 :

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

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

O seguinte é obsoleto (mantido como referência).

Para voltar ao comportamento anterior, você deve executar o comando ssh-add -A (que carrega automaticamente todas as chaves ssh com frases secretas nas chaves) ao efetuar login. Para fazer isso, siga estas etapas:

  1. Primeiro, adicione todas as chaves que deseja carregar automaticamente ao ssh-agent usando o comando ssh-add -K /absolute/path/to/your/private/key/id_rsa . O argumento -K garante que a frase-chave da chave seja adicionada ao keychain do macOS . Certifique-se de usar o caminho absoluto para a chave. Usar um caminho relativo fará com que o script de inicialização automática não encontre sua chave.

  2. Certifique-se de que todas as suas chaves sejam exibidas como adicionadas quando você digita ssh-add -A .

  3. Crie um arquivo chamado com.yourusername.ssh-add.plist in ~/Library/LaunchAgents/ com o conteúdo abaixo. Arquivos plist como este são usados por launchd para executar scripts quando você faz o 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 ao launchd para carregar o arquivo plist que acabou de criar executando: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist .

E você deve estar pronto.

    
por 12.12.2016 / 19:17
29

Existe uma maneira mais simples que a resposta de Ricardo para manter sua senha entre sessões / reinicializações do seu Mac executando 10.12 Sierra.

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

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

    Agora a senha é lembrada entre reinicializações!

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

    
por 05.01.2017 / 19:53
9

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, –K em vez de -K , causando uma mensagem no efeito de –K: No such file or directory . Deveria ler:

ssh-add -K [path/to/private SSH key]
    
por 28.04.2011 / 15:28
6

Suspeito que você não esteja usando o comando ssh padrão. Você tem ssh instalado via portas? Tente which ssh para ver qual comando ssh você está usando.

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

    
por 28.12.2009 / 13:55
6

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

  • A chave foi salva em ~/.ssh/
  • A chave privada tem uma frase secreta.
  • A frase secreta é armazenada nas chaves de login do OS X. %código%
  • A conexão foi a seguinte: meu servidor mac ~/Library/Keychains/login.keychain remoto mac -> git / ssh
  • Mac OS X 10.8.5

Quando conectei-me ao mac remoto usando a área de trabalho remota, não tive nenhum problema. No entanto, ao conectar-se com o SSH ao mac remoto, me pediram a senha ssh todas as vezes. As etapas a seguir resolveram isso para mim.

  1. -> A frase secreta é armazenada no chaveiro de login. Isso desbloqueia e permite que o agente ssh o acesse.
  2. security unlock-keychain Inicia o ssh-agent para uso do shell. Ele obterá a frase secreta do chaveiro e a usará para desbloquear a chave ssh privada.
  3. Estabeleça a conexão ssh / git e faça meu trabalho.
  4. eval 'ssh-agent -s' Mate o agente ssh em execução.
  5. eval 'ssh-agent -k' Bloqueie o chaveiro novamente.
por 14.10.2013 / 14:29
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, pois mais detalhes foram solicitados: o comando "security" é capaz de importar chaves (e outras coisas) diretamente para Keychains. O bom é que, ao contrário do ssh-add, você pode especificar o chaveiro. Isso torna possível importar diretamente para o sistema Keychain ("man man" para aprender como)

    
por 26.03.2014 / 10:45
1

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

So just do the following:

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

    
por 26.01.2017 / 11:39