Temos alguns servidores em um RH5 / RH6 misto que precisam ser autenticados em um dos dois serviços LDAP. Isso é implementado no SSSD e está funcionando bem. Os usuários de qualquer domínio podem fazer login com êxito e, onde houver um nome de usuário, o domínio correto prevalecerá.
A ruga é que temos um script executado por meio do pam_exec que precisa ser executado apenas para um dos dois domínios.
Em versões posteriores do PAM, como as fornecidas com o RH6, posso explorar a sintaxe [domains=X]
da seguinte forma:
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
(não sei se isso funcionará, pois não testei, pois a funcionalidade não está disponível para mim nos sistemas RH5. No primeiro domínio, qualquer módulo subseqüente na pilha é ignorado; não tenho certeza de como contornar isso se eu precisasse.)
De qualquer forma, com o RH5 não há sinalizador para pam_sss e, além disso, não há nada no PAM ou no ambiente de login que eu possa ver que inclua essa informação. Seria bom, por exemplo, se eu pudesse ter algo como:
#!/usr/bin/perl -w
# do not process users from X domain
exit(0) if $ENV{'SSSD_Domain'} eq "domain_without_login_script";
Até agora, as únicas soluções que tenho são o kludgy. Os UIDs de cada domínio serão diferentes mesmo quando houver sobreposição de nome de usuário, portanto, como as contas corretas estão sendo selecionadas, posso verificar os UIDs:
#!/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); # i.e. authenticated domain is X domain
Isso parece piegas para mim. Alguém sabe de uma maneira melhor?