
Tenemos la configuración sssd de la siguiente manera:
id_provider = ad
auth_provider = krb5
access_provider = ldap
enumerate = false
ignore_group_members = true;
Como puede ver, no enumeramos usuarios y grupos y, por lo tanto, getent passwd
no getent group
mostramos los usuarios y grupos del anuncio.
Ahora quiero entender cómo id -a <aduser>
el comando muestra al usuario y sus grupos. Entiendo que busca en tiempo real el nombre de usuario dado o lo recupera del caché sssd. Pero quiero saber exactamente qué le dice al comando id que obtenga esta información de sssd.
Alguna información general para mi pregunta:
Estoy intentando configurar la autenticación ldap en nuestro servidor comunitario mysql 5.6 y para eso estoy usando auth_pam.so, que copié del servidor percona de mi VM local.
Creé un usuario proxy: ad_dba
y lo asigné con el grupo ldap: mysql_dba
y creé el siguiente servicio pam:
# cat /etc/pamd./mysqld
#%PAM-1.0
auth include password-auth audit
account include password-auth audit
Entonces, mi auth_string es el siguiente:mysqld, ad_dba=mysql_dba
Ahora, le di privilegios completos al usuario proxy:ad_dba
Sin embargo, solo puedo autenticarme con mi usuario publicitario pero no tengo ningún privilegio. Tengo entendido que el mapeo grupal no funciona.
No estoy seguro de cómo MySQL verifica a los miembros del grupo de usuarios. Estoy intentando ver si puedo agregar un módulo específico en PAM solo para recuperar la información de este grupo.
EDITAR-1:
Veo en el código fuente que el complemento mysql utiliza funciones integradas de Linux getgrouplist
y 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
Por lo tanto, debo encontrar una manera de enumerar mis grupos y usuarios requeridos en la base de datos de grupos o cambiar el código y volver a compilarlo. Mi pregunta se ha vuelto irrelevante ahora respecto de esta cuestión. Pero todavía estoy ansioso por saber cómo obtiene id esta información.
Respuesta1
El id
comando obtiene la información del grupo de la misma fuente que getent group
: preguntando a la biblioteca C, que luego mira la group
línea de /etc/nsswitch.conf
y usa las funciones en la libnss_<name>.so
biblioteca o bibliotecas correspondientes para obtener la respuesta.
Las bibliotecas PAM no se utilizarán aquí en absoluto.
Por ejemplo, en tu situación, nsswitch.conf
deberías decir al menos:
passwd: files sss
group: files sss
lo que haría que la biblioteca C primero realice la consulta usando libnss_files.so
(que buscará en /etc/passwd
y /etc/group
), y si la respuesta no se encuentra allí, entonces con libnss_sss.so
(que preguntará sssd
).
Todos los mecanismos de búsqueda de nombres de usuario/grupos en la biblioteca GNU C ( glibc
) utilizan este mecanismo, por lo que tanto el id
comando como MySQL eventualmente terminarán usando las mismas fuentes de información.
Pero en su caso, nsswitch.conf
podría contener solo files
(o compat
) en las líneas passwd
y group
. Debe verificar su nsswitch.conf
archivo y agregarlo sss
allí si es necesario.
Respuesta2
id utiliza algunas utilidades principales para obtener la información. Si mirasid.cpuedes ver que incluye el archivo mgetgroups.h y llama a una función xgetgroups, que llamagrupos mget... si sigues persiguiendo, puedes rastrear las funciones que se llaman y desde dónde se incluyen. Básicamente, hay llamadas al sistema para recuperar la información pertinente de la base de datos del grupo que, en teoría, se construye utilizando la información nsswitch.conf para construir la base de datos a partir de las fuentes especificadas en la línea "grupo:".