Como posso configurar o login SSH sem senha?


252

Quero poder efetuar login em um controle remoto via ssh sem precisar digitar a senha o tempo todo.

  • Como faço para configurá-lo?
  • É necessário um comando diferente para executar uma sessão sem senha?

Você está usando o openssh? (se assim que é fácil;))
Rinzwind

@Rinzwind, Por que eu me incomodaria em obter a versão proprietária quando o OpenSSH já está pré-instalado?
Oxwivi

15
Eu tento não fazer suposições;)
Rinzwind 4/11/11

1
@ Kevin, por favor, esclareça-se. Estamos falando de ssh-ing sem senha, o que geralmente é uma boa prática . Você quer dizer ssh-ing em um shell raiz? Isso não é coberto por esta pergunta.
Oxwivi

@ Oxwivi: Desculpe, isso deveria ter sido um comentário sobre a resposta de Ravindra, que é direcionada para o login root.
21715 Kevin

Respostas:


266

Responda

Execute estes comandos:

ssh-keygen

Então você precisará copiar a nova chave no seu servidor :

ssh-copy-id user@host
## or if your server uses custom port no:
ssh-copy-id "user@host -p 1234"

Após a cópia da chave, ssh na máquina normalmente:

ssh user@host

Agora você pode fazer login sem digitar uma senha da máquina específica em que executou os comandos.

Exemplo

not-marco@rinzwind-desktop:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/not-marco/.ssh/id_rsa): 
Created directory '/home/not-marco/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/not-marco/.ssh/id_rsa.
Your public key has been saved in /home/not-marco/.ssh/id_rsa.pub.
The key fingerprint is:
b1:25:04:21:1a:38:73:38:3c:e9:e4:5b:81:e9:ac:0f not-marco@rinzwind-desktop
The key's randomart image is:
+--[ RSA 2048]----+
|.o= . oo.        |
|*B.+ . .         |
|*=o .   o .      |
| = .     =       |
|. o     S        |
|E.               |
| o               |
|  .              |
|                 |
+-----------------+

not-marco@rinzwind-desktop:~$ ssh-copy-id not-marco@server
not-marco@server's password: 
Now try logging into the machine, with "ssh 'not-marco@server'", and check in:

  ~/.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Explicação

Isso pressupõe que você já pode se conectar com sucesso ao seu servidor via SSH.

Você precisará gerar um par de chaves SSH que permitirá que você se identifique sem usar uma senha. Você pode optar por proteger as chaves com uma senha, se desejar, mas isso pode ser deixado em branco, permitindo o acesso SSH totalmente sem senha.

  1. Primeiro, crie seu par de chaves SSH, executando ssh-keygenisso criará um arquivo id_rsae id_rsa.pub. O pubarquivo é o que se passa nos servidores, a chave privada ( id_rsa) é o que fica com você e é como você se identifica.
  2. Em seguida, copie a chave pública para o seu servidor ssh-copy-id user@serversubstituindo user por seu usuário e servidor remoto pelo nome DNS ou endereço IP da máquina. Ele solicitará sua senha SSH, digite-a e, se tudo for concluído com êxito, você poderá acessar a máquina via ssh user@serversem precisar de uma senha.

Referências


11
@ Oxwivi, esta resposta é a maneira mais correta de fazê-lo - mas parece mais longa. Tudo que você precisa fazer é digitar ssh-keygensiga as instruções na tela, em seguida, digite ssh-copy-id user@serversubstituindo usuário com o usuário remoto e servidor com a máquina remota
Marco Ceppi

3
Tive este erro "O agente admitiu falha ao assinar usando a chave". sempre que tentar efetuar o login após seguir este procedimento. A solução foi executar "> ssh-add" na máquina local e agora posso efetuar logon na máquina remota conforme o esperado.
precisa saber é o seguinte

1
Vale a pena mencionar que, se você precisa usar a porta personalizada para @server, você precisa fazer isso com: ssh-copy-id "not-marco@127.0.0.1 -p 1234".
S3m3n

@Rinzwind: Isso significa que eu nunca consigo me autenticar de um cliente / máquina desconhecido para o meu servidor se eu desativar a autenticação por senha e permitir apenas a autenticação por chave. Existe alguma maneira de permitir o login de uma máquina desconhecida usando a chave privada que foi gerada para o cliente conhecido / configurado se comunicar com o servidor? Quero dizer, essa chave privada é portátil e pode ser usada para me autenticar no servidor de outras máquinas, em caso de necessidade de emergência?
Rajat Gupta

4
Mas o servidor ainda está pedindo a senha ,,,
Lerner Zhang

34

Digite os seguintes comandos:

  1. ssh-keygen

    Pressione a Entertecla até receber a solicitação

  2. ssh-copy-id -i root@ip_address

    (Uma vez solicitará a senha do sistema host)

  3. ssh root@ip_address

Agora você deve conseguir fazer login sem nenhuma senha.


25

A maneira como eu costumo fazer isso é a seguinte:

ssh-keygen -t rsa

(Quando for solicitada uma senha, deixe em branco)

Então: cat ~/.ssh/id_rsa.pub | ssh username@hostname 'cat >> .ssh/authorized_keys'

(Isso requer que a pasta .ssh esteja no diretório inicial no nome do host de destino, com o arquivo allowed_keys)

Obviamente, substitua o nome de usuário pelo nome de usuário desejado e o nome de host pelo nome de host ou endereço IP desejado.

Depois disso, apenas SSH para essa caixa como você está acostumado.


E o comando touche chmodna resposta de Rinzwind?
Oxwivi

7
Você precisará chmod o .ssh/authorized_keysarquivo para 0600 ou isso não vai funcionar
Marco Ceppi

Isso realmente ajudou, porque eu não conseguia que o ssh-copy-id funcionasse como root no meu servidor. ele deve ser raiz na situação em que o backuppc (ou qualquer outro daemon) precisa ssh em outra máquina.
Adam

18

Eu normalmente uso sshpasspara isso, instalo sudo apt-get install sshpasse uso assim

sshpass -p 'password' ssh your_username@your_server

6
Por que não usar chaves ssh?
enzotib

1
Não é uma situação do tipo "por que não", ainda funciona perfeitamente sem adicionar chaves, é apenas outro método, eu diria.
Bruno Pereira

Obrigado pelas informações sobre sshpass, nunca ouvi falar disso antes.
Panther

7
As chaves SSH são a resposta "correta" para a pergunta, mas sshpassé um hack muito útil nos casos em que você não pode alterar o método de autenticação no servidor remoto!
27430 Jacob Krall

9
Isto é muito perigoso, você vai manter em Bash_history ou o que as senhas simples para os hosts que você está se conectando ..
kappa

10

Desativar autenticação de senha

Como muitas pessoas com servidores SSH usam senhas fracas, muitos atacantes online procuram um servidor SSH e começam a adivinhar senhas aleatoriamente. Um invasor pode tentar milhares de senhas em uma hora e adivinhar até a senha mais forte, com tempo suficiente. A solução recomendada é usar chaves SSH em vez de senhas. Para ser tão difícil de adivinhar quanto uma chave SSH normal, uma senha teria que conter 634 letras e números aleatórios. Se você sempre conseguir fazer login no seu computador com uma chave SSH, desabilite completamente a autenticação por senha.

Se você desabilitar a autenticação por senha, somente será possível conectar-se a computadores que você aprovou especificamente. Isso melhora enormemente sua segurança, mas torna impossível a conexão com seu próprio computador a partir do PC de um amigo sem pré-aprovar o PC ou a partir do seu laptop quando você acidentalmente excluir sua chave.

É recomendável desativar a autenticação de senha, a menos que você tenha um motivo específico para não fazê-lo.

Para desativar a autenticação por senha, procure a seguinte linha no seu arquivo sshd_config:

#PasswordAuthentication yes

substitua-o por uma linha parecida com esta:

PasswordAuthentication no

Depois de salvar o arquivo e reiniciar o servidor SSH, você não deve nem ser solicitado por uma senha ao fazer login.

https://help.ubuntu.com/community/SSH/OpenSSH/Configuring#disable-password-authentication


2
Esta é a resposta correta mais básica, mas boa para segurança! Desabilitar também o login root é outro bom
FreeSoftwareServers

Afeta PasswordAuthentication notodos os usuários? Caso contrário, como faço para desativá-lo para usuários normais, mas o deixo inalterado para root enquanto estou testando? Eu realmente não quero me enganar e me trancar completamente.
Adam

Mantenha uma sessão ssh aberta para que você possa alterá-la novamente. Você deseja desativar senhas e raiz. Sim, você pode fubar. Não;)
Thufir

Durante o ssh, tenho um erro Permission denied (publickey).com PasswordAuthentication no. O que devo fazer? Eu mudo PasswordAuthentication noem outro host?
ParisaN

9

Esta solução é especificamente para usuários que usam o Windows para ssh em suas máquinas remotas, incluindo imagens em nuvem na AWS Cloud e GCE Cloud

aviso Legal

Recentemente, usei esta solução para fazer login remoto de novas imagens de vm implantadas no GCE.


Ferramentas usadas:

  1. puttygen puttygen baixar
  2. winscp download winscp

Etapas para executar:

  1. Gere par de chaves pública / privada usando puttygen.
  2. Faça o upload da chave pública para o servidor na nuvem ou local remoto.

Como fazer isso:

1. Gere uma chave / par ou use a chave privada existente

Se você possui uma chave privada:

Abra puttygen, pressione o botão carregar e selecione seu *.pemarquivo de chave privada ( ).


Se você não possui uma chave privada:

  • Aberto puttygen,
  • Selecione o tipo de chave desejado SSH2 DSA (você pode usar RSA ou DSA) na seção Parâmetros . É importante que você deixe o campo da senha em branco.
  • Pressione generatee siga as instruções para gerar o par de chaves (público / privado).

Imagem de geração de chave de amostra

(da fonte 1, link fornecido abaixo)

2. Crie um novo arquivo 'allowed_keys' (com notepad)

Copie os dados da chave pública da seção "Chave pública para colar no arquivo OpenSSH allowed_keys" do PuTTY Key Generator e cole os dados da chave no authorized_keysarquivo.


Verifique se há apenas uma linha de texto nesse arquivo.


3. Carregue a chave no servidor Linux

  • Abra o WinSCP,
  • Selecione o protocolo de arquivo SFTP e faça o login com suas credenciais ssh.
  • Em caso de sucesso, você verá a estrutura do diretório inicial em sua máquina remota.

Carregue o arquivo allowed_keys no diretório inicial na máquina remota.


4. Defina as permissões apropriadas

Criar .sshdiretório (se não existir)


Copie o authorized_keysarquivo para o .sshdiretório
(isso substituirá qualquer authorized_keysarquivo existente , observe isso).

Se o arquivo existir, basta adicionar o conteúdo desse arquivo ao arquivo existente.


Execute comandos para definir permissões:

sudo chmod 700 .ssh && chmod 600 .ssh/authorized_keys

Agora você poderá sshacessar a máquina remota sem inserir credenciais todas as vezes.

Leitura adicional:


4

Se você criar um par de chaves público / privado e efetuar login usando nossa chave pública recém-criada, não precisará digitar sua senha. Dependendo da configuração do seu conjunto de chaves e / ou agente ssh, pode ser necessário proteger sua chave com uma senha.

Aqui está um dos muitos breves tutoriais para você. É de importância crucial para a segurança desse método, que a chave privada gerada permaneça privada! Você nunca deve compartilhá-lo com ninguém ou permitir o acesso em qualquer capacidade.

Este comando gera uma chave razoavelmente forte em ~/.ssh/:

ssh-keygen -b 4096

Em ~/.ssh/você encontrará sua chave pública como id_rsa.pub. Seu conteúdo deve ser anexado ao authorized_keysarquivo do servidor transportando-o por uma mídia transportável (pen drive) ou ativando brevemente a autenticação por senha no servidor, usando ssh-copy-id ~/.ssh/id_rsa.pub username@servere desativando-o novamente.

Se você optar por proteger sua chave com uma frase secreta (na primeira etapa), poderá usar ssh-agento chaveiro Ubuntu para proteger esse farse localmente, para que você não precise digitá-lo o tempo todo.


3

Para fazer algumas adições:

  • Por padrão, o Mac não possui ssh-copy-id, você deverá instalá-lo:

    curl https://raw.github.com/beautifulcode/ssh-copy-id-for-OSX/master/ssh-copy-id.sh -o /usr/local/bin/ssh-copy-id
    chmod +x /usr/local/bin/ssh-copy-id
    

encontre mais aqui: https://github.com/beautifulcode/ssh-copy-id-for-OSX

  • se você fez um encaminhamento de porta, o comando deve ser assim:

    ssh-copy-id "not-marco@127.0.0.1 -p 2222"
    

observe que as aspas são necessárias.


3

Login / cópia remota sem fornecer uma senha

Os aplicativos sshe scppara logon remoto e cópia remota, respectivamente, permitem a comunicação com um host remoto sem fornecer uma senha. Isso requer que você siga um procedimento de autenticação como o descrito abaixo. Por cliente, entendemos a máquina em que você está sentado e por servidor, a máquina na qual você deseja fazer logon sem fornecer uma senha. As etapas do procedimento de autenticação são:

  1. Execute ssh-keygen para gerar chaves públicas e privadas, a menos que isso já tenha sido feito em sua máquina. Estes são armazenados em arquivos em $HOME/.ssh.
  2. Anexe o conteúdo do arquivo de chave pública ao arquivo $HOME/.ssh/authorized_keysou $HOME/.ssh/authorized_keys2ao servidor.

Existem três tipos diferentes de protocolos de autenticação. Você especifica o tipo ao executar o ssh-keygen:

  1. Protocolo SSH versão 1, RSA1: essa é a opção padrão e resulta na identidade dos arquivos (chave privada, deve-se chmod 0700garantir que esse arquivo não seja legível para outras pessoas) e identity.pub (chave pública).
  2. Protocolo SSH versão 1, RSA : é obtido executando ssh-keygen -t rsae resulta em arquivos id_rsa(chave privada) e id_rsa.pub(chave pública)
  3. Protocolo SSH versão 1, DSA : é obtido executando ssh-keygen -t dsae resulta em arquivos id_dsa(chave privada) e id_dsa.pub(chave pública)

Ao executar o ssh-keygen, você pode confiar nas respostas padrão (o que implica que você não fornece uma senha). Isso torna toda a configuração simples, mas também insegura.

Você pode especificar o tipo de chave a ser usado por uma opção para ssh ; ssh -1força o uso de chaves RSA1 (versão do protocolo 1), enquanto ssh -2força o ssh a experimentar apenas as chaves RSA ou DSA (versão do protocolo 2). Nos exemplos abaixo, geramos e instalamos chaves RSA1 e DSA no host remoto, para que você tenha mais flexibilidade. Você pode criar um arquivo de configuração em seu .sshdiretório com a linha

Protocol 1,2

Isso faz com que o ssh tente uma conexão RSA1 (protocolo versão 1) antes do RSA / DSA (protocolo versão 2).

Usando chaves RSA1

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat identity.pub >> authorized_keys"

Usando chaves DSA

remote=user@remotehost   # fill in correct user and remotehost names
cd $HOME/.ssh
# create .ssh on remote host if it is non-existing:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy DSA key: 
scp id_dsa.pub ${remote}:.ssh
ssh $remote "cd .ssh; cat id_dsa.pub >> authorized_keys2"

Isso é tudo o que você precisa fazer se não tiver usado uma senha durante a geração das chaves. Você pode testar a conexão executando o ssh $ remote e veja se consegue efetuar login sem fornecer uma senha (pode ser necessário usar -1ou -2como opções para o ssh ). Obviamente, o procedimento pode ser repetido para qualquer máquina na qual você deseja fazer logon.

Se você usou uma senha, precisará executar o programa ssh-agentpara iniciar um shell especial, seguido de ssh-addpara registrar sua combinação de chave / senhasshd . Consulte as páginas de manual desses programas para obter mais informações.

Um script para automatizar conexões sem senha: ssh-no-password.sh

#!/bin/sh

# create ssh connections without giving a password

if [ $# -lt 1 ]; then
  echo Usage: $0 username@remotehost
  exit
fi
remote="$1"  # 1st command-line argument is the user@remotehost address
this=$HOST   # name of client host

# first check if we need to run ssh-keygen for generating
# $HOME/.ssh with public and private keys:
if [ ! -d $HOME/.ssh ]; then
  echo "just type RETURN for each question:" # no passphrase - unsecure!!
  # generate RSA1, RSA and DSA keys:
  echo; echo; echo
  ssh-keygen
  echo; echo; echo
  ssh-keygen -t rsa
  echo; echo; echo
  ssh-keygen -t dsa
else
  # we have $HOME/.ssh, but check that we have all types of
  # keys (RSA1, RSA, DSA):
  if [ ! -f $HOME/.ssh/identity ]; then
     # generate RSA1 keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate RSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t rsa
  fi
  if [ ! -f $HOME/.ssh/id_rsa ]; then
     # generate DSA keys:
     echo "just type RETURN for each question:" # no passphrase - unsecure!!
     ssh-keygen -t dsa
  fi
fi


cd $HOME/.ssh

if [ ! -f config ]; then
  # make ssh try ssh -1 (RSA1 keys) first and then ssh -2 (DSA keys)
  echo "Protocol 1,2" > config
fi

# copy public keys (all three types) to the destination host:

echo; echo; echo
# create .ssh on remote host if it's not there:
ssh $remote 'if [ ! -d .ssh ]; then mkdir .ssh; fi' 
# copy RSA1 key: 
scp identity.pub ${remote}:.ssh/${this}_rsa1.pub
# copy RSA key:
#scp id_rsa.pub ${remote}:.ssh/${this}_rsa.pub
# copy DSA key:
scp id_dsa.pub ${remote}:.ssh/${this}_dsa.pub
# make authorized_keys(2) files on remote host:

echo; echo; echo
# this one copies all three keys:
#ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_rsa.pub >> authorized_keys2; cat ${this}_dsa.pub >> authorized_keys2;"
# this one copies RSA1 and DSA keys:
ssh $remote "cd .ssh; touch authorized_keys authorized_keys2; cat ${this}_rsa1.pub >> authorized_keys; cat ${this}_dsa.pub >> authorized_keys2;"

echo; echo; echo
echo "try an ssh $remote"

copiado de: http://folk.uio.no/hpl/scripting/doc/ssh-no-password.html


1

Gostaria de adicionar uma resposta para aqueles que acharem que devem digitar a senha, mesmo que tenham lido todas as respostas aqui, porque você definiu o IdentitiesOnly como sim. E a resposta aqui pode economizar muito tempo para gerenciar várias chaves, sendo chaves para git ou servidor.

Depois de gerar a chave e copiá-la para o servidor:

ssh-keygen  # change the file to /home/yourname/.ssh/something
ssh-copy-id -i ~/.ssh/something.pub lerner@192.168.20.160

Eu achei que não funcionou.

Depois fui verificar o ~/.ssh/configarquivo no cliente, vi isso na parte inferior:

Host *
IdentitiesOnly yes

Então eu adiciono isso acima:

Host somename
HostName 192.168.20.160
User lerner
IdentityFile ~/.ssh/something

Eu posso fazer login entrando ssh somename.

Em seguida, você pode adicionar várias chaves ssh usando seus nomes favoritos e você só precisa adicionar as configurações como as quatro linhas acima ao arquivo de configuração.

Host é o nome que você gostaria de inserir quando conectar o servidor posteriormente; o HostName é o ip do servidor; Usuário é o nome de usuário que você efetua login no servidor; e o arquivo de identidade é o arquivo em que você armazena a chave que você gerou.

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.