
Wir haben die SSD-Konfiguration wie folgt:
id_provider = ad
auth_provider = krb5
access_provider = ldap
enumerate = false
ignore_group_members = true;
Wie Sie sehen, zählen wir Benutzer und Gruppen nicht auf und zeigen daher getent passwd
die getent group
Benutzer und Gruppen aus der Anzeige nicht an.
Jetzt möchte ich verstehen, wie id -a <aduser>
der Befehl den Benutzer und seine Gruppen anzeigt. Ich verstehe, dass er in Echtzeit den angegebenen Benutzernamen abruft oder aus dem SSD-Cache abruft. Aber ich möchte genau wissen, was dem ID-Befehl sagt, dass er diese Informationen von der SSD abrufen soll.
Einige Hintergrundinformationen zu meiner Frage:
Ich versuche, die LDAP-Authentifizierung auf unserem MySQL 5.6-Community-Server einzurichten und verwende dazu auth_pam.so, das ich vom Percona-Server meiner lokalen VM kopiert habe.
Ich habe einen Proxy-Benutzer erstellt: ad_dba
und mit der LDAP-Gruppe zugeordnet: mysql_dba
Und ich habe den folgenden PAM-Dienst erstellt:
# cat /etc/pamd./mysqld
#%PAM-1.0
auth include password-auth audit
account include password-auth audit
Mein Auth_String sieht also wie folgt aus:mysqld, ad_dba=mysql_dba
Jetzt habe ich dem Proxy-Benutzer alle Berechtigungen erteilt:ad_dba
Ich kann mich jedoch nur mit meinem Ad-Benutzernamen authentifizieren, habe aber keine Berechtigungen. Meines Wissens funktioniert die Gruppenzuordnung nicht.
Ich bin nicht sicher, wie MySQL Benutzergruppenmitglieder überprüft. Ich versuche herauszufinden, ob ich ein bestimmtes Modul in PAM hinzufügen kann, um diese Gruppeninformationen abzurufen.
BEARBEITEN-1:
Ich sehe aus dem Quellcode, dass das MySQL-Plugin integrierte Linux-Funktionen verwendet getgrouplist
und 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
Ich muss also einen Weg finden, meine benötigten Gruppen und Benutzer in der Gruppendatenbank aufzulisten oder den Code ändern und neu kompilieren. Meine Frage ist für dieses Problem jetzt irrelevant geworden. Aber ich bin immer noch gespannt, herauszufinden, wie id an diese Informationen kommt.
Antwort1
Der id
Befehl ruft die Gruppeninformationen aus derselben Quelle ab wie getent group
:, indem er die C-Bibliothek fragt, die dann die group
Zeile von betrachtet /etc/nsswitch.conf
und die Funktionen in der libnss_<name>.so
oder den entsprechenden Bibliotheken verwendet, um die Antwort zu erhalten.
PAM-Bibliotheken werden hier überhaupt nicht verwendet.
In Ihrer Situation sollte beispielsweise nsswitch.conf
zumindest Folgendes gesagt werden:
passwd: files sss
group: files sss
Dadurch wird die C-Bibliothek veranlasst, die Abfrage zuerst mit durchzuführen (wobei und libnss_files.so
nachgeschaut wird ), und wenn die Antwort dort nicht gefunden wird, dann mit (wobei gefragt wird )./etc/passwd
/etc/group
libnss_sss.so
sssd
Alle Benutzernamen-/Gruppensuchmechanismen in der GNU C-Bibliothek ( glibc
) verwenden diesen Mechanismus, sodass sowohl der id
Befehl als auch MySQL letztendlich auf dieselben Informationsquellen zurückgreifen.
In Ihrem Fall könnte Ihr Text jedoch nur (oder ) in den Zeilen und nsswitch.conf
enthalten . Sie sollten Ihre Datei überprüfen und sie bei Bedarf ergänzen.files
compat
passwd
group
nsswitch.conf
sss
Antwort2
id verwendet einige grundlegende Dienstprogramme, um die Informationen abzurufen. Wenn Sie sich ansehenich würde.cSie können sehen, dass es die Datei mgetgroups.h einbindet und eine Funktion xgetgroups aufruft, die aufruftmgetgruppen... wenn Sie weiter nachforschen, können Sie die aufgerufenen Funktionen und deren Einbindung herausfinden. Grundsätzlich gibt es Systemaufrufe, um die relevanten Informationen aus der Gruppendatenbank abzurufen, die theoretisch unter Verwendung der nsswitch.conf-Informationen erstellt wird, um die Datenbank aus den in der Zeile „group:“ angegebenen Quellen zu erstellen.