0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OCI】 MySQL HeatWave で監査ログ(Audit Log)を設定する

0
Posted at

はじめに

OCI MySQL HeatWaveでは、データベース内の操作を記録するDB監査ログと、OCIのAPIコールを記録するOCI Auditサービスログの2種類の監査ログを取得できます。

本記事では、セキュリティや内部統制を目的としたMySQL Enterprise Audit PluginによるDB監査ログの設定方法を解説します。


監査ログの種類

種類 概要
MySQL Enterprise Audit Plugin DB内の操作(接続・切断・クエリ実行など)を記録
OCI Audit Service OCIのAPIコール(DBシステムの作成・変更など)を自動記録

本記事ではMySQL Enterprise Audit Pluginを扱います。


前提条件

  • OCI MySQL HeatWave DBシステムが構築済みであること
  • MySQLバージョン 8.0.34-u2 以上であること(Audit Plugin対応バージョン)
  • MySQL Client または MySQL Shell でDBに接続できること
  • デフォルトでは、作成時に設定した管理者ユーザーに AUDIT_ADMIN 権限が付与されている

デフォルトでは監査ログの出力は無効です。フィルタ設定を行って初めて記録が開始されます。
→参考マニュアル:MySQL Enterprise Auditプラグイン


設定手順

ステップ1: DBへの接続

MySQL ClientまたはMySQL Shellで、管理者ユーザーとして接続します。
参考記事:【OCI】 Windows PCからBastion経由でOCI MySQL HeatWaveに接続する手順

# MySQL Client の場合
mysql -h <DBエンドポイント> -u <管理者ユーザー> -p

# MySQL Shell の場合
mysqlsh <管理者ユーザー>@<DBエンドポイント>

ステップ2: 監査権限の確認・付与

管理者ユーザー以外に監査操作をさせる場合は、AUDIT_ADMIN 権限を付与します。

-- 権限付与
GRANT AUDIT_ADMIN ON *.* TO 'user001'@'%';

-- 権限確認
SHOW GRANTS FOR 'user001'@'%';

ステップ3: 監査フィルタの作成

どの操作をログに記録するかをフィルタとして定義します。

パターン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: 特定クラスの複数イベントを記録する(例: Delete+Update)

-- DELETE / UPDATE のみを監査するフィルタ
SELECT audit_log_filter_set_filter(
  'log_delete_update',
  '{
    "filter": {
      "class": {
        "name": "table_access",
        "event": [
          { "name": "delete" },
          { "name": "update" }
        ]
      }
    }
  }'
);

設定済みフィルタの確認

SELECT * FROM mysql_audit.audit_log_filter;

結果イメージ
image.png


ステップ4: フィルタをユーザーに割り当てる

作成したフィルタをユーザーに関連付けます。

すべてのユーザーに適用(ワイルドカード % を使用)

ステップ3の手順で作成したフィルタを割り当てる

-- 全ユーザーにすべての操作を記録するフィルタを適用
SELECT audit_log_filter_set_user('%', 'log_all');
-- 全ユーザーに「接続・切断イベントのみ」を記録するフィルタを適用
SELECT audit_log_filter_set_user('%', 'log_conn_events');
-- 全ユーザーに「特定クラスの複数イベント」を記録するフィルタを適用
SELECT audit_log_filter_set_user('%', 'log_delete_update');

特定ユーザーにのみ適用する例

-- user_dba@% にすべての操作を記録するフィルタを適用
SELECT audit_log_filter_set_user('user_dba@%', 'log_all');

割り当て状況の確認

SELECT * FROM mysql_audit.audit_log_user;

フィルタの割り当てを解除する

SELECT audit_log_filter_remove_user('user_dba@%');

ステップ5: 監査ログの参照

監査ログファイルへは直接アクセスできません。専用のファンクションを使って参照します。

最新ログの確認

SELECT audit_log_read(audit_log_read_bookmark());

特定のタイムスタンプ以降のログを取得

SELECT audit_log_read(
  '{ "start": { "timestamp": "2026-05-01 00:00:00" }, "max_array_length": 500 }'
);

見やすい形式(整形JSON)で表示

SELECT JSON_PRETTY(
  CONVERT(
    audit_log_read('{ "start": { "timestamp": "2026-05-01 00:00:00" }, "max_array_length": 100 }')
    USING UTF8MB4
  )
);

表形式に変換して分析する

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": "2026-05-01 00:00:00" }, "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(80)     PATH '$.connection_data.connection_type',
    _client_name    VARCHAR(200)    PATH '$.connection_data.attributes._client_name',
    _client_version VARCHAR(200)    PATH '$.connection_data.attributes._client_version',
    command         VARCHAR(2000)   PATH '$.general_data.command',
    sql_command     VARCHAR(2000)   PATH '$.general_data.sql_command',
    command_status  VARCHAR(2000)   PATH '$.general_data.status'
  )
) AS audit_data;

OCIコンソールから監査サービスログを確認する方法

OCI Audit ServiceはOCIのAPIコール(DBシステムの作成・停止・設定変更など)を自動記録します。コンソールから確認できます。

  1. OCIコンソールにログインし、**「データベース」→「MySQL HeatWave」→「DBシステム」**を開く
  2. 対象のDBシステムを選択
  3. ページ上部の**「アクション」メニューから「監査」**を選択
  4. コンパートメントの監査ページで、フィルタを使って、「編集」より時間帯を指定し、操作ログを確認

まとめ

OCI MySQL HeatWaveの監査ログ設定は次のステップで完了します。

ステップ 操作
1 DBに管理者として接続
2 必要なユーザーに AUDIT_ADMIN 権限を付与
3 audit_log_filter_set_filter() で記録するイベントを定義
4 audit_log_filter_set_user() でフィルタをユーザーに割り当て
5 audit_log_read() でログを参照・分析

デフォルトでは監査ログは無効のため、セキュリティポリシーや内部統制の要件に合わせてフィルタを定義しましょう。


OCI Log Analyticsとの連携

監査ログはOCI Log Analyticsと連携することで、集中管理・可視化・アラート設定が可能になります。

連携の主な手順は以下のとおりです:

  1. IAMポリシーの設定 — MySQL HeatWaveがLog Analyticsにログを送信できるよう権限を設定
  2. ログ・グループの作成 — 監査ログ・エラーログ・スロークエリログなどを目的別に整理
  3. テレメトリの有効化 — DBシステムの設定でどのログを送信するか選択

詳細はMySQL HeatWave テレメトリとOCI Log Analyticsを参照してください。


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?