Поставил NSS модуль для postgresql.
Он соединён с сервером базы данных по сети через внешний IP (но
находится сервер в той же системе)

Если написать в конфиг очередность проверки согласно документации
(compat, pgsql) то при попытке залогиниться сообщается:

Could not connect to database

и продолжается проверка в локальном списке. Если убрать nscd то
проверка в локальном списке не продолжается а "повисает" (вроде без
таймаута, навсегда).

В логе postgresql ошибок нет. Если очерёдность поменять то всё отлично
работает. (Но менять не хочется - хочу дать возможность
юзерам пользоваться именами типа "root" и другими системными)

Ещё не могу понять как эту nss дебажить, никуда вроде она не пишет логов


Вот конфиг:

# cat /etc/nsswitch.conf 
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
#
# extended with example entries using the nss-pgsql module.

#passwd:          compat pgsql
#group:           compat pgsql
#shadow:          compat pgsql
passwd:          pgsql compat
group:           pgsql compat
shadow:          pgsql compat

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis


# cat /etc/nss-pgsql.conf 
connectionstring        = hostaddr=192.168.1.75 dbname=dhcs-new user=nss 
password=123 connect_timeout=1

# you can use anything postgres accepts as table expression

# Must return "usernames", 1 column, list
getgroupmembersbygid    = SELECT username FROM passwd_table WHERE gid = $1
# Must return passwd_name, passwd_passwd, passwd_gecos, passwd_dir, 
passwd_shell, passwd_uid, passwd_gid
getpwnam        = SELECT username, passwd, gecos, homedir, shell, uid, gid FROM 
passwd_table WHERE username = $1
# Must return passwd_name, passwd_passwd, passwd_gecos, passwd_dir, 
passwd_shell, passwd_uid, passwd_gid
getpwuid        = SELECT username, passwd, gecos, homedir, shell, uid, gid FROM 
passwd_table WHERE uid = $1
# All users
allusers        = SELECT username, passwd, gecos, homedir, shell, uid, gid FROM 
passwd_table
# Must return group_name, group_passwd, group_gid
getgrnam        = SELECT groupname, passwd, gid, ARRAY(SELECT username FROM 
usergroups WHERE usergroups.gid = group_table.gid) AS members FROM group_table 
WHERE groupname = $1
# Must return group_name, group_passwd, group_gid
getgrgid        = SELECT groupname, passwd, gid, ARRAY(SELECT username FROM 
usergroups WHERE usergroups.gid = group_table.gid) AS members FROM group_table 
WHERE gid = $1
# Must return gid.  %s MUST appear first for username match in where clause
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 username FROM 
usergroups WHERE usergroups.gid = group_table.gid) AS members FROM group_table

Attachment: signature.asc
Description: PGP signature

Ответить