Usuario en passdb, ¡pero getpwnam() falla!

Usuario en passdb, ¡pero getpwnam() falla!

Hice esta pregunta en stackoverflow y me di cuenta de que podría obtener mejores respuestas aquí.

Intentando configurar Samba + OpenLDAP usando nss_ldap en Linux. Todo el software lo compilo yo desde la fuente, por lo que no hay RPM, YUM, etc.

Usando Pozix Linux, que es nuestra propia distribución: sistema de inicio de sesión básico, lo que significa que la distribución se basa en el estándar /etc/passwd, /etc/group.

Instalé todo el software necesario para convertir el sistema a un sistema basado en LDAP que parece funcionar con otro software como SSH excepto SAMBA.

Pude unir Windows7 al PDC independiente de Samba. No puedo iniciar sesión con una cuenta de dominio a menos que esa cuenta también se agregue al archivo /etc/passwd.

Obtengo: usuario en passdb, ¡pero getpwnam() falla!

Todo lo que he leído apunta a un problema de NSS_LDAP. Aquí hay una lista de cosas que he hecho:

  1. getent passwd muestra a los usuarios perfectamente bien
  2. Puedo ingresar por ssh al mismo host Linux usando una cuenta de usuario que está solo en la base de datos LDAP.
  3. prueba de identificación (la prueba es mi cuenta de prueba solo en LDAP) que funciona
  4. ./pdbedit -La prueba Lv funciona
  5. ./net rpc lista de derechos cuentas -Uroot funciona, veo que root tiene todos los derechos necesarios
  6. Por sugerencia de stackoverflow, cambié mi archivo nsswitch.conf de (archivos ldap) a (archivos ldap), lo que esencialmente cambió el orden de volcado de getent passwd y no resolvió el problema.
  7. comente rootbinddn y agregue bindpw con una versión de texto sin cifrar de la contraseña para eliminar cualquier pregunta con ldap.secret
  8. smb.conf tiene ldapsam:trusted = sí
  9. smb.conf y ldap.conf tienen ssl desactivado
  10. No se ejecuta nscd

Todo el capítulo 5 del sitio samba.org sobre cómo hacer felices a los usuarios funciona excepto:

./smbclient //tsrvr/test -Utest

Esto produce el mensaje de error del asunto en log.smbd y el registro de depuración de ldap muestra una consulta para prueba sin errores y con un valor de retorno exitoso.

Si pongo 'prueba' en /etc/passwd, ¡entonces funciona!

Es como si la relación entre nss_ldap y smbd estuviera rota y hago hincapié en la relación porque LDAP parece estar bien (slapcat, ldapsearch, etc... todos funcionan)... Parece que la biblioteca nss_ldap está obteniendo un valor de retorno que cuando se devuelve a smbd , de alguna manera no se entiende.

Realmente apreciaría cualquier sugerencia. Veo este problema listado con frecuencia. A menudo relacionado con PAM pero no uso PAM.

Además, si abro el archivo /etc/passwd y agrego una línea para el usuario en cuestión, puedo iniciar sesión.

No estoy usando PAM. Agregué las dos actualizaciones del registro de Windows7 requeridas por el sitio Samba.org.

La pila de software es la siguiente: Samba 3.5.3 OpenLDAP 2.4.21 nss_ldap 264

---------------------[ actualizar ]---------------------

Comencé a mirar el código fuente de Samba.

Encontré esta función en samba3/auth/auth_util.c (aproximadamente la línea 580)

auth_serversupplied_info *result; 
const char *username = pdb_get_username(sampass); 
pwd = getpwnam_alloc(result, username);

pwd se evalúa como NULL aunque el nombre de usuario sea válido. getpwnam_alloc asigna memoria para la estructura de resultados y la llena con el UID de Unix, el GID principal, etc.

Todo lo que leo dice que esta llamada usa NSS. Espero que alguien del equipo de Samba que tenga conocimiento de esto pueda intervenir.

---------------------[ actualización ]--------------------- Examinando el código fuente de samba aquí es lo que estoy descubriendo:

El error ocurre en auth/auth_util.c (línea 580) con una llamada a getpwnam_alloc

getpwnam_alloc intenta realizar algún tipo de almacenamiento en caché y si el nombre de usuario no se encuentra en el caché reciente, el código falla con una llamada a:

sys_getpwnam se encuentra en lib/system.c, que es solo un contenedor para getpwnam

Documentado aquí:http://opengroup.org/onlinepubs/007908775/xsh/getpwnam.html

No aparece cuando Samba verifica el error descrito; Agregará algo de depuración e informará.

Definitivamente una falla en la biblioteca del sistema operativo al implementar getpwnam, pero aún no estoy seguro de qué.

Respuesta1

SOLUCIONADO!!!!!!!!!!!!

Tengo un script que iniciaba Samba (NMBD, SMBD) y OpenLDAP (SLAPD). Es un script RC que lee datos de configuración de un archivo para determinar, entre otras cosas, qué procesos ya se están ejecutando o si un proceso dependiente no se inicia, etc... Aquí hay un fragmento de la parte relevante del script. La última línea copia una versión de nsswitch.conf en su lugar que especifica el uso de búsquedas LDAP.

while [ $i -lt $MAXPROCS ];
  do
   PID=${PROC[$i]}
   StartProc $PID

   if test $? != 0; then
    echo "!!! Aborting Any Remaining Start-up Processes !!!"
    exit 1
   fi

  i=$(($i+1))
done

 cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf

Y al cerrar estaba haciendo lo siguiente; Observe que copio un archivo nsswitch.conf que tiene entradas "noldap".

while [ $i -lt $MAXPROCS ];
do
  PID=${PROC[$i]}
  StopProc $PID
  i=$(($i+1))
done

cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf

Resulta que en el escenario de inicio, samba quiere que el contenido de nsswtich.conf tenga las entradas ldap allí antes de la invocación. Esto es lo que hice para solucionar mis problemas:

cp /etc/rc.d/pozix/nsswitch.conf.ldap /etc/nsswitch.conf

while [ $i -lt $MAXPROCS ];
  do
   PID=${PROC[$i]}
   StartProc $PID

   if test $? != 0; then
    cp /etc/rc.d/pozix/nsswitch.conf.noldap /etc/nsswitch.conf
    echo "!!! Aborting Any Remaining Start-up Processes !!!"
    exit 1
   fi

  i=$(($i+1))
done

En resumen, parece que cómo inicia SMBD es tan importante como cuándo lo inicia. Si inicia SMBD cuando nsswitch.conf no tiene entradas LDAP, obtendrá una versión de smbd ejecutándose vinculada a nss_ldap.así que piensa que solo debería depender de /etc/passwd (si eso es todo lo que hay en el archivo nsswitch.conf) y cambiar el contenido de nsswitch.conf después de ejecutar SMBD no tiene ningún efecto.

Espero que esto ayude a otros creadores de sistemas...

Respuesta2

nss_ldap configura el sistema de inicio de sesión de Linux para usar LDAP para la autenticación, no Samba. Aún tienes que decirle a Samba que use ldap para la autenticación. Por ejemplo:

ldap ssl = off
ldap admin dn = cn=Manager,dc=ldappdc,dc=mydomain,dc=com
ldap suffix = dc=ldappdc,dc=mydomain,dc=com
ldap user suffix = ou=People
ldap group suffix = ou=Group
ldap idmap suffix = ou=Idmap
ldap machine suffix = ou=Hosts

Por supuesto, Samba debe haber sido construido con soporte LDAP.

Ahora consigueherramientas-smbldappara crear usuarios/grupos/etc. en su base de datos LDAP. smbldap-tools creará las cuentas de usuario con los formatos de contraseña adecuados (una para Linux, otra para Samba) y otros atributos requeridos.

Así es como se vería una entrada LDAP completa:

dn: uid=someuser,ou=People,dc=corp,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: sambaSamAccount
cn: someuser
displayName: someuser
gecos: System User
gidNumber: 513
givenName: someuser
homeDirectory: /home/someuser
loginShell: /bin/bash
sambaAcctFlags: [U]
sambaHomeDrive: H:
sambaHomePath: \\%L\someuser
sambaKickoffTime: 2147483647
sambaLMPassword: FBB7BAF5868B4CBAAAD3B435B51404EE
sambaLogoffTime: 2147483647
sambaLogonScript: logon.bat
sambaLogonTime: 0
sambaNTPassword: D4CB2D67B19490FB090A6EDEC60E3EAE
sambaPrimaryGroupSID: S-1-5-21-1603264347-769597993-3324459097-513
sambaProfilePath: \\%L\profiles\someuser
sambaPwdCanChange: 0
sambaPwdLastSet: 1277051243
sambaPwdMustChange: 1280939243
sambaSID: S-1-5-21-1603264347-769597993-3324459097-3006
shadowLastChange: 14780
shadowMax: 45
sn: someuser
uid: someuser
uidNumber: 1003
userPassword:: e1NTSEF9Z2RueUNBMnVDMWVrejZLZGg4OGNLUmRJRU9zdlJFdE8=

información relacionada