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