Detectar domínio de autenticação SSSD programaticamente em ambiente de vários domínios

1

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?

    
por Drew 11.02.2016 / 22:00

1 resposta

0

Esta é realmente uma boa pergunta.

Uma maneira envolve o uso de um nome totalmente qualificado (username @ domain), que não faz iteração nos domínios, mas sempre atinge um domínio específico. Dessa forma, você pode codificar a lógica em seu aplicativo chamando:

for d in domain_list:
  if getpwnam(username + "@" + d):
    do_stuff()

O outro inclui o sssd colocando o domínio sssd no ambiente. Isso já foi rastreado com o link do ingresso do upstream, mas esse ainda não está implementado.

    
por 12.02.2016 / 22:16

Tags