Linux上的id指令如何取得使用者群組或使用哪個pam模組?

Linux上的id指令如何取得使用者群組或使用哪個pam模組?

我們的sssd配置如下:

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

正如您所看到的,我們沒有列舉使用者和群組,因此getent passwdgetent group沒有顯示廣告中的使用者和群組。

現在,我想了解id -a <aduser>命令如何顯示使用者及其群組。據我所知,它會即時獲取給定的用戶名或從 sssd 快取中檢索。但我想確切地知道是什麼告訴 id 命令從 sssd 獲取此資訊。

我的問題的一些背景資訊:

我正在嘗試在我們的 mysql 5.6 社群伺服器中設定 ldap 身份驗證,為此我使用 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

但是,我只能使用我的廣告使用者進行身份驗證,但沒有任何權限。我的理解是組映射不起作用。

我不確定mysql如何檢查使用者群組成員。我正在嘗試查看是否可以在 PAM 中添加特定模組來檢索此組資訊。

編輯1:

我從原始程式碼中看到,mysql 外掛正在使用內建的 linux 函數getgrouplist並且getgrgid_r

因此,我必須找到一種方法在群組資料庫中列出我所需的群組和用戶,或更改程式碼並重新編譯。我的問題現在對於這個問題來說已經變得無關緊要了。但我仍然渴望知道 id 是如何獲得這些資訊的。

答案1

id命令透過詢問 C 庫從與 : 相同的來源獲取群組信息getent group,然後 C 庫查看 的行group/etc/nsswitch.conf使用相應庫中的函數libnss_<name>.so來獲取答案。

這裡根本不會使用 PAM 函式庫。

例如,在你的情況下,nsswitch.conf至少應該說:

passwd: files sss
group: files sss

這將使 C 庫首先使用 using 進行查詢libnss_files.so(它將查看/etc/passwdand /etc/group),如果在那裡找不到答案,則使用 with libnss_sss.so(它將詢問sssd)。

GNU C 庫 ( glibc) 中的所有使用者名稱/群組查找機制都使用此機制,因此該id命令和 MySQL 最終將使用相同的資訊來源。

但就您而言,您可能只在和行上nsswitch.conf包含files(或 compat) 。您應該檢查您的文件並在必要時添加到其中。passwdgroupnsswitch.confsss

答案2

id 使用一些核心實用程式來獲取資訊。如果你看id.c您可以看到它包含檔案 mgetgroups.h 並呼叫函數 xgetgroups,該函數調用管理群組....如果您繼續追踪,您可以追蹤被呼叫的函數以及它們包含在哪裡。基本上,有一些系統調用從群組資料庫中檢索相關信息,理論上,該群組資料庫是使用 nsswitch.conf 資訊建構的,以從「group:」行中指定的來源建立資料庫。

相關內容