应用程序可以使用以下指导原则执行基于sql的审计,将数据库活动与MySQL帐户联系起来。
的行对应MySQL帐户mysql.user
系统表。当客户端连接成功时,服务器将对客户端进行身份验证,确认其与该表中的特定行相关。的用户
而且宿主
的列值唯一标识帐户,并与'
在SQL语句中写入帐户名的格式。user_name
“@”host_name
'
用于对客户端进行身份验证的帐户决定了客户端拥有哪些特权。通常情况下,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 >选择SUBSTRING_INDEX (CURRENT_USER (), ' @ ', 1);+---------------------------------------+ | SUBSTRING_INDEX (CURRENT_USER(),“@”,1 ) | +---------------------------------------+ | user1 | +---------------------------------------+ mysql >选择SUBSTRING_INDEX (CURRENT_USER (), ' @ ', 1);+----------------------------------------+ | SUBSTRING_INDEX (CURRENT_USER(),“@”,1 ) | +----------------------------------------+ | 本地主机 | +----------------------------------------+