Azure Database for MySQL 中的审核日志

适用于:Azure Database for MySQL - 单一服务器

重要

Azure Database for MySQL 单一服务器即将停用。 强烈建议升级到 Azure Database for MySQL 灵活服务器。 有关如何迁移到 Azure Database for MySQL 灵活服务器的详细信息,请参阅 Azure Database for MySQL 单一服务器发生了什么情况?

在 Azure Database for MySQL 中,审核日志可供用户使用。 审核日志可以用来跟踪数据库级别的活动,通常用于确保符合性。

配置审核日志记录

重要

建议仅记录审核所需的事件类型和用户,以确保服务器的性能不会受到严重影响并收集最少的数据量。

默认情况下,审核日志被禁用。 若要启用它,请将 audit_log_enabled 设置为 ON。

可以调整的其他参数包括:

  • audit_log_events:控制要记录的事件。 请查看下表以了解具体的审核事件。
  • audit_log_include_users:要包括 MySQL 用户进行日志记录。 此参数的默认值为空,这将包括所有用户进行日志记录。 此参数的优先级高于 audit_log_exclude_users。 此参数的最大长度为 512 个字符。
  • audit_log_exclude_users:不对 MySQL 用户进行日志记录。 此参数的最大长度为 512 个字符。

注意

audit_log_include_users 的优先级高于 audit_log_exclude_users。 例如,如果 audit_log_include_users = demouser 并且 audit_log_exclude_users = demouser,则会将该用户包括在审核日志中,因为 audit_log_include_users 的优先级更高。

事件 描述
CONNECTION - 启动连接(成功或不成功)
- 在会话期间使用不同的用户/密码对用户重新进行身份验证
- 终止连接
DML_SELECT SELECT 查询
DML_NONSELECT INSERT/DELETE/UPDATE 查询
DML DML = DML_SELECT + DML_NONSELECT
DDL 类似“DROP DATABASE”的查询
DCL 类似“GRANT PERMISSION”的查询
ADMIN 类似“SHOW STATUS”的查询
GENERAL All in DML_SELECT, DML_NONSELECT, DML, DDL, DCL, and ADMIN
TABLE_ACCESS - 适用于 MySQL 5.7 和 MySQL 8.0
- 表读取语句,例如 SELECT 或 INSERT INTO ...SELECT
- 表删除语句,例如 DELETE 或 TRUNCATE TABLE
- 表插入语句,例如 INSERT 或 REPLACE
- 表更新语句,例如 UPDATE

访问审核日志

审核日志与 Azure Monitor 诊断日志集成。 在 MySQL 服务器上启用审核日志后,可以将它们发送到 Azure Monitor 日志、事件中心或 Azure 存储。 若要详细了解如何在 Azure 门户中启用诊断日志,请参阅审核日志门户文章

注意

如果你通过诊断和设置将日志发送给 Azure 存储,将不支持高级存储帐户

诊断日志架构

以下部分介绍基于事件类型的 MySQL 审核日志的输出是什么。 根据输出方法,包含的字段以及这些字段出现的顺序可能会有所不同。

连接

属性 说明
TenantId 租户 ID
SourceSystem Azure
TimeGenerated [UTC] 记录日志时的时间戳 (UTC)
Type 日志的类型。 始终是 AzureDiagnostics
SubscriptionId 服务器所属的订阅的 GUID
ResourceGroup 服务器所属的资源组的名称
ResourceProvider 资源提供程序的名称。 始终是 MICROSOFT.DBFORMYSQL
ResourceType Servers
ResourceId 资源 URI
Resource 服务器的名称
Category MySqlAuditLogs
OperationName LogEvent
LogicalServerName_s 服务器的名称
event_class_s connection_log
event_subclass_s CONNECTDISCONNECTCHANGE USER(仅适用于 MySQL 5.7)
connection_id_d MySQL 生成的唯一连接 ID
host_s 空白
ip_s 连接到 MySQL 的客户端的 IP 地址
user_s 执行查询的用户的名称
db_s 连接的数据库的名称
\_ResourceId 资源 URI

常规

下面的架构适用于 GENERAL、DML_SELECT、DML_NONSELECT、DML、DDL、DCL 和 ADMIN 事件类型。

注意

对于 sql_text,如果日志超过 2048 个字符,则会截断日志。

属性 说明
TenantId 租户 ID
SourceSystem Azure
TimeGenerated [UTC] 记录日志时的时间戳 (UTC)
Type 日志的类型。 始终是 AzureDiagnostics
SubscriptionId 服务器所属的订阅的 GUID
ResourceGroup 服务器所属的资源组的名称
ResourceProvider 资源提供程序的名称。 始终是 MICROSOFT.DBFORMYSQL
ResourceType Servers
ResourceId 资源 URI
Resource 服务器的名称
Category MySqlAuditLogs
OperationName LogEvent
LogicalServerName_s 服务器的名称
event_class_s general_log
event_subclass_s LOGERRORRESULT(仅适用于 MySQL 5.6)
event_time 查询开始时间(UTC 时间戳)
error_code_d 查询失败时的错误代码。 0 意味着无错误
thread_id_d 执行了查询的线程的 ID
host_s 空白
ip_s 连接到 MySQL 的客户端的 IP 地址
user_s 执行查询的用户的名称
sql_text_s 完整查询文本
\_ResourceId 资源 URI

表访问权限

注意

只有 MySQL 5.7 输出表访问日志。
对于 sql_text,如果日志超过 2048 个字符,则会截断日志。

属性 说明
TenantId 租户 ID
SourceSystem Azure
TimeGenerated [UTC] 记录日志时的时间戳 (UTC)
Type 日志的类型。 始终是 AzureDiagnostics
SubscriptionId 服务器所属的订阅的 GUID
ResourceGroup 服务器所属的资源组的名称
ResourceProvider 资源提供程序的名称。 始终是 MICROSOFT.DBFORMYSQL
ResourceType Servers
ResourceId 资源 URI
Resource 服务器的名称
Category MySqlAuditLogs
OperationName LogEvent
LogicalServerName_s 服务器的名称
event_class_s table_access_log
event_subclass_s READINSERTUPDATEDELETE
connection_id_d MySQL 生成的唯一连接 ID
db_s 访问的数据库的名称
table_s 访问的表的名称
sql_text_s 完整查询文本
\_ResourceId 资源 URI

分析 Azure Monitor 日志中的日志

将审核日志通过诊断日志以管道方式传送到 Azure Monitor 日志后,便可以对审核事件进行进一步分析。 下面是一些可帮助你入门的示例查询。 请确保使用你的服务器名称更新下面的内容。

  • 列出特定服务器上的 GENERAL 事件

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs' and event_class_s == "general_log"
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | order by TimeGenerated asc nulls last 
    
  • 列出特定服务器上的 CONNECTION 事件

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs' and event_class_s == "connection_log"
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | order by TimeGenerated asc nulls last
    
  • 汇总特定服务器上的已审核事件

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | summarize count() by event_class_s, event_subclass_s, user_s, ip_s
    
  • 绘制特定服务器上的审核事件类型分布图

    AzureDiagnostics
    | where LogicalServerName_s == '<your server name>'
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | summarize count() by LogicalServerName_s, bin(TimeGenerated, 5m)
    | render timechart 
    
  • 列出已为审核日志启用诊断日志的所有 MySQL 服务器上的已审核事件

    AzureDiagnostics
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, LogicalServerName_s, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s 
    | order by TimeGenerated asc nulls last
    

后续步骤