Como usar a chave privada SSH para efetuar login sem inserir a senha todas as vezes no Mac OS X Lion?

22

Eu uso o Mac OS X Lion e conecto hosts remotos via SSH todos os dias. Apesar do fato de eu usar o par de chaves SSH para autenticação remota e eu não precisar motorizar a frase de login de cada host, ainda é muito chato que o terminal peça a senha para acessar minha chave privada SSH.

Por razões de segurança, creio eu, uma senha para acessar a chave privada do SSH é obrigatória. Existe uma maneira que faça com que o terminal peça a frase exatamente apenas uma vez na inicialização, em seguida, memorize-a e automaticamente usando minha chave privada em sessões posteriores de SSH?

Existe um script chamado keychain , que funciona bem no Gentoo Linux. Mas eu nunca descobri no Mac OS X Lion. Além disso, há muitos termos intimidadores, como ssh-agent , ssh-add . Depois de ler vários materiais sobre esses kits de ferramentas SSH e fazer alguns experimentos frustrados, fiquei mais confuso.

Portanto, cheguei ao StackExchange, procurando alguns conselhos sobre as seguintes perguntas.

  1. O que são ssh-agent , ssh-add , keychain , Keychain Access.app e como eles interagem uns com os outros?
  2. Como posso inserir a frase secreta da minha chave privada SSH uma vez no login e usá-la livremente na criação posterior da sessão SSH?
  3. Errr ... O que há de errado com Keychain Access.app ? Não armazena a frase SSH como antes.

Eu listo o que fiz aqui. Espero que haja pistas sobre os passos que perdi.

Etapa 1. Crie um par de chaves SSH no meu Mac.

$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.

Etapa 2. Copie minha chave pública SSH para o host remoto. Para dar um exemplo, eu copio a chave para localhost, Mac.

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

Etapa 3. Em seguida, tente se conectar ao host remoto (localhost aqui), via autenticação de par de chaves SSH.

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

Etapa 4. Efetue logout do host remoto e tente se conectar a ele novamente. Porra, o terminal pede a frase SSH novamente.

Uma pergunta frequente é que "O ssh-agent funciona bem no seu Mac?". Francamente falando, eu não tenho ideia do que está acontecendo nessas coisas. Aqui mostra alguns resultados em execução.

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

Qualquer feedback é bem-vindo. Obrigado!

    
por Jianwen W. 01.05.2012 / 14:31

7 respostas

11

ssh-agent é a parte que você deseja trabalhar, pois faz exatamente o que você está perguntando. O agente é executado como um daemon e, quando você "adiciona" uma chave privada a ele, ele memoriza essa chave e a fornece automaticamente ao controle remoto sshd durante a conexão inicial. ( ssh-add é simplesmente o comando que você executa para adicionar manualmente uma chave privada a ssh-agent ).

No OS X, a partir do Leopard, você não precisa executar ssh-agent ou ssh-add manualmente. Deve "apenas acontecer" quando você tenta se conectar a um servidor. Uma vez por chave, ele solicitará uma caixa de diálogo com a senha da interface do usuário, que (entre outras coisas) permitirá adicionar automaticamente a chave ao ssh-agent , para que você nunca seja solicitado novamente.

Isso é feito com uma configuração de launchd que atende conexões no soquete $SSH_AUTH_SOCK e inicia automaticamente ssh-agent quando precisar; depois disso, ssh-agent solicitará credenciais somente quando precisar abrir uma nova chave.

Se isso não funcionar, verifique se o arquivo de configuração launchd está correto:

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

Se ainda não estiver funcionando para você por algum motivo, aqui está a maneira "antiga" de fazer as coisas serem executadas à mão:

link

Existe também este aplicativo, que eu parei de usar desde que o Leopard saiu, mas basicamente fez a mesma coisa nas versões anteriores do Mac OS X:

link

    
por 01.05.2012 / 16:58
13

Durante o processo de resolução do "problema", pesquisei alguns tópicos relacionados e anotei algumas notas sobre como ssh-agent , ssh-add , keychain , KeyChain Access.app work. Acontece que este problema não é um problema, em vez disso, o problema é tudo sobre mim, e assim chamado de ssh-login-sem-pedir-senha-de-todas-as-vezes funciona perfeitamente no Mac out de caixa.

No entanto, esse processo me traz algumas experiências. Eu escrevo minhas anotações aqui na esperança de que elas ajudem alguém confuso sobre esses termos.

Dois termos de senha:

  • passphrase refere-se à frase requerida ao acessar sua chave privada SSH.
  • password refere-se à frase requerida para fazer login no seu Mac.

Agora, posso descobrir o que esses toolkits fazem, ou seja, ssh-agent , ssh-add , keychain , Keychain Access.app no Mac.

  • ssh-agent é o serviço crítico para ativar o uso da chave privada SSH sem digitar a senha SSH. ssh-agent funciona dessa maneira. Primeiro ele armazena ou cache , sua chave privada SSH na memória principal. Então, mais tarde, nesta sessão, quando sua chave SSH privada SSH for necessária para a autenticação remota, ssh-agent encontrará sua chave privada na memória principal e a entregará ao processo remoto. A única chance de que você seja solicitado a digitar sua senha SSH é quando sua chave privada é adicionada por ssh-agent inicialmente.
  • ssh-add faz parte da coleção ssh-agent , que ajuda a gerenciar suas chaves SSH em ssh-agent . Usamos o comando ssh-add para listar, adicionar, remover chaves privadas no chaveiro do ssh-agent. Então ssh-add comunica com ssh-agent service para cumprir as tarefas.
  • keychain é o script para encontrar ssh-agent service (se não existir, inicie um novo) e chame ssh-add para adicionar chaves privadas SSH. keychain tem uma ideia simples e direta, funcionando bem no Linux, onde o ssh-agent geralmente não é iniciado automaticamente.
  • Keychain Access.app parece ser o componente mais complicado. É o serviço de armazenamento de token universal do Mac OS X. Ele armazena vários tokens, como senhas, certs, et al e serve como um token agent para os aplicativos que solicitam os tokens. Em nosso caso de chave privada SSH, primeiro ele capta a solicitação para acessar a chave privada SSH e abre uma janela para solicitar que você armazene a senha SSH, que é um tipo de token, no chaveiro Keychain Access.app . Da próxima vez que você usar chaves privadas para autenticação, Keychain Access.app aparecerá novamente uma janela, perguntando se está concedendo o privilégio. Depois de receber um grande sim, keychain Access.app adiciona sua chave privada ao armazenamento de ssh-agent .

Duas coisas merecem sua atenção:

  1. O Mac OS X Lion inicia automaticamente um serviço ssh-agent na inicialização, ouvindo em um soquete em /tmp .
  2. Keychain Access.app armazena sua senha SSH, para que ela possa adicionar sua chave privada em ssh-agent sem interrompê-lo. Sim, não é necessário digitar sua frase SSH, mas é necessário digitar a senha de login da sua conta Mac para conceder privilégios ao criar essa entrada pela primeira vez.

Então, em resumo, SSH-login-sem-pedir-senha deve funcionar no Mac OS X fora da caixa.

    
por 12.05.2012 / 16:24
1

No caso de outras soluções aqui não funcionarem para as pessoas, o seguinte funcionou para mim.

Para cada chave privada no seu diretório ~ / .ssh, certifique-se de que a chave pública correspondente também esteja presente. Certifique-se de que a chave pública tenha o mesmo nome da chave privada, mas com .pub no final. Se você já tiver uma chave pública apropriada, tente regenerá-la.

Se você precisar recriar as chaves públicas, poderá fazê-lo facilmente: -

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

substituindo my_key por qualquer que seja a sua chave.

Depois disso, o MacOS lembra a frase-senha chave no keychain como deveria.

Nota - inserindo a frase secreta e salvando-a, o conjunto de chaves agora é uma ação única (não uma vez por sessão de login, como OP queria), mas assumindo que o login no mac em questão é protegido por senha, sua senha é protegida por senha de login. Além disso, esta solução não faz sentido para mim ... uma chave pública não deve ser necessária além da chave privada, mas por algum motivo o MacOSX exige isso.

(originalmente de responder a uma pergunta semelhante no Apple Stack Exchange)

    
por 30.09.2013 / 17:08
1

A única coisa que eu raramente encontro mencionada sobre a configuração da pasta ~/.ssh é restringir as permissões do diretório.

Para permitir que o ssh evite pedir a senha, sempre tive que definir as permissões do diretório base do usuário como 700 e as permissões ~/.ssh da pasta como 700 .

Caso contrário, ele continuará me pedindo uma senha mesmo quando eu tiver todas as chaves geradas e copiadas corretamente. Uma mensagem de erro é gerada nos logs de autenticação, mas isso é invisível para o usuário final em grande parte.

    
por 09.10.2013 / 17:04
0

Outra coisa que você poderia ter tentado seria substituir ssh-copy-id por algo como k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2" .

    
por 12.05.2012 / 20:14
0

Esta resposta é ligeiramente não a solução para esta questão; no entanto, é muito próximo (acabei nessa questão enquanto procurava uma solução para o meu problema).

Também faço muito SSH para servidores remotos no meu Mac, conforme descrito nesta pergunta, no entanto, o aplicativo Keychain Access.app armazenou a frase-chave e não preciso digitá-la toda vez que preciso da chave para autenticar em um servidor SSH.

No entanto, eu habilitei o servidor SSH no meu Mac, para que eu possa me conectar a ele remotamente. Quando conectado remotamente no meu Mac, a frase sempre era perguntada quando eu queria SSH ainda outro host.

Eu encontrei uma solução que permite que a frase-chave seja armazenada para a sessão atual. Eu pensei que isso poderia ser útil para alguém, daí este post / resposta.

    
por 13.06.2013 / 18:02
0

Eu tenho me intrigado com esse problema. O ssh funciona para todas as máquinas do nosso departamento EXCETO para maçãs (MacBooks ou iMacs não importa). Eu finalmente me cansei de digitar as senhas e decidi depurar isso.

Eu fui ao meu iMac e desabilitei o sshd no painel de preferência de compartilhamento. Eu então su'ed para root, e digitei "/ usr / sbin / sshd -d" para ativar o sshd no modo de depuração. Eu então tentei o ssh para aquela máquina e ela prontamente tentou usar o protocolo 2, o qual tudo parece usar muito bem, mas o sshd prontamente informou que não conseguiu encontrar "authorized_keys". Eu tinha um arquivo authorized_keys2 que todas as minhas caixas UNIX linux, solaris, you-name-it aceitam muito bem. Eu simplesmente copiei authorized_keys2 para authorized_keys e BOOM. Funciona perfeitamente agora.

Por que * as chaves em vez de * as chaves2 são desconhecidas. Particularmente quando o os x está satisfeito com o known_hosts2.

Em qualquer caso, agora todas as nossas caixas de maçã podem estar conectadas ou ter comandos remotos executados nelas sem essa senha explodida: prompt ...

    
por 27.04.2014 / 00:04