Spec-Zone.ru › MySQL 9.2

8.4.1.4 Модуль аутентификации 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; обратите внимание, что Windows не поддерживает PAM.

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

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

Таблица 8.17 Имена плагинов и библиотек для аутентификации 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 см. Раздел 8.2.17, “Аутентификация плагинов”. Для информации о плагине mysql_clear_password см. Раздел 8.4.1.3, “Аутентификация плагинов Cleartext на стороне клиента”. Для информации о пользователях-прокси см. Раздел 8.2.19, “Пользователи-прокси”.

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

Этот раздел содержит обзор того, как 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, проксирование происходит, и пользователь-прокси принимает привилегии пользователя-прокси.

END_OF_DOCUMENT_MARKER
Установка плагина аутентификации 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.

Для проверки установки плагина, просмотрите таблицу Information Schema 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.3, “Аутентификация на стороне клиента с использованием открытого текста”.

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

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

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

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

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

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

Примечание

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

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

  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.3, «Аутентификация с открытым текстом плагинов на стороне клиента».

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

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

В некоторых системах для аутентификации 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-9.2-en/pam-pluggable-authentication.html

Spec-Zone.ru

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