libnss-pgsql2 - o grupo getent falha

0

Eu configurei pam e nss em um servidor linux (Ubuntu 16.04) para obter usuários e grupos de um banco de dados postgresql remoto. O login no servidor é bom, mas os grupos não podem ser carregados para fora do banco de dados.

Se existirem entradas na tabela group_table, o grupo getent falhará com a mensagem 'o número da coluna 3 está fora do intervalo 0..2' . Todos os sqls usados no nss-pgsql.conf parecem bem.

Eu uso as seguintes tabelas de banco de dados:

Conteúdo do nss-pgsql.conf:

connectionstring        = hostaddr=123.456.789.10 dbname=nobodyexpects user=the password=spanishinquisition connect_timeout=1
getgroupmembersbygid    = SELECT username FROM passwd_table WHERE gid = $1
getpwnam        = SELECT username, passwd, gecos, homedir, shell, uid, gid FROM passwd_table WHERE username = $1
getpwuid        = SELECT username, passwd, gecos, homedir, shell, uid, gid FROM passwd_table WHERE uid = $1
allusers        = SELECT username, passwd, gecos, homedir, shell, uid, gid FROM passwd_table
getgrnam        = SELECT groupname, passwd, gid FROM group_table WHERE groupname = $1
getgrgid        = SELECT groupname, passwd, gid FROM group_table WHERE gid = $1
groups_dyn      = SELECT ug.gid FROM passwd_table JOIN usergroups ug USING (uid) where username = $1 and ug.gid <> $2
allgroups       = SELECT groupname, passwd, gid  FROM group_table

Se a tabela group_table não contiver dados, recebo a mensagem de que o nome do grupo não pode ser encontrado e o grupo getent trabalha com grupos locais. Espero que alguém possa ajudar.

    
por rnick 29.01.2018 / 14:11

1 resposta

2

Descoberto que o grupo-SQL precisa de uma lista adicional dos nomes de usuários. Alterando os SQLs para

getgrnam        = SELECT g.groupname, 'x' AS passwd, g.gid, ARRAY(SELECT p.username FROM passwd_table p INNER JOIN usergroups ug ON ug.uid=p.uid WHERE ug.gid = g.gid) AS members FROM group_table g WHERE g.groupname = $1
getgrgid        = SELECT g.groupname, 'x' AS passwd, g.gid, ARRAY(SELECT p.username FROM passwd_table p INNER JOIN usergroups ug ON ug.uid=p.uid WHERE ug.gid = g.gid) AS members FROM group_table g WHERE g.gid = $1
groups_dyn      = SELECT ug.gid FROM passwd_table JOIN usergroups ug USING (uid) where username = $1 and ug.gid <> $2
allgroups       = SELECT groupname, passwd, gid, ARRAY(SELECT p.username FROM passwd_table p INNER JOIN usergroups ug ON ug.uid=p.uid WHERE ug.gid = g.gid) AS members  FROM group_table

resolve o problema.

    
por 29.01.2018 / 15:29