Spec-Zone.ru › MySQL 8.4

8.4.5.4 Форматы файлов журналов аудита

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

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

  • Формат XML нового стиля (audit_log_format=NEW): Формат XML, который имеет лучшую совместимость с Oracle Audit Vault, чем формат XML старого стиля. MySQL 8.4 по умолчанию использует формат XML нового стиля.

  • Формат XML старого стиля (audit_log_format=OLD): Исходный формат журнала аудита, используемый по умолчанию в более старых версиях MySQL.

  • Формат JSON (audit_log_format=JSON): Записывает журнал аудита в виде JSON-массива. Только этот формат поддерживает необязательные статистические данные по времени и размеру запроса.

По умолчанию содержимое файла журнала аудита записывается в формате XML нового стиля без сжатия или шифрования.

Если вы измените audit_log_format, рекомендуется также изменить audit_log_file. Например, если вы установите audit_log_format на JSON, установите audit_log_file на audit.json. В противном случае новые файлы журналов будут иметь другой формат, чем старые файлы, но все они будут иметь одинаковое базовое имя без каких-либо указаний на то, когда изменился формат.

  • Формат файла журнала аудита XML нового стиля

  • Формат файла журнала аудита XML старого стиля

  • Формат файла журнала аудита JSON

Формат файла журнала аудита XML нового стиля

Вот пример файла журнала в формате XML нового стиля (audit_log_format=NEW), слегка отформатированный для лучшей читаемости:

<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:06:33 UTC</TIMESTAMP>
  <RECORD_ID>1_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Audit</NAME>
  <SERVER_ID>1</SERVER_ID>
  <VERSION>1</VERSION>
  <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
    --socket=/usr/local/mysql/mysql.sock
    --port=3306</STARTUP_OPTIONS>
  <OS_VERSION>i686-Linux</OS_VERSION>
  <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
 </AUDIT_RECORD>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
  <RECORD_ID>2_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Connect</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
  <CONNECTION_ATTRIBUTES>
   <ATTRIBUTE>
    <NAME>_pid</NAME>
    <VALUE>42794</VALUE>
   </ATTRIBUTE>
   ...
   <ATTRIBUTE>
    <NAME>program_name</NAME>
    <VALUE>mysqladmin</VALUE>
   </ATTRIBUTE>
  </CONNECTION_ATTRIBUTES>
  <PRIV_USER>root</PRIV_USER>
  <PROXY_USER/>
  <DB>test</DB>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:38 UTC</TIMESTAMP>
  <RECORD_ID>6_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Query</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root[root] @ localhost [127.0.0.1]</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>drop_table</COMMAND_CLASS>
  <SQLTEXT>DROP TABLE IF EXISTS t</SQLTEXT>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:39 UTC</TIMESTAMP>
  <RECORD_ID>8_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Quit</NAME>
  <CONNECTION_ID>5</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
 </AUDIT_RECORD>

...

 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:43 UTC</TIMESTAMP>
  <RECORD_ID>11_2019-10-03T14:06:33</RECORD_ID>
  <NAME>Quit</NAME>
  <CONNECTION_ID>6</CONNECTION_ID>
  <STATUS>0</STATUS>
  <STATUS_CODE>0</STATUS_CODE>
  <USER>root</USER>
  <OS_LOGIN/>
  <HOST>localhost</HOST>
  <IP>127.0.0.1</IP>
  <COMMAND_CLASS>connect</COMMAND_CLASS>
  <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
 </AUDIT_RECORD>
 <AUDIT_RECORD>
  <TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
  <RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
  <NAME>NoAudit</NAME>
  <SERVER_ID>1</SERVER_ID>
 </AUDIT_RECORD>
</AUDIT>

Файл журнала аудита записывается в формате XML, используя кодировку UTF-8 (до 4 байтов на символ). Корневой элемент — <AUDIT>. Корневой элемент содержит <AUDIT_RECORD> элементы, каждый из которых предоставляет информацию об аудируемом событии. Когда плагин журнала аудита начинает запись нового файла журнала, он записывает объявление XML и открывающий <AUDIT> корневой элемент. Когда плагин закрывает файл журнала, он записывает закрывающий </AUDIT> корневой элемент. Закрывающего тега нет, пока файл открыт.

Элементы внутри <AUDIT_RECORD> элементов имеют следующие характеристики:

  • Некоторые элементы присутствуют в каждом <AUDIT_RECORD> элементе. Другие являются необязательными и могут появляться в зависимости от типа записи аудита.

  • Порядок элементов внутри <AUDIT_RECORD> элемента не гарантируется.

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

  • Символы <, >, " и & закодированы как &lt;, &gt;, &quot; и &amp; соответственно. Байты NULL (U+00) закодированы как символ ?.

  • Символы, не являющиеся допустимыми символами XML, кодируются с помощью числовых кодовых ссылок. Допустимые XML-символы:

    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
    

Следующие элементы являются обязательными в каждом <AUDIT_RECORD> элементе:

  • <NAME>

    Строка, представляющая тип инструкции, которая сгенерировала событие аудита, например, команда, полученная сервером от клиента.

    Пример:

    <NAME>Query</NAME>
    

    Некоторые общие значения <NAME>:

    Audit    When auditing starts, which may be server startup time
    Connect  When a client connects, also known as logging in
    Query    An SQL statement (executed directly)
    Prepare  Preparation of an SQL statement; usually followed by Execute
    Execute  Execution of an SQL statement; usually follows Prepare
    Shutdown Server shutdown
    Quit     When a client disconnects
    NoAudit  Auditing has been turned off
    

    Возможные значения: Audit, Binlog Dump, Change user, Close stmt, Connect Out, Connect, Create DB, Daemon, Debug, Delayed insert, Drop DB, Execute, Fetch, Field List, Init DB, Kill, Long Data, NoAudit, Ping, Prepare, Processlist, Query, Quit, Refresh, Register Slave, Reset stmt, Set option, Shutdown, Sleep, Statistics, Table Dump, TableDelete, TableInsert, TableRead, TableUpdate, Time.

    Многие из этих значений соответствуют значениям команды COM_xxx, перечисленным в заголовке файла my_command.h. Например, Create DB и Change user соответствуют COM_CREATE_DB и COM_CHANGE_USER соответственно.

    События, имеющие значения <NAME> в виде TableXXX, сопровождают события Query. Например, следующее утверждение генерирует одно событие Query, два события TableRead и одно событие TableInsert:

    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
    

    Каждое событие TableXXX содержит элементы <TABLE> и <DB> для идентификации таблицы, к которой относится событие, и базы данных, содержащей таблицу.

  • <RECORD_ID>

    Уникальный идентификатор записи аудита. Значение состоит из порядкового номера и метки времени в формате SEQ_TIMESTAMP. Когда плагин журнала аудита открывает файл журнала аудита, он инициализирует порядковый номер размером файла журнала аудита, а затем увеличивает его на 1 для каждой записанной записи. Метка времени — это значение UTC в формате YYYY-MM-DDThh:mm:ss, указывающее дату и время открытия файла плагином журнала аудита.

    Пример:

    <RECORD_ID>12_2019-10-03T14:06:33</RECORD_ID>
    
  • <TIMESTAMP>

    Строка, представляющая значение UTC в формате YYYY-MM-DDThh:mm:ss UTC, указывающая дату и время генерации события аудита. Например, событие, соответствующее выполнению SQL-запроса, полученного от клиента, имеет значение <TIMESTAMP>, которое появляется после завершения запроса, а не при получении.

    Пример:

    <TIMESTAMP>2019-10-03T14:09:45 UTC</TIMESTAMP>
    

Следующие элементы являются необязательными в <AUDIT_RECORD> элементах. Многие из них встречаются только со специфическими значениями элемента <NAME>.

  • <COMMAND_CLASS>

    Строка, которая указывает тип выполненного действия.

    Пример:

    <COMMAND_CLASS>drop_table</COMMAND_CLASS>
    

    Значения соответствуют счётчикам команд statement/sql/xxx. Например, xxx соответствует drop_table и select для команд DROP TABLE и SELECT соответственно. Следующая команда отображает возможные имена:

    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
    
  • <CONNECTION_ATTRIBUTES>

    События со значением <COMMAND_CLASS> равным connect могут содержать элемент <CONNECTION_ATTRIBUTES> для отображения атрибутов подключения, переданных клиентом во время подключения. (Для получения информации об этих атрибутах, которые также доступны в таблицах Performance Schema, см. Раздел 29.12.9, «Таблицы атрибутов подключения Performance Schema».)

    Элемент <CONNECTION_ATTRIBUTES> содержит по одному элементу <ATTRIBUTE> на каждый атрибут, каждый из которых содержит элементы <NAME> и <VALUE> для обозначения имени и значения атрибута соответственно.

    Пример:

    <CONNECTION_ATTRIBUTES>
     <ATTRIBUTE>
      <NAME>_pid</NAME>
      <VALUE>42794</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_os</NAME>
      <VALUE>macos0.14</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_platform</NAME>
      <VALUE>x86_64</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_client_version</NAME>
      <VALUE>8.4.0</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>_client_name</NAME>
      <VALUE>libmysql</VALUE>
     </ATTRIBUTE>
     <ATTRIBUTE>
      <NAME>program_name</NAME>
      <VALUE>mysqladmin</VALUE>
     </ATTRIBUTE>
    </CONNECTION_ATTRIBUTES>
    

    Если атрибуты подключения отсутствуют в событии, они не регистрируются, и элемент <CONNECTION_ATTRIBUTES> не появляется. Это может произойти, если попытка подключения не удалась, клиент не передал атрибуты или подключение произошло внутренне, например, во время запуска сервера или при инициализации плагином.

  • <CONNECTION_ID>

    Беззнаковое целое число, представляющее идентификатор подключения клиента. Это совпадает со значением, возвращаемым функцией CONNECTION_ID() внутри сессии.

    Пример:

    <CONNECTION_ID>127</CONNECTION_ID>
    
  • <CONNECTION_TYPE>

    Состояние безопасности подключения к серверу. Разрешённые значения: TCP/IP (TCP/IP-соединение установлено без шифрования), SSL/TLS (TCP/IP-соединение установлено с шифрованием), Socket (соединение через Unix-сокет), Named Pipe (соединение через именованную Windows-пайп), и Shared Memory (соединение через общую память Windows).

    Пример:

    <CONNECTION_TYPE>SSL/TLS</CONNECTION_TYPE>
    
  • <DB>

    Строка, представляющая имя базы данных.

    Пример:

    <DB>test</DB>
    

    Для событий подключения этот элемент указывает базу данных по умолчанию; элемент пустой, если базы данных по умолчанию нет. Для событий доступа к таблицам элемент указывает базу данных, к которой принадлежит доступная таблица.

  • <HOST>

    Строка, представляющая имя хоста клиента.

    Пример:

    <HOST>localhost</HOST>
    
  • <IP>

    Строка, представляющая IP-адрес клиента.

    Пример:

    <IP>127.0.0.1</IP>
    
  • <MYSQL_VERSION>

    Строка, представляющая версию сервера MySQL. Это то же самое, что и значение функции VERSION() или системной переменной version.

    Пример:

    <MYSQL_VERSION>5.7.21-log</MYSQL_VERSION>
    
  • <OS_LOGIN>

    Строка, представляющая имя внешнего пользователя, используемого во время процесса аутентификации, заданное используемым плагином для аутентификации клиента. При использовании родной (встроенной) аутентификации MySQL или если плагин не установил значение, этот элемент пустой. Значение совпадает со значением системной переменной external_user (см. Раздел 8.2.19, «Пользователи-прокси»).

    Пример:

    <OS_LOGIN>jeffrey</OS_LOGIN>
    
  • <OS_VERSION>

    Строка, представляющая операционную систему, на которой был построен или работает сервер.

    Пример:

    <OS_VERSION>x86_64-Linux</OS_VERSION>
    
  • <PRIV_USER>

    Строка, представляющая имя пользователя, под которым сервер аутентифицировал клиента. Это имя пользователя, используемое сервером для проверки привилегий, и может отличаться от значения <USER>.

    Пример:

    <PRIV_USER>jeffrey</PRIV_USER>
    
  • <PROXY_USER>

    Строка, представляющая пользователя-прокси (см. Раздел 8.2.19, «Пользователи-прокси»). Значение пустое, если использование прокси-пользователей не активна.

    Пример:

    <PROXY_USER>developer</PROXY_USER>
    
  • <SERVER_ID>

    Беззнаковое целое число, представляющее идентификатор сервера. Это совпадает со значением системной переменной server_id.

    Пример:

    <SERVER_ID>1</SERVER_ID>
    
  • <SQLTEXT>

    Строка, представляющая текст SQL-команды. Значение может быть пустым. Длинные значения могут быть усечены. Строка, как и сам файл журнала аудита, записывается с использованием UTF-8 (до 4 байтов на символ), поэтому значение может быть результатом преобразования. Например, исходная команда могла быть получена от клиента в виде строки SJIS.

    Пример:

    <SQLTEXT>DELETE FROM t1</SQLTEXT>
    
  • <STARTUP_OPTIONS>

    Строка, представляющая параметры, заданные в командной строке или в файлах параметров при запуске сервера MySQL. Первый параметр — путь к исполняемому файлу сервера.

    Пример:

    <STARTUP_OPTIONS>/usr/local/mysql/bin/mysqld
      --port=3306 --log_output=FILE</STARTUP_OPTIONS>
    
  • <STATUS>

    Беззнаковое целое число, представляющее состояние команды: 0 для успеха, отличное от нуля, если произошла ошибка. Это совпадает со значением функции C API. См. описание <STATUS_CODE> для информации о различиях со значением <STATUS>.

    Журнал аудита не содержит значение SQLSTATE или сообщение об ошибке. Чтобы увидеть соответствия между кодами ошибок, значениями SQLSTATE и сообщениями, см. .

    Предупреждения не регистрируются.

    Пример:

    <STATUS>1051</STATUS>
    
  • <STATUS_CODE>

    Беззнаковое целое число, представляющее состояние команды: 0 для успеха, 1, если произошла ошибка.

    Значение STATUS_CODE отличается от значения STATUS: STATUS_CODE равно 0 для успеха и 1 для ошибки, что совместимо с потребителем EZ_collector для Audit Vault. STATUS является значением функции C API. Это 0 для успеха и отличное от нуля для ошибки, и, следовательно, не обязательно 1 для ошибки.

    Пример:

    <STATUS_CODE>0</STATUS_CODE>
    
  • <TABLE>

    Строка, представляющая имя таблицы.

    Пример:

    <TABLE>t3</TABLE>
    
  • <USER>

    Строка, представляющая имя пользователя, отправленное клиентом. Это может отличаться от значения <PRIV_USER>.

    Пример:

    <USER>root[root] @ localhost [127.0.0.1]</USER>
    
  • <VERSION>

    Беззнаковое целое число, представляющее версию формата файла журнала аудита.

    Пример:

    <VERSION>1</VERSION>
    
Формат файла журнала аудита XML старого стиля

Вот пример файла журнала в формате XML старого стиля (audit_log_format=OLD), слегка переформатированный для удобства чтения:

<?xml version="1.0" encoding="utf-8"?>
<AUDIT>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:00 UTC"
    RECORD_ID="1_2019-10-03T14:25:00"
    NAME="Audit"
    SERVER_ID="1"
    VERSION="1"
    STARTUP_OPTIONS="--port=3306"
    OS_VERSION="i686-Linux"
    MYSQL_VERSION="5.7.21-log"/>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="2_2019-10-03T14:25:00"
    NAME="Connect"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="connect"
    CONNECTION_TYPE="SSL/TLS"
    PRIV_USER="root"
    PROXY_USER=""
    DB="test"/>

...

  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="6_2019-10-03T14:25:00"
    NAME="Query"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root[root] @ localhost [127.0.0.1]"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="drop_table"
    SQLTEXT="DROP TABLE IF EXISTS t"/>

...

  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:24 UTC"
    RECORD_ID="8_2019-10-03T14:25:00"
    NAME="Quit"
    CONNECTION_ID="4"
    STATUS="0"
    STATUS_CODE="0"
    USER="root"
    OS_LOGIN=""
    HOST="localhost"
    IP="127.0.0.1"
    COMMAND_CLASS="connect"
    CONNECTION_TYPE="SSL/TLS"/>
  <AUDIT_RECORD
    TIMESTAMP="2019-10-03T14:25:32 UTC"
    RECORD_ID="12_2019-10-03T14:25:00"
    NAME="NoAudit"
    SERVER_ID="1"/>
</AUDIT>

Файл журнала аудита записывается в формате XML с использованием кодировки UTF-8 (до 4 байтов на символ). Корневой элемент — <AUDIT>. Корневой элемент содержит элементы <AUDIT_RECORD>, каждый из которых предоставляет информацию о событии аудита. Когда плагин журнала аудита начинает запись нового файла журнала, он записывает объявление XML и открывающий тег корневого элемента <AUDIT>. Когда плагин закрывает файл журнала, он записывает закрывающий тег корневого элемента </AUDIT>. Закрывающего тега нет, пока файл открыт.

Атрибуты элементов <AUDIT_RECORD> имеют следующие характеристики:

  • Некоторые атрибуты присутствуют в каждом элементе <AUDIT_RECORD>. Другие являются необязательными и могут появляться в зависимости от типа записи аудита.

  • Порядок атрибутов внутри элемента <AUDIT_RECORD> не гарантируется.

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

  • Символы <, >, " и & кодируются как &lt;, &gt;, &quot; и &amp; соответственно. Байты NUL (U+00) кодируются как символ ?.

  • Символы, не являющиеся допустимыми символами XML, кодируются с помощью числовых ссылок на символы. Допустимые символы XML:

    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
    

Следующие атрибуты являются обязательными в каждом элементе <AUDIT_RECORD>:

  • NAME

    Строка, представляющая тип инструкции, которая сгенерировала событие аудита, например, команду, полученную сервером от клиента.

    Пример: NAME="Query"

    Некоторые распространенные значения NAME:

    Audit    When auditing starts, which may be server startup time
    Connect  When a client connects, also known as logging in
    Query    An SQL statement (executed directly)
    Prepare  Preparation of an SQL statement; usually followed by Execute
    Execute  Execution of an SQL statement; usually follows Prepare
    Shutdown Server shutdown
    Quit     When a client disconnects
    NoAudit  Auditing has been turned off
    

    Возможные значения: Audit, Binlog Dump, Change user, Close stmt, Connect Out, Connect, Create DB, Daemon, Debug, Delayed insert, Drop DB, Execute, Fetch, Field List, Init DB, Kill, Long Data, NoAudit, Ping, Prepare, Processlist, Query, Quit, Refresh, Register Slave, Reset stmt, Set option, Shutdown, Sleep, Statistics, Table Dump, TableDelete, TableInsert, TableRead, TableUpdate, Time.

    Многие из этих значений соответствуют значениям команды COM_xxx, перечисленным в заголовочном файле my_command.h. Например, "Create DB" и "Change user" соответствуют COM_CREATE_DB и COM_CHANGE_USER соответственно.

    События, имеющие значения NAME, равные TableXXX, сопровождаются событиями Query. Например, следующее утверждение генерирует одно событие Query, два события TableRead и одно событие TableInsert:

    INSERT INTO t3 SELECT t1.* FROM t1 JOIN t2;
    

    Каждое событие TableXXX имеет атрибуты TABLE и DB для идентификации таблицы, к которой относится событие, и базы данных, содержащей таблицу.

    События Connect для формата журнала аудита XML старого стиля не включают атрибуты подключения.

  • RECORD_ID

    Уникальный идентификатор записи аудита. Значение состоит из порядкового номера и метки времени в формате SEQ_TIMESTAMP. Когда плагин журнала аудита открывает файл журнала аудита, он инициализирует порядковый номер размером файла журнала аудита, затем увеличивает порядковый номер на 1 для каждой записанной записи. Метка времени — это значение UTC в формате YYYY-MM-DDThh:mm:ss, указывающее дату и время открытия файла плагином журнала аудита.

    Пример: RECORD_ID="12_2019-10-03T14:25:00"

  • TIMESTAMP

    Строка, представляющая значение UTC в формате YYYY-MM-DDThh:mm:ss UTC, указывающее дату и время генерации события аудита. Например, событие, соответствующее выполнению SQL-запроса, полученного от клиента, имеет значение TIMESTAMP, которое происходит после завершения запроса, а не при его получении.

    Пример: TIMESTAMP="2019-10-03T14:25:32 UTC"

Следующие атрибуты являются необязательными в элементах <AUDIT_RECORD>. Многие из них встречаются только для элементов со специфическими значениями атрибута NAME.

  • COMMAND_CLASS

    Строка, указывающая тип выполненного действия.

    Пример: COMMAND_CLASS="drop_table"

    Значения соответствуют счётчикам команд statement/sql/xxx. Например, xxx соответствует drop_table и select для операторов DROP TABLE и SELECT соответственно. Следующее выражение отображает возможные имена:

    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
    
  • CONNECTION_ID

    Беззнаковое целое число, представляющее идентификатор подключения клиента. Это то же значение, что и возвращаемое функцией CONNECTION_ID() в сессии.

    Пример: CONNECTION_ID="127"

  • CONNECTION_TYPE

    Состояние безопасности подключения к серверу. Разрешённые значения — TCP/IP (TCP/IP-соединение установлено без шифрования), SSL/TLS (TCP/IP-соединение установлено с шифрованием), Socket (соединение через Unix-сокет), Named Pipe (соединение через именованную Windows-трубу) и Shared Memory (соединение через разделяемую память Windows).

    Пример: CONNECTION_TYPE="SSL/TLS"

  • DB

    Строка, представляющая имя базы данных.

    Пример: DB="test"

    Для событий подключения это атрибут указывает базу данных по умолчанию; атрибут пуст, если база данных по умолчанию отсутствует. Для событий доступа к таблицам атрибут указывает базу данных, к которой принадлежит таблица.

  • HOST

    Строка, представляющая имя хоста клиента.

    Пример: HOST="localhost"

  • IP

    Строка, представляющая IP-адрес клиента.

    Пример: IP="127.0.0.1"

  • MYSQL_VERSION

    Строка, представляющая версию сервера MySQL. Это то же значение, что и в функции VERSION() или системной переменной version.

    Пример: MYSQL_VERSION="5.7.21-log"

  • OS_LOGIN

    Строка, представляющая имя внешнего пользователя, используемого во время процесса аутентификации, задаваемое используемым плагином для аутентификации клиента. При использовании собственной (встроенной) аутентификации MySQL или если значение не установлено плагином, этот атрибут пуст. Значение совпадает со значением системной переменной external_user (см. Раздел 8.2.19, «Proxy Users»).

    Пример: OS_LOGIN="jeffrey"

  • OS_VERSION

    Строка, представляющая операционную систему, на которой сервер был собран или на которой он работает.

    Пример: OS_VERSION="x86_64-Linux"

  • PRIV_USER

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

    Пример: PRIV_USER="jeffrey"

  • PROXY_USER

    Строка, представляющая пользователя-прокси (см. Раздел 8.2.19, «Proxy Users»). Значение пустое, если проксирование пользователя не используется.

    Пример: PROXY_USER="developer"

  • SERVER_ID

    Беззнаковое целое число, представляющее идентификатор сервера. Это совпадает со значением системной переменной server_id.

    Пример: SERVER_ID="1"

  • SQLTEXT

    Строка, представляющая текст оператора SQL. Значение может быть пустым. Длинные значения могут быть усечены. Строка, подобно самому файлу журнала аудита, записана с использованием кодировки UTF-8 (до 4 байт на символ), поэтому значение может быть результатом преобразования. Например, исходный оператор мог быть получен от клиента как строка в кодировке SJIS.

    Пример: SQLTEXT="DELETE FROM t1"

  • STARTUP_OPTIONS

    Строка, представляющая параметры, заданные в командной строке или в файлах параметров при запуске сервера MySQL.

    Пример: STARTUP_OPTIONS="--port=3306 --log_output=FILE"

  • STATUS

    Беззнаковое целое число, представляющее статус команды: 0 для успешного выполнения, ненулевое значение при возникновении ошибки. Это совпадает со значением функции C API. См. описание для STATUS_CODE, чтобы узнать, чем оно отличается от STATUS.

    Журнал аудита не содержит значения SQLSTATE или сообщения об ошибке. Чтобы увидеть соответствия между кодами ошибок, значениями SQLSTATE и сообщениями, см. .

    Предупреждения не регистрируются.

    Пример: STATUS="1051"

  • STATUS_CODE

    Беззнаковое целое число, представляющее статус команды: 0 для успешного выполнения, 1 при возникновении ошибки.

    Значение STATUS_CODE отличается от значения STATUS: STATUS_CODE равно 0 для успешного выполнения и 1 для ошибки, что совместимо с потребителем EZ_collector для Audit Vault. STATUS — это значение функции C API. Это 0 для успешного выполнения и ненулевое значение для ошибки, и поэтому необязательно 1 для ошибки.

    Пример: STATUS_CODE="0"

  • TABLE

    Строка, представляющая имя таблицы.

    Пример: TABLE="t3"

  • USER

    Строка, представляющая имя пользователя, отправленное клиентом. Это может отличаться от значения PRIV_USER.

  • VERSION

    Беззнаковое целое число, представляющее версию формата файла журнала аудита.

    Пример: VERSION="1"

Формат файла журнала аудита JSON

Для журналирования аудита в формате JSON (audit_log_format=JSON) содержимое файла журнала представляет собой массив JSON , где каждый элемент массива представляет собой аудиторское событие как JSON хеш пар ключ-значение. Примеры полных записей событий представлены позже в этом разделе. Ниже приведён фрагмент частичных событий:

[
  {
    "timestamp": "2019-10-03 13:50:01",
    "id": 0,
    "class": "audit",
    "event": "startup",
    ...
  },
  {
    "timestamp": "2019-10-03 15:02:32",
    "id": 0,
    "class": "connection",
    "event": "connect",
    ...
  },
  ...
  {
    "timestamp": "2019-10-03 17:37:26",
    "id": 0,
    "class": "table_access",
    "event": "insert",
      ...
  }
  ...
]

Файл журнала аудита записывается в кодировке UTF-8 (до 4 байт на символ). Когда плагин журнала аудита начинает запись нового файла журнала, он записывает открывающий маркер массива [. Когда плагин закрывает файл журнала, он записывает закрывающий маркер массива ]. Закрывающего маркера нет, пока файл открыт.

Элементы внутри записей аудита имеют следующие характеристики:

  • Некоторые элементы присутствуют в каждой записи аудита. Другие являются необязательными и могут появляться в зависимости от типа записи аудита.

  • Порядок элементов в записи аудита не гарантируется.

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

  • Символы " и \ закодированы как \" и \\ соответственно.

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

Чтобы добавить статистику запроса в файл журнала, необходимо настроить её как фильтр, используя функцию журнала аудита audit_log_filter_set_filter() как элемент сервиса в синтаксисе фильтрации JSON. Инструкции по выполнению этого действия см. в Добавление статистики запросов для обнаружения выбросов. Для того, чтобы поля bytes_sent и bytes_received были заполнены, необходимо установить системную переменную log_slow_extra в значение ON.

Следующие примеры демонстрируют форматы JSON-объектов для различных типов событий (как указано элементами class и event), слегка переформатированные для удобства чтения:

Событие запуска аудита:

{ "timestamp": "2019-10-03 14:21:56",
  "id": 0,
  "class": "audit",
  "event": "startup",
  "connection_id": 0,
  "startup_data": { "server_id": 1,
                    "os_version": "i686-Linux",
                    "mysql_version": "5.7.21-log",
                    "args": ["/usr/local/mysql/bin/mysqld",
                             "--loose-audit-log-format=JSON",
                             "--log-error=log.err",
                             "--pid-file=mysqld.pid",
                             "--port=3306" ] } }

Когда плагин журнала аудита запускается в результате запуска сервера (в отличие от включения во время выполнения), connection_id устанавливается в 0, а account и login отсутствуют.

Событие завершения аудита:

{ "timestamp": "2019-10-03 14:28:20",
  "id": 3,
  "class": "audit",
  "event": "shutdown",
  "connection_id": 0,
  "shutdown_data": { "server_id": 1 } }

Когда плагин журнала аудита удаляется в результате завершения работы сервера (в отличие от отключения во время выполнения), connection_id устанавливается в 0, а account и login отсутствуют.

Событие подключения или смены пользователя:

{ "timestamp": "2019-10-03 14:23:18",
  "id": 1,
  "class": "connection",
  "event": "connect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl",
                       "status": 0,
                       "db": "test",
                       "connection_attributes": {
                         "_pid": "43236",
                         ...
                         "program_name": "mysqladmin"
                       } }
}

Событие разъединения:

{ "timestamp": "2019-10-03 14:24:45",
  "id": 3,
  "class": "connection",
  "event": "disconnect",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "connection_data": { "connection_type": "ssl" } }

Событие запроса:

{ "timestamp": "2019-10-03 14:23:35",
  "id": 2,
  "class": "general",
  "event": "status",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" },
  "general_data": { "command": "Query",
                    "sql_command": "show_variables",
                    "query": "SHOW VARIABLES",
                    "status": 0 } }

Событие запроса с необязательной статистикой запроса для обнаружения выбросов:

{ "timestamp": "2022-01-28 13:09:30",
  "id": 0,
  "class": "general",
  "event": "status",
  "connection_id": 46,
  "account": { "user": "user", "host": "localhost" },
  "login": { "user": "user", “os": "", “ip": "127.0.0.1", “proxy": "" },
  "general_data": { "command": "Query",
                    "sql_command": "insert",
	            "query": "INSERT INTO audit_table VALUES(4)",
	            "status": 1146 }
  "query_statistics": { "query_time": 0.116250,
                        "bytes_sent": 18384,
                        "bytes_received": 78858,
                        "rows_sent": 3,
                        "rows_examined": 20878 } }

Событие доступа к таблице (чтение, удаление, вставка, обновление):

{ "timestamp": "2019-10-03 14:23:41",
  "id": 0,
  "class": "table_access",
  "event": "insert",
  "connection_id": 5,
  "account": { "user": "root", "host": "localhost" },
  "login": { "user": "root", "os": "", "ip": "127.0.0.1", "proxy": "" },
  "table_access_data": { "db": "test",
                         "table": "t1",
                         "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                         "sql_command": "insert" } }

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

END_OF_DOCUMENT_MARKER
  • account

    MySQL-аккаунт, связанный с событием. Значение — хеш, содержащий элементы, эквивалентные значению функции CURRENT_USER() в разделе: user, host.

    Пример:

    "account": { "user": "root", "host": "localhost" }
    
  • class

    Строка, представляющая класс события. Класс определяет тип события, если рассматривать его вместе с элементом event, который указывает подкласс события.

    Пример:

    "class": "connection"
    

    Следующая таблица демонстрирует допустимые комбинации значений class и event.

    Таблица 8.33 Комбинации класса и события журнала аудита

    Таблица 8.33 Комбинации класса и события журнала аудита
    Значение класса Допустимые значения события
    audit startup, shutdown
    connection connect, change_user, disconnect
    general status
    table_access_data read, delete, insert, update

  • connection_data

    Информация о подключении клиента. Значение — хеш, содержащий эти элементы: connection_type, status, db и возможно connection_attributes. Этот элемент встречается только в записях аудита со значением class равным connection.

    Пример:

    "connection_data": { "connection_type": "ssl",
                         "status": 0,
                         "db": "test" }
    

    События со значением class равным connection и значением event равным connect могут включать элемент connection_attributes для отображения атрибутов подключения, переданных клиентом во время подключения. (Для получения информации об этих атрибутах, которые также доступны в таблицах Performance Schema, см. Раздел 29.12.9, «Таблицы атрибутов подключения Performance Schema».)

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

    Пример:

    "connection_attributes": {
      "_pid": "43236",
      "_os": "macos0.14",
      "_platform": "x86_64",
      "_client_version": "8.4.0",
      "_client_name": "libmysql",
      "program_name": "mysqladmin"
    }
    

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

  • connection_id

    Беззнаковое целое число, представляющее идентификатор подключения клиента. Это то же значение, что и возвращаемое функцией CONNECTION_ID() в сеансе.

    Пример:

    "connection_id": 5
    
  • event

    Строка, представляющая подкласс класса события. Подкласс определяет тип события, когда рассматривается вместе с элементом class, указывающим класс события. Дополнительную информацию см. в описании элемента class.

    Пример:

    "event": "connect"
    
  • general_data

    Информация об исполненном операторе или команде. Значение — хеш, содержащий эти элементы: command, sql_command, query, status. Этот элемент встречается только в записях аудита со значением class, равным general.

    Пример:

    "general_data": { "command": "Query",
                      "sql_command": "show_variables",
                      "query": "SHOW VARIABLES",
                      "status": 0 }
    
  • id

    Беззнаковое целое число, представляющее идентификатор события.

    Пример:

    "id": 2
    

    Для записей аудита с одинаковым значением timestamp их значения id различают их и образуют последовательность. В журнале аудита пары timestamp/id уникальны. Эти пары служат метками, идентифицирующими местоположение событий в журнале.

  • login

    Информация о том, как клиент подключился к серверу. Значение — хеш, содержащий эти элементы: user, os, ip, proxy.

    Пример:

    "login": { "user": "root", "os": "", "ip": "::1", "proxy": "" }
    
  • query_statistics

    Необязательные статистические данные запроса для выявления аномалий. Значение — хеш, содержащий эти элементы: query_time, rows_sent, rows_examined, bytes_received, bytes_sent. Инструкции по настройке статистических данных запроса см. в разделе Добавление статистических данных запроса для выявления аномалий.

    Пример:

    "query_statistics": { "query_time": 0.116250,
                          "bytes_sent": 18384,
                          "bytes_received": 78858,
                          "rows_sent": 3,
                          "rows_examined": 20878 }
    
  • shutdown_data

    Информация о завершении плагина журнала аудита. Значение — хеш, содержащий эти элементы: server_id. Этот элемент встречается только в записях аудита со значениями class и event, соответственно, равными audit и shutdown.

    Пример:

    "shutdown_data": { "server_id": 1 }
    
  • startup_data

    Информация об инициализации плагина журнала аудита. Значение — хеш, содержащий эти элементы: server_id, os_version, mysql_version, args. Этот элемент встречается только в записях аудита со значениями class и event, соответственно, равными audit и startup.

    Пример:

    "startup_data": { "server_id": 1,
                      "os_version": "i686-Linux",
                      "mysql_version": "5.7.21-log",
                      "args": ["/usr/local/mysql/bin/mysqld",
                               "--loose-audit-log-format=JSON",
                               "--log-error=log.err",
                               "--pid-file=mysqld.pid",
                               "--port=3306" ] }
    
  • table_access_data

    Информация о доступе к таблице. Значение — хеш, содержащий эти элементы: db, table, query, sql_command. Этот элемент встречается только в записях аудита со значением class, равным table_access.

    Пример:

    "table_access_data": { "db": "test",
                           "table": "t1",
                           "query": "INSERT INTO t1 (i) VALUES(1),(2),(3)",
                           "sql_command": "insert" }
    
  • time

    Этот поле аналогичен полю timestamp, но значение является целым числом и представляет собой значение временной метки UNIX, указывающее дату и время создания события аудита.

    Пример:

    "time" : 1618498687
    

    Поле time появляется в файлах журналов в формате JSON только в том случае, если системная переменная audit_log_format_unix_timestamp включена.

  • timestamp

    Строка, представляющая значение UTC в формате YYYY-MM-DD hh:mm:ss, указывающее дату и время создания события аудита. Например, событие, соответствующее выполнению SQL-запроса, полученного от клиента, имеет значение timestamp, которое появляется после завершения запроса, а не при его получении.

    Пример:

    "timestamp": "2019-10-03 13:50:01"
    

    Для записей аудита с одинаковым значением timestamp их значения id различают их и образуют последовательность. В журнале аудита пары timestamp/id уникальны. Эти пары служат метками, идентифицирующими местоположение событий в журнале.

Эти элементы появляются внутри значений хешей, связанных с элементами верхнего уровня записей журналов аудита в формате JSON:

  • args

    Массив опций, заданных в командной строке или файлах опций при запуске сервера MySQL. Первой опцией является путь к исполняемому файлу сервера.

    Пример:

    "args": ["/usr/local/mysql/bin/mysqld",
             "--loose-audit-log-format=JSON",
             "--log-error=log.err",
             "--pid-file=mysqld.pid",
             "--port=3306" ]
    
  • bytes_received

    Количество байтов, полученных от клиента. Этот элемент является частью необязательной статистики запросов. Для заполнения этого поля переменная системы log_slow_extra должна быть установлена в ON.

    Пример:

    "bytes_received": 78858
    
  • bytes_sent

    Количество байтов, отправленных клиенту. Этот элемент является частью необязательной статистики запросов. Для заполнения этого поля переменная системы log_slow_extra должна быть установлена в ON.

    Пример:

    "bytes_sent": 18384
    
  • command

    Строка, представляющая тип инструкции, которая сгенерировала событие аудита, например, команду, полученную сервером от клиента.

    Пример:

    "command": "Query"
    
  • connection_type

    Состояние безопасности подключения к серверу. Допустимые значения: tcp/ip (TCP/IP-соединение установлено без шифрования), ssl (TCP/IP-соединение установлено с шифрованием), socket (соединение по Unix-сокету), named_pipe (соединение по именованной трубе Windows) и shared_memory (соединение по общей памяти Windows).

    Пример:

    "connection_type": "tcp/tcp"
    
  • db

    Строка, представляющая имя базы данных. Для connection_data это база данных по умолчанию. Для table_access_data это база данных таблиц.

    Пример:

    "db": "test"
    
  • host

    Строка, представляющая имя хоста клиента.

    Пример:

    "host": "localhost"
    
  • ip

    Строка, представляющая IP-адрес клиента.

    Пример:

    "ip": "::1"
    
  • mysql_version

    Строка, представляющая версию сервера MySQL. Она совпадает со значением функции VERSION() или переменной системы version.

    Пример:

    "mysql_version": "5.7.21-log"
    
  • os

    Строка, представляющая имя внешнего пользователя, используемого во время процесса аутентификации, заданное используемым для аутентификации клиента плагином. При использовании собственной (встроенной) аутентификации MySQL или если значение не задано плагином, этот атрибут пустой. Значение совпадает со значением переменной системы external_user. См. Раздел 8.2.19, «Proxy Users».

    Пример:

    "os": "jeffrey"
    
  • os_version

    Строка, представляющая операционную систему, на которой был построен или работает сервер.

    Пример:

    "os_version": "i686-Linux"
    
  • proxy

    Строка, представляющая прокси-пользователя (см. Раздел 8.2.19, «Proxy Users»). Значение пустое, если проксирование пользователя не активно.

    Пример:

    "proxy": "developer"
    
  • query

    Строка, представляющая текст SQL-запроса. Значение может быть пустым. Длинные значения могут быть усечены. Строка, подобно самому файлу журнала аудита, записывается с использованием UTF-8 (до 4 байтов на символ), поэтому значение может быть результатом преобразования. Например, исходный запрос мог быть получен от клиента в виде строки SJIS.

    Пример:

    "query": "DELETE FROM t1"
    
  • query_time

    Время выполнения запроса в микросекундах (если выбран тип данных longlong) или секундах (если выбран тип данных double). Этот элемент является частью необязательной статистики запросов.

    Пример:

    "query_time": 0.116250
    
  • rows_examined

    Количество строк, к которым был произведен доступ во время запроса. Этот элемент является частью необязательной статистики запросов.

    Пример:

    "rows_examined": 20878
  • rows_sent

    Количество строк, отправленных клиенту в результате. Этот элемент является частью необязательной статистики запросов.

    Пример:

    "rows_sent": 3
    
  • server_id

    Беззнаковое целое число, представляющее идентификатор сервера. Это то же самое, что значение переменной системы server_id.

    Пример:

    "server_id": 1
    
  • sql_command

    Строка, указывающая тип SQL-запроса.

    Пример:

    "sql_command": "insert"
    

    Значения соответствуют счетчикам команд statement/sql/xxx. Например, xxx соответствует drop_table и select для запросов DROP TABLE и SELECT соответственно. Следующее утверждение отображает возможные имена:

    SELECT REPLACE(EVENT_NAME, 'statement/sql/', '') AS name
    FROM performance_schema.events_statements_summary_global_by_event_name
    WHERE EVENT_NAME LIKE 'statement/sql/%'
    ORDER BY name;
    
  • status

    Беззнаковое целое число, представляющее статус команды: 0 — успех, ненулевое значение — ошибка. Это совпадает со значением функции C API.

    Журнал аудита не содержит значение SQLSTATE или сообщение об ошибке. Чтобы увидеть соответствия между кодами ошибок, значениями SQLSTATE и сообщениями, см. .

    Предупреждения не регистрируются.

    Пример:

    "status": 1051
    
  • table

    Строка, представляющая имя таблицы.

    Пример:

    "table": "t1"
    
  • user

    Строка, представляющая имя пользователя. Значение отличается в зависимости от элемента, в котором встречается user:

    • В элементах account, user — это строка, представляющая пользователя, под которым сервер аутентифицировал клиента. Это имя пользователя, которое сервер использует для проверки привилегий.

    • В элементах login, user — это строка, представляющая имя пользователя, отправленное клиентом.

    Пример:

    "user": "root"
    

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/audit-log-file-formats.html

Spec-Zone.ru

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