
Temos a configuração sssd da seguinte forma:
id_provider = ad
auth_provider = krb5
access_provider = ldap
enumerate = false
ignore_group_members = true;
Como você pode ver, não estamos enumerando usuários e grupos e, portanto, getent passwd
não getent group
mostramos os usuários e grupos do anúncio.
Agora quero entender como id -a <aduser>
o comando mostra o usuário e seus grupos. Entendo que ele busca em tempo real o nome de usuário fornecido ou recupera do cache SSD. Mas quero saber exatamente o que diz ao comando id para buscar essas informações do sssd.
Algumas informações básicas para minha pergunta:
Estou tentando configurar a autenticação ldap em nosso servidor da comunidade mysql 5.6 e para isso estou usando auth_pam.so que copiei do servidor percona da minha VM local.
Criei um usuário proxy: ad_dba
e mapeei com o grupo ldap: mysql_dba
E criei o seguinte serviço pam:
# cat /etc/pamd./mysqld
#%PAM-1.0
auth include password-auth audit
account include password-auth audit
Então, meu auth_string é o seguinte:mysqld, ad_dba=mysql_dba
Agora, dei privilégios completos ao usuário proxy:ad_dba
No entanto, só posso autenticar com meu usuário de anúncio, mas não tenho nenhum privilégio. Meu entendimento é que o mapeamento de grupo não funciona.
Não tenho certeza de como o MySQL verifica os membros do grupo de usuários. Estou tentando ver se consigo adicionar um módulo específico no PAM apenas para recuperar essas informações do grupo.
EDITAR-1:
Vejo no código-fonte que o plugin mysql está usando funções internas do Linux getgrouplist
e 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
Portanto, devo encontrar uma maneira de listar meus grupos e usuários necessários no banco de dados de grupos ou alterar o código e recompilar. Minha pergunta tornou-se irrelevante agora para esta questão. Mas ainda estou ansioso para descobrir como o id obtém essas informações.
Responder1
O id
comando obtém as informações do grupo da mesma fonte que getent group
: perguntando à biblioteca C, que então analisa a group
linha de /etc/nsswitch.conf
e usa as funções na libnss_<name>.so
biblioteca ou bibliotecas correspondentes para obter a resposta.
As bibliotecas PAM não serão usadas aqui.
Por exemplo, na sua situação, nsswitch.conf
deveria dizer pelo menos:
passwd: files sss
group: files sss
o que faria com que a biblioteca C primeiro fizesse a consulta usando libnss_files.so
(que irá analisar /etc/passwd
e /etc/group
), e se a resposta não for encontrada lá, então com libnss_sss.so
(que irá perguntar sssd
).
Todos os mecanismos de pesquisa de nome de usuário/grupo na biblioteca GNU C ( glibc
) usam esse mecanismo, portanto, tanto o id
comando quanto o MySQL acabarão usando as mesmas fontes de informação.
Mas no seu caso, você nsswitch.conf
pode conter apenas files
(ou compat
) nas linhas passwd
e group
. Você deve verificar seu nsswitch.conf
arquivo e adicioná sss
-lo, se necessário.
Responder2
id usa alguns utilitários principais para obter as informações. Se você olharid.cvocê pode ver que ele inclui o arquivo mgetgroups.h e chama uma função xgetgroups, que chamagrupos de mget... se você continuar perseguindo, poderá rastrear as funções que são chamadas e de onde elas são incluídas. Basicamente, existem chamadas de sistema para recuperar as informações pertinentes do banco de dados do grupo que, em teoria, são construídas usando as informações do nsswitch.conf para construir o banco de dados a partir de fontes especificadas na linha "group:".