Spec-Zone.ru › MariaDB

Сопоставление пользователей и групп с 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 и сопоставлением пользователей:

  • Настройка аутентификации PAM и сопоставления пользователей с аутентификацией Unix
  • Настройка аутентификации PAM и сопоставления пользователей с аутентификацией LDAP

См. также

  • Настройка аутентификации PAM и сопоставления пользователей с MariaDB
  • Настройка сопоставления групп PAM с MariaDB
  • Настройка аутентификации LDAP и сопоставления групп с MariaDB
Содержимое, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержимое не просматривается предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API