У нас есть несколько серверов в смешанном RH5 / RH6, которым необходимо пройти аутентификацию в одной из двух служб LDAP. Это реализовано в SSSD и работает нормально. Пользователи из любого домена могут успешно войти в систему, и там, где есть совпадения имен пользователей, правильный домен имеет приоритет.
Проблема в том, что у нас есть сценарий, запускаемый через 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
(Я не уверен, что это сработает, поскольку я не тестировал его, так как эта функциональность недоступна мне в системах RH5. Для первого домена все последующие модули в стеке игнорируются; не уверен, как чтобы обойти это, если мне нужно.)
В любом случае, с RH5 нет такого флага для pam_sss, и, кроме того, в PAM или среде входа в систему нет ничего, что, как я могу видеть, включает эту информацию. Было бы неплохо, например, если бы у меня было что-то вроде:
#!/usr/bin/perl -w
# do not process users from X domain
exit(0) if $ENV{'SSSD_Domain'} eq "domain_without_login_script";
Пока что единственные решения, которые я придумал, беспорядочные. UID для каждого домена будут отличаться, даже если есть совпадение имен пользователей, поэтому, поскольку выбираются правильные учетные записи, я могу проверить 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); # i.e. authenticated domain is X domain
Мне это кажется странным. Кто-нибудь знает способ лучше?
Это действительно хороший вопрос.
Один из способов предполагает использование полностью определенного имени (имя пользователя @ домен), которое не перебирает домены, но всегда попадает в один конкретный домен. Таким образом, вы можете закодировать логику в своем приложении, вызвав:
for d in domain_list:
if getpwnam(username + "@" + d):
do_stuff()
Другой включает sssd, помещающий домен sssd в среду. Это уже отслеживается с помощью восходящего тикета https://fedorahosted.org/sssd/ticket/2476 но этот еще не реализован.