你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
使用 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 |
CONNECT 、DISCONNECT 、CHANGE 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 |
LOG 、ERROR 、RESULT (仅适用于 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 |
READ 、INSERT 、UPDATE 或 DELETE |
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