nss_ldap (равно как и pam_ldap) - хорошо. Функции свои они выполняют. Хочется же однако не хорошо, а как можно лучше, чего с ними не получается.
Собственно, вариации на тему "почему плохо" и "как лучше" -
Далее...Во-первых кроме как в позе oneshot оно неюзабельно в силу например особенности sshd закрывать открытые дескрипторы при форке процесса, а на каждый запрос - установка tcp-сессии, установка TLS, аутентификация, собственно запрос и закрытие соединение не совсем здорово.
Во-вторых - нет единой схемы, каждый из модулей, предназначенных в общем-то для того, чтобы выцепить из LDAP какие-то поля у пользователя или группы - имеет свой собственный конфиг со своими собственными дополнительными настройками, в результате чего то, что можно выцепить в рамках одного запроса к LDAP-серверу превращается в кучу дерганий его же разными модулями при логине.
В-третьих, каждой софтине, которая использует что-нибудь типа getpwent() полагается "тяжелый" довесок в виде подгрузки ldap-овских библиотек.
В-четвертых - помимо всего прочего нет кэширования.
Один из вариантов решения проблемы называется nscd и позволяет фактически решить все проблемы, кроме второго пункта.
Очень хотелось написать свой маленький кэширующий ldap-демон, однако он уже
нашелсяОсновные идеи как раз такие -
* все "клиенты" ходят в unix socket, формат протокола легко расширяем
* сам сервер достаточно мал и быстр, кроме того умеет кипэлайвы и кэширование
Теперь его зовут
net/nss_ldapd и он нормально работает под FreeBSD (по крайней мере, на 7+).
Кроме того, текущая реализация FreeBSD nss позволяет достаточно легко добавлять новые категории без модификации кода базы. В результате большой и толстый
openssh-lpk patch превращается в 3-4 строчки кода (де-факто вызов nsdispatch(3)), или же несколько больше, если сделать люкапа ключей в файлах полноценной nss-функцией и определять порядок прямо в nsswitch.conf
Попробую в ближайшее время сделать нормальный патч для lpk, заодно вылизать весь nss-код и пропихнуть его еще в openssh-portable
Во-первых кроме как в позе oneshot оно неюзабельно в силу например особенности sshd закрывать открытые дескрипторы при форке процесса, а на каждый запрос - установка tcp-сессии, установка TLS, аутентификация, собственно запрос и закрытие соединение не совсем здорово.
Во-вторых - нет единой схемы, каждый из модулей, предназначенных в общем-то для того, чтобы выцепить из LDAP какие-то поля у пользователя или группы - имеет свой собственный конфиг со своими собственными дополнительными настройками, в результате чего то, что можно выцепить в рамках одного запроса к LDAP-серверу превращается в кучу дерганий его же разными модулями при логине.
В-третьих, каждой софтине, которая использует что-нибудь типа getpwent() полагается "тяжелый" довесок в виде подгрузки ldap-овских библиотек.
В-четвертых - помимо всего прочего нет кэширования.
Один из вариантов решения проблемы называется nscd и позволяет фактически решить все проблемы, кроме второго пункта.
Очень хотелось написать свой маленький кэширующий ldap-демон, однако он уже нашелся
Основные идеи как раз такие -
* все "клиенты" ходят в unix socket, формат протокола легко расширяем
* сам сервер достаточно мал и быстр, кроме того умеет кипэлайвы и кэширование
Теперь его зовут net/nss_ldapd и он нормально работает под FreeBSD (по крайней мере, на 7+).
Кроме того, текущая реализация FreeBSD nss позволяет достаточно легко добавлять новые категории без модификации кода базы. В результате большой и толстый openssh-lpk patch превращается в 3-4 строчки кода (де-факто вызов nsdispatch(3)), или же несколько больше, если сделать люкапа ключей в файлах полноценной nss-функцией и определять порядок прямо в nsswitch.conf
Попробую в ближайшее время сделать нормальный патч для lpk, заодно вылизать весь nss-код и пропихнуть его еще в openssh-portable