Spec-Zone.ru › MySQL 5.7

6.4.1.7 Модуль аутентификации PAM

Примечание

Модуль аутентификации PAM — это расширение, включённое в MySQL Enterprise Edition, коммерческий продукт. Чтобы узнать больше о коммерческих продуктах, посетите https://www.mysql.com/products/.

MySQL Enterprise Edition поддерживает метод аутентификации, который позволяет MySQL Server использовать PAM (Pluggable Authentication Modules) для аутентификации пользователей MySQL. PAM позволяет системе использовать стандартный интерфейс для доступа к различным методам аутентификации, таким как традиционные пароли Unix или каталог LDAP.

Модуль аутентификации PAM предоставляет следующие возможности:

  • Внешняя аутентификация: аутентификация PAM позволяет MySQL Server принимать подключения от пользователей, определённых вне таблиц разрешений MySQL и аутентифицирующихся с помощью методов, поддерживаемых PAM.

  • Поддержка прокси-пользователей: аутентификация PAM может возвращать MySQL имя пользователя, отличное от имени внешнего пользователя, переданного клиентом, на основе групп PAM, к которым принадлежит внешний пользователь, и предоставленной строки аутентификации. Это означает, что плагин может возвращать имя пользователя MySQL, определяющее привилегии, которые должен иметь внешний пользователь, аутентифицированный через PAM. Например, пользователь операционной системы с именем joe может подключиться и иметь привилегии пользователя MySQL с именем developer.

Модуль аутентификации PAM был протестирован на Linux и macOS.

В следующей таблице показаны имена плагина и библиотечного файла. На вашей системе имя файла может отличаться. Файл должен находиться в каталоге, указанном переменной системы plugin_dir. Информацию об установке см. в разделе Установка модуля аутентификации PAM.

Таблица 6.13 Имена плагина и библиотеки для аутентификации PAM

Таблица 6.13 Имена плагина и библиотеки для аутентификации PAM
Плагин или файл Имя плагина или файла
Плагин на стороне сервера authentication_pam
Плагин на стороне клиента mysql_clear_password
Файл библиотеки authentication_pam.so

Плагин mysql_clear_password на стороне клиента для обмена данными в открытом виде с плагином PAM на стороне сервера встроен в библиотеку клиента libmysqlclient и включен во все дистрибутивы, включая дистрибутивы сообщества. Включение плагина cleartext на стороне клиента во все дистрибутивы MySQL позволяет клиентам из любого дистрибутива подключаться к серверу, на котором загружен плагин PAM на стороне сервера.

В следующих разделах приводится информация об установке и использовании, специфичная для модуля аутентификации PAM:

  • Как работает аутентификация пользователей MySQL с помощью PAM

  • Установка модуля аутентификации PAM

  • Удаление модуля аутентификации PAM

  • Использование модуля аутентификации PAM

  • Аутентификация PAM по паролю Unix без прокси-пользователей

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

  • Аутентификация PAM по паролю Unix с прокси-пользователями и отображением групп

  • Доступ к хранилищу паролей Unix с помощью аутентификации PAM

  • Отладка аутентификации PAM

Дополнительную информацию об аутентификации с плагинами в MySQL см. в разделе 6.2.13 «Аутентификация с плагинами». Информацию о плагине mysql_clear_password см. в разделе 6.4.1.6 «Аутентификация с плагинами Cleartext на стороне клиента». Информацию о прокси-пользователях см. в разделе 6.2.14 «Прокси-пользователи».

Как работает аутентификация пользователей MySQL с помощью PAM

Этот раздел предоставляет общий обзор взаимодействия MySQL и PAM при аутентификации пользователей MySQL. Примеры настройки учётных записей MySQL для использования конкретных служб PAM см. в разделе «Использование модуля аутентификации PAM».

  1. Программа клиента и сервера взаимодействуют, при этом клиент отправляет серверу имя пользователя клиента (имя пользователя операционной системы по умолчанию) и пароль:

    • Имя пользователя клиента — это имя внешнего пользователя.

    • Для учётных записей, использующих плагин аутентификации PAM на стороне сервера, соответствующий плагин на стороне клиента — это mysql_clear_password. Этот плагин на стороне клиента не выполняет хэширование паролей, в результате чего клиент отправляет пароль на сервер в открытом виде.

  2. Сервер находит соответствующую учётную запись MySQL на основе имени внешнего пользователя и хоста, с которого подключается клиент. Плагин PAM использует информацию, переданную ему сервером MySQL (например, имя пользователя, имя хоста, пароль и строку аутентификации). При определении учётной записи MySQL, которая аутентифицируется с помощью PAM, строка аутентификации содержит:

    • Имя службы PAM, которое системный администратор может использовать для указания метода аутентификации для конкрельного приложения. Может быть несколько приложений, связанных с одним экземпляром сервера базы данных, поэтому выбор имени службы предоставляется разработчику SQL-приложения.

    • Необязательно, если используется проксирование, отображение отображения групп PAM в имена пользователей MySQL.

  3. Плагин использует службу PAM, указанную в строке аутентификации, для проверки учётных данных и возвращает 'Authentication succeeded, Username is user_name' или 'Authentication failed'. Пароль должен соответствовать хранилищу паролей, используемому службой PAM. Примеры:

    • Для традиционных паролей Unix служба ищет пароли, сохранённые в файле /etc/shadow.

    • Для LDAP служба ищет пароли, сохранённые в каталоге LDAP.

    Если проверка учётных данных не пройдена, сервер отклоняет подключение.

  4. В противном случае, строка аутентификации указывает, происходит ли проксирование. Если строка не содержит сопоставление групп PAM, проксирование не происходит. В этом случае имя пользователя MySQL совпадает с именем внешнего пользователя.

  5. В противном случае проксирование указывается на основе отображения групп PAM, при этом имя пользователя MySQL определяется на основе первой совпавшей группы в списке отображения. Значение «“группа PAM”» зависит от службы PAM. Примеры:

    • Для традиционных паролей Unix группы — это группы Unix, определённые в файле /etc/group, возможно, дополненные дополнительной информацией PAM в файле, таком как /etc/security/group.conf.

    • Для LDAP группы — это группы LDAP, определённые в каталоге LDAP.

    Если прокси-пользователь (внешний пользователь) имеет привилегию PROXY для имени пользователя MySQL, проксирование происходит, и прокси-пользователь принимает привилегии проксированного пользователя.

Установка подключаемого модуля аутентификации PAM

В этом разделе описано, как установить подключаемый модуль аутентификации PAM на стороне сервера. Для общей информации об установке подключаемых модулей см. Раздел 5.5.1, «Установка и удаление подключаемых модулей».

Для использования сервером, библиотечный файл подключаемого модуля должен находиться в каталоге подключаемых модулей MySQL (каталог, указанный переменной системы plugin_dir). При необходимости, настройте расположение каталога подключаемых модулей, задав значение переменной plugin_dir при запуске сервера.

Имя базового файла библиотеки подключаемого модуля — authentication_pam. Суффикс имени файла отличается в зависимости от платформы (например, .so для Unix и Unix-подобных систем, .dll для Windows).

Для загрузки подключаемого модуля при запуске сервера используйте опцию --plugin-load-add для указания имени библиотечного файла, содержащего модуль. При таком способе загрузки подключаемого модуля, опция должна указываться каждый раз при запуске сервера. Например, поместите эти строки в файл конфигурации сервера my.cnf, подстроив суффикс .so под вашу платформу:

[mysqld]
plugin-load-add=authentication_pam.so

После изменения my.cnf перезапустите сервер, чтобы новые настройки вступили в силу.

В качестве альтернативы, для загрузки подключаемого модуля во время работы, используйте следующее утверждение, подстроив суффикс .so под вашу платформу:

INSTALL PLUGIN authentication_pam SONAME 'authentication_pam.so';

INSTALL PLUGIN загружает подключаемый модуль сразу и также регистрирует его в таблице системы mysql.plugins, чтобы сервер загружал его при каждом последующем нормальном запуске без необходимости использования опции --plugin-load-add.

Для проверки установки подключаемого модуля, просмотрите таблицу Информационной Схемы PLUGINS или используйте оператор SHOW PLUGINS (см. Раздел 5.5.2, «Получение информации о подключаемых модулях сервера»). Например:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%pam%';
+--------------------+---------------+
| PLUGIN_NAME        | PLUGIN_STATUS |
+--------------------+---------------+
| authentication_pam | ACTIVE        |
+--------------------+---------------+

Если подключаемый модуль не может быть инициализирован, проверьте журнал ошибок сервера на наличие диагностических сообщений.

Для сопоставления учетных записей MySQL с подключаемым модулем PAM см. Использование подключаемого модуля аутентификации PAM.

Удаление подключаемого модуля аутентификации PAM

Способ удаления подключаемого модуля аутентификации PAM зависит от способа его установки:

  • Если подключаемый модуль был установлен при запуске сервера с помощью опции --plugin-load-add, перезапустите сервер без этой опции.

  • Если подключаемый модуль был установлен во время работы с помощью оператора INSTALL PLUGIN, он остается установленным после перезагрузки сервера. Для его удаления используйте UNINSTALL PLUGIN:

    UNINSTALL PLUGIN authentication_pam;
    
Использование плагина аутентификации PAM

В этом разделе в общих чертах описано, как использовать плагин аутентификации PAM для подключения клиентских программ MySQL к серверу. В следующих разделах приведены инструкции по использованию аутентификации PAM различными способами. Предполагается, что сервер работает с включенным плагином аутентификации PAM на стороне сервера, как описано в Установка плагина аутентификации PAM.

Для обращения к плагину аутентификации PAM в предложении CREATE USER в подразделе IDENTIFIED WITH используйте имя authentication_pam. Например:

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'auth_string';

Строка аутентификации определяет следующие типы информации:

  • Имя службы PAM (см. Как работает аутентификация пользователей MySQL с помощью PAM). В примерах ниже используется имя службы mysql-unix для аутентификации с использованием традиционных паролей Unix и mysql-ldap для аутентификации с использованием LDAP.

  • Для поддержки проксирования PAM предоставляет способ возврата серверу имени пользователя MySQL, отличного от имени внешнего пользователя, переданного клиентской программой при подключении к серверу. Используйте строку аутентификации для управления отображением внешних имен пользователей на имена пользователей MySQL. Если вы хотите воспользоваться возможностями прокси-пользователей, строка аутентификации должна содержать такой тип отображения.

Например, если учетная запись использует имя службы PAM mysql-unix и должна отображать пользователей операционной системы в группах PAM root и users соответственно на пользователей MySQL developer и data_entry, используйте такое предложение:

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'mysql-unix, root=developer, users=data_entry';

Синтаксис строки аутентификации для плагина аутентификации PAM соответствует следующим правилам:

  • Строка состоит из имени службы PAM, за которым необязательно следует список отображения групп PAM, состоящий из одного или нескольких пар «ключ-значение», каждая из которых задает имя группы PAM и имя пользователя MySQL:

    pam_service_name[,pam_group_name=mysql_user_name]...
    

    Плагин анализирует строку аутентификации для каждого запроса на подключение, использующего учетную запись. Для минимизации накладных расходов следует держать строку максимально короткой.

  • Каждая пара «ключ-значение» pam_group_name=mysql_user_name должна предшествовать запятой.

  • Пробелы в начале и конце строки, не являющиеся частью двойных кавычек, игнорируются.

  • Значения pam_service_name, pam_group_name и mysql_user_name, не заключенные в кавычки, могут содержать любые символы, кроме знака равенства, запятой или пробела.

  • Если значение pam_service_name, pam_group_name или mysql_user_name заключено в двойные кавычки, всё содержимое между кавычками является частью значения. Это необходимо, например, если значение содержит пробелы. Все символы допустимы, кроме двойной кавычки и обратной косой черты (\). Чтобы включить любой из этих символов, следует экранировать его обратной косой чертой.

Если плагин успешно аутентифицирует имя внешнего пользователя (переданное клиентом), он ищет список отображения групп PAM в строке аутентификации и, если он присутствует, использует его для возврата MySQL серверу другого имени пользователя MySQL в зависимости от того, участником каких групп PAM является внешний пользователь:

  • Если строка аутентификации не содержит список отображения групп PAM, плагин возвращает внешнее имя.

  • Если строка аутентификации содержит список отображения групп PAM, плагин анализирует каждую пару «ключ-значение» в списке слева направо и пытается найти соответствие для значения pam_group_name в каталоге, не относящемся к MySQL, групп, назначенных аутентифицированному пользователю, и возвращает mysql_user_name для первого найденного соответствия. Если плагин не находит соответствия ни одной группе PAM, он возвращает внешнее имя. Если плагин не способен найти группу в каталоге, он игнорирует список отображения групп PAM и возвращает внешнее имя.

В следующих разделах описано, как настроить несколько сценариев аутентификации, использующих плагин аутентификации PAM:

  • Отсутствуют прокси-пользователи. В данном случае PAM используется только для проверки имен пользователей и паролей. Каждый внешний пользователь, имеющий право подключаться к MySQL Server, должен иметь соответствующую учетную запись MySQL, которая настроена на использование аутентификации PAM. (Для соответствия внешнего пользователя учетной записи MySQL 'user_name'@'host_name', имя внешнего пользователя должно быть user_name, а имя хоста, с которого подключается клиент, должно соответствовать host_name.) Аутентификация может выполняться различными методами, поддерживаемыми PAM. В дальнейшем показано, как аутентифицировать учетные данные клиента с использованием традиционных паролей Unix и паролей в LDAP.

    Аутентификация с помощью PAM, когда она не выполняется через прокси-пользователей или группы PAM, требует, чтобы имя пользователя MySQL совпадало с именем пользователя операционной системы. Имена пользователей MySQL ограничены 32 символами (см. Раздел 6.2.3, «Таблицы разрешений»), что ограничивает аутентификацию PAM без проксирования учетными записями Unix с именами длиной не более 32 символов.

  • Только прокси-пользователи с отображением групп PAM. Для этого сценария создайте одну или несколько учетных записей MySQL, определяющих разные наборы привилегий. (В идеале никто не должен подключаться к этим учетным записям напрямую.) Затем определите пользователя по умолчанию, который проходит аутентификацию через PAM, использующий некоторую схему отображения (обычно на основе внешних групп PAM, членами которых являются пользователи) для отображения всех внешних имен пользователей на несколько учетных записей MySQL, обладающих наборами привилегий. Любой клиент, который подключается и указывает имя внешнего пользователя в качестве имени клиента, отображается на одну из учетных записей MySQL и использует ее привилегии. В обсуждении показано, как настроить это с использованием традиционных паролей Unix, но вместо этого можно использовать другие методы PAM, такие как LDAP.

Возможны вариации этих сценариев:

  • Вы можете разрешить некоторым пользователям входить в систему напрямую (без проксирования), но потребовать от других подключиться через прокси-учетные записи.

  • Вы можете использовать один метод аутентификации PAM для одних пользователей и другой метод для других пользователей, используя разные имена служб PAM в ваших учетных записях, аутентифицируемых с помощью PAM. Например, для некоторых пользователей можно использовать службу PAM mysql-unix, а для других — mysql-ldap.

В примерах сделаны следующие предположения. Вам, возможно, потребуется внести некоторые коррективы, если ваша система настроена иначе.

  • Имя пользователя и пароль соответственно равны antonio и antonio_password. Измените эти значения в соответствии с пользователем, которого вы хотите аутентифицировать.

  • Директория конфигурации PAM равна /etc/pam.d.

  • Имя службы PAM соответствует методу аутентификации (mysql-unix или mysql-ldap в данном обсуждении). Чтобы использовать заданную службу PAM, необходимо настроить файл PAM с таким же именем в директории конфигурации PAM (создав его, если он не существует). Кроме того, необходимо указать имя службы PAM в строке аутентификации предложения CREATE USER для любой учетной записи, которая проходит аутентификацию с помощью данной службы PAM.

Плагин аутентификации PAM проверяет при инициализации, установлено ли значение переменной среды AUTHENTICATION_PAM_LOG в среде запуска сервера. Если да, то плагин включает протоколирование диагностических сообщений в стандартный вывод. В зависимости от способа запуска сервера, сообщение может отображаться на консоли или в журнале ошибок. Эти сообщения могут быть полезны для отладки проблем, связанных с PAM, которые возникают при выполнении плагином аутентификации. Дополнительную информацию см. в Отладка аутентификации PAM.

Аутентификация PAM Unix паролей без прокси-пользователей

Этот сценарий аутентификации использует PAM для проверки внешних пользователей, определенных в терминах имён пользователей операционной системы и паролей Unix, без проксирования. Каждый такой внешний пользователь, которому разрешено подключение к MySQL Server, должен иметь соответствующую MySQL учётную запись, определённую для использования аутентификации PAM через традиционный хранилище паролей Unix.

Примечание

Традиционные пароли Unix проверяются с помощью файла /etc/shadow. Сведения о возможных проблемах, связанных с этим файлом, см. в PAM Authentication Access to Unix Password Store.

  1. Убедитесь, что аутентификация Unix позволяет вход в операционную систему с именем пользователя antonio и паролем antonio_password.

  2. Настройте PAM для аутентификации подключений MySQL с использованием традиционных паролей Unix, создав файл службы PAM mysql-unix с именем /etc/pam.d/mysql-unix. Содержимое файла зависит от системы, поэтому проверьте существующие файлы, связанные с входами, в каталоге /etc/pam.d, чтобы увидеть, как они выглядят. В Linux файл mysql-unix может выглядеть так:

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth
    

    Для macOS используйте login вместо password-auth.

    Формат файла PAM может отличаться на некоторых системах. Например, в Ubuntu и других системах на базе Debian используйте следующее содержимое файла:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
    
  3. Создайте учётную запись MySQL с тем же именем пользователя, что и имя пользователя операционной системы, и определите её для аутентификации с использованием плагина PAM и службы PAM mysql-unix:

    CREATE USER 'antonio'@'localhost'
      IDENTIFIED WITH authentication_pam
      AS 'mysql-unix';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'antonio'@'localhost';
    

    Здесь строка аутентификации содержит только имя службы PAM, mysql-unix, которая аутентифицирует пароли Unix.

  4. Используйте командную строку mysql для подключения к серверу MySQL как antonio. Например:

    $> mysql --user=antonio --password --enable-cleartext-plugin
    Enter password: antonio_password
    

    Сервер должен разрешить подключение, и следующий запрос вернёт вывод, как показано:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+-------------------+--------------+
    | USER()            | CURRENT_USER()    | @@proxy_user |
    +-------------------+-------------------+--------------+
    | antonio@localhost | antonio@localhost | NULL         |
    +-------------------+-------------------+--------------+
    

    Это демонстрирует, что пользователь операционной системы antonio аутентифицирован для получения привилегий, предоставленных пользователю MySQL antonio, и что проксирование не происходило.

Примечание

Плагин аутентификации mysql_clear_password со стороны клиента оставляет пароль без изменений, поэтому клиентские программы отправляют его на сервер MySQL как открытый текст. Это позволяет передать пароль как есть в PAM. Открытый текст пароля необходим для использования библиотеки PAM на стороне сервера, но может представлять собой проблему безопасности в некоторых конфигурациях. Эти меры сводят к минимуму риск:

  • Чтобы уменьшить вероятность непреднамеренного использования плагина mysql_clear_password, клиенты MySQL должны явно включить его (например, с опцией --enable-cleartext-plugin). См. Раздел 6.4.1.6, «Аутентификация с открытым текстом плагинов со стороны клиента».

  • Чтобы избежать раскрытия пароля при включённом плагине mysql_clear_password, клиенты MySQL должны подключаться к серверу MySQL с помощью защищённого соединения. См. Раздел 6.3.1, «Настройка MySQL для использования защищённых соединений».

Аутентификация PAM LDAP без прокси-пользователей

Этот сценарий аутентификации использует PAM для проверки внешних пользователей, определенных в терминах имён пользователей операционной системы и паролей LDAP, без проксирования. Каждый такой внешний пользователь, которому разрешено подключение к MySQL Server, должен иметь соответствующую MySQL учётную запись, определённую для использования аутентификации PAM через LDAP.

Для использования плагина аутентификации PAM LDAP в MySQL должны быть выполнены следующие предварительные условия:

  • Сервер LDAP должен быть доступен для связи с PAM LDAP-службой.

  • Каждый пользователь LDAP, подлежащий аутентификации MySQL, должен присутствовать в каталоге, управляемом сервером LDAP.

Примечание

Другой способ использования LDAP для аутентификации пользователей MySQL — использование плагинов аутентификации, специфичных для LDAP. См. Раздел 6.4.1.9, «Плагин аутентификации LDAP».

Настройте MySQL для аутентификации PAM LDAP следующим образом:

  1. Убедитесь, что аутентификация Unix позволяет вход в операционную систему с именем пользователя antonio и паролем antonio_password.

  2. Настройте PAM для аутентификации подключений MySQL с использованием LDAP, создав файл службы PAM mysql-ldap с именем /etc/pam.d/mysql-ldap. Содержимое файла зависит от системы, поэтому проверьте существующие файлы, связанные с входами, в каталоге /etc/pam.d, чтобы увидеть, как они выглядят. В Linux файл mysql-ldap может выглядеть так:

    #%PAM-1.0
    auth        required    pam_ldap.so
    account     required    pam_ldap.so
    

    Если файлы объектов PAM имеют другой суффикс, чем .so в вашей системе, замените его правильным.

    Формат файла PAM может отличаться на некоторых системах.

  3. Создайте учётную запись MySQL с тем же именем пользователя, что и имя пользователя операционной системы, и определите её для аутентификации с использованием плагина PAM и службы PAM mysql-ldap:

    CREATE USER 'antonio'@'localhost'
      IDENTIFIED WITH authentication_pam
      AS 'mysql-ldap';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'antonio'@'localhost';
    

    Здесь строка аутентификации содержит только имя службы PAM, mysql-ldap, которая выполняет аутентификацию с использованием LDAP.

  4. Подключение к серверу выполняется так же, как описано в PAM Unix Password Authentication without Proxy Users.

END_OF_DOCUMENT_MARKER
Аутентификация PAM Unix паролей с прокси-пользователями и сопоставлением групп

Схема аутентификации, описанная здесь, использует проксирование и сопоставление групп PAM для сопоставления подключающихся пользователей MySQL, которые проходят аутентификацию с помощью PAM, с другими учетными записями MySQL, определяющими разные наборы привилегий. Пользователи подключаются не напрямую к учетным записям, определяющим привилегии. Вместо этого они подключаются через стандартную прокси-учетную запись, авторизованную с помощью PAM, так что все внешние пользователи сопоставляются с учетными записями MySQL, которые содержат привилегии. Любой пользователь, подключающийся с помощью прокси-учетной записи, сопоставляется с одной из этих учетных записей MySQL, привилегии которой определяют разрешенные операции с базой данных для внешнего пользователя.

В данном случае используется аутентификация паролей Unix. Чтобы использовать LDAP вместо этого, обратитесь к начальным шагам в PAM LDAP-аутентификации без прокси-пользователей.

Примечание

Традиционные пароли Unix проверяются с помощью файла /etc/shadow. Сведения о возможных проблемах, связанных с этим файлом, см. в PAM-аутентификации доступа к хранилищу паролей Unix.

  1. Убедитесь, что аутентификация Unix позволяет входить в операционную систему с именем пользователя antonio и паролем antonio_password.

  2. Убедитесь, что antonio является членом группы PAM root или users.

  3. Настройте PAM для аутентификации службы PAM mysql-unix через пользователей операционной системы, создав файл с именем /etc/pam.d/mysql-unix. Содержимое файла зависит от системы, поэтому проверьте существующие файлы, связанные с входами, в каталоге /etc/pam.d, чтобы увидеть их структуру. В Linux файл mysql-unix может выглядеть так:

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth
    

    Для macOS используйте login вместо password-auth.

    Формат файла PAM может отличаться в некоторых системах. Например, в Ubuntu и других системах на основе Debian используйте такое содержимое файла:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
    
  4. Создайте стандартного прокси-пользователя (''@''), который сопоставляет внешних пользователей PAM с проксированными учетными записями:

    CREATE USER ''@''
      IDENTIFIED WITH authentication_pam
      AS 'mysql-unix, root=developer, users=data_entry';
    

    Здесь строка аутентификации содержит имя службы PAM, mysql-unix, которая аутентифицирует пароли Unix. Строка аутентификации также сопоставляет внешних пользователей в группах PAM root и users с именами пользователей MySQL developer и data_entry соответственно.

    Список сопоставления групп PAM, следующий за именем службы PAM, требуется при настройке прокси-пользователей. В противном случае плагин не сможет определить, как выполнить сопоставление имен внешних пользователей с соответствующими именами проксированных пользователей MySQL.

    Примечание

    Если ваша установка MySQL имеет анонимных пользователей, они могут конфликтовать с прокси-пользователем по умолчанию. Дополнительную информацию об этой проблеме и способах ее решения см. в Разделе о конфликтах между прокси-пользователем по умолчанию и анонимными пользователями.

  5. Создайте проксированные учетные записи и предоставьте каждой из них необходимые привилегии:

    CREATE USER 'developer'@'localhost'
      IDENTIFIED WITH mysql_no_login;
    CREATE USER 'data_entry'@'localhost'
      IDENTIFIED WITH mysql_no_login;
    
    GRANT ALL PRIVILEGES
      ON mydevdb.*
      TO 'developer'@'localhost';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'data_entry'@'localhost';
    

    Проксированные учетные записи используют плагин аутентификации mysql_no_login, чтобы предотвратить подключение клиентов напрямую к серверу MySQL. Вместо этого ожидается, что пользователи, прошедшие аутентификацию с помощью PAM, будут подключаться к серверу как developer или data_entry, используя прокси, в зависимости от их группы PAM. (Предполагается, что плагин установлен. Инструкции см. в Разделе 6.4.1.10 «Плагин аутентификации без входа».) Альтернативные методы защиты проксированных учетных записей от прямого входа см. в Разделе о предотвращении прямого входа в проксированные учетные записи.

  6. Предоставьте прокси-учетной записи привилегию PROXY для каждой проксированной учетной записи:

    GRANT PROXY
      ON 'developer'@'localhost'
      TO ''@'';
    GRANT PROXY
      ON 'data_entry'@'localhost'
      TO ''@'';
    
  7. Используйте командную строку клиента mysql, чтобы подключиться к серверу MySQL как antonio.

    $> mysql --user=antonio --password --enable-cleartext-plugin
    Enter password: antonio_password
    

    Сервер аутентифицирует подключение, используя прокси-учетную запись по умолчанию ''@''. Результативные привилегии для antonio зависят от того, членами каких групп PAM является antonio. Если antonio является членом группы PAM root, плагин PAM сопоставляет root с именем пользователя MySQL developer и возвращает это имя серверу. Сервер проверяет, что ''@'' имеет привилегию PROXY для developer и разрешает подключение. Следующий запрос возвращает результат, как показано:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+---------------------+--------------+
    | USER()            | CURRENT_USER()      | @@proxy_user |
    +-------------------+---------------------+--------------+
    | antonio@localhost | developer@localhost | ''@''        |
    +-------------------+---------------------+--------------+
    

    Это демонстрирует, что пользователь операционной системы antonio аутентифицирован для получения привилегий, предоставленных пользователю MySQL developer, и что проксирование происходит через прокси-учетную запись по умолчанию.

    Если antonio не является членом группы PAM root, но является членом группы PAM users, происходит аналогичный процесс, но плагин сопоставляет членство в группе PAM user с именем пользователя MySQL data_entry и возвращает это имя серверу:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+----------------------+--------------+
    | USER()            | CURRENT_USER()       | @@proxy_user |
    +-------------------+----------------------+--------------+
    | antonio@localhost | data_entry@localhost | ''@''        |
    +-------------------+----------------------+--------------+
    

    Это демонстрирует, что пользователь операционной системы antonio аутентифицирован для получения привилегий пользователя MySQL data_entry, и что проксирование происходит через прокси-учетную запись по умолчанию.

Примечание

Клиентский плагин аутентификации mysql_clear_password оставляет пароль без изменений, поэтому клиентские программы отправляют его серверу MySQL как открытый текст. Это позволяет передавать пароль в PAM как есть. Открытый текст пароля необходим для использования серверной библиотеки PAM, но может представлять проблему безопасности в некоторых конфигурациях. Эти меры минимизируют риск:

  • Чтобы уменьшить вероятность случайного использования плагина mysql_clear_password, клиенты MySQL должны явно включить его (например, с помощью опции --enable-cleartext-plugin). См. Раздел 6.4.1.6 «Клиентская аутентификация с открытым текстом».

  • Чтобы избежать раскрытия паролей при включенном плагине mysql_clear_password, клиенты MySQL должны подключаться к серверу MySQL с использованием зашифрованного соединения. См. Раздел 6.3.1 «Настройка MySQL для использования зашифрованных соединений».

PAM-аутентификация доступа к хранилищу паролей Unix

В некоторых системах аутентификация Unix использует хранилище паролей, например /etc/shadow, файл, который обычно имеет ограниченные разрешения доступа. Это может привести к сбою аутентификации MySQL на основе PAM. К сожалению, реализация PAM не позволяет различать сообщение «пароль не удалось проверить» (например, из-за невозможности чтения /etc/shadow) и сообщение «пароль не соответствует». Если вы используете хранилище паролей Unix для аутентификации PAM, вы можете включить доступ к нему из MySQL, используя один из следующих методов:

  • Предполагая, что сервер MySQL запускается от учетной записи операционной системы mysql, поместите эту учетную запись в группу shadow, которая имеет доступ /etc/shadow:

    1. Создайте группу shadow в /etc/group.

    2. Добавьте пользователя операционной системы mysql в группу shadow в /etc/group.

    3. Назначьте /etc/group в группу shadow и включите разрешение на чтение для группы:

      chgrp shadow /etc/shadow
      chmod g+r /etc/shadow
      
    4. Перезапустите сервер MySQL.

  • Если вы используете модуль pam_unix и утилиту unix_chkpwd, включите доступ к хранилищу паролей следующим образом:

    chmod u-s /usr/sbin/unix_chkpwd
    setcap cap_dac_read_search+ep /usr/sbin/unix_chkpwd
    

    При необходимости скорректируйте путь к unix_chkpwd для вашей платформы.

Отладка аутентификации PAM

Плагин аутентификации PAM при инициализации проверяет, установлено ли значение среды AUTHENTICATION_PAM_LOG. В MySQL 5.7 и в MySQL NDB Cluster до NDB 7.5.33 и NDB 7.6.29 значение не имеет значения. Плагин позволяет регистрировать диагностические сообщения в стандартный вывод, включая пароли. Эти сообщения могут быть полезны для отладки проблем, связанных с PAM, возникающих при выполнении аутентификации плагином.

В MySQL NDB Cluster, начиная с версий 7.5.33 и 7.6.29, пароли не включаются, если вы установите AUTHENTICATION_PAM_LOG=1 (или какое-либо другое произвольное значение); вы можете включить протоколирование сообщений отладки, включая пароли, установив AUTHENTICATION_PAM_LOG=PAM_LOG_WITH_SECRET_INFO.

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

Другой метод отладки сбоев соединения и определения того, что происходит во время попыток подключения, заключается в настройке аутентификации PAM для разрешения всех подключений, а затем проверке системных журналов. Этот метод следует использовать только в временном режиме и не на сервере производства.

Настройте файл службы PAM с именем /etc/pam.d/mysql-any-password со следующим содержимым (формат может отличаться на некоторых системах):

#%PAM-1.0
auth        required    pam_permit.so
account     required    pam_permit.so

Создайте учетную запись, использующую плагин PAM и назовите службу PAM mysql-any-password:

CREATE USER 'testuser'@'localhost'
  IDENTIFIED WITH authentication_pam
  AS 'mysql-any-password';

Файл службы mysql-any-password заставляет любую попытку аутентификации возвращать true, даже для неправильных паролей. Если попытка аутентификации завершается неудачей, это означает, что проблема конфигурации находится на стороне MySQL. В противном случае проблема находится на стороне операционной системы/PAM. Чтобы увидеть, что происходит, проверьте системные журналы, такие как /var/log/secure, /var/log/audit.log, /var/log/syslog или /var/log/messages.

После определения проблемы удалите файл службы PAM mysql-any-password, чтобы отключить доступ с любым паролем.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/pam-pluggable-authentication.html

Spec-Zone.ru

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