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

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

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

A conta está desativada:

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

... mas seu id ainda existe:

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

Isso faz com que as instalações do mariadb falhem no CentOS7 porque /var/run/mariadbé criado por uma regra tmpfile que tenta atribuir o diretório de propriedade do mysql. Mas o mysql não existe até que o LDAP/rede esteja instalado e funcionando, e a instalação do mariadb não cria o mysqlusuário 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 mysqlusuário ldap para mysql_ldap?

Minha única solução alternativa é adicionar manualmente a entrada /etc/passwd? (Ou altere a configuração do mariadb para usar um nome de usuário diferente.) Prefiro fazer alterações mínimas nos arquivos de configuração e systemd que vêm do rpm.

(E não tenho grandes esperanças de remover mysqlo LDAP, pois isso poderia quebrar muita infraestrutura legada.)

Estarei usando ansible, aliás, para implementar a mudança.

Adicional:

Mudei o título da pergunta:

Descobri que se eu adicionar o mysqlusuário " " local, ele funcionará bem, a menos que eu tenha arquivos pertencentes ao ID do usuário LDAP " mysql". Se eu usar ls -laos arquivos, ele polui o cache nscd (ou sssd) e " mysql" novamente resolve para o usuário LDAP. Parece que o que eu realmente quero é construir de alguma forma um filtro PAM para contas para fazer esse mysqlusuário LDAP " " desaparecer.

Responder1

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        

Responder2

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

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

Eu escolheria A - B está um pouco ofuscado :)

Responder3

Aqui está algo que estou usando atualmente como solução alternativa. Adicionei isso ao meu arquivo kickstart para ser executado %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 iria executar useraddmanualmente depois de ler o mariadb-serverarquivo de especificações:http://pkgs.fedoraproject.org/cgit/mariadb.git/tree/mariadb.spec

%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 fico mais confortável em fazer isso direto da instalação do rpm.

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

Responder4

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

informação relacionada