Я настроил pam и nss на сервере Linux (ubuntu 16.04), чтобы получать пользователей и группы из удаленной базы данных postgresql. Вход на сервер проходит нормально, но группы из базы выгружаться не могут.

Если в таблице group_table существуют записи, getent group завершается ошибкой с сообщением 'столбец номер 3 находится вне диапазона 0..2'. Все sql, используемые в nss-pgsql.conf, выглядят нормально.

Я использую следующие db-таблицы:

table passwd

usergroups

group_table

Содержимое 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

Если в таблице group_table нет данных, я получаю сообщение о том, что имя группы не найдено, а getent group работает с локальными группами. Надеюсь, кто-то может помочь.

0
rnick 29 Янв 2018 в 16:11
Похоже, getent ищет дополнительный столбец, который нужно вернуть из запроса? имя пользователя будет равно 0, пароль 1 и gid 2.
 – 
Raman Sailopal
29 Янв 2018 в 16:41
Да @RamanSailopal. Выяснил, что группе-sqls нужна дополнительная колонка, содержащая список имен пользователей. Спасибо.
 – 
rnick
29 Янв 2018 в 17:25

1 ответ

Лучший ответ

Выяснил, что для группы SQL нужен дополнительный список имен пользователей. Изменение SQL на

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

Решает проблему.

2
rnick 29 Янв 2018 в 17:29