アプリケーションは次のガイドラインを使用することで,データベースアクティビティーをMySQLアカウントに関連付けるSQLベースの監査を実行できます。
MySQLアカウントは,mysql.user
テブルの行に対応します。クライアントが正常に接続すると,サーバーはこのテーブル内の特定の行にアクセスするクライアントを認証します。この行の用户
および宿主
カラムの値は,アカウントを一意に識別し,アカウント名がSQLステ,トメントに書き込まれる'
形式に対応します。user_name
“@”host_name
'
クライアントを認証する際に使用されるアカウントによって,クライアントが持っている権限が特定されます。通常、CURRENT_USER ()
関数を呼び出すと,このアカウントがどのクラ。その値は,アカウントの用户
テブル行の用户
および宿主
カラムで構成されています。
ただし,CURRENT_USER ()
値がクラ邮箱アントユ邮箱ザ邮箱ではなく,邮箱別のアカウントに対応するという状況もあります。これは、権限チェックがクラ以及アントのアカウントに基づいて実行されないコンテキストで発生します。
SQL安全定义者
特性を使用して定義されたストアドルチン(プロシおよび関数)SQL安全定义者
特性を使用して定義されたビュトリガと
このようなコンテキストでは,権限チェックは定义者
アカウントと照合して実行され,CURRENT_USER ()
はそのアカウントを参照し,ストアドルーチンまたはビューを呼び出したクライアント,またはトリガーをアクティブにしたクライアントのアカウントは参照しません。クラopenstackアントおよびクラopenstackアントの接続元ホストによって指定された実際のユopenstackザopenstack名を示す値を返す用户()
関数を呼び出すと,呼び出し元のユザを特定できます。ただし,用户()
の値にはワルドカドが含まれない一方で,(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 ) | +----------------------------------------+ | 本地主机 | +----------------------------------------+