SSSD: Como forçar usuários em diferentes grupos a usar diferentes shells

1

Eu tenho um Active Directory funcionando como id, access e auth provider para meus servidores CentOS 7 usando sssd. Eu tenho seguido este postar para que usuários de grupos diferentes usem shells diferentes enquanto fazem login, mas eu tenho alguns problemas. Aqui está o meu arquivo 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


A ideia é que quando alguém do grupo dev for logar, o shell seria o tcsh e quando alguns outros logins populares, ele usa o bash. A questão é, com esse conf, posso logar com sucesso com o Smith, um membro do grupo dev e chegar ao tcsh com sucesso, mas se eu fizer login com o John, membro também do domínio mas não um membro do dev, acontece o seguinte :

  • Revendo /var/log/secure recebo uma falha de autenticação primeiro do pam_unix e depois um sucesso do pam_sss
  • O primeiro usuário loga como john e obtém seu shell como tcsh (mesmo que deva ser bash). Em segundo lugar, o usuário efetua login como [email protected] e obtém o bash. Terceiro, o usuário loga novamente como john e agora ele obtém o shell correto (bash)

Aparentemente sssd depois de verificar o segundo domínio com o FQDN, ele armazena em cache o shell do usuário e, no terceiro login, faz isso direito.
Qual é a configuração correta para fazer o login de cada usuário em seu shell correspondente?

UPDATE :
Parece que, às vezes, o processo de login passa pelos módulos pam sozinho e, às vezes, por meio das diretivas sssd baseadas no GPO, obtidas do diretório ativo. Eu tentei desativar o filtro e reiniciar o sssd várias vezes e em um desses eu consegui no log:

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.

Com o filtro desativado, o usuário Smith de dev groups obtém tcsh com êxito, mas também john . Com filtro ativado, ambos recebem bash.

UPDATE2
Aparentemente, existe um pacote chamado sssd-tools , que tem um comando que permite substituir o shell de qualquer usuário separado; no entanto, depois de tentar essa solução, ainda não obtive resultados apropriados. Aqui está o comando, mas pelo menos para mim, não está funcionando como deveria:
sss_override user-add smith -s /usr/bin/sh

    
por Edgar Sampere 28.08.2018 / 19:56

1 resposta

0

Após uma longa busca e com a ajuda de @ ChristopheDrevet-Droguet com o filtro ou=Domain,dc=domain,dc=local?subtree?(memberOf=cn=dev,ou=Security Groups,ou=Domain,dc=domain,dc=local) como base, faltava apenas uma árvore de objetos para analisar, quer dizer, na qual o usuário poderia ser encontrado. br> O sssd deve se parecer com o seguinte para que isso funcione (pelo menos para mim):

[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=*))
    
por 31.08.2018 / 18:15