Adicionar uma chave pública a ~ / .ssh / allowed_keys não me loga automaticamente

446

Adicionei a chave pública SSH ao arquivo allowed_keys . ssh localhostdeve me conectar sem pedir a senha.

Eu fiz isso e tentei digitar ssh localhost, mas ele ainda me pede para digitar a senha. Existe outra configuração pela qual eu tenho que passar para fazer funcionar?

Eu segui as instruções para alterar permissões:

Abaixo está o resultado, se eu fizer ssh -v localhost.

debug1: Reading configuration data /home/john/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: Connection established.
debug1: identity file /home/john/.ssh/identity type 1
debug1: identity file /home/john/.ssh/id_rsa type -1
debug1: identity file /home/john/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_4.7p1 Debian-8ubuntu3
debug1: match: OpenSSH_4.7p1 Debian-8ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'localhost' is known and matches the RSA host key.
debug1: Found key in /home/john/.ssh/known_hosts:12
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: /home/john/.ssh/identity
debug1: Server accepts key: pkalg ssh-rsa blen 149
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>

Em seguida, solicita uma fase de passagem após o log acima. Por que não está me conectando sem uma senha?

user482594
fonte
5
Embora não seja o caso aqui, se você é do Google e está usando um diretório inicial criptografado, o sshd não poderá acessá-lo e, portanto, não poderá ler seu arquivo allowed_keys. Aqui está uma solução: bugs.launchpad.net/ubuntu/+source/openssh/+bug/362427/comments/…
Daniel Schaffer

Respostas:

1097

Você precisa verificar as permissões do authorized_keysarquivo e as pastas pai / pasta em que ele está localizado.

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Para mais informações, consulte esta página .

Você também pode precisar alterar / verificar as permissões do seu diretório pessoal para remover o acesso de gravação para o grupo e outros.

chmod go-w ~
Urso de pelúcia
fonte
6
Bem, algo acima funcionou, embora o "chmod -R go-wrx foobar" não seja dramático? Por que a necessidade de recursividade?
Joachim
9
Para a segunda parte, não é necessário torná-lo recursivo, basta fazer o chmod go-wrx foobarsuficiente. Fazer isso recursivamente pode afetar seriamente alguns aplicativos se você tiver algum grupo ou outro acesso aos arquivos, especialmente se for um diretório da web.
StingeyB
24
Conforme mencionado nas perguntas frequentes do OpenSSH, o diretório home & .ssh do usuário precisa apenas remover a permissão de gravação para o grupo / outro (o que chmod go-w $HOME $HOME/.sshserá feito). Portanto, as permissões podem ser tão "abertas" quanto 755 para os dois diretórios, se você quiser. Os comandos mais simples / menos invasivos estão no FAQ: openssh.org/faq.html#3.14
davidjb
3
Por que não funcionou para mim até eu chmod 700 ~/.ssh && chmod 644 ~/.ssh/authorized_keys? 600 não funcionou, onde 644 fez ...
ficuscr
3
Eu também precisava sudo chown -R {$USER}:{$USER} ~/.ssh/porque havia escrito o authorized_keysarquivo como root.
Zane Hooper
155

O SELinux também pode fazer com que as teclas_autorizadas não funcionem. Especialmente para root no CentOS 6 e 7. No entanto, não é necessário desativá-lo. Depois de verificar se suas permissões estão corretas, você pode corrigir isso da seguinte maneira:

chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
restorecon -R -v /root/.ssh
Cole Stanfield
fonte
7
O restoreconé o que você precisa depois de ter copiado os arquivos à mão, por exemplo, para um novo disco rígido. (Você provavelmente deve executá-lo em todos os arquivos neste caso poderia corrigir outros problemas estranhos..)
ospalh
Outro campista feliz aqui. Este foi o meu problema no RHEL 6.5
Antonio Ortells
2
9/10 vezes, uma questão "por que isso não está funcionando, sempre funciona" é uma questão do selinux.
Andrew White
corrigiu o problema para mim em 1and1 (1und1) servidor
musicman
104

definir ssh author_keys parece simples, mas esconde algumas armadilhas que estou tentando descobrir

-- SERVIDOR --

em / etc / ssh / sshd_config configurado passwordAuthentication yespara permitir que o servidor aceite temporariamente a autenticação por senha

-- CLIENTE --

considere o cygwin como emulação de linux e instale e execute o openssh

1. gerar chaves públicas e privadas (lado do cliente) # ssh-keygen

aqui, pressionando apenas ENTER, você obtém os arquivos PADRÃO 2 " id_rsa " e " id_rsa.pub " em ~ / .ssh / mas se você der um nome para a chave, os arquivos gerados são salvos no seu pwd

2. coloque o your_key.pub no computador de destinossh-copy-id user_name@host_name

se você não criou a chave padrão, este é o primeiro passo para dar errado ... você deve usar

ssh-copy-id -i path/to/key_name.pub user_name@host_name

3. o log ssh user_name@host_namefuncionará apenas para id_rsa padrão, então aqui está a segunda armadilha para você precisarssh -i path/to/key_name user@host

(use a opção ssh -v ... para ver o que está acontecendo)

Se o servidor ainda solicitar a senha , você deu a smth. para Enter passphrase: quando você criou chaves (por isso é normal)

se o ssh não estiver escutando, a porta padrão 22 deve usar ssh -p port_nr

-- SERVIDOR -----

4. modifique / etc / ssh / sshd_config para ter

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  %h/.ssh/authorized_keys

(descomentado se for o caso)

Isso instrui o ssh a aceitar o author_keys e procurar no diretório inicial do usuário o nome do key_name sting gravado no arquivo .ssh / allowed_keys

5 definir permissões na máquina de destino

chmod 755 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Desative também a autenticação de passe

passwordAuthentication no

fechar o portão para todas as tentativas ssh root / admin /....@ your_domain

6 garanta que a propriedade e a propriedade do grupo de todos os diretórios pessoais não raiz sejam apropriadas.

chown -R ~ usernamehere
chgrp -R ~/.ssh/ user 

=================================================

7. considere o excelente http://www.fail2ban.org

8. TUNNEL ssh extra para acessar um servidor MySQL (bind = 127.0.0.1)

Bortunac
fonte
5
Note que "apenas 4 segurança" não é apenas segurança! O SSH ignorará o arquivo se ele não tiver permissões restritivas.
Navin
Garantir a posse seria uma grande adição a esta lista
steviejay
1
Eu não tinha ideia ssh-copy-id! Esse passo por si só seria uma ótima resposta.
James Marble
1
chmod 755 ~ / .ssh em vez de 700 que eu vejo em outros lugares parecia fazê-lo
Jim W diz que restabelece Monica
36

Verifique também se o diretório inicial não é gravável por outras pessoas

chmod g-w,o-w /home/USERNAME

A resposta é roubada daqui

Stephan Hoyer
fonte
4
Fazer chmod 700 ~/.ssh ; chmod 600 ~/.ssh/authorized_keys ; chmod g-w,o-w ~funcionou para mim. Obrigado.
gbraad
1
por que não usar apenas em chmod og-w /home/USERNAMEvez disso?
Paramvir Singh Karwal,
13

os desesperados também podem garantir que não tenham novas linhas extras no arquivo allowed_keys devido à cópia do texto id_rsa.pub de um terminal confuso.

Alexander Taylor
fonte
2
Isso é exatamente o que aconteceu comigo! os dois terminais têm a mesma largura, então é difícil descobrir até que eu liguei os números das linhas para ver duas linhas no arquivo allowed_keys.
Shawn
1
Este. Só perdi uma hora por causa disso. E não é a primeira vez. A resposta do @ bortunac menciona a ferramenta ssh-copy-id, que usarei no futuro para evitar isso.
Xdhmoore
Eu obtive o conteúdo de id_rsa.pubusar em morevez de cat, o que foi fatal por causa das quebras de linha invisíveis.
Dan Halbert
8

usuário é seu nome de usuário

mkdir -p /home/user/.ssh
ssh-keygen -t rsa
touch /home/user/.ssh/authorized_keys
touch /home/user/.ssh/known_hosts
chown -R user:user /home/user/.ssh
chmod 700 /home/user/.ssh
chmod 600 /home/user/.ssh/id*
chmod 644 /home/user/.ssh/id*.pub
chmod 644 /home/user/.ssh/authorized_keys
chmod 644 /home/user/.ssh/known_hosts
wcc526
fonte
Melhor para root:mkdir -p /home/$USER/.ssh && chown -R $USER:$USER /home/$USER/.ssh && sudo -u $USER ssh-keygen -t rsa && touch /home/$USER/.ssh/authorized_keys && touch /home/$USER/.ssh/known_hosts && chmod 700 /home/$USER/.ssh && chmod 600 /home/$USER/.ssh/id* && chmod 644 /home/$USER/.ssh/id*.pub && chmod 644 /home/$USER/.ssh/authorized_keys && chmod 644 /home/$USER/.ssh/known_hosts && vim /home/$USER/.ssh/authorized_keys # paste keys here!
Odysseus
7

Observe que o SELinux também pode acionar esse erro, mesmo que todas as permissões pareçam estar OK. Desativá-lo fez o truque para mim (insira isenções de responsabilidade comuns sobre desativá-lo).

Nim
fonte
Você pode ver o SELinux interferindo /var/log/audit/audit.log. restorecon -R -v /root/.sshconsertou meu caso específico.
21817 Dave Goodell
7

Listar uma chave pública em .ssh / allowed_keys é necessário, mas não suficiente para o sshd (servidor) aceitá-la. Se sua chave privada estiver protegida por senha, você precisará fornecer a senha ao ssh (cliente) toda vez. Ou você pode usar o ssh-agent ou um equivalente do GNOME.

Seu rastreamento atualizado é consistente com uma chave privada protegida por senha. Consulte ssh-agent ou use ssh-keygen -p.

fche
fonte
5

Comando de gravação:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Depois de fazer isso, verifique se o seu diretório é assim:

drwx------ 2 lab lab 4.0K Mar 13 08:33 .
drwx------ 8 lab lab 4.0K Mar 13 08:07 ..
-rw------- 1 lab lab  436 Mar 13 08:33 authorized_keys
-rw------- 1 lab lab 1.7K Mar 13 07:35 id_rsa
-rw-r--r-- 1 lab lab  413 Mar 13 07:35 id_rsa.pub
Exsonic
fonte
1
como sua resposta é diferente da resposta aceita? Você escreveu três anos depois usando seu comando Ctrl + C Ctrl-V?
Stinger
5

O que fez o truque para mim finalmente foi garantir que o proprietário / grupo não fosse raiz, mas usuário:

chown -R ~/.ssh/ user
chgrp -R ~/.ssh/ user 
Ulliroyal
fonte
chown: usuário inválido: '/home/lsa/.ssh/'
Stepan Yakovenko
3

Tente "ssh-add", que funcionou para mim.

h99
fonte
3

Outra dica para lembrar. Como a v7.0 OpenSSH desabilita as chaves ssh DSS / DSA por padrão, devido a sua fraqueza herdada. Portanto, se você possui o OpenSSH v7.0 +, verifique se sua chave não está ssh-dss.

Se você estiver com as chaves DSA, poderá reativar o suporte localmente, atualizando seus arquivos sshd_confige ~/.ssh/configcom as seguintes linhas:PubkeyAcceptedKeyTypes=+ssh-dss

user2683246
fonte
3

No meu caso, eu precisava colocar meu authorized_keysarquivo .openssh.

Esta localização é especificada na /etc/ssh/sshd_configopção AuthorizedKeysFile %h/.ssh/authorized_keys.

Sean Bannister
fonte
Há toda uma classe de problemas que podem ocorrer no servidor (ao tentar conectar-se a partir de um cliente) que são impossíveis de depurar sem acesso ao servidor ... Isso ocorre por design para ocultar informações de clientes mal-intencionados, mas torna mais difícil depurar.
qneill
2

Verifique se o usuário de destino tem uma senha definida. Corra passwd usernamepara definir um. Isso foi necessário para mim, mesmo que o login SSH da senha estivesse desativado.

George
fonte
2

isso resolve meu problema

bash do agente ssh

ssh-add

Julian
fonte
Explique o que isso faz, por favor.
lyuboslav Kanev
O agente ssh armazena suas chaves ssh ... o comando bash inicia uma nova instância de seu shell. e ssh-add desbloqueia as chaves e cargas deles
Julian
2

Outra questão que você precisa cuidar. Se o seu arquivo gerado não for o padrão id_rsa e id_rsa.pub

É necessário criar o arquivo .ssh / config e definir manualmente qual arquivo de identificação você usará com a conexão.

O exemplo está aqui:

host remote_host_name
hostname 172.xx.xx.xx
user my_user
IdentityFile /home/my_user/.ssh/my_user_custom.pub
Kunthar
fonte
2
O IdentityFile deve ser a chave privada
Ken H
@KenH sim, com certeza. erro de digitação é. Desculpe por isso.
Kunthar #
1

I emitido sudo chmod 700 ~/.sshe chmod 600 ~/.ssh/authorized_keyse chmod go-w $HOME $HOME/.sshde cima e fixa o meu problema em uma caixa CentOS7 que eu tinha foi cancelada as permissões ao tentar obter samba ações trabalhando. obrigado

GJSmith3rd
fonte
1

Parece um problema de permissão. Geralmente isso acontece se a permissão de algum arquivo / diretório não estiver configurada corretamente. Na maioria dos casos, eles são ~/.sshe ~/.ssh/*. No meu caso eles são /home/xxx.

Você pode alterar o nível de log do sshd modificando /etc/ssh/sshd_config(pesquise LogLevel, defina-o como DEBUG) e verifique a saída /var/log/auth.logpara ver o que aconteceu exatamente.

Joey
fonte
3
Isso parece substancialmente idêntico à resposta aceita e provavelmente deveria ter sido um comentário, não uma resposta. Com um pouco mais de rep, você poderá postar comentários . Até lá, não use respostas como solução alternativa.
Nathan Tuggy
Desculpe, pensei que fosse o caminho para resolver todos os tipos desta questão. Agora eu sei como fazê-lo agora, obrigado.
Joey
1

Meu problema foi um AuthorizedKeysFile modificado, quando a automação para preencher / etc / ssh / allowed_keys ainda não havia sido executada.

$sudo grep AuthorizedKeysFile /etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys
AuthorizedKeysFile  /etc/ssh/authorized_keys/%u
Marca
fonte
1

Basta consultar /var/log/auth.log no servidor . Definir verbosidade adicional com -vv no lado do cliente não ajudará, porque é improvável que o servidor ofereça muitas informações a um possível invasor.

Edward van Kuik
fonte
1

Verifique se você copiou toda a chave pública para authorized_keys; o ssh rsaprefixo é necessário para que a chave funcione.

Willem
fonte
2
ssh-copy-id usado
vishnu
1

você precisa verificar as propriedades dos arquivos. para atribuir o uso de propriedade necessário:

$ chmod 600 ~/.ssh/sshKey
$ chmod 644 ~/.ssh/sshKey.pub
Maná
fonte
1

Procure no /var/log/auth.logservidor por sshderros de autenticação.

Se tudo mais falhar, execute o sshdservidor no modo de depuração:

sudo /usr/sbin/sshd -ddd -p 2200

Em seguida, conecte-se a partir do cliente:

ssh user@host -p 2200

No meu caso, encontrei a seção de erro no final:

    debug1: userauth_pubkey: test whether pkalg/pkblob are acceptable for RSA SHA256:6bL+waAtghY5BOaY9i+pIX9wHJHvY4r/mOh2YaL9RvQ [preauth]
==> debug2: userauth_pubkey: disabled because of invalid user [preauth]
    debug2: userauth_pubkey: authenticated 0 pkalg ssh-rsa [preauth]
    debug3: userauth_finish: failure partial=0 next methods="publickey,password" [preauth]
    debug3: send packet: type 51 [preauth]
    debug3: receive packet: type 50 [preauth]

Com essas informações, percebi que sshd_configestava restringindo os logins aos membros do sshgrupo. O comando a seguir corrigiu esse erro de permissão:

sudo usermod -a -G ssh NEW_USER
cmcginty
fonte
0

nessa nota, verifique se o sshd config possui -;

PermitRootLogin without-password

definido como acima, e reinicie o sshd (/etc/init.d/sshd restart)

saia e tente fazer login novamente!

padrão eu acredito que é -;

PermitRootLogin no
Posição de Edd
fonte
0

No meu caso, é porque o grupo do usuário não está definido no AllowGroups do arquivo de configuração / etc / ssh / sshd_config. Depois de adicioná-lo, tudo funciona bem.

pppk520
fonte
0

Eu tenho o diretório inicial em um local não padrão e, nos sshdlogs, tenho esta linha:

Could not open authorized keys '/data/home/user1/.ssh/authorized_keys': Permission denied

mesmo se todas as permissões forem boas (veja as outras respostas).

Encontrei uma solução aqui: http://arstechnica.com/civis/viewtopic.php?p=25813191&sid=0876f069ec2aa5fdcd691a2e2e7242c2#p25813191

No meu caso particular:

  • adicionou uma nova linha em /etc/selinux/targeted/contexts/files/file_contexts.homedirs:

    • esta é a linha original para diretórios pessoais regulares:

      /home/[^/]*/\.ssh(/.*)? unconfined_u:object_r:ssh_home_t:s0

    • esta é minha nova linha:

      /data/home/[^/]*/\.ssh(/.*)? unconfined_u:object_r:ssh_home_t:s0

  • seguido por um restorecon -r /data/e um sshdreinício

alexandrul
fonte
0

Eu tive esse problema e nenhuma das outras respostas o resolveu, embora, é claro, as outras respostas estejam corretas.

No meu caso, descobriu-se que o /rootdiretório em si (não por exemplo /root/.ssh) tinha as permissões erradas. Eu precisei:

chown root.root /root
chmod 700 /root

Obviamente, essas permissões devem ser algo assim (talvez chmod 770) independentemente. No entanto, especificamente impedido sshdde trabalhar, mesmo que /root/.sshe /root/.ssh/authorized_keysambos tinham permissões e proprietários corretos.

Jason Cohen
fonte
0

Eu tive esse problema quando adicionei o grupo do usuário de logon a outro usuário. Digamos que exista um usuário ssh-login chamado userA e um usuário não ssh-login userB. userA também possui o grupo userA. Eu modifiquei o userB para ter o grupo userA também. O lead para o comportamento descrito, para que o userA não possa efetuar login sem um prompt. Depois de remover o grupo userA do userB, o login sem aviso funcionou novamente.

Bevor
fonte