autenticação de chave pública falha SOMENTE quando sshd é daemon

33

Não tenho idéia de como isso acontece. A distribuição é o Scientific Linux 6.1 e tudo está configurado para executar a autenticação via chave pública. No entanto, quando o sshd está sendo executado como um daemon (service sshd start), ele não aceita chaves públicas. (Para obter essa parte do log, alterei o script sshd para adicionar a opção -ddd)

debug1: trying public key file /root/.ssh/authorized_keys
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys2
debug1: restore_uid: 0/0
Failed publickey for root from xxx.xxx.xxx.xxx port xxxxx ssh2
debug3: mm_answer_keyallowed: key 0x7f266e1a8840 is not allowed
debug3: mm_request_send entering: type 22
debug3: mm_request_receive entering
debug2: userauth_pubkey: authenticated 0 pkalg ssh-rsa
debug3: Wrote 64 bytes for a total of 1853
debug1: userauth-request for user root service ssh-connection method publickey
debug1: attempt 2 failures 1

Se o sshd for executado no modo de depuração /usr/sbin/sshd -ddd, a autenticação funcionará como um encanto:

debug1: trying public key file /root/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
debug1: matching key found: file /root/.ssh/authorized_keys, line 1
Found matching RSA key: d7:3a:08:39:f7:28:dc:ea:f3:71:7c:23:92:02:02:d8
debug1: restore_uid: 0/0
debug3: mm_answer_keyallowed: key 0x7f85527ef230 is allowed
debug3: mm_request_send entering: type 22
debug3: mm_request_receive entering
debug3: Wrote 320 bytes for a total of 2109
debug2: userauth_pubkey: authenticated 0 pkalg ssh-rsa
Postponed publickey for root from xxx.xxx.xxx.xxx port xxxxx ssh2
debug1: userauth-request for user root service ssh-connection method publickey
debug1: attempt 2 failures 0

Alguma ideia?? Alguém já viu algo como isso?

Notas:

As permissões de arquivo foram verificadas duas vezes:

# ll -d .ssh
drwx------. 2 root root 4096 Oct 14 10:05 .ssh
# ll .ssh
total 16
-rw-------. 1 root root  786 Oct 14 09:35 authorized_keys
-rw-------. 1 root root 1675 Oct 13 08:24 id_rsa
-rw-r--r--. 1 root root  393 Oct 13 08:24 id_rsa.pub
-rw-r--r--. 1 root root  448 Oct 13 12:51 known_hosts

Me perguntaram se o sshd pode acessar os arquivos root no "modo daemon". A resposta mais próxima que chego a essa pergunta é:

# netstat -ntap | grep 22
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      19847/sshd 
# ps -ef | grep 19847
root     19847     1  0 09:58 ?        00:00:00 /usr/sbin/sshd

Se o sshd estiver sendo executado como root, não sei como não é possível acessar seus próprios arquivos. O SELinux poderia ser a causa?

user666412
fonte
1
O script init do sshd faz algo interessante? (Deve ser /etc/init.d/sshd?) Que você não está fazendo na linha de comando? Em vez de 'service sshd start', tente 'sh -x /etc/init.d/ssh start'.
PT

Respostas:

42

Sim, provavelmente o SELinux é a causa. O .sshdiretório provavelmente está errado. Olhe para /var/log/audit/audit.log. Deve ser rotulado ssh_home_t. Verifique com ls -laZ. Execute restorecon -r -vv /root/.sshse necessário.

Mark Wagner
fonte
1
Sim, o SELinux foi a causa: type = AVC msg = audit (1318597097.413: 5447): avc: denied {read} for pid = 19849 comm = "sshd" name = "selected_keys" dev = dm-0 ino = 262398 scontext = unconfined_u : system_r: sshd_t: s0-s0: c0.c1023 tcontext = unconfined_u: object_r: admin_home_t: s0 tclass = file Funciona após a execução de "restorecon -r -vv /root/.ssh". Muito obrigado.
user666412
1
thanks OBRIGADO OBRIGADO pela correção da linha de comando do selinux Eu venho tentando descobrir há anos por que eu poderia ssh como root no meu servidor redhat enterprise 6.2 usando autenticação de chave ssh, mas não consegui ssh como um usuário não root sem precisar digitar uma senha. "ssh -v" não indicava nada incomum. Eu verifiquei e verifiquei novamente as proteções de arquivo em /home/example/.ssh Não foi até que eu executei "/ usr / sbin / sshd -d" e, por algum motivo que funcionasse normalmente, percebi que algo mais estava acontecendo, e tentei uma pesquisa no google diferente e encontrei isso. Assim, os sintomas eram eu poderia SSH como ro
Paul M
1
Eu tive que fazer isso em todo o sistema de arquivos, ou seja restorecon -r /, YMMV.
Irfy
1
Eu tentei isso - mas ainda não está funcionando. no log de auditoria eu tenho type=AVC msg=audit(1434642809.455:94717): avc: denied { search } for pid=27032 comm="sshd" name="/" dev=dm-2 ino=2 scontext=unconfined_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:file_t:s0 tclass=dir- não tenho certeza do que isso significa
Yehosef 18/06/2015
1
A resposta estava no name="/"- eu tive que executar o restorecon -r /que o @Irfy sugeriu.
Yehosef 18/06
3

Eu tive o mesmo problema. No meu caso, restorecon e chcon não funcionaram.

Eu não queria desativar o selinux. Depois de muita pesquisa, finalmente percebi que era porque meu diretório pessoal foi montado de outro lugar (NFS). Encontrei este relatório de erro que me deu pistas.

Irã:

> getsebool use_nfs_home_dirs
use_nfs_home_dirs --> off

para confirmar use_nfs_home_dirs estava desativado e, em seguida:

sudo setsebool -P use_nfs_home_dirs 1

para ligar.

Agora eu posso ssh na minha máquina usando minha chave e sem digitar uma senha. Alternar o booleano use_home_nfs_dirs foi o que foi necessário para mim.

Gerard
fonte
1

Para adicionar à resposta de Mark Wagner, se você estiver usando um caminho de diretório inicial personalizado (ou seja, não /home), verifique se configurou o contexto de segurança do SELinux. Para fazer isso, se você tiver diretórios pessoais do usuário, por exemplo /myhome, execute:

semanage fcontext -a -e /home /myhome
restorecon -vR /myhome
DavidArndt
fonte
Se você estiver no CentOS, precisará executá-lo para obter semanage:sudo yum install policycoreutils-python
sm4rk0:
0

Parece que você usa chaves diferentes ao testar as conexões, 0x7f266e1a8840 vs 0x7f85527ef230. Tente conectar usando 'ssh -v example.com' ao sshd em execução como um daemon e no modo de depuração e procure as chaves usadas pelo ssh na cadeia "Oferecendo chave pública RSA".

Johan Nilsson
fonte
Sim, havia id_rsa e id_dsa. A chave DSA se foi e eu refarei o teste.
user666412
O valor mencionado em debug3: mm_answer_keyallowed: key 0xFFFFFFFFFFmudará toda vez que o sshd receber uma nova conexão. Para confirmar isso, encontre um servidor no qual o SSH funcione, ligue o sshd LOGLEVEL para debug3, reinicie o sshd, execute tail -f /var/log/secure |grep mm_answer_keyallowede efetue login algumas vezes, aguardando alguns segundos (ou minutos) entre cada conexão. Você verá que o valor muda a cada vez. E, na verdade, parece um contador para mim.
Stefan Lasiewski