Фильтрация пользователя LDAP через PAM, чтобы казалось, что он вообще не существует

Фильтрация пользователя LDAP через PAM, чтобы казалось, что он вообще не существует

В нашей корпоративной среде давным-давно какой-то гений решил поместить пользователя " mysql" в LDAP.

Учетная запись отключена:

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

...но его идентификатор все еще существует:

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

Это приводит к сбою установки mariadb на CentOS7, поскольку /var/run/mariadbсоздается правилом tmpfile, которое пытается назначить каталог владельцем mysql. Но mysql не существует, пока LDAP/сеть не запущена и не работает, а установка mariadb не создает пользователя, mysqlпоскольку пользователь уже существует в ldap.

Есть ли способ локально заставить PAM (или что-то еще?) игнорировать пользователя mysql в LDAP? Или переименовать mysqlпользователя ldap в mysql_ldap?

Единственный ли способ обойти это — вручную добавить запись в /etc/passwd? (Или изменить конфигурацию mariadb, чтобы использовать другое имя пользователя.) Я бы предпочел внести минимальные изменения в файлы конфигурации и systemd, которые поставляются из rpm.

(И я не питаю больших надежд на удаление mysqlиз LDAP, поскольку это может разрушить большую часть устаревшей инфраструктуры.)

Кстати, для реализации изменений я буду использовать ansible.

Дополнительный:

Я изменил название вопроса:

Я обнаружил, что если я добавляю локального " mysql" пользователя, то все работает нормально, если только у меня нет файлов, принадлежащих userid пользователя LDAP " mysql". Если я ls -laдобавляю файлы, то это загрязняет кэш nscd (или sssd) и " mysql" снова разрешается в пользователя LDAP. Кажется, что на самом деле я хочу как-то создать фильтр PAM для учетных записей, чтобы этот пользователь LDAP " mysql" исчез.

решение1

Вот мое окончательное решение, закодированное в 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        

решение2

На уровне PAM:
Все, что вам нужно, это игнорировать пользователя в LDAP. Итак, настройте конкретный клиент LDAP, который вы используете, в CentOS это будет sssd, для использования пользовательских фильтров поиска LDAP UID/GID, которые будут игнорировать запись "mysql". В существующей системе вам придется очистить кэш sssd и перезапустить ее, и пользователь исчезнет. Переустановка mariadb затем создаст локального пользователя mysql.

На уровне пакета:
Настройте пользовательский репозиторий Yum где-нибудь в сети, который будет включать пакет, содержащий скрипт после установки, исправляющий проблему пользователя mysql. Вам также придется поместить пакет mariadb в этот репозиторий. Затем определите группу пакетов, которая будет включать этот пакет и mariadb, и установите его.
В качестве альтернативы вы можете пересобрать пакет mariaDB с обновленным, более интеллектуальным скриптом после установки, который позаботится о создании пользователя mysql.

Я бы выбрал вариант А, так как вариант Б несколько запутан :)

решение3

Вот что я сейчас использую в качестве обходного пути. Я добавил это в свой файл kickstart для запуска %post-- перед включением/настройкой 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

Я собирался запустить useraddвручную, прочитав mariadb-serverфайл спецификации: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 || :

...но мне удобнее делать это сразу после установки RPM.

Меня это тоже не совсем устраивает, потому что если я случайно найду файл с идентификатором пользователя ldap "mysql", обратный поиск по идентификатору пользователя засорит nscd или sssd неправильным пользователем "mysql".

решение4

Если все, что вы хотите сделать, это не разрешать пользователей ldap. Отредактируйте /etc/nsswitch.conf и для записей пользователей и групп удалите записи sssd (или ldap). Затем очистите кэш nscd

Связанный контент