在我们的企业环境中,很久以前,一些奇才决定将用户“ 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/networking 启动并运行后,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 缓存