很久以前,在我們的公司環境中,有些奇才決定將使用者「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 快取