将 $PATH 设置为 OpenLDAP 属性

将 $PATH 设置为 OpenLDAP 属性

我需要$PATH为 OpenLDAP 用户(CentOS6/7)进行设置。不在 中.profile,也不在.bashrc客户端计算机上,而是作为 LDAP 服务器上 LDAP 中的属性,因此每当用户通过 登录到任何主机时都会设置它ssh。客户端没有任何内容——只有 LDAP 服务器。是否可以?怎么做?

答案1

仅限 LDAP 目录商店数据,您需要 LDAP 客户端层(例如pam_ldap与它有关的东西。与 NetWare/ActiveDirectory 不同,在目录中将登录脚本作为用户属性在其他环境中并不是标准的事情,并且没有标准属性来存储此类脚本的[路径](尽管labelledURI是候选)。

使用 PAM+NSS,仅支持少数可以指向 LDAP 的“数据库”(密码、组等,请参阅nsswitch.conf(5))没有一个能让这变得更容易。

两者都不PADLpam_ldap也不nss-pam-ldap除了填写基本属性之外,还提供任何灵活类型的 LDAP 属性处理getpwent() password结构字段。

但是,也许有一些解决方法,尽管没有一个可以满足您的“客户端无任何内容”的要求。

  1. 使用pam_execpam_script,因为它们作为登录的子进程运行,它们不能直接影响环境更改,但您可以编写一些脚本来确保正确的内容PATH始终出现在其中或末尾.profile(取决于稳健性要求)

  2. 用于/etc/profile从 LDAP 获取用户属性,然后进行PATH相应设置(尽管您可能会发现防止.profile覆盖它很棘手)

  3. 修改pam_unix以允许并支持滥用loginShell以变量为前缀的属性,例如PATH=/opt/thing/bin /bin/bash(不适用于 PADL、AFAICT)

  4. 修改pam_umask,Linux PAMpam_umask已经处理额外信息来自 gecos 字段,如“umask=nnnn,ulimit=nnnn”,所以这里有一些先例。

  5. 修改pam_ldap以将 LDAP 属性保存为 PAM“数据”:pam_set_data(),然后pam_get_data()在另一个 PAM 模块中使用来处理它们(我很久以前就这样做过,在我的例子中,它是使用 LDAP 属性中的详细信息在 SQL 用户数据库中按需创建用户)。pam_env是这里的一个很好的候选人。

  6. PAM“项目”有一个类似的概念(pam_set_item()/ pam_get_item()) 对于一小组数据项(之前的 PAM 数据概念是针对任意名称/值数据),pam_env支持@{PAM_itemname}使用这些设置环境值的语法- 您可能能够滥用诸如 之类的项目PAM_XDISPLAYpam_ldap已经设置了一些项目,因此这可能是最简单的代码更改。

(需要明确的是,“修改”是指“更改源”,因此这些解决方案需要在客户端上进行配置和二进制部署。)

这是一个(健壮的)bash 示例,可以使用前两个选项:

 while read line; do
     [[ "$line" =~ ^description:\ setenv\ ([a-zA-Z_][a-zA-Z0-9_]+)=(.*) ]] && {
         export "${BASH_REMATCH[1]}"="${BASH_REMATCH[2]}"
     }
 done < <(ldapsearch -LLL -o ldif-wrap=no -H ldap://ldap0/ -b ${LDAPBASE} \
    -s sub "(&(objectClass=posixAccount)(uid=${USER}))" description

给定每个用户的一个或多个“描述”属性,格式如下:

setenv MYVAR=MYVALUE

在这里,我们采用了一种可疑的做法,将非描述数据填充到“描述”属性中,这是在多值属性中存储最多 1024 个字符的便捷方法。这是一种简单的方法,ldapsearch如果/当值/类型导致 Base64 编码输出时,使用您可能会遇到麻烦。

答案2

问题解决了,尽管不是我想要的方式。使用 puppet 填充包含 export PATH=$PATH:/xxxxxxxx 指令的 .profile 文件。结合删除 ldap 条目“shell=\bin\bash”,它可以正确设置 PATH 变量。

感谢斯帕蒂克先生的广泛回答,很高兴深入研究这个问题。

相关内容