はじめに
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;
ステップ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システムの作成・停止・設定変更など)を自動記録します。コンソールから確認できます。
- OCIコンソールにログインし、**「データベース」→「MySQL HeatWave」→「DBシステム」**を開く
- 対象のDBシステムを選択
- ページ上部の**「アクション」メニューから「監査」**を選択
- コンパートメントの監査ページで、フィルタを使って、「編集」より時間帯を指定し、操作ログを確認
まとめ
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と連携することで、集中管理・可視化・アラート設定が可能になります。
連携の主な手順は以下のとおりです:
- IAMポリシーの設定 — MySQL HeatWaveがLog Analyticsにログを送信できるよう権限を設定
- ログ・グループの作成 — 監査ログ・エラーログ・スロークエリログなどを目的別に整理
- テレメトリの有効化 — DBシステムの設定でどのログを送信するか選択
詳細はMySQL HeatWave テレメトリとOCI Log Analyticsを参照してください。
