Spec-Zone.ru › MySQL 8.4

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

Примечание

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

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

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

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

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

PAM-подключаемая аутентификация была протестирована на Linux и macOS; обратите внимание, что Windows не поддерживает PAM.

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

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

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

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

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

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

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

  • Удаление PAM-подключаемой аутентификации

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

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

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

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

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

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

Для получения общей информации о подключаемой аутентификации в MySQL см. Раздел 8.2.17, «Подключаемая аутентификация». Для получения информации о плагине mysql_clear_password см. Раздел 8.4.1.4, «Подключаемая аутентификация Cleartext на стороне клиента». Для получения информации о пользователях-прокси см. Раздел 8.2.19, «Пользователи-прокси».

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

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

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

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

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

  2. Сервер находит соответствующую учетную запись MySQL на основе имени внешнего пользователя и хоста, с которого подключается клиент. Плагин PAM использует информацию, переданную ему MySQL Server (например, имя пользователя, имя хоста, пароль и строку аутентификации). При определении учетной записи 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 на стороне сервера. Для получения общей информации об установке плагинов см. Раздел 7.6.1, «Установка и удаление плагинов».

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

Базовое имя файла библиотеки плагина — authentication_pam, и обычно оно компилируется с суффиксом .so.

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

[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 (см. Раздел 7.6.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 в разделе IDENTIFIED WITH оператора CREATE USER используйте имя authentication_pam. Например:

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'auth_string';

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

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

  • Для поддержки прокси PAM предоставляет способ, позволяющий модулю 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, отличного от внешнего, в зависимости от того, к каким группам 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 символами (см. Раздел 8.2.3, “Grant Tables”), что ограничивает аутентификацию 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, должен иметь соответствующую учетную запись MySQL, настроенную для использования аутентификации PAM через традиционный хранилище паролей Unix.

Примечание

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

  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). См. Раздел 8.4.1.4, «Подключаемая аутентификация в открытом тексте на стороне клиента».

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

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

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

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

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

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

Примечание

Другой способ использования LDAP для аутентификации пользователей MySQL — использование плагинов аутентификации, специфичных для LDAP. См. Раздел 8.4.1.7, «Подключаемая аутентификация 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 без прокси-пользователей.

Аутентификация паролей 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. (Предполагается, что плагин установлен. Инструкции см. в разделе 8.4.1.9, «Плагины аутентификации без входа».) Альтернативные методы защиты прокси-учетных записей от прямого использования см. в разделе о предотвращении прямого входа в прокси-учетные записи.

  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). См. раздел 8.4.1.4, «Клиентская аутентификация с открытым текстом».

  • Чтобы избежать раскрытия пароля при включенном плагине mysql_clear_password, клиенты MySQL должны подключаться к серверу MySQL с использованием защищенного соединения. См. раздел 8.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. Если да, плагин включает протоколирование диагностических сообщений в стандартный вывод. Эти сообщения могут быть полезны для отладки проблем, связанных с PAM, возникающих при выполнении аутентификации плагином.

Установка 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-8.4-en/pam-pluggable-authentication.html

Spec-Zone.ru

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