28 votos

No se puede entrar por SSH a cualquiera de las cuentas que usar /bin/bash como shell por defecto

Estoy tratando de instalar bash como shell por defecto en un BRAZO de Linux que se ejecuta en un dispositivo embebido (Synology DS212+ NAS). Pero hay algo realmente malo, y yo no puedo averiguar qué es.

Síntomas:

1) Root /bin/bash como shell por defecto, y puede iniciar sesión normalmente a través de SSH:

$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash

$ ssh root@NAS
root@NAS's password:
Last login: Sun Dec 16 14:06:56 2012 from desktop
# 


2) joeusuario ha /bin/bash como shell por defecto, y recibe "Permiso denegado" cuando intenta iniciar sesión a través de SSH:

$ grep joeuser /etc/passwd
joeuser:x:1029:100:Joe User:/home/joeuser:/bin/bash

$ ssh joeuser@localhost
joeuser@NAS's password:
Last login: Sun Dec 16 14:07:22 2012 from desktop
Permission denied, please try again.
Connection to localhost closed.


3) cambio de joeusuario la shell /bin/sh:

$ grep joeuser /etc/passwd
joeuser:x:1029:100:Joe User:/home/joeuser:/bin/sh

$ ssh joeuser@localhost
Last login: Sun Dec 16 15:50:52 2012 from localhost
$ 




Para hacer las cosas aún más extraño, que puede iniciar la sesión como joeusuario usando /bin/bash el uso de la consola serie (!). También un su - joeuser como root funciona bien, por lo que el bash binario sí está funcionando bien.

En un acto de desesperación, he cambiado joeusuario del uid a 0 en /etc/passwd, pero también que no funcionó, por lo que no parece ser algo de permisos relacionados.

Parece que bash es hacer algo extra para comprobar que sshd no le gusta, y el bloqueo de las conexiones para usuarios no root. Tal vez algún tipo de cordura de cheques o de emulación de terminal - que es la activación de la cuando sigchld, pero sólo cuando se llama a través de ssh.

Yo ya fui a través de cada elemento en el archivo sshd_config, y también poner SSHD en modo de depuración, pero no encontró nada extraño. Aquí está mi /etc/ssh/sshd_config:

LogLevel DEBUG
LoginGraceTime 2m
PermitRootLogin yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys
ChallengeResponseAuthentication no
UsePAM yes
AllowTcpForwarding no
ChrootDirectory none
Subsystem       sftp    internal-sftp -f DAEMON -u 000




Y aquí está el resultado de /usr/syno/sbin/sshd -d, mostrando el intento fallido de joeusuario tratando de conectarse, con /bin/bash como shell:

debug1: Config token is loglevel
debug1: Config token is logingracetime
debug1: Config token is permitrootlogin
debug1: Config token is rsaauthentication
debug1: Config token is pubkeyauthentication
debug1: Config token is authorizedkeysfile
debug1: Config token is challengeresponseauthentication
debug1: Config token is usepam
debug1: Config token is allowtcpforwarding
debug1: Config token is chrootdirectory
debug1: Config token is subsystem
debug1: HPN Buffer Size: 87380
debug1: sshd version OpenSSH_5.8p1-hpn13v11
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: read PEM private key done: type ECDSA
debug1: private host key: #2 type 3 ECDSA
debug1: rexec_argv[0]='/usr/syno/sbin/sshd'
debug1: rexec_argv[1]='-d'
Set /proc/self/oom_adj from 0 to -17
debug1: Bind to port 22 on ::.
debug1: Server TCP RWIN socket size: 87380
debug1: HPN Buffer Size: 87380
Server listening on :: port 22.
debug1: Bind to port 22 on 0.0.0.0.
debug1: Server TCP RWIN socket size: 87380
debug1: HPN Buffer Size: 87380
Server listening on 0.0.0.0 port 22.

debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 6 out 6 newsock 6 pipe -1 sock 9
debug1: inetd sockets after dupping: 4, 4
Connection from 127.0.0.1 port 52212
debug1: HPN Disabled: 0, HPN Buffer Size: 87380
debug1: Client protocol version 2.0; client software version OpenSSH_5.8p1-hpn13v11
SSH: Server;Ltype: Version;Remote: 127.0.0.1-52212;Protocol: 2.0;Client: OpenSSH_5.8p1-hpn13v11
debug1: match: OpenSSH_5.8p1-hpn13v11 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.8p1-hpn13v11
debug1: permanently_set_uid: 1024/100
debug1: MYFLAG IS 1
debug1: list_hostkey_types: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: AUTH STATE IS 0
debug1: REQUESTED ENC.NAME is 'aes128-ctr'
debug1: kex: client->server aes128-ctr hmac-md5 none
SSH: Server;Ltype: Kex;Remote: 127.0.0.1-52212;Enc: aes128-ctr;MAC: hmac-md5;Comp: none
debug1: REQUESTED ENC.NAME is 'aes128-ctr'
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: expecting SSH2_MSG_KEX_ECDH_INIT
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: KEX done
debug1: userauth-request for user joeuser service ssh-connection method none
SSH: Server;Ltype: Authname;Remote: 127.0.0.1-52212;Name: joeuser
debug1: attempt 0 failures 0
debug1: Config token is loglevel
debug1: Config token is logingracetime
debug1: Config token is permitrootlogin
debug1: Config token is rsaauthentication
debug1: Config token is pubkeyauthentication
debug1: Config token is authorizedkeysfile
debug1: Config token is challengeresponseauthentication
debug1: Config token is usepam
debug1: Config token is allowtcpforwarding
debug1: Config token is chrootdirectory
debug1: Config token is subsystem
debug1: PAM: initializing for "joeuser"
debug1: PAM: setting PAM_RHOST to "localhost"
debug1: PAM: setting PAM_TTY to "ssh"
debug1: userauth-request for user joeuser service ssh-connection method password
debug1: attempt 1 failures 0
debug1: do_pam_account: called
Accepted password for joeuser from 127.0.0.1 port 52212 ssh2
debug1: monitor_child_preauth: joeuser has been authenticated by privileged process
debug1: PAM: establishing credentials
User child is on pid 9129
debug1: Entering interactive session for SSH2.
debug1: server_init_dispatch_20
debug1: server_input_channel_open: ctype session rchan 0 win 65536 max 16384
debug1: input_session_request
debug1: channel 0: new [server-session]
debug1: session_new: session 0
debug1: session_open: channel 0
debug1: session_open: session 0: link with channel 0
debug1: server_input_channel_open: confirm session
debug1: server_input_global_request: rtype no-more-sessions@openssh.com want_reply 0
debug1: server_input_channel_req: channel 0 request pty-req reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req pty-req
debug1: Allocating pty.
debug1: session_new: session 0
debug1: session_pty_req: session 0 alloc /dev/pts/1
debug1: server_input_channel_req: channel 0 request shell reply 1
debug1: session_by_channel: session 0 channel 0
debug1: session_input_channel_req: session 0 req shell
debug1: Setting controlling tty using TIOCSCTTY.

debug1: Received SIGCHLD.
debug1: session_by_pid: pid 9130
debug1: session_exit_message: session 0 channel 0 pid 9130
debug1: session_exit_message: release channel 0
debug1: session_by_tty: session 0 tty /dev/pts/1
debug1: session_pty_cleanup: session 0 release /dev/pts/1
Received disconnect from 127.0.0.1: 11: disconnected by user
debug1: do_cleanup
debug1: do_cleanup
debug1: PAM: cleanup
debug1: PAM: closing session
debug1: PAM: deleting credentials




Aquí tienes la salida completa de sshd-dd, junto con ssh-vv.

Bash:

# bash --version
GNU bash, version 3.2.49(1)-release (arm-none-linux-gnueabi)
Copyright (C) 2007 Free Software Foundation, Inc.

El bash binario cruz fue compilado desde el código fuente. También he intentado usar el binario pre-compilado desde el Optware de distribución, pero tenía el mismo problema. He comprobado que faltan librerías compartidas usando objdump -x, pero son todos los que hay.

Alguna idea de lo que podría ser la causa de este "Permiso denegado, por favor, inténtelo de nuevo."? Estoy casi seguro de buceo en el bash de código fuente para investigar, pero tratando de evitar las horas de la persecución de algo que puede ser tonto.

EDIT: la adición de más información acerca de bash y el sistema de

$ ls -la /bin/bash
-rwxr-xr-x    1 root     root        724676 Dec 15 23:57 /bin/bash

$  file /bin/bash
/bin/bash: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.14, stripped

$  uname -a
Linux NAS 2.6.32.12 #2661 Mon Nov 12 23:10:15 CST 2012 armv5tel GNU/Linux synology_88f6282_212+

$ grep bash /etc/shells
/bin/bash
/bin/bash2

34voto

Gui Ambros Puntos 518

Para referencia en el futuro: después de muchas horas de investigación y depuración de este problema, finalmente descubrí la causa de la root.

La versión de OpenSSH utilizado por Synology es una versión altamente personalizada, que hace que no se comportan como el código original. Tiene un montón de hacks y ad-hoc personalizaciones - por ejemplo, comprobaciones adicionales antes de aceptar un inicio de sesión para ver si el servicio SSH está habilitado dentro de la interfaz web, o la eliminación de caracteres especiales (;, |, ') de comandos rsync, o... espere... evitando regular a los usuarios utilizar un shell diferente de /bin/sh o /bin/ash. Sí, codificados en binario.

He aquí el fragmento de código de OpenSSH 5.8p1, distribuidos por Synology en su código fuente (DSM4.1 - rama 2636), archivo session.c:

void do_child(Session *s, const char *command)
{
...

#ifdef MY_ABC_HERE
   char szValue[8];
   int RunSSH = 0;
   SSH_CMD SSHCmd = REQ_UNKNOWN;

   if (1 == GetKeyValue("/etc/synoinfo.conf", "runssh", szValue, sizeof(szValue))) {
           if (strcasecmp(szValue, "yes") == 0) {
                   RunSSH = 1;
           }
   }

   if (IsSFTPReq(command)){
           SSHCmd = REQ_SFTP;
   } else if (IsRsyncReq(command)){
           SSHCmd = REQ_RSYNC;
   } else if (IsTimebkpRequest(command)){
           SSHCmd = REQ_TIMEBKP;
   } else if (RunSSH && IsAllowShell(pw)){
           SSHCmd = REQ_SHELL;
   } else {
           goto Err;
   }

   if (REQ_RSYNC == SSHCmd) {
           pw = SYNOChgValForRsync(pw);
   }
   if (!SSHCanLogin(SSHCmd, pw)) {
           goto Err;
   }
   goto Pass;

 Err:
   fprintf(stderr, "Permission denied, please try again.\n");
   exit(1);

 Pass:
   #endif /* MY_ABC_HERE */
...
}


Como se puede imaginar, IsAllowShell(pw) fue el culpable:

static int IsAllowShell(const struct passwd *pw)
{
     struct passwd *pUnPrivilege = NULL;
     char *szUserName = NULL;
     if (!pw || !pw->pw_name) {
             return 0;
     }
     szUserName = pw->pw_name;
     if(!strcmp(szUserName, "root") || !strcmp(szUserName, "admin")){
             return 1;
     }
     if (NULL != (pUnPrivilege = getpwnam(szUserName))){
             if (!strcmp(pUnPrivilege->pw_shell, "/bin/sh") || 
                     !strcmp(pUnPrivilege->pw_shell, "/bin/ash")) {
                     return 1;
             }
     }
     return 0;
}


No es de extrañar por qué estaba experimentando un comportamiento extraño. Sólo conchas /bin/sh y /bin/ash sería aceptado por los usuarios diferente de root o administrador. Y esto independientemente de la uid (he probado también a hacer joeusuario uid=0, y no funcionó. Ahora es obvio por qué).

Una vez identificada la causa, la solución era fácil: basta con retirar la llamada a IsAllowShell(). Me tomó un tiempo para el derecho de configuración cross-compile openssh y todas sus dependencias, pero al final funcionó bien.

Si alguien está interesado en hacer lo mismo (o tratando de cross-compile otros módulos del kernel o los binarios de Synology), aquí está mi versión de archivo Makefile. Fue probado con OpenSSH-5.8p1 de origen, y funciona bien con los modelos de ejecución de Marvell Kirkwood mv6281/mv6282 de la CPU (como DS212+). He utilizado un host que ejecuta Ubuntu 12.10 x64.

Línea de base: las malas prácticas, terrible código, y un gran ejemplo de lo que no hacer. Entiendo que a veces Oem necesitan para desarrollar personalizaciones especiales, pero se debe pensar dos veces antes de cavar muy profundo. No sólo esto se traduce en tanto el código para ellos, pero también crea todo tipo de problemas imprevistos en el camino. Afortunadamente GPL existen para mantener honestas y abiertas.

2voto

BiG_NoBoDy Puntos 36

trate de /etc/ssh/sshd_config
búsqueda de AllowUsers

si existe trate de añadir joeusuario hay, sólo un nombre de usuario

también puede ser bloqueado en el pam... no recuerdo que archivo es...

1voto

Tom Regner Puntos 151

Para evitar el problema, y desde que he instalado bash a través de ipkg y no puedo estar seguro /opt serán siempre disponible (montado correctamente), yo simplemente puse lo siguiente en mi .perfil

[ -x /opt/bin/bash ] && exec /opt/bin/bash

mientras que /etc/passwd contiene /bin/ash como shell.

1voto

Andrew B Puntos 9763

Vamos a ver. Es aislado a una sola cáscara, además de que están mirando sshd la salida de depuración, así que no es del mundo de permiso de escritura problemas con ~joeusuario/.ssh. Esa es la que obtiene la mayoría de la gente.

Has probado a crear un adicional de usuario normal (es decir, no joeusuario) para asegurarse de que experimenta el mismo problema? Que aislar a la configuración del usuario frente de configuración de sistema.

Si se trata de un sistema de amplia del problema, la siguiente cosa que me gustaría echar un vistazo a se comparten los archivos de configuración como /etc/profile que conseguir abastecido por todos. Podría ser un bloque condicional al que no le funcionan si el nombre de usuario es root. (no es efectivo para el id de usuario, desde el que ya probados para el)

Revise el dmesg para la segmentación de informes de fallos si no lo has hecho, sólo en caso de que hay algo aún más raro pasa.

0voto

PratapSingh Puntos 467

Trate de volver a instalar Bash y ver si eso ayuda.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: