Como configuro o SSH para não precisar digitar minha senha?


153

Como configuro o SSH para não precisar digitar minha senha ao me conectar a um host?


Alguém pode argumentar se o uso dessas chaves não requer uma senha. Para evitar que alguém que se apossar da sua chave privada possa realmente abusá-la, é possível proteger a chave com uma senha própria. Obviamente, pode-se deixar essa senha em branco, mas há muitos casos em que isso não seria recomendado.
Arjan

Na última Cygwin com a mais recente SSH, eu estava sendo re-solicitado porque eu precisava fazer uma mudança para o meu ~/.ssh/configque agora é necessária PubkeyAcceptedKeyTypes ssh-rsa*,ssh-dss*
HDave

Respostas:


164

Gere uma chave SSH (se você não tiver uma)

Se você usa o GNOME, o aplicativo de cavalos - marinhos ("Senhas e chaves de criptografia") pode fazer isso por você: Arquivo -> Novo -> Chave do Secure Shell .

Se você preferir o terminal, execute para gerar um par de chaves. Os tipos de pares de chaves válidos são:ssh-keygen -t <type>

  • rsa: o padrão
  • dsa: equivalente mais ou menos, exceto restrito a chaves de 1024 bits
  • ecdsa: mesma segurança com chaves menores, mas relativamente nova e um tanto rara no software SSH.
  • ed25519: Alta segurança (mais resistente a ataques de canal lateral e geradores de números aleatórios fracos). Geração de assinatura muito rápida. Muito novo. Disponível apenas no OpenSSH> = 6.5 .

O programa solicitará uma senha e um local para salvar a nova chave. É recomendável usar o caminho padrão sugerido porque todas as outras ferramentas o procurarão lá.

Carregar a chave pública no servidor remoto

Novamente, o cavalo-marinho geralmente pode fazer isso por você - em Minhas Chaves Pessoais , clique com o botão direito do mouse na sua chave SSH e escolha Configurar chave para um shell seguro .

Ou, ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-hostno terminal.

Ou, completamente manualmente, passo a passo:

  1. Crie um diretório (se ainda não existir) nomeado .sshno diretório inicial do usuário remoto no host remoto.
  2. Nesse diretório, crie um arquivo chamado authorized_keys(se ele já não existir).
  3. No caso seu controle remoto umaské mais liberal do que o normal, tornar o arquivo não agrupar-gravável: chmod go-w ~/.ssh ~/.ssh/authorized_keys.
  4. Por fim, copie (anexe) o conteúdo da sua chave pública local ( ~/.ssh/id_rsa.pub) no ~/.ssh/authorized_keysarquivo remoto .

Carregue a chave no agente ssh

Se você carregar sua chave privada em um agente ssh , ela manterá a chave descriptografada na memória. Queremos que isso evite redigitar a senha sempre que entrarmos em um servidor.

Primeiro, o agente deve ser iniciado ou o caminho de um soquete de comunicação iniciado deve ser carregado em uma variável. A execução do ssh-agent em um terminal irá gerar comandos para atribuir e configurar as variáveis ​​do agente. Esses comandos podem ser salvos em um arquivo para uso em um terminal diferente. Como alternativa, é possível executar esses comandos e esquecer a reutilização do mesmo agente em outro terminal. por exemplo: eval $(ssh-agent).

Carregar a chave é uma questão simples de executar ssh-adde fornecer a frase secreta.

Se você estiver usando o GNOME, o gnome-keyring-daemon geralmente fornece a mesma funcionalidade de agente SSH que o ssh-agent, portanto, você não precisa iniciar nada. O GNOME irá carregar e desbloquear automaticamente a chave no login também.

Shell no servidor remoto sem senha

Se tudo foi feito corretamente, o uso não solicitará uma senha. Se algo estiver errado com o agente e não com a chave, você será solicitado a digitar a frase secreta da chave e não a senha da conta do usuário.ssh user@server

Qualquer coisa que use ssh para comunicação funcionará sem inserir a senha da conta do usuário quando a chave correta for carregada no agente. Programas como scp , sftp e rsync fazem uso disso.


Notas:

  • Você só precisa de uma chave SSHv2, pois o SSHv1 é muito inseguro e agora não utilizado.
  • Você também precisa apenas de um tipo de chave - RSA ou DSA é suficiente. (ed25519 e ECDSA são recentes e, portanto, não são suportados em todos os lugares).
  • Todas essas etapas são as mesmas para as chaves RSA e DSA. Se você usa o DSA, use em id_dsavez de id_rsae o ECDSA terá id_ecdsa.
  • Os servidores OpenSSH anteriores ao 3.0 foram usados authorized_keys2- mas é muito improvável que você encontre algo anterior ao 5.0 em uso.
  • Estas instruções se aplicam apenas ao OpenSSH versão 3.0 e mais recente. lsh, ssh.comE outros (Unix e não) servidores SSH não estão incluídos neste tutorial.

Exemplos:

  • Copiando a chave pública para um host remoto:

    ssh-copy-id -i ~ / .ssh / id_rsa.pub myaccount @ remotehost # this
    
    cat ~ / .ssh / id_rsa.pub | ssh myaccount @ remotehost \
          'mkdir -p ~ / .ssh; cat >> ~ / .ssh / allowed_keys '# ou este
    
  • Salvando variáveis ​​do agente para reutilização (exemplo elaborado)
    ssh-agent> ~ / .ssh / agente de terminal cruzado
    . ~ / .ssh / agente de terminal cruzado
    

7
ah, você precisa dizer "ssh-add {caminho para o arquivo-chave-privado}" e solicitará sua senha. Por favor, torne isso mais explícito em sua postagem. Você também deve adicionar "Quarto, execute ssh". Parte do problema com a documentação desse material é que ela encobre etapas aparentemente óbvias que NÃO são óbvias para alguém novo no processo que não tem idéia do que está acontecendo e como esses programas funcionam juntos.
Jason S

1
Jason: ssh-add -l é para verificar se um agente está em execução. O ssh-add sem argumentos adicionará a chave do local padrão (que é ~ / .ssh / id_rsa). Enfim, atualizado.
#

4
existe um comando ssh-copy-idque copia a chave pública para o host de destino e define as permissões automaticamente.
hasen

1
Ótima resposta! Está faltando um pouco nas permissões dos arquivos principais - eu só tive um problema relacionado a isso hoje. O arquivo de chave privada só deve ser acessível por mim e o arquivo de chave pública deve ser gravável apenas por mim.
ripper234

1
Um revestimento: ssh-keygen -f ~/.ssh/id_rsa -N "";ssh-copy-id -i ~/.ssh/id_rsa username@server-ip-or-address(basta substituir username@server-ip-or-address).
totymedli

22

Você não especificou em que Unix está, em que Unix está se conectando, em qual shell está usando, qual variante SSH está usando etc. Então, isso pode precisar ser ligeiramente ajustado; isso é baseado em versões razoavelmente recentes do OpenSSH, que são usadas em muitas variantes do unix.

Isso tudo é do seu sistema de desktop local.

ssh-keygen

Certifique-se de usar o padrão para o nome da chave. Eu sugiro que você faça definir uma senha nessa tecla, caso contrário, é um problema de segurança. "-t rsa" não seria uma má idéia, mas provavelmente não é necessário.

ssh-copy-id username@server

Isso solicitará a senha que você usaria para efetuar o login e configurará o material allowed_keys para você. (não é necessário fazê-lo manualmente)

Então isso:

`ssh-agent`

ou talvez isso:

exec ssh-agent sh

ou:

exec ssh-agent bash

Isso iniciará um agente SSH que pode manter sua chave. Em muitas variantes modernas do Unix, se você estiver logado graficamente, isso já terá ocorrido. A primeira variante (com os backticks) coloca um agente ssh em segundo plano e configura as variáveis ​​de ambiente para conversar com ele. Os dois segundos fazem com que o agente execute um shell para você; assim, quando você sai do shell, o agente sai.

Muitas variantes modernas do Unix já terão um agente em execução para você, especialmente se você efetuou login graficamente. Você pode tentar " ps aux | grep ssh-agent" ou " ps -ef | grep ssh-agent"; se algo já estiver em execução, use isso.

Então finalmente:

ssh-add

Ele solicitará uma senha; dê o que você deu ao ssh-keygen. Também há maneiras de fazer isso perguntar graficamente. E você pode colocar as coisas ssh-agent e ssh-add em seus scripts de login (a configuração é diferente dependendo do shell usado) para automatizar isso, mas algumas variantes do Unix (atual Linux Linux, por exemplo) fazem a maioria disso automaticamente, então tudo o que você realmente precisa fazer é criar uma chave e usar ssh-copy-id para configurá-la no host remoto.

Agora, " ssh username@server" deve funcionar sem solicitar nenhuma autenticação. Nos bastidores, está usando uma chave que o ssh-agent está segurando e pedindo ao agente que faça os truques de assinatura mágica para ele.


11

Também é possível fazer isso no PuTTY no Windows.

Depois de configurar o par de chaves pública / privada (como outras respostas aqui mostram), execute o PuttyGen. Lá, carregue a chave privada existente que você já configurou e salve-a como uma chave privada PuTTY (ppk).

Em seguida, no PuTTY, basta clicar na sessão salva na qual deseja efetuar login automaticamente e clicar em Carregar. A partir daqui, vá para Conexão -> Dados no painel esquerdo e, em "Nome de usuário com login automático", digite o nome de usuário para esse servidor remoto:

Entrada de nome de usuário PuTTY

Depois disso, vá para Connection -> SSH -> Auth e procure o ppk que você criou no PuttyGen:

Entrada de chave privada PuTTY

Volte para a página da sessão e salve a sessão que você carregou anteriormente.


O primeiro link da imagem, "PuTTY username entry", parece estar quebrado.
22640 Peter Mortensen

2
O PuTTY inclui sua própria versão do ssh-agent; chama-se Pageant. Ele roda na bandeja do sistema e segura sua chave para você. Você nunca precisa executar o ssh-agent, basta marcar "Permitir encaminhamento do agente" nas opções do PuTTY na seção Auth, e a conexão do Pageant será encaminhada para o terminal remoto para disponibilizar seu agente-chave.
22410 Kevin Panko

3

Em uma pergunta muito semelhante no ServerFault , recomendo usar o ssh-copy-id , que executa todas as etapas envolvidas na configuração de chaves de autenticação para você:

ssh-copy-id é um script que usa ssh para efetuar login em uma máquina remota (presumivelmente usando uma senha de login, portanto a autenticação por senha deve ser ativada, a menos que você tenha feito algum uso inteligente de várias identidades)

Ele também altera as permissões da página inicial do usuário remoto, ~ / .ssh e ~ / .ssh / allowed_keys para remover a capacidade de gravação do grupo (o que impediria o login, se o sshd remoto tiver StrictModes definido em sua configuração).

Se a opção -i for fornecida, o arquivo de identidade (o padrão é ~ / .ssh / identity.pub) será usado, independentemente de haver chaves no seu ssh-agent.

Tudo que você precisa fazer é simplesmente isso:

ssh-copy-id user@host

Digite sua senha uma vez e pronto!


3

Além de tudo que já foi dito sobre como definir chaves ssh, eu recomendo o Keychain como um front end do console do ssh-agent, que permite que você lide com apenas um por processo do sistema em vez de por login.

Eu sei que já existem ferramentas GNOME e KDE que fazem o mesmo, mas se você é do tipo viciado em console, isso é ótimo (e pode ser usado na maioria dos sistemas Unix).

Para usá-lo, basta anexar o seguinte ao seu ~/.bashrc(semelhante para outras conchas):

if type keychain >/dev/null 2>/dev/null; then
  keychain --nogui -q <all your SSH/PGP keys>
  [ -f ~/.keychain/${HOSTNAME}-sh ] && . ~/.keychain/${HOSTNAME}-sh
  [ -f ~/.keychain/${HOSTNAME}-sh-gpg ] && . ~/.keychain/${HOSTNAME}-sh-gpg
fi

2

http://linuxproblem.org/art_9.html

Seu alvo

Você deseja usar o Linux e o OpenSSH para automatizar suas tarefas. Portanto, você precisa de um login automático do host A / usuário a para Host B / usuário b. Você não deseja inserir nenhuma senha, porque deseja chamar ssh de um script shell.


1
O voto negativo não foi meu, mas eu não me importaria de as pessoas excluirem sua resposta se notassem que alguém postou uma resposta quase semelhante alguns momentos antes.
Arjan

2
Arjan: Na maioria das vezes, eu concordo com você, mas quando as postagens são separadas apenas por alguns segundos, não necessariamente acho justo punir a pessoa em segundo lugar. Não estou dizendo que você tem que recompensá-los por upvoting, mas downvoting dá a impressão de que a resposta é errada, em vez de não a tempo
TheTXI

2

Eu escrevi este tutorial muito curto depois de ficar MUITO frustrado com MUITO REALMENTE longos tutoriais porque realmente é tão simples :)

test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa #press enter twice if given prompts, then "ssh-add"

scp ~/.ssh/id_rsa.pub destID@destMachine:/tmp/ #type password

ssh destID@destMachine #type password

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

rm /tmp/id_rsa.pub

2

O Putty tem uma -pwopção que permite criar um atalho na área de trabalho como este:

"C:\Program Files\PuTTY\putty.exe" -ssh user@192.168.2.2 -pw your_password

1
  1. No host de conexão, execute ssh-keygen. (Se indicar que você precisa especificar um tipo, faça ssh-keygen -t rsa.) Quando solicitar um local para o arquivo, escolha o padrão. Quando solicitar uma senha, pressione enter para não usar a senha.
  2. cat ~/.ssh/id_rsa.pub(ou qualquer que seja o local padrão do arquivo ssh-keygen, embora você precise ter uma instalação muito antiga sshpara que seja diferente); copie a saída para a área de transferência.
  3. Efetue login normalmente no host de destino como a conta à qual você deseja se conectar. Edite o arquivo ~/.ssh/authorized_keys(se ~/.sshnão existir, sloginem algum lugar; esta é a maneira simples e fácil de criar com as permissões corretas). Cole sua área de transferência (contendo a id_rsa.pubdo outro host) neste arquivo.

3
-1 por sugerir não adicionar senha. Sem uma senha, qualquer pessoa que esteja lendo o arquivo agora pode se passar por um usuário legítimo.
22449 bortzmeyer

2
Primeiro, ele pediu para não precisar digitar sua senha; Eu realmente não acho que ter que digitar uma senha em vez da senha dele seria uma melhoria. Segundo, você está errado; é por isso que existe uma chave pública e uma chave privada, para que a chave pública possa estar no mundo.
caos

A senha em questão é digitada durante a geração da chave, nem sempre que você se conecta. Corrigir?
Richard Hoskins

Não. As chaves geradas com uma frase secreta exigem que a senha seja inserida toda vez que a chave é usada.
caos

2
Errado. Com o ssh-agent (consulte a resposta aceita), você digita a senha apenas uma vez por sessão.
22449 bortzmeyer

0

Se você quiser fazer tudo no terminal no Linux:

No host

cd ~ / .ssh /

ssh-keygen -t {rsa | dsa} -b {1024 | 2048 | 4096} -C "algum texto de comentário se desejar" -f id_ArbitraryName

Os itens no {} são opções, use rsa ou dsa e escolha o tamanho do bit (maior é mais seguro)

Em seguida, você precisa adicionar as permissões aos arquivos allowed_keys e allowed_keys2.

gato id_ArbitraryName.pub >> chaves_autorizadas

cat id_AribtraryName.pub >> allowed_keys2

Em seguida, faça o download do arquivo id_AribtraryName para a caixa da qual você deseja ssh. Se a caixa de conexão for baseada em unix, um arquivo de configuração pode ser necessário (em massa, alguém acima o cobriu).

Na caixa de conexão

No seu arquivo de configuração - vim ~ / .ssh / config

Host example.host.com # ou o nome do seu computador

Nome de usuário do usuário

IdentityFile ~ / .ssh / id_ArbitraryName

O arquivo de configuração precisa de permissões de 600. A pasta SSh precisa de 700.

Espero que ajude se você encontrar o problema de configuração que é muito omitido.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.