Spec-Zone .ru
спецификации, руководства, описания, API

6.3.12. Основанный на SQL MySQL Account Activity Auditing

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

Учетные записи MySQL соответствуют строкам в mysql.user таблица. Когда клиент соединяется успешно, сервер аутентифицирует клиент к определенной строке в этой таблице. User и Host значения столбцов в этой строке однозначно определяют учетную запись и соответствуют 'user_name'@'host_name' формат, в котором имена учетной записи пишутся в SQL-операторах.

Учетная запись, используемая, чтобы аутентифицировать клиент, определяет, который дает клиенту полномочия, имеет. Обычно, CURRENT_USER() функция может быть вызвана, чтобы определить, какая учетная запись это для клиентского пользователя. Его значение создается из User и Host столбцы user строка таблицы для учетной записи.

Однако, есть обстоятельства под который CURRENT_USER() значение соответствует не клиентскому пользователю, но различной учетной записи. Это происходит в контекстах, когда проверка полномочия не базируется учетная запись клиента:

В тех контекстах проверка полномочия делается против DEFINER учетная запись и CURRENT_USER() ссылается на ту учетную запись, не на учетную запись за клиент, который вызвал сохраненную подпрограмму или представление или кто заставил триггер активироваться. Чтобы определить пользователя вызова, можно вызвать USER() функция, которая возвращает значение, указывающее на фактическое имя пользователя, обеспеченное клиентом и узлом от который соединенный клиент. Однако, это значение не обязательно соответствует непосредственно учетной записи в user таблица, потому что USER() значение никогда не содержит подстановочные знаки, тогда как учетная запись оценивает (как возвращено CURRENT_USER()) может содержать подстановочные знаки имени пользователя и имени хоста.

Например, пустое имя пользователя соответствует любому пользователю, таким образом, учетная запись ''@'localhost' позволяет клиентам соединиться как анонимный пользователь от локального узла с любым именем пользователя. Если этот случай, если клиент соединяется как user1 от локального узла, USER() и CURRENT_USER() возвратите различные значения:

mysql> SELECT USER(), CURRENT_USER();+-----------------+----------------+| USER()          | CURRENT_USER() |+-----------------+----------------+| user1@localhost | @localhost     |+-----------------+----------------+

Часть имени хоста учетной записи может содержать подстановочные знаки, также. Если имя хоста содержит a '%' или '_' символ образца или нотация сетевой маски использования, учетная запись может использоваться для клиентов, соединяющихся от многократных узлов и CURRENT_USER() значение не будет указывать который. Например, учетная запись 'user2'@'%.example.com' может использоваться user2 соединяться от любого узла в example.com домен. Если user2 соединяется от remote.example.com, USER() и CURRENT_USER() возвратите различные значения:

mysql> SELECT USER(), CURRENT_USER();+--------------------------+---------------------+| USER()                   | CURRENT_USER()      |+--------------------------+---------------------+| user2@remote.example.com | user2@%.example.com |+--------------------------+---------------------+

Если приложение должно вызвать USER() для пользователя, контролирующего (например, если это делает контроль изнутри триггеров), но, должен также быть в состоянии связаться USER() значение с учетной записью в user таблица, необходимо избежать учетных записей, которые содержат подстановочные знаки в User или Host столбец. Определенно, не разрешать User чтобы быть пустыми (который создает анонимную учетную запись пользователя), и не разрешают символы образца или нотацию сетевой маски в Host значения. У всех учетных записей должно быть непустое User значение и литерал Host значение.

Относительно предыдущих примеров, ''@'localhost' и 'user2'@'%.example.com' учетные записи должны быть изменены, чтобы не использовать подстановочные знаки:

RENAME USER ''@'localhost' TO 'user1'@'localhost';RENAME USER 'user2'@'%.example.com' TO 'user2'@'remote.example.com';

Если user2 должен быть в состоянии соединиться от нескольких узлов в example.com домен, должно быть отдельное, учитывают каждый узел.

Чтобы извлечь имя пользователя или имя хоста расстаются с a CURRENT_USER() или USER() значение, используйте SUBSTRING() функция:

mysql> SELECT
        SUBSTRING_INDEX(CURRENT_USER(),'@',1);+---------------------------------------+| SUBSTRING_INDEX(CURRENT_USER(),'@',1) |+---------------------------------------+| user1                                 |+---------------------------------------+mysql> SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',-1);+----------------------------------------+| SUBSTRING_INDEX(CURRENT_USER(),'@',-1) |+----------------------------------------+| localhost                              |+----------------------------------------+