В нашей корпоративной среде давно какой-то волшебник решил поставить пользователя "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