通过 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/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 缓存

相关内容