Как команда id в Linux получает группы пользователей или какой модуль pam используется?

Как команда id в Linux получает группы пользователей или какой модуль pam используется?

У нас есть следующая конфигурация sssd:

id_provider = ad
auth_provider = krb5
access_provider = ldap
enumerate = false
ignore_group_members = true;

Как видите, мы не перечисляем пользователей и группы и, следовательно, getent passwdне getent groupпоказываем пользователей и группы из объявления.

Теперь я хочу понять, как id -a <aduser>команда показывает пользователя и его группы. Я понимаю, что она делает выборку в реальном времени для указанного имени пользователя или извлекает из кэша sssd. Но я хочу точно знать, что говорит команде id извлекать эту информацию из sssd.

Некоторая дополнительная информация по моему вопросу:

Я пытаюсь настроить аутентификацию LDAP на нашем сервере MySQL 5.6 Community Server и для этого использую auth_pam.so, который скопировал с сервера Percona моей локальной виртуальной машины.

Я создал пользователя-прокси: ad_dbaи сопоставил его с группой ldap: mysql_dba И я создал следующую службу pam:

# cat /etc/pamd./mysqld
#%PAM-1.0
auth    include  password-auth audit
account include password-auth audit

Итак, моя auth_string выглядит следующим образом:mysqld, ad_dba=mysql_dba

Теперь я предоставил прокси-пользователю полные привилегии:ad_dba

Однако я могу аутентифицироваться только с моим пользователем ad, но не имею никаких привилегий. Я понимаю, что сопоставление групп не работает.

Я не уверен, как mysql проверяет членов группы пользователей. Я пытаюсь понять, могу ли я добавить определенный модуль в PAM, чтобы просто получить эту информацию о группе.

ПРАВКА-1:

Из исходного кода я вижу, что плагин MySQL использует встроенные функции Linux getgrouplistи getgrgid_r:

Итак, я должен найти способ перечислить мои требуемые группы и пользователей в базе данных групп или изменить код и перекомпилировать. Мой вопрос теперь стал неактуальным для этой проблемы. Но я все еще хочу узнать, как id получает эту информацию.

решение1

Команда idполучает информацию о группе из того же источника, что и getent group: запрашивая библиотеку C, которая затем просматривает строку groupи /etc/nsswitch.confиспользует функции в соответствующей libnss_<name>.soбиблиотеке или библиотеках, чтобы получить ответ.

Библиотеки PAM здесь вообще использоваться не будут.

Например, в вашей ситуации nsswitch.confследует сказать как минимум:

passwd: files sss
group: files sss

что заставит библиотеку C сначала сделать запрос с помощью libnss_files.so(которая будет искать /etc/passwdи /etc/group), а если ответ там не будет найден, то с помощью libnss_sss.so(которая спросит sssd).

Все механизмы поиска имени пользователя/группы в библиотеке GNU C ( glibc) используют этот механизм, поэтому и idкоманда, и MySQL в конечном итоге будут использовать одни и те же источники информации.

Но в вашем случае, вы nsswitch.confможете содержать только files(или compat) на линиях passwdи group. Вы должны проверить свой nsswitch.confфайл и добавить sssтуда, если необходимо.

решение2

id использует некоторые основные утилиты для получения информации. Если вы посмотрите наid.cвы можете видеть, что он включает файл mgetgroups.h и вызывает функцию xgetgroups, которая вызываетmgetgroups... если вы продолжите преследование, вы сможете отследить вызываемые функции и откуда они включаются. В основном это системные вызовы для извлечения соответствующей информации из базы данных группы, которая, в теории, создается с использованием информации nsswitch.conf для построения базы данных из источников, указанных в строке "group:".

Связанный контент