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

2

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

Tentativa de configurar o Samba + OpenLDAP usando o nss_ldap uner Linux. O software Alls é compilado por mim a partir da fonte, então nenhum RPM, YUM, etc ...

Usando o Pozix Linux, que é nosso próprio sistema de distribuição - o significado do sistema de login baunilha, a distro 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 outro software, como o SSH, exceto o SAMBA.

Conseguiu juntar o Windows7 ao 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.

Eu recebo: user no passdb, mas o getpwnam () falha!

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

  1. getent passwd mostra usuários perfeitamente bem
  2. Eu posso ssh no mesmo host Linux usando uma conta de usuário que está apenas no banco de dados LDAP.
  3. teste de
  4. id (teste é minha conta de teste somente no LDAP) que funciona
  5. ./ pdbedit -Lv test trabalha
  6. ./ net rpc lista de direitos de contas -Urro funciona, vejo raiz tem todos os direitos necessários
  7. por sugestão do stackoverflow, alterei meu arquivo nsswitch.conf de (arquivos ldap) para (arquivos ldap) que essencialmente alteravam a ordem de despejo de getent passwd & não resolveu o problema.
  8. comentou rootbinddn e incluiu o bindpw com a versão em texto puro da senha para eliminar qualquer dúvida com ldap.secret
  9. smb.conf tem ldapsam: trusted = yes
  10. smb.conf e ldap.conf ambos têm SSL fora de um
  11. Não executando o nscd

Em todo o site samba.org, capítulo 5, sobre como fazer os usuários felizes, exceto:

./smbclient // tsrvr / test -Utest

Isso produz a mensagem de erro subject 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 a relação entre nss_ldap e smbd estivesse quebrada e eu enfatizasse relacionamento porque o LDAP parece OK (slapcat, ldapsearch, etc ... all work) ... Parece que a biblioteca nss_ldap está recebendo um valor de retorno que quando entregue de volta ao smbd, de alguma forma não é entendido.

Eu realmente aprecio todas as sugestões. Eu vejo esse problema listado com freqüência. Geralmente 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, posso fazer o login.

Eu não estou usando o PAM. Eu adicionei as duas atualizações de registro do Windows7 necessárias para o site Samba.org.

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

--------------------- [update] ---------------------

Eu comecei a olhar para o código fonte do Samba.

Eu 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);

O pwd é avaliado como NULL, embora o nome de usuário seja válido. getpwnam_alloc aloca memória para estrutura de resultado e preenche-a com o Unix UID, o GID principal, etc ...

Tudo o que li diz que esta chamada usa o NSS. Espero que alguém da equipe de samba que tenha conhecimento disso eu possa falar.

--------------------- [update] --------------------- Examinar 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 armazenamento em cache e, se o nome de usuário não for encontrado no cache recente, o código fica com uma chamada para:

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

Documentado aqui: link

Não aparece quando o Samba verifica o errno descrito; irá adicionar alguns depurar e reportar de volta.

Definitivamente, uma falha na biblioteca do sistema operacional que está implementando o getpwnam, mas ainda não é certa.

    
por Kilo 20.06.2010 / 17:07

2 respostas

1

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

Eu tenho um script que estava iniciando o Samba (NMBD, SMBD) e 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 no script. A última linha copia uma versão do nsswitch.conf no local 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 no desligamento eu estava fazendo o seguinte; note que copio um arquivo nsswitch.conf que tem entradas "noldap" nele.

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 quer que o conteúdo do nsswtich.conf tenha as entradas do ldap lá antes da chamada. Veja 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 maneira 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ê obtém uma versão do smbd em execução vinculada ao nss_ldap.so pensando que ele deve depender somente de / etc / passwd (se isso é tudo o que está no arquivo nsswitch.conf) e mudar o conteúdo do nsswitch.conf depois que o SMBD está rodando não tem efeito.

Espero que isso ajude outros criadores de sistemas ...

    
por 28.06.2010 / 20:57
0

nss_ldap configura o sistema de login do Linux para usar o LDAP para autenticação, não o Samba. Você ainda tem que dizer 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

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

Agora, obtenha smbldap-tools para criar usuários / grupos / etc em seu banco de dados LDAP. O smbldap-tools criará as contas de usuário com os formatos de senha apropriados (um para o Linux, um para o Samba) e outros atributos obrigatórios.

Aqui está o que seria 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=
    
por 20.06.2010 / 18:30

Tags