Nscd linux что это

Обновлено: 07.07.2024

Столкнулся с непонятным мне поведением системы при авторизации пользователей через OpenLDAP. Сама авторизация работает, с ее настройкой проблем не возникло. Однако в процессе тестирования заметил, что в случае остановки процесса nscd (Name Switch Cache Daemon) обычные пользователи перестают получать информацию из LDAP-каталога. Проявляется это, например, в невозможности получения имени пользователей/групп по их идентификаторам. К примеру, вот так выглядит ls корня для домашних каталогов от обычного пользователя при опущенном nscd:

$ ls -la /home
итого 16
drwxr-xr-x 4 root root 4096 Июн 10 08:00 .
drwxr-xr-x 20 root root 4096 Июн 10 07:10 ..
drwxr-xr-x 2 10001 10001 4096 Июн 10 08:01 Obivan
drwxr-xr-x 3 10000 10000 4096 Июн 10 07:11 Vitaly

Причем на LDAP-сервер в этот момент запросы от NSS хоста вообще не прилетают. Если запустить nscd, то все кардинально меняется:

$ ls -la /home
итого 16
drwxr-xr-x 4 root root 4096 Июн 10 08:00 .
drwxr-xr-x 20 root root 4096 Июн 10 07:10 ..
drwxr-xr-x 2 obivan obivan 4096 Июн 10 08:01 Obivan
drwxr-xr-x 3 pacman pacman 4096 Июн 10 07:11 Vitaly

При работе под root такого эффекта не наблюдается. Почему? Ведь nscd только кеширует запросы. Или не только?


nscd кеширует те запросы, которые сделал сам. Т.е. он подгружает nss_ldap, передает ему поступающие через сокет запросы и кеширует результаты. Без nscd приложение бы подгружало nss_ldap и передавало ему запросы.

nss_ldap должен читать файлик с настройками (в т.ч. DN и паролем, с которым надо делать bind). Вероятно, файлик недоступен на чтение обычным пользователям, но доступен пользователю (скорее всего - root), от которого запущен nscd. Т.е. в данном случае nscd выступает как точка развязки пользователей.

P.S. nss_ldap мертв, пользуйтесь nss_ldapd, он сам предоставляет такую развязку.

>nss_ldap должен читать файлик с настройками (в т.ч. DN и паролем, с которым надо делать bind). Вероятно, файлик недоступен на чтение обычным пользователям

В нормально настроенном openldap доступ на чтение всех записей, за исключением паролей, дан всем анонимусам и биндиться каким-то конкретным пользователем не обязательно. Собственно, это умолчательная настройка.

Учу читать. Дорого. Файл С НАСТРОЙКАМИ. Что бы присосаться к серваку нужно знать его ИП, например.

Настройки и пароли, как правило (в нормальных системах), хранятся в разных файликах.

Результаты разрешения имен хостов, пользователей и групп пользователей стандартными функциями libc (glibc) сервисами имен (про переключение сервисов имен см. NSS) в операционных системах Solaris и Linux могут кэшироваться с помощью сервера nscd. nscd кеширует результаты, полученные NSS.

Прикладная программа, которой необходимо, например, получить адрес хоста по его имени, вызывает подпрограмму gethostbyname(3) или аналогичную. При сборке программы к ней прилинковываются подпрограммы из библиотеки libc (glibc), которые проверяют наличие требуемой информации в кеше nscd (если, конечно, запущен сервер nscd). Если информацию из кеша извлечь не удалось, то используется NSS для определения сервиса имен, который (которые) будет использован для поиска адреса по имени. В общем случае, таким сервисом служит DNS клиент (resolver).

Кеширование имен пользователей и групп пользователей имеет смысл, если для их разрешения используется некий сетевой сервис (NIS или NIS+). Кеширование имен хостов очень полезно, если на хосте не запущен локальный сервер DNS (уровень кеширования имен хостов на почтовом сервере достигает 92%).

В Solaris сервер /usr/sbin/nscd и скрипты запуска устанавливаются по умолчанию. Скрипт запуска /etc/init.d/nscd имеет опции start и stop. Для запуска и остановки создаются соответствующие ссылки:

В Red Hat Linux и совместимых с ним (ядро не ниже 2.2!) сервер /usr/sbin/nscd и скрипт запуска /etc/rc.d/init.d/nscd входят в состав пакета ncsd-*.rpm (кстати, исходные тексты пакета берутся из glibc-*.srpm). nscd реализован в виде многопоточного процесса, общающегося с включаемой в glibc клиентской частью с использованием unix-сокета /var/run/.nscd_socket (права 0666, кто-нибудь пробовал записать туда мусор?). Для предотвращения повторного запуска используется файл /var/run/nscd.pid. Опции скрипта: start, stop, status, restart, reload. Для запуска и остановки создаются соответствующие ссылки (управление через chkconfig):

Посмотреть статистику (в Linux возможность доступна только root и не показывается уровень заполнения таблиц):

Имя файла конфигурации можно изменить с помощью ключа запуска -f (по умолчанию - /etc/nscd.conf).

При изменении настройки NSS или DNS-клиента сервер nscd требуется перезапустить.

В некоторых версиях имена хостов, имеющих несколько адресов, не кешируются, чтобы не мешать балансировке нагрузки удалекнного сервера.

  • -d (отладочный режим)
  • -t (--nthreads, максимальное число нитей)
  • -K (--shutdown)
  • -i (--invalidate имя-таблицы)
  • -S (--secure имя-таблицы,yes; использовать отдельный кеш для каждого uid)

Конфигурация по умолчанию расчитана на работу в составе рабочей станции, а не на сервера. Имена пользователей и групп пользователей у меня почти не используются, да и NIS не запущен), а вот кеширование имен хостов используется на сервере интенсивно, так что настройку таблицы хостов я сделал такую (кстати, она максимальная для Solaris по количеству позиций в таблице и количеству горячих позиций):

Через несколько суток работы nscd на одном из наших хостинг-серверов было получены следующие значения:

0 server debug level
4d 17h 21m 20s server runtime
8 current number of threads
32 maximum number of threads
0 number of times clients had to wait
no paranoia mode enabled
3600 restart internal

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
18296 used data pool size
600 seconds time to live for positive entries
20 seconds time to live for negative entries
26303 cache hits on positive entries
0 cache hits on negative entries
18186 cache misses on positive entries
36 cache misses on negative entries
59% cache hit rate
190 current number of cached values
542 maximum number of cached values
7 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/passwd for changes

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
17648 used data pool size
3600 seconds time to live for positive entries
60 seconds time to live for negative entries
3283 cache hits on positive entries
0 cache hits on negative entries
4439 cache misses on positive entries
67 cache misses on negative entries
42% cache hit rate
245 current number of cached values
268 maximum number of cached values
8 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/group for changes

no cache is enabled
yes cache is persistent
yes cache is shared
0 suggested size
0 total data pool size
0 used data pool size
3600 seconds time to live for positive entries
20 seconds time to live for negative entries
0 cache hits on positive entries
0 cache hits on negative entries
0 cache misses on positive entries
0 cache misses on negative entries
0% cache hit rate
0 current number of cached values
0 maximum number of cached values
0 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/hosts for changes

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
1432 used data pool size
28800 seconds time to live for positive entries
20 seconds time to live for negative entries
32 cache hits on positive entries
0 cache hits on negative entries
15 cache misses on positive entries
1876 cache misses on negative entries
1% cache hit rate
9 current number of cached values
26 maximum number of cached values
2 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/services for changes

А вот потребление памяти:

ps aux | grep nscd
root 5138 0.0 0.0 346312 1020 ? Ssl Apr24 0:38 /usr/sbin/nscd

Теперь тестируем скорость работы DNS:

real 0m27.112s
user 0m0.003s
sys 0m0.001s

real 0m0.107s
user 0m0.001s
sys 0m0.001s

real 0m0.106s
user 0m0.001s
sys 0m0.001s

real 0m0.105s
user 0m0.000s
sys 0m0.002s

Теперь если отключить nscd, проблема вернется:

real 0m22.109s
user 0m0.000s
sys 0m0.003s

nscd умеет кэшировать не только DNS запросы, но и кучу всяких других тяжелых операций, выполняемых из libc, например: getpwnam, getpwuid, getgrnam, getgrgid, gethostbyname (как раз DNS).

Nscd provides caching for accesses of the passwd(5), group(5), and hosts(5)
databases through standard libc interfaces, such as getpwnam(3), getpwuid(3),
getgrnam(3), getgrgid(3), gethostbyname(3), and others.

Причем, не стоит бояться ошибок кэширования, так как он очень умный:

Названия служб: passwd, group, hosts, services или netgroup.

logfile имя_файла_отладки

Задаёт имя файла, в который будет выдаваться информация об отладке.

debug-level значение

Задаёт уровень отладки. По умолчанию 0.

threads число

Задаёт количество запускаемых нитей, ожидающих запросов. Всегда будет создано не менее пяти нитей.

max-threads число

Задаёт максимальное количество нитей. По умолчанию 32.

server-user пользователь

Если указан этот параметр, то nscd будет запущена с правами обычного пользователя, а не root. Если используется раздельное кэширование для каждого пользователя (параметр -S), то данный параметр игнорируется.

stat-user пользователь

Задаёт имя пользователя, которому разрешено запрашивать статистику.

reload-count unlimited | число

Задаёт предельное количество раз, которое неиспользуемый кэшированный элемент будет перезагружаться перед тем как будет удалён. По умолчанию 5.

paranoia <yes|no>

Включает параноидальный режим, в котором nscd будет периодически самостоятельно перезапускаться. По умолчанию выключен.

restart-interval время

Устанавливает интервал перезапуска равным времени в секундах, если включён периодический перезапуск с помощью режима paranoia. По умолчанию 3600.

enable-cache служба <yes|no>

Включает или отключает кэширование указанной службы. По умолчанию выключено.

positive-time-to-live служба значение

Устанавливает время жизни (TTL --- time-to-live) для положительных элементов (успешных запросов) в указанном кэше для службы. Значение указывается в секундах. Большие значения увеличивают частоту использования кэша и уменьшают время ответа, но при этом возникают проблемы с актуальностью содержимого кэша.

negative-time-to-live служба значение

Устанавливает время жизни (TTL — time-to-live) для отрицательных элементов (безуспешных запросов) в указанном кэше для службы. Значение указывается в секундах. Может привести к значительному увеличению производительности, если существуют несколько файлов, идентификаторы владельцев которых (ID) не находятся в системной базе данных (например, выполнение распаковки tar исходного кода ядра Linux под пользователем root); значение должно быть небольшим чтобы не возникло проблем с актуальностью содержимого кэша.

suggested-size служба значение

Размер внутренней хэш-таблицы кэша; значение должно оставаться простым числом для оптимальной эффективности. По умолчанию 211.

check-files служба <yes|no>

Включает или отключает проверку на принадлежность файла к указанной службе для изменений. Файлами могут быть /etc/passwd, /etc/group, /etc/hosts, /etc/services и /etc/netgroup. По умолчанию включена.

persistent служба <yes|no>

Сохраняет содержимое кэша для службы между перезапусками сервера; полезно при включённом режиме paranoia. По умолчанию выключено.

shared служба <yes|no>

Отражение в память баз данных nscd для службы позволяет совместно использовать их из клиентов так, что они могут выполнять поиск самостоятельно, а не запрашивать службу через сокет каждый раз при выполнении просмотра. По умолчанию выключено.

max-db-size служба байты

Максимальный допустимый размер, в байтах, файлов баз данных службы. По умолчанию 33554432.

Читайте также: