Сопоставление пользователей и групп с PAM
Даже при использовании плагина аутентификации pam, учетная запись аутентифицируемого пользователя PAM по-прежнему должна существовать в MariaDB, и учетной записи необходимы привилегии в базе данных. Создание этих учетных записей MariaDB и обеспечение правильности привилегий может быть довольно сложной задачей. Для уменьшения объема работы некоторые пользователи хотели бы иметь возможность сопоставлять пользователя PAM с другим пользователем MariaDB. Например, предположим, что alice и bob являются DBA. Было бы удобно, если бы каждый из них мог войти в MariaDB со своим именем пользователя и паролем PAM, а MariaDB воспринимал бы их обоих как одного и того же пользователя dba. Таким образом, нужно отслеживать только одну учетную запись MariaDB.
Хотя большинство модулей PAM обычно не выполняют такие действия, PAM поддерживает возможность изменения имени пользователя в процессе аутентификации. Плагин аутентификации MariaDB pam полностью поддерживает эту функцию PAM.
Модуль PAM pam_user_map
Вместо того, чтобы интегрировать сопоставление пользователей и групп в плагин аутентификации pam, MariaDB посчитал, что это обеспечит наибольшее количество случаев использования и наибольшую гибкость, передав эту функциональность внешнему модулю PAM. Модуль PAM pam_user_map был реализован MariaDB для этого. Этот модуль PAM можно настроить в службе PAM, используемой плагином аутентификации pam, как и другие модули PAM.
Отсутствие поддержки синтаксиса сопоставления групп MySQL/Percona
В отличие от MariaDB, MySQL и Percona реализовали сопоставление групп в своих плагинах аутентификации PAM. Если вы прочитали документацию MySQL по аутентификации PAM с сопоставлением групп здесь или документацию Percona по аутентификации PAM с сопоставлением групп здесь, вы, вероятно, увидели синтаксис, где сопоставления групп предоставляются в утверждении CREATE USER следующим образом:
CREATE USER ''@'' IDENTIFIED WITH authentication_pam AS 'mysql, root=developer, users=data_entry';
Поскольку сопоставление пользователей и групп в MariaDB выполняется внешним модулем PAM, плагин аутентификации MariaDB pam не поддерживает этот синтаксис. Вместо этого сопоставления пользователей и групп для модуля PAM pam_user_map настраиваются во внешнем конфигурационном файле. Это обсуждается в последующем разделе.
Установка модуля PAM pam_user_map
Модуль PAM pam_user_map устанавливается в рамках всех пакетов сервера MariaDB с MariaDB 10.5, и был добавлен начиная с 10.2.31, 10.3.22 и 10.4.12 в предыдущих основных версиях MariaDB, где он изначально отсутствовал.
Некоторые дистрибутивы Linux еще не приняли эту модификацию в свои пакеты, поэтому при установке сервера MariaDB из стандартных пакетов Ubuntu на Ubuntu 20.04LTS модуль pam_user_map всё ещё не будет установлен, даже если установленный сервер MariaDB более новый, чем MariaDB 10.3.22.
При использовании такой установки и невозможности перейти на собственные репозитории пакетов MariaDB может потребоваться скомпилировать модуль PAM из исходного кода, как описано в следующем разделе, или вручную извлечь его из одного из наших пакетов сервера и скопировать на целевую систему.
Установка модуля PAM pam_user_map из исходного кода
Установка зависимостей компиляции
Перед компиляцией модуля из исходного кода может потребоваться установка некоторых зависимостей.
В дистрибутивах Linux, таких как RHEL, CentOS и аналогичных, использующих пакеты RPM, необходимо установить gcc, pam-devel и MariaDB-devel. Например:
sudo yum install gcc pam-devel MariaDB-devel
В дистрибутивах Linux, таких как Debian, Ubuntu и аналогичных, использующих пакеты DEB, необходимо установить gcc, libpam0g-dev. Например:
sudo apt-get install gcc libpam0g-dev libmariadb-dev
Компиляция и установка модуля PAM pam_user_map
Модуль PAM pam_user_map можно создать, загрузив файл plugin/auth_pam/mapper/pam_user_map.c из дерева исходного кода MariaDB и скомпилировав его после незначительных корректировок. После компиляции его можно установить в каталог модулей PAM системы, который обычно /lib64/security/.
Например: (замените 10.4 в URL на фактические версии сервера)
wget https://raw.githubusercontent.com/MariaDB/server/10.4/plugin/auth_pam/mapper/pam_user_map.c sed -ie 's/config_auth_pam/plugin_auth_common/' pam_user_map.c gcc -I/usr/include/mysql/ pam_user_map.c -shared -lpam -fPIC -o pam_user_map.so sudo install --mode=0755 pam_user_map.so /lib64/security/
Вам также потребуется скорректировать номер основной версии в URL на первой строке, чтобы он соответствовал установленной версии MariaDB, а аргумент #-I# пути включения на строке gcc, так как в зависимости от операционной системы и версии сервера MariaDB файл plugin_auth_common.h может быть установлен в каталогах, отличных от /usr/include/mysql/
Настройка модуля PAM pam_user_map
Модуль PAM pam_user_map использует конфигурационный файл по пути /etc/security/user_map.conf для определения сопоставлений пользователей и групп. Ниже описан формат файла.
Для сопоставления определенного пользователя PAM с определенным пользователем MariaDB:
orig_pam_user_name: mapped_mariadb_user_name
Или для сопоставления любого пользователя PAM в определенной группе PAM с определенным пользователем MariaDB, имя группы предваряется @:
@orig_pam_group_name: mapped_mariadb_user_name
Например, вот пример /etc/security/user_map.conf:
========================================================= #comments and empty lines are ignored john: jack bob: admin top: accounting @group_ro: readonly
Настройка PAM
При сопоставлении пользователей и групп настройка PAM выполняется аналогично тому, как она обычно выполняется с плагином аутентификации pam. Однако при настройке службы PAM вам необходимо добавить строку auth для модуля PAM pam_user_map в конфигурационный файл службы PAM. Например:
auth required pam_unix.so audit auth required pam_user_map.so account required pam_unix.so audit
Создание пользователей
При сопоставлении пользователей и групп создание пользователей выполняется аналогично тому, как это обычно делается с плагином аутентификации pam. Однако существенное различие заключается в том, что вам потребуется GRANT привилегию PROXY для сопоставленного пользователя на исходного пользователя.
Например, если у вас в файле /etc/security/user_map.conf настроено следующее:
foo: bar @dba:dba
Тогда вы могли бы выполнить следующее, чтобы предоставить необходимые привилегии:
CREATE USER 'bar'@'%' IDENTIFIED BY 'strongpassword'; GRANT ALL PRIVILEGES ON *.* TO 'bar'@'%' ; CREATE USER 'dba'@'%' IDENTIFIED BY 'strongpassword'; GRANT ALL PRIVILEGES ON *.* TO 'dba'@'%' ; CREATE USER ''@'%' IDENTIFIED VIA pam USING 'mariadb'; GRANT PROXY ON 'bar'@'%' TO ''@'%'; GRANT PROXY ON 'dba'@'%' TO ''@'%';
Обратите внимание, что учетная запись ''@'%' — это специальная всеобъемлющая анонимная учетная запись. Любой вход пользователя, для которого нет более конкретного соответствия в системе, будет соответствовать этой анонимной учетной записи.
Также обратите внимание, что по умолчанию вы можете не иметь возможности создать анонимную учетную запись ''@'%' на некоторых системах без дополнительных шагов. Подробности см. в разделе Устранение проблемы с устаревшей анонимной учетной записью по умолчанию.
Проверка выполнения сопоставления
В случае выполнения сопоставления пользователей исходное имя пользователя возвращается функцией SQL USER(), а аутентифицированное имя пользователя возвращается функцией SQL CURRENT_USER(). Последняя фактически определяет доступные привилегии подключенного пользователя.
Например, если у нас настроено следующее:
foo: bar
Тогда следующий вывод подтвердит правильность работы:
$ mysql -u foo -h 172.30.0.198 [mariadb] Password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 22 Server version: 10.3.10-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SELECT USER(), CURRENT_USER(); +------------------------------------------------+----------------+ | USER() | CURRENT_USER() | +------------------------------------------------+----------------+ | foo@ip-172-30-0-198.us-west-2.compute.internal | bar@% | +------------------------------------------------+----------------+ 1 row in set (0.000 sec)
Мы можем проверить, что наш пользователь PAM foo был корректно сопоставлен с пользователем MariaDB bar, посмотрев значение возвращаемое CURRENT_USER().
Ведение журнала
По умолчанию модуль PAM pam_user_map не выполняет никаких действий по ведению журнала. Однако, если вы хотите включить отладочную запись в журнал, то вы можете добавить аргумент модуля debug в конфигурационный файл службы PAM. Например:
auth required pam_unix.so audit auth required pam_user_map.so debug account required pam_unix.so audit
При включенной отладочной записи в журнал модуль PAM pam_user_map записывает записи журнала в тот же путь syslog, что и другие модули PAM, который обычно /var/log/secure на многих системах.
Например, этот вывод отладочного журнала может выглядеть следующим образом:
Jan 9 05:42:13 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Opening file '/etc/security/user_map.conf'. Jan 9 05:42:13 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Incoming username 'alice'. Jan 9 05:42:13 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): User belongs to 2 groups [alice,dba]. Jan 9 05:42:13 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Check if user is in group 'dba': YES Jan 9 05:42:13 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): User mapped as 'dba' Jan 9 05:43:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Opening file '/etc/security/user_map.conf'. Jan 9 05:43:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Incoming username 'bob'. Jan 9 05:43:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): User belongs to 2 groups [bob,dba]. Jan 9 05:43:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Check if user is in group 'dba': YES Jan 9 05:43:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): User mapped as 'dba' Jan 9 06:08:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Opening file '/etc/security/user_map.conf'. Jan 9 06:08:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Incoming username 'foo'. Jan 9 06:08:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): User belongs to 1 group [foo]. Jan 9 06:08:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Check if user is in group 'dba': NO Jan 9 06:08:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): Check if username 'foo': YES Jan 9 06:08:36 ip-172-30-0-198 mysqld: pam_user_map(mariadb:auth): User mapped as 'bar'
Известные проблемы
Пользователь PAM с тем же именем, что и сопоставленный пользователь MariaDB, должен существовать
При сопоставлении пользователей и групп любой пользователь PAM или любой пользователь PAM в заданной группе PAM может быть сопоставлен с конкретной учетной записью пользователя MariaDB. Однако из-за того, как работает PAM, пользователь PAM с тем же именем, что и сопоставленная учетная запись пользователя MariaDB, должен существовать.
Например, если конфигурационный файл файла службы PAM содержал следующее:
auth required pam_sss.so auth required pam_user_map.so debug account sufficient pam_unix.so account sufficient pam_sss.so
И если /etc/security/user_map.conf содержал следующее:
@dba: dba
Тогда любой пользователь PAM в группе PAM dba будет сопоставлен с учетной записью пользователя MariaDB dba. Но если пользователь PAM с именем dba не существует, то модуль PAM pam_user_map будет записывать ошибки в syslog, как показано ниже:
Sep 27 17:17:05 dbserver1 mysqld: pam_user_map(mysql:auth): Opening file '/etc/security/user_map.conf'. Sep 27 17:17:05 dbserver1 mysqld: pam_user_map(mysql:auth): Incoming username 'alice'. Sep 27 17:17:05 dbserver1 mysqld: pam_user_map(mysql:auth): User belongs to 4 groups [dba,mongod,mongodba,mysql]. Sep 27 17:17:05 dbserver1 mysqld: pam_user_map(mysql:auth): Check if user is in group 'mysql': YES Sep 27 17:17:05 dbserver1 mysqld: pam_user_map(mysql:auth): User mapped as 'dba' Sep 27 17:17:05 dbserver1 mysqld: pam_unix(mysql:account): could not identify user (from getpwnam(dba)) Sep 27 17:17:05 dbserver1 mysqld: pam_sss(mysql:account): Access denied for user dba: 10 (User not known to the underlying authentication module) Sep 27 17:17:05 dbserver1 mysqld: 2018-09-27 17:17:05 72 [Warning] Access denied for user 'alice'@'localhost' (using password: NO)
В приведенном фрагменте журнала обратите внимание, что оба модуля PAM, pam_unix и pam_sss, сообщают об отсутствии пользователя PAM dba, и эти сообщения вызывают сбой процесса аутентификации PAM, что, в свою очередь, вызывает сбой процесса аутентификации MariaDB.
Это можно исправить, создав пользователя PAM с тем же именем, что и сопоставленная учетная запись пользователя MariaDB, в данном случае dba.
Вы также можете обойти эту проблему, по сути, отключив проверку учетных записей PAM для службы с помощью модуля PAM pam_permit . Например, в указанном случае это будет:
auth required pam_sss.so auth required pam_user_map.so debug account required pam_permit.so
Дополнительная информация доступна в MDEV-17315.
Учебники
Для вас могут быть полезны следующие учебники, связанные с PAM и сопоставлением пользователей:
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/user-and-group-mapping-with-pam/