Filtre o usuário LDAP através do PAM, de forma que pareça não existir

5

Em nosso ambiente corporativo, há muito tempo, alguns especialistas decidiram colocar o usuário " mysql " no LDAP.

A conta está desativada:

$ sudo su - mysql
This account is currently not available.

... mas ainda existe o id:

$ id mysql
uid=2050913(mysql) gid=867(ENG) groups=867(ENG)

Isso faz com que as instalações de mariadb falhem no CentOS7 porque /var/run/mariadb é criado por uma regra tmpfile que tenta designar o diretório para ser de propriedade do mysql. Mas o mysql não existe até que o LDAP / rede esteja ativo e funcionando, e a instalação do mariadb não cria o usuário mysql porque o usuário já existe no ldap.

Existe uma maneira de forçar localmente o PAM (ou algo assim?) a ignorar o usuário mysql no LDAP? Ou renomeie o usuário ldap mysql para mysql_ldap ?

Minha única solução alternativa é adicionar manualmente a entrada em /etc/passwd ? (Ou mude a configuração do mariadb para usar um nome de usuário diferente.) Eu prefiro ter mudanças mínimas nos arquivos config e systemd que vêm do rpm.

(E eu não tenho grandes esperanças de remover mysql do LDAP, já que isso poderia quebrar uma grande parte da infraestrutura legada.)

Vou usar o ansible, btw, para implementar a alteração.

Adicional:

Eu mudei o título da pergunta:

Descobri que, se eu adicionar o usuário " mysql " local, tudo bem, a menos que eu tenha arquivos de propriedade do userid do usuário LDAP " mysql ". Se eu ls -la os arquivos, ele poluirá o cache nscd (ou sssd) e " mysql " novamente será resolvido para o usuário LDAP. Parece que o que eu realmente quero é de alguma forma construir um filtro PAM para contas para fazer este usuário LDAP " mysql " desaparecer.

    
por rrauenza 29.09.2015 / 19:45

5 respostas

3

Aqui está minha solução final, codificada em ansible:

- name: Disable ldap users                                                  
  ini_file: dest=/etc/sssd/sssd.conf section='nss' 
            option=filter_users value={{ filter_ldap_users | join(",") }}
  register: sssd_conf_users                                                   

- name: Disable ldap groups                                                 
  ini_file: dest=/etc/sssd/sssd.conf section='nss' 
            option=filter_groups value={{ filter_ldap_groups | join(",") }}
  register: sssd_conf_groups                                                  

- name: Restart SSSD                                                        
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  service: name=sssd state=restarted                                          

- name: Flush NSCD cache                                                    
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  shell: "for db in /var/db/nscd/*; do nscd -i $(basename $db); done"         

- name: Flush SSSD cache                                                     
  when: sssd_conf_users.changed or sssd_conf_groups.changed                   
  command: /usr/sbin/sss_cache -E        
    
por 30.09.2015 / 21:13
1

No nível PAM:
Tudo que você precisa é ignorar um usuário no LDAP. Então, configure o cliente LDAP específico que você está usando, no CentOS seria sssd, para usar um personalizado LDAP UID / GID pesquisa que irá ignorar o registro "mysql". Em um sistema existente, você terá que limpar o cache sssd e reiniciá-lo, e o usuário terá ido embora. Reinstalação do mariadb irá então criar um usuário mysql local.

No nível do pacote:
Configure um repositório personalizado do Yum em algum ponto da rede que inclua um pacote que contenha um script de pós-instalação, corrigindo o problema do usuário do mysql. Você também terá que colocar o pacote mariadb nesse repo. Em seguida, defina um grupo de pacotes que incluirá esse pacote e o mariadb e o instalará.
Alternativamente, você pode reconstruir o pacote mariaDB com um script de pós-instalação atualizado e mais inteligente que cuidará da criação do usuário mysql.

Eu iria com A - B é um pouco ofuscado:)

    
por 29.09.2015 / 21:05
1

Aqui está algo que estou usando atualmente como solução alternativa. Eu adicionei isto ao meu arquivo de kickstart para rodar em %post - antes de ativar / configurar o LDAP:

# Install and de-install mariadb-server to create mysql
# user before LDAP is enabled.
yum -d1 -e1 -y install yum-plugin-remove-with-leaves mariadb-server
yum -d1 -e1 -y erase mariadb-server --remove-leaves

Eu ia executar o useradd manualmente depois de ler o arquivo mariadb-server spec: link

%pre server
/usr/sbin/groupadd -g 27 -o -r mysql >/dev/null 2>&1 || :
/usr/sbin/useradd -M -N -g mysql -o -r -d %{mysqluserhome} -s /sbin/nologin \
  -c "MySQL Server" -u 27 mysql >/dev/null 2>&1 || :

... mas estou mais confortável em tirar tudo diretamente da instalação do rpm.

Eu não estou completamente satisfeito com isso também, porque se eu encontrar um arquivo com o userd ldap "mysql", a pesquisa reversa no id do usuário polui nscd ou sssd com o usuário "mysql" errado.

    
por 30.09.2015 / 00:34
1

Eu realmente sugiro adicionar:

filter_users = mysql
filter_groups = mysql

Para a seção [nss] do sssd.conf, em vez de personalizar o filtro LDAP. Ele deve fazer a mesma coisa, exceto que, quando você usa o modo de filtro LDAP, as pesquisas ainda atingem o servidor LDAP, mas não correspondem.

Por outro lado, o filter_users/filter_groups entraria o usuário mysql no cache negativo do SSSD, que retornaria "Not found" diretamente do respondente do NSS, sem passar pelo processo sssd_be e pelo servidor LDAP.

    
por 02.10.2015 / 09:19
0

Se tudo o que você deseja fazer é não resolver os usuários do ldap. Edite /etc/nsswitch.conf e para o usuário & entradas de grupos removem entradas sssd (ou ldap). Em seguida, libere o cache nscd

    
por 01.10.2015 / 14:04