10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国Ltr)- 41.5 mb
PDF (A4)- 41.6 mb
手册(TGZ)- 262.2 kb
手册(Zip)- 372.3 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

6.2.22基于sql的帐户活动审计

应用程序可以使用以下指导原则执行基于sql的审计,将数据库活动与MySQL帐户联系起来。

的行对应MySQL帐户mysql.user系统表。当客户端连接成功时,服务器将对客户端进行身份验证,确认其与该表中的特定行相关。的用户而且宿主的列值唯一标识帐户,并与user_name“@”host_name在SQL语句中写入帐户名的格式。

用于对客户端进行身份验证的帐户决定了客户端拥有哪些特权。通常情况下,CURRENT_USER ()函数来确定这是为客户机用户准备的哪个帐户。它的值由用户而且宿主的列用户表行为帐户。

然而,在某些情况下CURRENT_USER ()值对应的不是客户端用户,而是不同的帐户。这种情况发生在特权检查不是基于客户端帐户的情况下:

  • 类定义的存储例程(过程和函数)SQL安全定义器特征

  • 方法定义的视图SQL安全定义器特征

  • 触发器和事件

在这些上下文中,特权检查是针对定义者账户和CURRENT_USER ()指的是该帐户,而不是调用所存储例程或视图的客户端的帐户,也不是触发触发器的客户端的帐户。要确定调用用户,可以调用用户()函数,该函数返回一个值,该值指示客户机提供的实际用户名和客户机连接的主机。但是,该值不一定直接对应于用户表,因为用户()值从不包含通配符,而account值(如CURRENT_USER ())可能包含用户名和主机名通配符。

例如,空白用户名匹配任何用户,因此帐户”@“localhost”允许客户端以匿名用户的身份使用任何用户名从本地主机连接。在本例中,如果客户端连接为user1从本地主机,用户()而且CURRENT_USER ()返回不同的值:

SELECT USER(), CURRENT_USER();+-----------------+----------------+ | 用户()| CURRENT_USER () | +-----------------+----------------+ | user1@localhost | @localhost  | +-----------------+----------------+

帐户的主机名部分也可以包含通配符。如果主机名中包含“%”“_”模式字符或使用网络掩码表示法时,该帐户可用于从多个主机连接的客户端CURRENT_USER ()值不指示是哪一个。例如,帐户' user2 ' @ ' % .example.com '可以通过user2的任何主机连接example.com域。如果user2连接从remote.example.com用户()而且CURRENT_USER ()返回不同的值:

SELECT USER(), CURRENT_USER();+--------------------------+---------------------+ | 用户()| CURRENT_USER () | +--------------------------+---------------------+ | user2@remote.example.com | user2@ % .example.com  | +--------------------------+---------------------+

如果应用程序必须调用用户()对于用户审计(例如,如果从触发器内部进行审计),但还必须能够关联用户()值与帐户中的用户表中,必须避免包含通配符的帐户用户宿主列。具体来说,就是不允许用户为空(这将创建匿名用户帐户),并且不允许模式字符或网掩码符号宿主值。所有帐户必须有一个非空用户值和文字宿主价值。

对于前面的例子,”@“localhost”而且' user2 ' @ ' % .example.com '帐户应该更改为不使用通配符:

重命名用户“@'localhost'为'user1'@'localhost';将用户user2 @'%.example.com'重命名为'user2'@'remote.example.com';

如果user2必须能够从多个主机连接example.com域中,每个主机应该有一个单独的帐户。

对象中提取用户名或主机名部分CURRENT_USER ()用户()值时,使用SUBSTRING_INDEX ()功能:

mysql> SELECT SUBSTRING_INDEX(CURRENT_USER(),'@',1);+---------------------------------------+ | SUBSTRING_INDEX (CURRENT_USER(),“@”,1 ) | +---------------------------------------+ | user1  | +---------------------------------------+ mysql >选择SUBSTRING_INDEX (CURRENT_USER (), ' @ ', 1);+----------------------------------------+ | SUBSTRING_INDEX (CURRENT_USER(),“@”,1 ) | +----------------------------------------+ | 本地主机  | +----------------------------------------+