Usuário no passdb, mas getpwnam() falha!

Usuário no passdb, mas getpwnam() falha!

Fiz esta pergunta no stackoverflow e percebi que poderia obter respostas melhores aqui.

Tentando configurar o Samba + OpenLDAP usando nss_ldap no Linux. Todo o software é compilado por mim a partir do código-fonte, portanto, não há RPMs, YUM, etc.

Usando Pozix Linux, que é nossa própria distribuição - sistema de login vanilla, ou seja, pronto para uso, a distribuição depende do padrão /etc/passwd, /etc/group.

Instalou todo o software necessário para converter o sistema em um sistema baseado em LDAP que parece funcionar com outros softwares como SSH, exceto SAMBA.

Consegui ingressar o Windows7 no PDC autônomo do Samba. Não consigo fazer login com uma conta de domínio, a menos que essa conta também seja adicionada ao arquivo /etc/passwd.

Recebo: usuário no passdb, mas getpwnam() falha!

Tudo que li aponta para um problema de NSS_LDAP. Aqui está uma lista de coisas que fiz:

  1. getent passwd mostra aos usuários perfeitamente bem
  2. Consigo fazer ssh no mesmo host Linux usando uma conta de usuário que está apenas no banco de dados LDAP.
  3. id test (test é minha conta de teste apenas no LDAP) que funciona
  4. ./pdbedit -Lv teste funciona
  5. ./net rpc Rights List Accounts -Uroot funciona, vejo que o root tem todos os direitos necessários
  6. por sugestão do stackoverflow, alterei meu arquivo nsswitch.conf de (arquivos ldap) para (arquivos ldap), o que essencialmente alterou a ordem de despejo de getent passwd e não resolveu o problema.
  7. comentou rootbinddn e adicione o bindpw com versão em texto simples da senha para eliminar qualquer dúvida com ldap.secret
  8. smb.conf tem ldapsam:trusted = sim
  9. smb.conf e ldap.conf possuem SSL em um
  10. Não estou executando o nscd

Tudo no capítulo 5 do site samba.org sobre como deixar os usuários felizes funciona, exceto:

./smbclient //tsrvr/test -Utest

Isso produz a mensagem de erro do assunto em log.smbd e o log de depuração ldap mostra uma consulta para teste sem erros e um valor de retorno bem-sucedido.

Se eu colocar 'test' em /etc/passwd, então funciona!

É como se o relacionamento entre nss_ldap e smbd estivesse quebrado e eu enfatizo o relacionamento porque o LDAP parece OK (slapcat, ldapsearch, etc... tudo funciona)... Parece que a biblioteca nss_ldap está recebendo um valor de retorno que quando devolvido ao smbd , de alguma forma não é compreendido.

Eu realmente apreciaria qualquer sugestão. Vejo esse problema listado com frequência. Freqüentemente relacionado ao PAM, mas não estou usando o PAM.

Além disso, se eu abrir o arquivo /etc/passwd e adicionar uma linha para o usuário em questão, poderei fazer login.

Não estou usando PAM. Adicionei as duas atualizações de registro do Windows7 exigidas pelo site Samba.org.

A pilha de software é a seguinte: Samba 3.5.3 OpenLDAP 2.4.21 nss_ldap 264

---------------------[ atualizar ]---------------------

Comecei a examinar o código-fonte do Samba.

Encontrei esta função em samba3/auth/auth_util.c (sobre a linha 580)

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

pwd é avaliado como NULL mesmo que o nome de usuário seja válido. getpwnam_alloc aloca memória para estrutura de resultados e a preenche com o UID Unix, GID primário, etc...

Tudo que li diz que esta chamada usa NSS. Espero que alguém da equipe do Samba que tenha conhecimento disso possa intervir.

---------------------[atualização]--------------------- Examinando o código-fonte do samba aqui é o que estou descobrindo:

A falha está acontecendo em auth/auth_util.c (linha 580) com uma chamada para getpwnam_alloc

getpwnam_alloc tenta fazer algum tipo de cache e se o nome de usuário não for encontrado no cache recente, o código falha com uma chamada para:

sys_getpwnam encontrado em lib/system.c que é apenas um wrapper para getpwnam

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

Não aparece nas verificações do Samba o erro descrito; adicionará alguma depuração e reportará.

Definitivamente uma falha na biblioteca do sistema operacional que implementa getpwnam, mas ainda não tenho certeza do quê.

Responder1

RESOLVIDO!!!!!!!!!!!!

Eu tenho um script que estava iniciando o Samba (NMBD, SMBD) e também o OpenLDAP (SLAPD). É um script RC que lê dados de configuração de um arquivo para determinar, entre outras coisas, quais processos já estão em execução ou se um processo dependente falha ao iniciar, etc... Aqui está um trecho da parte relevante do script. A última linha copia uma versão do nsswitch.conf que especifica o uso de pesquisas 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

E após o desligamento eu estava fazendo o seguinte; observe que copio um arquivo nsswitch.conf que contém 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

Acontece que no cenário de inicialização, o samba deseja que o conteúdo do nsswtich.conf tenha as entradas ldap antes da invocação. Aqui está o que fiz para corrigir meus 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

Em resumo, parece que a forma como você inicia o SMBD é tão importante quanto quando você o inicia. Se você iniciar o SMBD quando o nsswitch.conf não tiver entradas LDAP, você obterá uma versão do smbd em execução vinculada ao nss_ldap.so, pensando que deve depender apenas de /etc/passwd (se isso for tudo o que estiver no arquivo nsswitch.conf) e alterar o conteúdo do nsswitch.conf após a execução do SMBD não terá efeito.

Espero que isso ajude outros construtores de sistemas....

Responder2

nss_ldap configura o sistema de login do Linux para usar LDAP para autenticação, não Samba. Você ainda precisa informar ao Samba para usar o ldap para autenticação. Por exemplo:

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

Claro, o Samba deve ter sido construído com suporte LDAP.

Agora pegueferramentas smbldappara criar usuários/grupos/etc em seu banco de dados LDAP. smbldap-tools criará as contas de usuário com os formatos de senha adequados (um para Linux, um para Samba) e outros atributos necessários.

Esta é a aparência de uma 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=

informação relacionada