我们有一些混合的RH5 / RH6服务器,需要对两个LDAP服务之一进行身份validation。 这是在SSSD中实施,运行良好。 来自任一域的用户都可以成功login,并且在用户名重叠的情况下,正确的域优先。
起皱是我们有一个脚本运行通过pam_exec只需要运行的两个域之一。
在PAM的更高版本(如RH6提供的版本)中,我可以像下面这样利用[domains=X]语法:
account [default=bad success=done user_unknown=ignore] pam_sss.so domains=domain_without_login_script account [default=bad success=ok user_unknown=ignore] pam_sss.so domains=domain_with_login_script
(我不知道这是行不通的,因为我没有testing它,因为在RH5系统上我没有这个function。对于第一个域,堆栈中的所有后续模块都被忽略;不知道如何如果需要,可以绕过这个)
无论如何,在RH5中,没有这样的标志给pam_sss,而且在PAM或login环境中没有任何东西可以看到包含这些信息。 例如,如果我可以有这样的事情,这将是很好的:
#!/usr/bin/perl -w # do not process users from X domain exit(0) if $ENV{'SSSD_Domain'} eq "domain_without_login_script";
到目前为止,我提出的唯一解决scheme是kludgy。 即使有用户名重叠,每个域的UID也会不同,因此,由于正在select正确的帐户,我可以检查UID:
#!/usr/bin/perl -w # get authenticating user from environment use Env qw(PAM_USER); # do not process users from X domain my $uid = getpwnam($PAM_USER); my $domainXuid = getpwnam("$PAM_USER\@domain_without_login_script"); exit(0) if ($uid == $domainXuid); # ie authenticated domain is X domain
这对我来说似乎很棘手。 有人知道更好的方法吗?
这是一个非常好的问题。
一种方法涉及使用完全限定的名称(用户名@域),该名称不会遍历域,但总是碰到一个特定的域。 这样,您可以通过调用以下代码来编写应用程序中的逻辑:
for d in domain_list: if getpwnam(username + "@" + d): do_stuff()
另一个包括sssd将sssd域放到环境中。 这已经跟上游票https://fedorahosted.org/sssd/ticket/2476跟踪,但那个还没有实施。