你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure Database for MySQL - 灵活服务器中的审核日志跟踪数据库活动

适用于 Azure Database for MySQL 灵活服务器

Azure Database for MySQL 灵活服务器为用户提供了配置审核日志的功能。 还可使用审核日志来跟踪数据库级活动,包括连接、管理、DDL 和 DML 事件。 这些类型的日志通常用于符合性目的。

配置审核日志记录

重要

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

默认情况下,审核日志处于禁用状态。 若要启用它们,请将 audit_log_enabled 服务器参数设置为“开启”。 可使用 Azure 门户或 Azure CLI 配置此功能。

可调整来控制审核日志记录行为的其他参数包括:

  • audit_log_events:控制要记录的事件。 请查看下表以了解具体的审核事件。
  • audit_log_include_users:要包括 MySQL 用户进行日志记录。 此参数的默认值为空,这将包括所有用户进行日志记录。 此参数的优先级高于 audit_log_exclude_users。 此参数的最大长度为 512 个字符。 例如,dev* 的通配符值包括以关键字 dev(例如“dev1,dev_user,dev_2”)开头的所有用户。 此示例中包含用户的通配符条目的另一个示例是 *dev,以值“dev”结尾的所有用户(如“stage_dev,prod_dev,user_dev”)均包含在审核日志条目中。 此外,允许在模式中使用问号 (?) 作为通配符。
  • audit_log_exclude_users:不对 MySQL 用户进行日志记录。 此参数的最大长度为 512 个字符。 还接受用户的通配符条目以排除审核日志中的用户。 例如,stage* 的通配符值排除所有条目以关键字 stage 开头的用户(例如“stage1,stage_user,stage_2”)。 此示例中排除用户的通配符条目的另一个示例是 *com,以值 com 结尾的所有用户都将从审核日志条目中排除。 此外,允许在模式中使用问号 (?) 作为通配符。

注意

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

事件 描述
CONNECTION - 连接启动
- 终止连接
CONNECTION_V2 - 连接启动(成功或失败的尝试错误代码)
- 终止连接
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 - 表读取语句,例如 SELECT 或 INSERT INTO ...SELECT
- 表删除语句,例如 DELETE 或 TRUNCATE TABLE
- 表插入语句,例如 INSERT 或 REPLACE
- 表更新语句,例如 UPDATE

访问审核日志

审核日志与 Azure Monitor 诊断设置相集成。 在灵活服务器上启用审核日志后,可以将它们发送到 Azure Monitor 日志、Azure 事件中心或 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
connection_id_d MySQL 生成的唯一连接 ID
host_s 空白
ip_s 连接到 MySQL 的客户端的 IP 地址
user_s 执行查询的用户的名称
db_s 连接的数据库的名称
\_ResourceId 资源 URI
status_d 连接 CONNECTIONS_V2 事件的错误代码条目。

常规

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

注意

对于 sql_text_s,如果日志超过 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

表访问权限

注意

对于 sql_text_s,如果日志超过 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 Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs' and event_class_s == "general_log"
    | project TimeGenerated, Resource, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s
    | order by TimeGenerated asc nulls last
    
  • 列出特定服务器上的 CONNECTION_V2 事件,status_d 列表示在连接时客户端应用程序面临的客户端连接错误代码

    AzureDiagnostics
    | where Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs' and event_subclass_s == "CONNECT"
    | project TimeGenerated, Resource, event_class_s, event_subclass_s, user_s, ip_s, status_d
    | order by TimeGenerated asc nulls last
    
  • 列出特定服务器上的 CONNECTION 事件

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

    AzureDiagnostics
    | where Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, Resource, 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 Resource  == '<your server name>' //Server name must be in Upper case
    | where Category == 'MySqlAuditLogs'
    | project TimeGenerated, Resource, event_class_s, event_subclass_s, event_time_t, user_s , ip_s , sql_text_s
    | summarize count() by Resource, bin(TimeGenerated, 5m)
    | render timechart
    
  • 列出已为审核日志启用了诊断日志的所有 Azure Database for MySQL 灵活服务器实例中的已审核事件

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

后续步骤