Перейти к основному содержимому

Управление журналами аудита в Selena через AuditLoader

В этой теме описывается, как управлять журналами аудита Selena в таблице с помощью плагина AuditLoader.

Selena хранит свои журналы аудита в локальном файле fe/log/fe.audit.log, а не во внутренней базе данных. Плагин AuditLoader позволяет управлять журналами аудита непосредственно в вашем кластере. После установки AuditLoader читает логи из файла и загружает их в Selena через HTTP PUT. Затем вы можете запрашивать журналы аудита в Selena с помощью SQL-запросов.

Создание таблицы для хранения журналов аудита

Создайте базу данных и таблицу в вашем кластере Selena для хранения журналов аудита. Подробные инструкции см. в разделах CREATE DATABASE и CREATE TABLE.

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

ВНИМАНИЕ

  • НЕ изменяйте схему таблицы в примерах, иначе загрузка логов завершится неудачей.
  • Поскольку поля журналов аудита различаются в разных версиях Selena, новая версия AuditLoader собирает общие поля из всех доступных версий Selena.
CREATE DATABASE starrocks_audit_db__;

CREATE TABLE starrocks_audit_db__.starrocks_audit_tbl__ (
`queryId` VARCHAR(64) COMMENT "Unique ID of the query",
`timestamp` DATETIME NOT NULL COMMENT "Query start time",
`queryType` VARCHAR(12) COMMENT "Query type (query, slow_query, connection)",
`clientIp` VARCHAR(32) COMMENT "Client IP",
`user` VARCHAR(64) COMMENT "Query username",
`authorizedUser` VARCHAR(64) COMMENT "Unique identifier of the user, i.e., user_identity",
`resourceGroup` VARCHAR(64) COMMENT "Resource group name",
`catalog` VARCHAR(32) COMMENT "Catalog name",
`db` VARCHAR(96) COMMENT "Database where the query runs",
`state` VARCHAR(8) COMMENT "Query state (EOF, ERR, OK)",
`errorCode` VARCHAR(512) COMMENT "Error code",
`queryTime` BIGINT COMMENT "Query execution time (milliseconds)",
`scanBytes` BIGINT COMMENT "Number of bytes scanned by the query",
`scanRows` BIGINT COMMENT "Number of rows scanned by the query",
`returnRows` BIGINT COMMENT "Number of rows returned by the query",
`cpuCostNs` BIGINT COMMENT "CPU time consumed by the query (nanoseconds)",
`memCostBytes` BIGINT COMMENT "Memory consumed by the query (bytes)",
`stmtId` INT COMMENT "Incremental ID of the SQL statement",
`isQuery` TINYINT COMMENT "Whether the SQL is a query (1 or 0)",
`feIp` VARCHAR(128) COMMENT "FE IP that executed the statement",
`stmt` VARCHAR(1048576) COMMENT "Original SQL statement",
`digest` VARCHAR(32) COMMENT "Fingerprint of slow SQL",
`planCpuCosts` DOUBLE COMMENT "CPU usage during query planning (nanoseconds)",
`planMemCosts` DOUBLE COMMENT "Memory usage during query planning (bytes)",
`pendingTimeMs` BIGINT COMMENT "Time the query waited in the queue (milliseconds)",
`candidateMVs` VARCHAR(65533) NULL COMMENT "List of candidate materialized views",
`hitMvs` VARCHAR(65533) NULL COMMENT "List of matched materialized views",
`warehouse` VARCHAR(32) NULL COMMENT "Warehouse name"
) ENGINE = OLAP
DUPLICATE KEY (`queryId`, `timestamp`, `queryType`)
COMMENT "Audit log table"
PARTITION BY RANGE (`timestamp`) ()
DISTRIBUTED BY HASH (`queryId`) BUCKETS 3
PROPERTIES (
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30", -- Keep the audit logs from the latest 30 days. You can adjust this value based on you business demand.
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "3",
"dynamic_partition.enable" = "true",
"replication_num" = "3" -- Keep three replicas of audit logs. It is recommended to keep three replicas in a production environment.
);

Таблица starrocks_audit_tbl__ создается с динамическими разделами. По умолчанию первый динамический раздел создается через 10 минут после создания таблицы. После этого журналы аудита могут быть загружены в таблицу. Вы можете проверить разделы в таблице с помощью следующего запроса:

SHOW PARTITIONS FROM starrocks_audit_db__.starrocks_audit_tbl__;

После создания раздела вы можете переходить к следующему шагу.

Загрузка и настройка AuditLoader

  1. Загрузите установочный пакет AuditLoader. Пакет совместим со всеми доступными версиями Selena.

  2. Распакуйте установочный пакет.

    unzip auditloader.zip

    Извлекаются следующие файлы:

    • auditloader.jar: JAR-файл AuditLoader.
    • plugin.properties: файл свойств AuditLoader. Вам не нужно изменять этот файл.
    • plugin.conf: файл конфигурации AuditLoader. В большинстве случаев вам нужно изменить только поля user и password в файле.
  3. Измените plugin.conf для настройки AuditLoader. Вы должны настроить следующие элементы, чтобы убедиться, что AuditLoader работает правильно:

    • frontend_host_port: IP-адрес FE и HTTP-порт в формате <fe_ip>:<fe_http_port>. Рекомендуется установить значение по умолчанию 127.0.0.1:8030. Каждый FE в Selena управляет своим собственным журналом аудита независимо, и после установки плагина каждый FE запустит свой собственный фоновый поток для получения и сохранения журналов аудита и записи их через Stream Load. Параметр конфигурации frontend_host_port используется для предоставления IP и порта HTTP-протокола для фоновой задачи Stream Load плагина, и этот параметр не поддерживает несколько значений. IP-часть параметра может использовать IP любого FE в кластере, но это не рекомендуется, поскольку если соответствующий FE выйдет из строя, задача записи журнала аудита в фоне других FE также завершится неудачей из-за сбоя связи. Рекомендуется установить значение по умолчанию 127.0.0.1:8030, чтобы каждый FE использовал свой собственный HTTP-порт для связи, избегая таким образом влияния на связь в случае исключения других FE (все задачи записи в конечном итоге будут переданы на узел FE Leader для выполнения).
    • database: имя базы данных, созданной для хранения журналов аудита.
    • table: имя таблицы, созданной для хранения журналов аудита.
    • user: имя пользователя вашего кластера. У вас ДОЛЖНЫ быть привилегии для загрузки данных (LOAD_PRIV) в таблицу.
    • password: пароль пользователя.
    • secret_key: ключ (строка, не должна превышать 16 байт), используемый для шифрования пароля. Если этот параметр не установлен, это означает, что пароль в plugin.conf не будет зашифрован, и вам нужно только указать пароль в открытом тексте в password. Если этот параметр указан, это означает, что пароль зашифрован этим ключом, и вам нужно указать зашифрованную строку в password. Зашифрованный пароль можно сгенерировать в Selena с помощью функции AES_ENCRYPT: SELECT TO_BASE64(AES_ENCRYPT('password','secret_key'));.
    • filter: условия фильтрации для загрузки журнала аудита. Этот параметр основан на параметре WHERE в Stream Load, т.е. -H "where: <condition>", по умолчанию пустая строка. Пример: filter=isQuery=1 and clientIp like '127.0.0.1%' and user='root'.
  4. Упакуйте файлы обратно в пакет.

    zip -q -m -r auditloader.zip auditloader.jar plugin.conf plugin.properties
  5. Распространите пакет на все машины, на которых размещены узлы FE. Убедитесь, что все пакеты хранятся в одинаковом пути. В противном случае установка завершится неудачей. Не забудьте скопировать абсолютный путь к пакету после его распространения.

ПРИМЕЧАНИЕ

Вы также можете распространить auditloader.zip в HTTP-сервис, доступный для всех FE (например, httpd или nginx) и установить его через сеть. Обратите внимание, что в обоих случаях auditloader.zip должен сохраняться в пути после выполнения установки, и исходные файлы не должны удаляться после установки.

Установка AuditLoader

Выполните следующий запрос вместе с скопированным путем для установки AuditLoader в качестве плагина в Selena:

INSTALL PLUGIN FROM "<absolute_path_to_package>";

Пример установки из локального пакета:

INSTALL PLUGIN FROM "<absolute_path_to_package>";

Если вы хотите установить плагин через сетевой путь, вам нужно предоставить md5 пакета в свойствах оператора INSTALL.

Пример:

INSTALL PLUGIN FROM "http://xx.xx.xxx.xxx/extra/auditloader.zip" PROPERTIES("md5sum" = "3975F7B880C9490FE95F42E2B2A28E2D");

Подробные инструкции см. в разделе INSTALL PLUGIN.

Проверка установки и запрос журналов аудита

  1. Вы можете проверить успешность установки с помощью SHOW PLUGINS.

    В следующем примере Status плагина AuditLoader равен INSTALLED, что означает успешную установку.

    mysql> SHOW PLUGINS\G
    *************************** 1. row ***************************
    Name: __builtin_AuditLogBuilder
    Type: AUDIT
    Description: builtin audit logger
    Version: 0.12.0
    JavaVersion: 1.8.31
    ClassName: com.starrocks.qe.AuditLogBuilder
    SoName: NULL
    Sources: Builtin
    Status: INSTALLED
    Properties: {}
    *************************** 2. row ***************************
    Name: AuditLoader
    Type: AUDIT
    Description: Available for versions 3.3.11+. Load audit log to starrocks, and user can view the statistic of queries
    Version: 5.0.0
    JavaVersion: 11
    ClassName: com.starrocks.plugin.audit.AuditLoaderPlugin
    SoName: NULL
    Sources: /x/xx/xxx/xxxxx/auditloader.zip
    Status: INSTALLED
    Properties: {}
    2 rows in set (0.01 sec)
  2. Выполните несколько произвольных SQL-запросов для генерации журналов аудита и подождите 60 секунд (или время, которое вы указали в элементе max_batch_interval_sec при настройке AuditLoader), чтобы позволить AuditLoader загрузить журналы аудита в Selena.

  3. Проверьте журналы аудита, запросив таблицу.

    SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__;

    Следующий пример показывает, когда журналы аудита успешно загружены в таблицу:

    mysql> SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__\G
    *************************** 1. row ***************************
    queryId: 84a69010-d47e-11ee-9647-024228044898
    timestamp: 2024-02-26 16:10:35
    queryType: query
    clientIp: xxx.xx.xxx.xx:65283
    user: root
    authorizedUser: 'root'@'%'
    resourceGroup: default_wg
    catalog: default_catalog
    db:
    state: EOF
    errorCode:
    queryTime: 3
    scanBytes: 0
    scanRows: 0
    returnRows: 1
    cpuCostNs: 33711
    memCostBytes: 4200
    stmtId: 102
    isQuery: 1
    feIp: xxx.xx.xxx.xx
    stmt: SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__
    digest:
    planCpuCosts: 908
    planMemCosts: 0
    pendingTimeMs: -1
    candidateMvs: null
    hitMVs: null
    …………

Устранение неполадок

Если журналы аудита не загружаются в таблицу после создания динамического раздела и установки плагина, вы можете проверить, правильно ли настроен plugin.conf. Для его изменения сначала необходимо удалить плагин:

UNINSTALL PLUGIN AuditLoader;

Логи AuditLoader выводятся в fe.log, вы можете найти их, выполнив поиск по ключевому слову audit в fe.log. После правильной настройки всех конфигураций вы можете следовать приведенным выше шагам для повторной установки AuditLoader.