
我們的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 獲取此資訊。
我的問題的一些背景資訊:
我正在嘗試在我們的 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
:
- 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
命令透過詢問 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/passwd
and /etc/group
),如果在那裡找不到答案,則使用 with libnss_sss.so
(它將詢問sssd
)。
GNU C 庫 ( glibc
) 中的所有使用者名稱/群組查找機制都使用此機制,因此該id
命令和 MySQL 最終將使用相同的資訊來源。
但就您而言,您可能只在和行上nsswitch.conf
包含files
(或 compat
) 。您應該檢查您的文件並在必要時添加到其中。passwd
group
nsswitch.conf
sss