У меня есть Active Directory, работающий как поставщик идентификаторов, доступа и аутентификации для моих серверов CentOS 7 с использованием sssd. Я слежу за этим Почта чтобы пользователи из разных групп использовали разные оболочки при входе в систему, но у меня есть некоторые проблемы. Вот мой sssd.conf
файл:
[sssd]
domains = dev, domain.local
config_file_version = 2
services = nss, pam
[nss]
default_shell = /bin/bash
[domain/dev]
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
ad_server = adserver.domain.local
id_provider = ad
access_provider = ad
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
override_shell = /bin/tcsh
ldap_user_search_base = cn=dev,ou=Security Groups,ou=Domain,dc=domain,dc=local #According to sssd-ldap man page ldap_user_search_filter is deprecated
[domain/domain.local]
ad_server = adserver.domain.local
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
access_provider = ad
Идея состоит в том, что когда кто-то входит в группу разработчиков, оболочка будет tcsh, а когда некоторые другие люди входят в систему, она использует bash. Проблема в том, что с этим conf я могу успешно войти в систему со Смитом, членом группы разработчиков, и он успешно попадает в tcsh, но если я вхожу в систему с Джоном, членом также домена, но не членом разработчика, происходит следующее :
/var/log/secure
Сначала я получаю ошибку аутентификации от pam_unix, а затем успешную от pam_sssjohn
и получить его оболочку как tcsh (хотя она должна быть bash). Во-вторых, пользователь входит в систему как john@domain.local
и получает bash. В-третьих, пользователь снова входит в систему как john
и теперь он получает правильную оболочку (bash)По-видимому, sssd после проверки второго домена с полным доменным именем кэширует оболочку пользователя и при третьем входе в систему делает это правильно.
Какая конфигурация является правильной для входа каждого пользователя в соответствующую оболочку?
ОБНОВИТЬ:
Похоже, что иногда процесс входа в систему проходит только через модули pam, а иногда через политики на основе sssd GPO, взятые из активного каталога. Я несколько раз пытался отключить фильтр и перезапустить sssd, и в одном из них я получил следующее в журнале:
Aug 28 15:42:43 co-proy-02 sssd[be[dev.domain.local]]: Warning: user would have been denied GPO-based logon access if the ad_gpo_access_control option were set to enforcing mode.
Пользователь с отключенным фильтром Smith
из dev
группы успешно получают tcsh, но также john
. При включенном фильтре оба получают bash.
ОБНОВЛЕНИЕ2
По-видимому, есть пакет с именем sssd-tools
в котором есть команда, которая позволит вам переопределить оболочку любого отдельного пользователя, однако, попробовав это решение, я все еще не получил подходящего результата. Вот команда, но, по крайней мере, для меня она не работает должным образом:
sss_override user-add smith -s /usr/bin/sh
После долгих поисков и с помощью @ ChristopheDrevet-Droguet с фильтром ou=Domain,dc=domain,dc=local?subtree?(memberOf=cn=dev,ou=Security Groups,ou=Domain,dc=domain,dc=local)
в качестве основы единственное, чего не хватало, - это дерево объектов для анализа, я имею в виду, в котором можно было бы найти пользователя.
Для того, чтобы это работало (по крайней мере, для меня), sssd должен выглядеть следующим образом:
[sssd]
domains = dev, domain.local
config_file_version = 2
services = nss, pam
[nss]
default_shell = /bin/bash
[domain/dev]
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
ad_server = adserver.domain.local
id_provider = ad
access_provider = ad
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
override_shell = /bin/tcsh
ldap_user_search_base = dc=domain,dc=local??(&(memberOf=cn=dev,ou=Security Groups,ou=Domain,dc=veritran,dc=local)(objectClass=*))
[domain/domain.local]
ad_server = adserver.domain.local
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
access_provider = ad
ldap_user_search_base = dc=domain,dc=local??(&(memberOf=cn=other,ou=Security Groups,ou=Domain,dc=veritran,dc=local)(objectClass=*))