透過 PAM 過濾 LDAP 用戶,使其看起來根本不存在

透過 PAM 過濾 LDAP 用戶,使其看起來根本不存在

很久以前,在我們的公司環境中,有些奇才決定將使用者「mysql」放入 LDAP 中。

該帳戶已停用:

$ sudo su - mysql
This account is currently not available.

……但它的 id 仍然存在:

$ id mysql
uid=2050913(mysql) gid=867(ENG) groups=867(ENG)

這使得 mariadb 在 CentOS7 上安裝失敗,因為它/var/run/mariadb是由 tmpfile 規則建立的,該規則嘗試指派由 mysql 擁有的目錄。但在 LDAP/網路啟動並運行之前,mysql 並不存在,且 mariadb 安裝不會建立用戶,mysql因為該用戶已存在於 ldap 中。

有沒有辦法在本機強制 PAM(或其他什麼?)忽略 LDAP 中的使用者 mysql?或將 ldapmysql使用者重新命名為mysql_ldap

我唯一的解決方法是手動新增條目嗎/etc/passwd? (或更改 mariadb 配置以使用不同的使用者名稱。)我寧願對來自 rpm 的配置和 systemd 檔案進行最小的更改。

(我對從 LDAP 中刪除並沒有抱太大希望,mysql因為這可能會破壞很多遺留基礎設施。)

順便說一句,我將使用 ansible 來實現更改。

額外的:

我更改了問題的標題:

我發現,如果我新增本機「mysql」用戶,它就可以正常工作,除非我有 LDAP「mysql」用戶的用戶 ID 擁有的檔案。如果我ls -la刪除這些文件,它會污染 nscd(或 sssd)緩存,並且「mysql」再次解析為 LDAP 使用者。看來我真正想要的是以某種方式為帳戶建立一個 PAM 過濾器,以使這個 LDAP「mysql」用戶消失。

答案1

這是我的最終解決方案,用 ansible 編碼:

- name: Disable ldap users                                                  
  ini_file: dest=/etc/sssd/sssd.conf section='nss' 
            option=filter_users value={{ filter_ldap_users | join(",") }}
  register: sssd_conf_users                                                   

- name: Disable ldap groups                                                 
  ini_file: dest=/etc/sssd/sssd.conf section='nss' 
            option=filter_groups value={{ filter_ldap_groups | join(",") }}
  register: sssd_conf_groups                                                  

- name: Restart SSSD                                                        
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  service: name=sssd state=restarted                                          

- name: Flush NSCD cache                                                    
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  shell: "for db in /var/db/nscd/*; do nscd -i $(basename $db); done"         

- name: Flush SSSD cache                                                     
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  command: /usr/sbin/sss_cache -E        

答案2

在 PAM 層級:
您所需要做的就是忽略 LDAP 中的使用者。因此,設定您正在使用的特定 LDAP 用戶端(在 CentOS 中為 sssd),以使用自訂 LDAP UID/GID 來尋找過濾器,該過濾器將忽略「mysql」記錄。在現有系統上,您必須清理 sssd 快取並重新啟動它,使用者就會消失。重新安裝 mariadb 將建立本機 mysql 使用者。

在程式包層級:
在網路上的某個位置設定自訂 Yum 儲存庫,其中將包含一個包含安裝後腳本的程式包,從而修復 mysql 使用者問題。您還必須將 mariadb 套件放入該儲存庫中。然後,定義一個包含該套件和 mariadb 的套件組並安裝它。
或者,您可以使用更新的、更聰明的安裝後腳本重建 mariaDB 包,該腳本將負責 mysql 使用者的建立。

我會選擇 A - B 有點混亂:)

答案3

這是我目前正在使用的解決方法。我已將其新增至我的 kickstart 檔案中%post,以便在啟用/設定 LDAP 之前執行:

# Install and de-install mariadb-server to create mysql
# user before LDAP is enabled.
yum -d1 -e1 -y install yum-plugin-remove-with-leaves mariadb-server
yum -d1 -e1 -y erase mariadb-server --remove-leaves

我打算useradd透過閱讀mariadb-server規範文件來手動運行:http://pkgs.fedoraproject.org/cgit/mariadb.git/tree/mariadb.spec

%pre server
/usr/sbin/groupadd -g 27 -o -r mysql >/dev/null 2>&1 || :
/usr/sbin/useradd -M -N -g mysql -o -r -d %{mysqluserhome} -s /sbin/nologin \
  -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || :

……但我更願意直接從安裝 rpm 中取得它。

我對此也不完全滿意,因為如果我碰巧找到帶有 ldap“mysql”用戶 ID 的文件,則對用戶 ID 的反向查找會使用錯誤的“mysql”用戶污染 nscd 或 sssd。

答案4

如果您只想不解析 ldap 使用者。編輯 /etc/nsswitch.conf 並針對使用者和群組項目刪除 sssd(或 ldap)條目。然後刷新 nscd 快取

相關內容