
У нас есть следующая конфигурация 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
:
- https://github.com/percona/percona-server/blob/5.6/plugin/percona-pam-for-mysql/src/groups.c
- http://man7.org/linux/man-pages/man3/getgrouplist.3.html
- https://linux.die.net/man/3/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:".