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
| Плагин или файл | Имя плагина или файла |
|---|---|
| Плагин на стороне сервера | authentication_pam |
| Плагин на стороне клиента | mysql_clear_password |
| Файл библиотеки | authentication_pam.so |
Плагин mysql_clear_password на стороне клиента, который взаимодействует с плагином PAM на стороне сервера, встроен в библиотеку клиента libmysqlclient и включен во все дистрибутивы, включая сообщественные. Включение плагина cleartext на стороне клиента во все дистрибутивы MySQL позволяет клиентам из любого дистрибутива подключаться к серверу, на котором загружен плагин 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.
-
Программа-клиент и сервер обмениваются информацией, при этом клиент отправляет серверу имя клиента (имя пользователя операционной системы по умолчанию) и пароль:
Имя пользователя клиента — это внешнее имя пользователя.
Для учетных записей, использующих плагин аутентификации PAM на стороне сервера, соответствующий плагин на стороне клиента —
mysql_clear_password. Этот плагин на стороне клиента не выполняет хеширование паролей, в результате чего клиент отправляет пароль на сервер в открытом виде.
-
Сервер находит соответствующую учетную запись MySQL на основе имени внешнего пользователя и хоста, с которого подключается клиент. Плагин PAM использует переданную ему MySQL Server информацию (такую как имя пользователя, имя хоста, пароль и строка аутентификации). При определении учетной записи MySQL, аутентифицирующейся с помощью PAM, строка аутентификации содержит:
Имя службы PAM, которое системный администратор может использовать для обозначения метода аутентификации для определенного приложения. Может быть несколько приложений, связанных с одним экземпляром сервера базы данных, поэтому выбор имени службы остается на усмотрение разработчика SQL-приложения.
Дополнительно, если используется проксирование, сопоставление групп PAM с именами пользователей MySQL.
-
Плагин использует службу PAM, указанную в строке аутентификации, для проверки учетных данных пользователя и возвращает
'Authentication succeeded, Username isилиuser_name''Authentication failed'. Пароль должен соответствовать хранилищу паролей, используемому службой PAM. Примеры:Для традиционных паролей Unix служба ищет пароли, хранящиеся в файле
/etc/shadow.Для LDAP служба ищет пароли, хранящиеся в каталоге LDAP.
Если проверка учетных данных завершается неудачно, сервер отказывается от подключения.
В противном случае строка аутентификации указывает, происходит ли проксирование. Если строка не содержит сопоставления групп PAM, проксирование не происходит. В этом случае имя пользователя MySQL совпадает с именем внешнего пользователя.
-
В противном случае проксирование указывается на основе сопоставления групп 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.
Для проверки установки плагина, просмотрите таблицу 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.
Убедитесь, что аутентификация Unix позволяет вход в систему с именем пользователя
antonioи паролемantonio_password.-
Настройте 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
-
Создайте учетную запись 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. -
Используйте командную строку mysql для подключения к серверу MySQL как
antonio. Например:$>
mysql --user=antonio --password --enable-cleartext-pluginEnter password:antonio_passwordСервер должен разрешить подключение, и следующая команда возвращает вывод, как показано:
mysql>
SELECT USER(), CURRENT_USER(), @@proxy_user;+-------------------+-------------------+--------------+ | USER() | CURRENT_USER() | @@proxy_user | +-------------------+-------------------+--------------+ | antonio@localhost | antonio@localhost | NULL | +-------------------+-------------------+--------------+Это демонстрирует, что пользователь операционной системы
antonioаутентифицирован и имеет привилегии, предоставленные пользователю MySQLantonio, и что проксирование не произошло.
Плагин аутентификации 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 следующим образом:
Убедитесь, что аутентификация Unix позволяет вход в систему с именем пользователя
antonioи паролемantonio_password.-
Настройте 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 может отличаться на некоторых системах.
-
Создайте учетную запись 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. Подключение к серверу выполняется так же, как описано в Аутентификация PAM для Unix-паролей без прокси-пользователей.
Аутентификация паролей PAM Unix с прокси-пользователями и сопоставлением групп
Схема аутентификации, описанная здесь, использует проксирование и сопоставление групп PAM для сопоставления подключаемых пользователей MySQL, которые аутентифицируются с помощью PAM, с другими учетными записями MySQL, которые определяют разные наборы привилегий. Пользователи не подключаются напрямую через учетные записи, которые определяют привилегии. Вместо этого они подключаются через учетную запись-прокси по умолчанию, аутентифицированную с помощью PAM, таким образом, все внешние пользователи сопоставляются с учетными записями MySQL, которые хранят привилегии. Любой пользователь, который подключается с помощью учетной записи-прокси, сопоставляется с одной из этих учетных записей MySQL, привилегии которой определяют разрешенные операции с базой данных для внешнего пользователя.
В данном процедуре используется аутентификация паролей Unix. Чтобы использовать LDAP вместо этого, см. начальные шаги в Аутентификации PAM LDAP без прокси-пользователей.
Традиционные пароли Unix проверяются с помощью файла /etc/shadow. Сведения о возможных проблемах, связанных с этим файлом, см. в Доступе к хранилищу паролей Unix с помощью аутентификации PAM.
Убедитесь, что аутентификация Unix позволяет пользователям операционной системы с именем пользователя
antonioи паролемantonio_password.Убедитесь, что
antonioявляется членом группы PAMrootилиusers.-
Настройте 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
-
Создайте учетную запись-прокси по умолчанию (
''@''), которая сопоставляет внешних пользователей PAM с прокси-учетными записями:CREATE USER ''@'' IDENTIFIED WITH authentication_pam AS 'mysql-unix, root=developer, users=data_entry';
Здесь строка аутентификации содержит имя службы PAM,
mysql-unix, которое аутентифицирует пароли Unix. Строка аутентификации также сопоставляет внешних пользователей в группах PAMrootиusersс именами пользователей MySQLdeveloperиdata_entryсоответственно.Список сопоставления групп PAM, следующий за именем службы PAM, требуется при настройке прокси-пользователей. В противном случае плагин не может определить, как выполнить сопоставление имен внешних пользователей с соответствующими именами прокси-пользователей MySQL.
ПримечаниеЕсли в вашей установке MySQL есть анонимные пользователи, они могут конфликтовать с учетной записью-прокси по умолчанию. Дополнительную информацию об этой проблеме и способах ее решения см. в Конфликтах между учетной записью-прокси по умолчанию и анонимными пользователями.
-
Создайте прокси-учетные записи и предоставьте каждой из них необходимые привилегии:
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, «Аутентификация без входа с помощью плагинов».) Для альтернативных методов защиты прокси-учетных записей от прямого использования см. Предотвращение прямого входа в прокси-учетные записи. -
Предоставьте учетной записи-прокси привилегию
PROXYдля каждой прокси-учетной записи:GRANT PROXY ON 'developer'@'localhost' TO ''@''; GRANT PROXY ON 'data_entry'@'localhost' TO ''@'';
-
Используйте командную строку mysql, чтобы подключиться к серверу MySQL как
antonio.$>
mysql --user=antonio --password --enable-cleartext-pluginEnter password:antonio_passwordСервер аутентифицирует подключение, используя учетную запись-прокси по умолчанию
''@''. Результирующие привилегии дляantonioзависят от групп PAM, участником которых являетсяantonio. Еслиantonioявляется членом группы PAMroot, плагин PAM сопоставитrootс именем пользователя MySQLdeveloperи вернёт это имя серверу. Сервер проверит, имеет ли''@''привилегиюPROXYдляdeveloperи разрешит подключение. Следующий запрос возвращает вывод, как показано:mysql>
SELECT USER(), CURRENT_USER(), @@proxy_user;+-------------------+---------------------+--------------+ | USER() | CURRENT_USER() | @@proxy_user | +-------------------+---------------------+--------------+ | antonio@localhost | developer@localhost | ''@'' | +-------------------+---------------------+--------------+Это демонстрирует, что пользователь операционной системы
antonioаутентифицирован для получения привилегий, предоставленных пользователю MySQLdeveloper, и что проксирование происходит через учетную запись-прокси по умолчанию.Если
antonioне является членом группы PAMroot, но является членом группы PAMusers, происходит аналогичный процесс, но плагин сопоставляет членство в группе PAMuserс именем пользователя MySQLdata_entryи возвращает это имя серверу:mysql>
SELECT USER(), CURRENT_USER(), @@proxy_user;+-------------------+----------------------+--------------+ | USER() | CURRENT_USER() | @@proxy_user | +-------------------+----------------------+--------------+ | antonio@localhost | data_entry@localhost | ''@'' | +-------------------+----------------------+--------------+Это демонстрирует, что пользователь операционной системы
antonioаутентифицирован для получения привилегий пользователя MySQLdata_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:Создайте группу
shadowв/etc/group.Добавьте пользователя операционной системы
mysqlв группуshadowв/etc/group.-
Назначьте
/etc/groupв группуshadowи включите разрешение на чтение группы:chgrp shadow /etc/shadow chmod g+r /etc/shadow
Перезапустите сервер 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.