问题

问题

目前,我的 PAM 通过 LDAP 与以下自定义身份验证堆栈集成/etc/pam.d/systhem-auth

auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth required pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.netgroup.allowed
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass retry=3
password    sufficient    pam_unix.so sha512 nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so

如您所见,授权是通过查找文件进行的/etc/login.netgroup.allow,该文件包含 LDAP 组列表。因此,如果用户至少属于一个或多个组,则他可以登录或不登录此服务器。

此检查是静态进行的。我的意思是,login.netgroup.allow 文件是不可变的,它仅包含一个组列表。有没有办法或建议通过 LDAP 检查动态地进行此检查?我的意思是,假设我有一个 LDAP 分支,其中包含一个带有我的服务器主机名的条目和一个包含与此服务器关联的组列表的多值属性。是否可以不针对文件而是直接针对 LDAP 进行检查?

信息:操作系统:Red Hat 6.4 LDAP 客户端:nslcd

编辑:目前我已经使用自定义脚本使其工作:

这是system-auth我的hostname1服务器:

auth        sufficient    pam_unix.so nullok try_first_pass
auth            required        pam_exec.so /usr/sbin/netgroupCheck
auth            required        pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.netgroup.allowed

我正在使用以下脚本直接在 LDAP 上检查允许的组/usr/sbin/netgroupCheck

#!/usr/bin/env bash

#Allowed Netgroup File
file=/etc/login.netgroup.allowed

#LDAP Client
uri=$(cat /etc/nslcd.conf | grep uri | grep "^[^#;]" | sed 's/[^ ]* //')
oud_user=$( cat /etc/nslcd.conf | grep binddn | grep "^[^#;]" | sed 's/[^ ]* //')
oud_password=$( cat /etc/nslcd.conf | grep bindpw | grep "^[^#;]" | sed 's/[^ ]* //')
hostname=$(hostname)

#Refresh Allowed Netgroup File from LDAP
ldapsearch -LLL -D $oud_user -H $uri -w $oud_password -b "dc=base,dc=it" "(cn=$hostname)" Allowednetgroup | grep -i Allowednetgroup | sed 's/[^ ]* //' > $file

这是 LDAP 上的条目:

dc: cn=hostname1,ou=servers,dc=base,dc=it
objectClass: host
objectClass: ipHost
objectClass: top
cn: hostname1
ipHostNumber: 10.10.10.10
Allowednetgroup: GROUP1
Allowednetgroup: GROUP2
Allowednetgroup: GROUP3

这样,我就可以直接在 LDAP 上编辑 allowednetgroup,而无需在服务器上编辑它们。

答案1

当然,这是filter passwd通过nslcd配置文件文件,如下所示:

 filter passwd (memberOf=cn=myLoginGroup,ou=groups,dc=foo,dc=bar)

由于filter passwd引用了 LDAP 过滤器,它可以根据需要变得尽可能复杂,包括在逻辑表达式内的多个组约束。

答案2

问题

如果我理解正确的话,您在使用 LDAP 插件之前会使用一个文件来检查身份验证。并且此文件连接到 LDAP,它会检查 (至少) 2 个组,并允许属于这两个组 (其中任何一个) 的用户进行身份验证。

如果是这种情况,您可以简单地将其委托给 pam_ldap,并将其配置为在该阶段过滤身份验证。

无论如何,如果您正在运行 LDAP,那么您已经拥有动态组。您需要的是将这些组提供给客户端。我可能遗漏了一些东西,但这里有几个我能想到的选项:

PAM LDAP

单组

pam_groupdn如果您可以创建一个新组、合并 GROUP1 和 GROUP2,并添加每个用户,那么您可以使用 PAM_LDAP 的配置选项来实现这一点第 1 组第 2 组例如,我们称之为第 3 组

然后您应该将以下行添加到/etc/ldap.conf

pam_groupdn cn=GROUP3,ou=groups,dc=foo,dc=bar

根据需要重新启动服务。

据我所知,pam_groupdn不允许多个组。如果您无法将 GROUP1 和 GROUP2 合并为第三个 GROUP3,则另一个选择是使用 SSSD。

多个组

您需要安装 SSSD。我不知道您使用的是哪个发行版,但通常包具有相同的名称sssd

在 /etc/sssd/sssd.conf 的 [domain] 部分下添加以下行:

access_provider = ldap
ldap_access_filter = (|(memberOf=cn=GROUP1,ou=groups,dc=foo,dc=bar)(memberOf=cn=GROUP2,ou=groups,dc=foo,dc=bar))

根据需要重新启动服务。

相关内容