Como posso salvar permanentemente uma chave SSH protegida por senha?

9

Estou usando o Awesome Window Manager

Como posso adicionar permanentemente chaves privadas com senha?

Inspirado pela resposta aqui , adicionei as chaves privadas em ~ / .ssh / config

Conteúdo de ~ / .ssh / config:

IdentityFile 'private key full path'

Permissões de ~ / .ssh / config: 0700

Mas isso não funciona para mim.

Se eu adicionar manualmente a chave em todas as sessões, ela funcionará, mas estou procurando uma maneira mais elegante (não em .bashrc)

EDIT :

  • Usando a versão clássica do Gnome (sem efeitos).

Depois de adicionar a chave SSH ssh-copy-ifao host remoto, recebo o seguinte prompt no terminal (GNOME Terminal 3.0.1) quando estou efetuando login:

ssh -i .ssh/Password-Protected-Key user@host
Enter passphrase for key '.ssh/Password-Protected-Key':
  • Usando o gerenciador de janelas Awesome v3.4.10. Eu já tinha, gnome-keyring-dameonentão matei o outro pid e executei gnome-keyring-daemon --start | grep SOCK(também o adicionei no .profile) a saída (grep):

SSH_AUTH_SOCK=/tmp/keyring-2LXXXX/ssh

Eu segui exatamente as mesmas etapas e da mesma forma não tenho nenhuma caixa de diálogo GUI ssh-add.

EDIT 2 :

Criei uma nova chave protegida por senha na máquina virtual Ubuntu 11.10 na unidade e ainda não consigo obter nenhum prompt de senha.

EDIT 3 : Parece que isso não funciona no gerenciador de janelas Awesome :( e possivelmente em outro ..

pl1nk
fonte
1
Qual o sentido de adicionar uma chave SSH protegida por senha? Ele derrota o objetivo ... #
6286 MarkovCh1
3
@ Syzygy Bem, você sempre digita as senhas de diferentes serviços e aplicativos ou usa um chaveiro para desbloquear sua senha com a senha de login?
pl1nk
Mais pensamentos / perguntas, pl1nk? O período de carência da recompensa expira REALMENTE em breve :-)
ish
@izx Eu verifiquei tudo o que você mencionou e são todos conforme o esperado. Como mencionei na minha atualização, eu também tinha usado o Gnome. Devo registrar um bug?
pl1nk
Você pode encontrar algumas pistas aqui . Parece que a ordem na qual as coisas começam é importante, e para o gnome-keyring-daemon chegar ao dbus também é importante.
John S Gruber

Respostas:

2

Se você estiver usando o Unity ou um gerenciador de sessões que inicie o gnome-keyring-daemon, você pode simplesmente usar o Seahorse (Senhas e Chaves) para estabelecer uma chave, definir para que serve, definir uma senha e distribuir sua chave pública para o diretório computador que você vai usar com o ssh. Nenhum comando do terminal é necessário.

Você cria a senha:

  1. selecionando Arquivo-> Novo e selecione Chave do Shell Seguro. Pressione Continuar.

  2. Digite um nome descritivo e selecione Create and set up.

  3. Você será solicitado a digitar uma frase-chave duas vezes (na segunda vez para verificar se não a inseriu incorretamente na primeira vez.

  4. Digite o computador no qual a chave pública deve ser usada e o nome de usuário no computador para o qual você usará a chave. A chave pública será copiada para esse outro computador, solicitando sua senha nesse computador, se necessário.

Agora a My Personal Keysguia exibirá a chave.

Assumindo que o gnome-keyring-daemon foi iniciado corretamente quando você efetuou login no Lightdm, e novamente pelo seu gerenciador de sessões, quando você usa a chave pela primeira vez com o ssh, será solicitada a frase-chave. Nesta caixa de diálogo, você pode fornecer a frase-chave, selecionar o Detailscontrole e solicitar que o chaveiro seja desbloqueado sempre que você estiver conectado - fornecendo automaticamente essa chave. pressioneOK

Você pode não ser solicitado dessa maneira se houver outra chave disponível para fazer login no computador remoto.

Depois disso, a primeira guia Seahorse Passwordslistará uma "Desbloquear entrada de senha" para o nome da chave. Clique no triângulo antes de " Senhas: Login" para vê-lo.

John S Gruber
fonte
Portanto, essa funcionalidade não está funcionando com o Awesome WM. Gostaria de continuar usando o Awesome, para continuar usando minha solução alternativa.
pl1nk
19

Fazendo uma chave SSH protegida por senha persistir entre sessões e reinicializa

Provavelmente, é isso que você deseja: digitar a senha da chave uma vez a torna disponível sempre que você estiver conectado. Funcionará para a maioria dos usuários que estão usando os desktops Unity ou Gnome.

  • Quando você se conecta após adicionar a chave pública ao servidor remoto, você obtém a caixa de diálogo ssh-add da GUI:

    insira a descrição da imagem aqui

  • Expanda os "Detalhes" clicando no triângulo e você verá o abaixo. O padrão é "bloquear chaveiro quando eu sair", o que requer que você digite a senha uma vez por sessão:

    insira a descrição da imagem aqui

  • Altere para Desbloquear automaticamente ... sempre que eu estiver conectado , o que significa que funcionará sempre que você fizer login na sua sessão - é "controlado" pela sua senha de usuário. Ele persistirá durante as reinicializações.

    insira a descrição da imagem aqui

  • Digite a senha da chave uma vez e é isso - a chave é autenticada através do login inicial bem-sucedido no seu ambiente de área de trabalho.


Se você estiver usando o AwesomeWM

Testado com uma nova instalação do AwesomeWM em um novo ID do usuário

  • Por padrão, o AwesomeWM usa ssh-agent:

    $ exportação | grep SSH
    declarar -x SSH_AGENT_PID = "5479"
    declarar -x SSH_AUTH_SOCK = "/ tmp / ssh-fWCKNnPq5440 / agent.5440"
    
  • Para que as etapas acima funcionem, você deve usar gnome-keyring-daemoncomo o daemon de autenticação SSH, não o ssh-agent. Quando você faz login usando o lightdm, o PAM é iniciado gnome-keyring-daemonpara tentar desbloquear uma chave de login com sua senha de desbloqueio, mas você deve adicionar à sua configuração para mantê-la em execução e usá-la.

  • Adicione o seguinte ao final do seu ~/.xprofile:

      #! / bin / bash
      eval $ (gnome-keyring-daemon --start)
      exportar SSH_AUTH_SOCK
      exportar GNOME_KEYRING_PID
      exportar GNOME_KEYRING_CONTROL
    

Os comandos no ~/.xprofilearquivo serão executados pelo xsession antes de iniciar o incrível gerenciador de janelas e o vincularão ao gnome-keyring-daemon --loginprocesso iniciado pelo PAM através das variáveis ​​de ambiente acima.

  • Efetue logout no lightdm e efetue login novamente. Agora, quando o fizer ssh user@host, você deverá obter os pop-ups acima - use-os para decodificar suas chaves privadas em ~ / .ssh / e salve-as no chaveiro de login do gnome-keyring.

A solução geral para qualquer ambiente de gerenciador de janelas / desktop

  • é usar em gnome-keyring-daemonvez de ssh-agent. Para isso, você precisa estar executando gnome-keyring-daemon e tê-lo iniciado e quer fazer isso depois ssh-agenté iniciado ou não iniciar ssh-agentem tudo.

  • ssh(na verdade, ssh-add) decide qual agente de autenticação chamar com base no valor da SSH_AUTH_SOCKvariável de ambiente, que pode ser verificada digitandoexport | grep SOCK

  • este é o formato SSH_AUTH_SOCK=/tmp/ssh-MMFyVlI22130/agent.22130para ssh-agent (NÃO é o que você deseja salvar sua chave)

  • mas do formulário SSH_AUTH_SOCK="/tmp/keyring-mEQB5g/ssh"para o gnome-keyring-daemon (que você deseja)

  • verifique o valor e verifique se ps aux | grep keyringo gnome-keyring-daemon está em execução e, se estiver, inicialize-o com os resultados degnome-keyring-daemon --start

  • você pode verificar as identidades salvas associadas no console digitando ssh-add -l- se ele mostrar "sem agente", você cometeu um erro ao configurar o gnome-keyring-daemon.

ish
fonte
Bem, eu não vi isso! Qual comando devo usar ou, melhor ainda, qual comando esse diálogo chama?
pl1nk
@ Izx ao usar isso, é necessário usar o ssh-add?
John S Gruber
@JohnSGruber Não, desde que as chaves privadas estejam inseridas ~/.ssh, não há necessidade de usar ssh-add- a caixa de diálogo será exibida no primeiro uso. Observe que isso só funciona no Unity / Gnome - eu descobri no chat que o OP está usando o AwesomeWM , onde isso não funciona!
Ish
1
@ pl1nk: consulte a solução atualizada para o AwesomeWM no final da resposta.
Ish
@izx - Obrigado por seu suporte geral, verifique minha pergunta atualizada.
pl1nk
2

A solução para o seu problema está usando o agente ssh. Você só precisa desbloquear a senha da sua chave uma vez, depois ela é mantida na memória pelo agente e usada automaticamente

  • Gere um par de chaves públicas / privadas com ssh-keygen -t dsa
  • Copie a chave pública na máquina remota, geralmente é ~ / .ssh / allowed_keys (use ssh-copy-idpara isso)
  • Execute ssh-addantes de efetuar login no sistema remoto; isso solicitará sua senha e a armazenará
  • Efetue login no sistema remoto, sem necessidade de senha

O ssh-agent é bem descrito no .net, por exemplo aqui:

Outra vantagem do ssh-agent é que, se você se conectar ao sistema remoto, ssh -A [email protected]poderá ssh do computador domain.name para um terceiro computador que contenha sua chave pública, sem copiar sua chave privada para o computador domain.name (e nunca vê sua chave privada, apenas o desafio / resposta única).

Floyd
fonte
Como eu posso fazer isso? Não está claro nas instruções que você enviou. Além disso, este Ubuntu está relacionado?
pl1nk
Eu editei o meu post com instruções detalhadas
Floyd
Sua solução armazena a senha por sessão. Além disso, no meu caso, parece que houve um conflito com o gnome-keyring, como você pode ver na minha resposta.
pl1nk
@ pl1nk: então você precisa que a senha seja armazenada nas sessões - ou seja, solicitada apenas uma vez para cada inicialização?
Ish
Sim, você deve fornecer a senha uma vez por sessão. Essa é a idéia por trás das chaves ssh protegidas por senha, para fornecer outra camada de segurança além de poder acessar o arquivo de chave privada após o login.
Floyd
-1

você pode usar

ssh-add 'filename or fullpath'

você será solicitado a senha, se você tiver uma

então você pode se conectar sem senha

eyadof
fonte
1
Como mencionei na minha pergunta, estou procurando uma maneira mais elegante.
Pl1nk 18/05/12
-2

Se você deseja trabalhar com chaves privadas, faça:

ssh-keygen -t rsa -N ''

Então:

copiar .ssh/id_rsa.pubpara o destino da máquina .ssh/authorized_keysvia scp

scp .ssh/id_rsa.pub user@remote_machine:~/.ssh/authorized_keys

Tudo feito.

Conecte-se à máquina remota sem senha:

ssh user@remote_machine

E não temos solicitação de senha.

Octávio Filipe Gonçalves
fonte
Isso continuará me pedindo a senha da chave todas as vezes.
Pl1nk
1
Provavelmente porque quando você executa o ssh-keygen -t rsa -N '', você coloca uma senha. Portanto, quando você executar o comando acima, não coloque uma senha, apenas pressione a tecla "ENTER".
Octávio Filipe Gonçalves
Bem, eu gostaria de ter chaves com senha. Atualizei minha pergunta
pl1nk
1
Ok, eu não entendo por que você quer fazer isso com senha. Normalmente, esse conceito é usado apenas para fazer conexões com máquinas remotas que podem reconhecer a máquina cliente sem autenticação. Portanto, se você não quiser esse cenário, basta executar uma conexão ssh normal. direita?
Octávio Filipe Gonçalves
1
Dizer às pessoas para copiarem sua chave pública sobre as chaves autorizadas em uma máquina remota é uma força bruta ... Muito melhor é usar o comando ssh-copy-id user @ remotemachine, que fará o login com uma senha pela primeira vez e depois APPEND não substitui a chave.
Floyd