La autenticación de clave pública falla SOLO cuando sshd es daemon

33

No tengo idea de cómo sucede esto. La distribución es Scientific Linux 6.1 y todo está configurado para realizar la autenticación mediante clave pública. Sin embargo, cuando sshd se ejecuta como un demonio (servicio sshd start), no acepta claves públicas. (Para obtener este registro, he cambiado el script sshd para agregar la opción -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

Si sshd se ejecuta en modo de depuración /usr/sbin/sshd -ddd, la autenticación funciona como un 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

¿¿Algunas ideas?? ¿Alguien ha visto algo como esto?

Notas:

Los permisos de archivo se han verificado dos veces:

# 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 preguntaron si sshd puede acceder a los archivos raíz en "modo demonio". La respuesta más cercana a esta pregunta es:

# 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

Si sshd se ejecuta como root, no sé cómo no es posible acceder a sus propios archivos. ¿Podría SELinux ser la causa?

usuario666412
fuente
1
¿El script de inicio sshd hace algo interesante? (¿Debería ser /etc/init.d/sshd?) Que no está haciendo en la línea de comando? En lugar de 'service sshd start' intente 'sh -x /etc/init.d/ssh start'.
PT

Respuestas:

42

Sí, SELinux es probablemente la causa. El .sshdirectorio probablemente esté mal etiquetado. Mira /var/log/audit/audit.log. Debería estar etiquetado ssh_home_t. Consulte con ls -laZ. Corre restorecon -r -vv /root/.sshsi es necesario.

Mark Wagner
fuente
1
Sí, SELinux fue la causa: type = AVC msg = audit (1318597097.413: 5447): avc: negado {read} for pid = 19849 comm = "sshd" name = "Authorized_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 después de ejecutar "restorecon -r -vv /root/.ssh". Muchas gracias.
user666412
1
gracias GRACIAS por la corrección de la línea de comandos de selinux que he estado tratando de encontrar durante años por qué podía ssh como root a mi servidor redhat enterprise 6.2 usando la autenticación de clave ssh, pero no pude ingresar como un usuario no root sin tener que ingresar una contraseña. "ssh -v" no indicaba nada inusual en absoluto. Revisé y volví a verificar las protecciones de archivos en /home/example/.ssh No fue hasta que ejecuté "/ usr / sbin / sshd -d" y por alguna razón que funcionó normalmente, me di cuenta de que algo más estaba sucediendo, y Intenté una búsqueda en Google diferente y encontré esto. Entonces, los síntomas eran que podía funcionar como un robo
Paul M
1
Tuve que hacer esto en todo el sistema de archivos, es decir restorecon -r /, YMMV.
Irfy
1
Intenté esto, pero aún no funciona. en el registro de auditoría que tengo 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- no estoy seguro de lo que significa
Yehosef
1
La respuesta estaba en name="/": tuve que ejecutar el restorecon -r /como sugirió @Irfy.
Yehosef
3

Tuve el mismo problema En mi caso, restorecon y chcon no funcionaron.

No quería deshabilitar selinux. Después de mucha investigación, finalmente pensé que era porque mi directorio de inicio estaba montado desde otro lugar (NFS). Encontré este informe de error que me dio pistas.

Corrí:

> getsebool use_nfs_home_dirs
use_nfs_home_dirs --> off

para confirmar use_nfs_home_dirs estaba apagado y luego:

sudo setsebool -P use_nfs_home_dirs 1

Encenderlo.

Ahora puedo ingresar a mi máquina con mi llave y sin ingresar una contraseña. Alternar el booleano use_home_nfs_dirs fue lo que necesitó para mí.

Gerard
fuente
1

Para agregar a la respuesta de Mark Wagner, si está utilizando una ruta de directorio de inicio personalizada (es decir, no /home), debe asegurarse de haber configurado el contexto de seguridad de SELinux. Para hacerlo, si tiene directorios de inicio de usuario en, por ejemplo /myhome, ejecute:

semanage fcontext -a -e /home /myhome
restorecon -vR /myhome
DavidArndt
fuente
Si está en CentOS, deberá ejecutar esto para obtener semanage:sudo yum install policycoreutils-python
sm4rk0
0

Parece que usa diferentes teclas al probar las conexiones, 0x7f266e1a8840 vs 0x7f85527ef230. Intente conectarse usando 'ssh -v example.com' a sshd ejecutándose como un demonio y en modo de depuración y busque las claves utilizadas por ssh alrededor de la cadena "Ofrecer clave pública RSA".

Johan Nilsson
fuente
Sí, hubo id_rsa e id_dsa. La clave DSA se ha ido y volveré a hacer la prueba.
user666412
El valor mencionado en debug3: mm_answer_keyallowed: key 0xFFFFFFFFFFcambiará cada vez que sshd reciba una nueva conexión. Para confirmar esto, encuentre un servidor donde SSH funcione, ponga en marcha el LOGSVEL sshd para depurar3, reinicie sshd, ejecute tail -f /var/log/secure |grep mm_answer_keyallowedy luego inicie sesión algunas veces, esperando unos segundos (o minutos) entre cada conexión. Verá que el valor cambia cada vez. Y en realidad me parece un contador.
Stefan Lasiewski