Назад | Перейти на главную страницу

Отфильтруйте пользователя 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 user, потому что пользователь уже существует в ldap.

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

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

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

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

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

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

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

Вот мое окончательное решение, закодированное в анзибле:

- 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        

Я бы предложил добавить:

filter_users = mysql
filter_groups = mysql

К [nss] раздел sssd.conf вместо настройки фильтра LDAP. Он должен делать то же самое, за исключением того, что при использовании способа фильтрации LDAP поисковые запросы по-прежнему попадают на сервер LDAP, просто не совпадают.

Напротив, filter_users/filter_groups ввел бы пользователя mysql в отрицательный кеш SSSD, который вернул бы «Not found» непосредственно от ответчика NSS, не обращаясь к процессу sssd_be и серверу LDAP.

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

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

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

Я бы пошел с A - B несколько запутано :)

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