MySQL Enterprise Auditプラグイン

MySQL Enterprise Auditプラグインを使用すると、MySQL Serverはサーバーアクティビティの監査レコードを含むログファイルを生成できます。ログの内容には、クライアントが接続および切断したとき、および接続中に実行されたアクション(アクセスされたデータベースやテーブルなど)が含まれます。

各問合せの時間とサイズの統計を追加して、外れ値を検出できます。デフォルトでは、監査プラグインのログは無効になっており、監査プラグインのフィルタを定義して、すべてのユーザーまたは特定のユーザーに対して監査可能なイベントのロギングを有効にする必要があります。

関連トピック

監査管理権限の付与

デフォルトでは、DBシステムの作成時に定義したHeatWave管理者ユーザーは、AUDIT_ADMIN権限を持ちます。監査管理権限を他のユーザーに付与できます。

コマンドライン・クライアントの使用

MySQLクライアントやMySQLシェルなどのコマンドライン・クライアントを使用して、より多くのユーザーに監査管理権限を付与します。

  1. お好みのコマンドライン・クライアントを使用してDBシステムに接続します。
  2. 次のコマンドを実行して、ユーザーUser001に監査管理権限を付与します。
    GRANT AUDIT_ADMIN ON *.* TO <User001>;

監査プラグイン・フィルタの定義

監査プラグイン・フィルタを定義して、すべてのユーザーまたは特定のユーザーに対して監査可能なイベントのロギングを有効にする必要があります。デフォルトでは、監査プラグインのログは無効になっています。

コマンドライン・クライアントの使用

MySQLクライアントやMySQLシェルなどのコマンドライン・クライアントを使用して、監査プラグイン・フィルタを定義し、すべてのユーザーまたは特定のユーザーの監査可能イベントのロギングを有効にします。

このタスクでは次が必要です:
  • MySQLバージョン8.0.34-u2以上。
  1. お好みのコマンドライン・クライアントを使用してDBシステムに接続します。
  2. ロギングを有効にする監査フィルタを定義します。監査ログ・フィルタ定義の記述を参照してください。
    1. すべてのイベントを監査するには、次のコマンドを実行します。
      SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
    2. 接続イベントのみを監査するには、次のコマンドを実行します。
      SELECT audit_log_filter_set_filter('log_conn_events','{ "filter": { "class": { "name": "connection" } } }');
    3. 監査フィルタを表示するには、次のコマンドを実行します。
      SELECT * FROM mysql_audit.audit_log_filter;
  3. ステップ2で作成したフィルタをユーザーに割り当てます。監査フィルタは、すべてのユーザーまたは特定のユーザーに割り当てることができます。
    1. 任意のアカウントのすべてのイベントをログに記録するようにデフォルトの監査フィルタを割り当てるには、ワイルドカード文字%を使用します。
      SELECT audit_log_filter_set_user('%', 'log_all');
    2. 任意のアカウントからすべての接続イベントをログに記録するようにデフォルトの監査フィルタを割り当てるには、ワイルドカード文字%を使用します。
      SELECT audit_log_filter_set_user('%', 'log_conn_events');
    3. user_dbaなどの特定のユーザーからのすべてのイベントをログに記録するようにデフォルトの監査フィルタを割り当てるには、次のコマンドを実行します。
      SELECT audit_log_filter_set_user('user_dba@%', 'log_all');
    4. 割り当てられたルールを表示するには、次のコマンドを実行します。
      SELECT * FROM mysql_audit.audit_log_user;
    5. ユーザーuser_dbaからルールの割当てを解除するには、次のコマンドを実行します。
      SELECT audit_log_filter_remove_user('user_dba@%');
  4. (オプション)コンポーネントaudit_api_message_emitを使用して、独自のイベント・データを挿入できます。Audit Message Functionを参照してください。例:
    SELECT audit_api_message_emit_udf('component_text', 'producer_text', 'message_text', 'key1', 'value1', 'key2', 123, 'key3', NULL) AS 'Message';

監査データへのアクセスおよび分析

監査データを使用してDBシステムをモニターします。

コマンドライン・クライアントの使用

MySQLクライアントやMySQLシェルなどのコマンドライン・クライアントを使用して、監査データにアクセスして分析します。

  1. お好みのコマンドライン・クライアントを使用してDBシステムに接続します。
  2. 前回チェックしてから新しいログを表示するには、次のコマンドを実行します。これにより、古いログに再度アクセスすることなく、常に最新の監査ログで更新されます。
    SELECT audit_log_read(audit_log_read_bookmark());
  3. 特定のタイムスタンプから開始する監査ログを抽出するには、audit_log_read()ファンクション内の追加パラメータを指定します。
    SELECT audit_log_read('{ "start": { "timestamp": "2023-08-24 12:30:00" }, "max_array_length": 500 }');
  4. 監査データを読みやすい形式で表示するには、JSON_PRETTY()関数およびCONVERT()関数を使用します。
    SELECT JSON_PRETTY(CONVERT(audit_log_read( ... ) USING UTF8MB4));
  5. データを表形式に変換するには、MySQL JSON関数を使用します。たとえば、JSONの名前/値ペアのサブセットを構造化表形式に変換すると、データとのやり取りや分析が容易になります。
    SELECT @@server_uuid as server_uuid, ts, class, event, login_ip,login_user,connection_id,
     status,connection_type,_client_name,_client_version,
     command,sql_command,command_status
    FROM
    JSON_TABLE
    (
      AUDIT_LOG_READ( '{ "start": {\"timestamp\": \"2023-08-16 15:33:37\"}, \"max_array_length\": 10 }' ), 
      '$[*]'
      COLUMNS
      ( 
        ts TIMESTAMP PATH '$.timestamp',
        class VARCHAR(20) PATH '$.class',
        event VARCHAR(80) PATH '$.event',      
        login_ip VARCHAR(200) PATH '$.login.ip',
        login_user VARCHAR(200) PATH '$.login.user',
        connection_id VARCHAR(80) PATH '$.connection_id',
        status INT PATH '$.connection_data.status',
        connection_type VARCHAR(40) PATH '$.connection_data.connection_type',
        _client_name VARCHAR(80) PATH '$.connection_data.connection_attributes._client_name',
        _client_version VARCHAR(80) PATH '$.connection_data.connection_attributes._client_version',
        command VARCHAR(40) PATH '$.general_data.command',
        sql_command VARCHAR(40) PATH '$.general_data.sql_command',
        command_status VARCHAR(40) PATH '$.general_data.status'
       )) as audit_log;
  6. データ抽出をさらに絞り込むには、SQL文でWHERE句を使用します。たとえば、WHERE connection_type <> 'SSL'です。