Я использую libnss-pgsql2, чтобы пользователи виртуальной системы хранились в базе данных PostgreSQL. Виртуальные пользователи в базе данных работают нормально. Они могут войти в систему. Я могу видеть их uid, gid, группы с помощью команды id. Пример:
# id backup001
uid=10001(backup001) gid=10001(backup001) groups=10001(backup001)
Однако в системах, в которых я использую libnss, я часто получаю эту ошибку:
Could not connect to database
Это часто случается, например, с заданиями cron. У меня есть одно задание cron, которое запускается каждый час и сбрасывает базы данных postgresql в резервную копию. Контраб такой:
04 * * * * postgres umask 077 && /usr/bin/pg_dumpall | gzip > ~postgres/backup/postgresql-complete-dump-$(date +\%H).sql.gz
Это задание всегда вызывает ошибку. Таким образом, каждый час засыпая меня электронной почтой.
Моя настройка довольно проста: макет таблицы, который я использую для хранения пользователей, доступен здесь: http://p.adora.dk/P2486.html
Я использую Debian Squeeze на сервере.
Соответствующие файлы конфигурации: nsswitch.conf: http://p.adora.dk/P2489.html
(описание: используйте "обычных" системных пользователей в / etc / passwd и / etc / shadow, однако, если пользователь НЕ найден, продолжите поиск через pgsql)
nss-pgsql.conf: http://p.adora.dk/P2487.html
(описание: содержит запросы SQL, которые используются для поиска различной информации, которая обычно находится в / etc / passwd и / etc / group)
nss-pgsql-root.conf: http://p.adora.dk/P2488.html
(описание: содержит запросы SQL, которые используются для поиска конфиденциальной информации, которая обычно находится в / etc / shadow)
Что я сделал для отладки этого:
Я очень надеюсь, что вы поможете мне исправить эту ошибку.
Обновление 2012-08-22:
Я пробовал делать strace на psql. Соответствующая часть стразы находится внизу этой пасты: http://paste.adora.dk/P2492.html
Я заметил, что он пытается открыть /etc/nss-pgsql-root.conf и получить EACCESS, однако я не считаю, что это должно быть проблемой. Этот файл должен быть доступным для чтения только root, поскольку он соответствует / etc / shadow, который также доступен для чтения только root.
25341 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
25341 open("/usr/lib/libgpg-error.so.0", O_RDONLY) = 4
25341 read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 \6\0\0004\0\0\0"..., 512) = 512
25341 fstat64(4, {st_mode=S_IFREG|0644, st_size=11540, ...}) = 0
25341 mmap2(NULL, 14512, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0xb6f6c000
25341 mmap2(0xb6f6f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x2) = 0xb6f6f000
25341 close(4) = 0
25341 mprotect(0xb70bf000, 4096, PROT_READ) = 0
25341 mprotect(0xb73d8000, 4096, PROT_READ) = 0
25341 munmap(0xb7414000, 40018) = 0
25341 open("/etc/nss-pgsql-root.conf", O_RDONLY) = -1 EACCES (Permission denied)
25341 write(2, "\nCould not connect to database\n", 31) = 31
Возможно, это ошибка libnss-pgsql .... Как вы думаете?
Обновление 2012-08-22:
ХОРОШО. Я откопал отчет об ошибке пятилетней давности: http://pgfoundry.org/tracker/index.php?func=detail&aid=1010197&group_id=1000039&atid=234
Кажется, что такое поведение на самом деле является ошибкой. Был предоставлен патч, однако в отчете об ошибке нет активности. Может быть, проект заброшен. Надеюсь, что нет :(
Я думаю, что ответ на вашу проблему в этой строке:
open("/etc/nss-pgsql-root.conf", O_RDONLY) = -1 EACCES (Permission denied)
Попробуйте ослабить права доступа к этому файлу, чтобы его могли читать «группа» и «другие», и посмотрите, решит ли это проблему.
Вы ошибаетесь, что файл соответствует /etc/shadow
. Это соответствует /etc/password
, который читается как «группа», так и «другие». Ваша база данных PostgreSQL и таблицы, используемые для аутентификации, соответствуют /etc/shadow
.
Он не может подключиться к базе данных, потому что не может прочитать учетные данные для доступа к базе данных из этого файла.