一連のフィルターを通じて、特定のイベントに対するセキュリティ監査を実現します。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity Editionは、現在監査機能をサポートしていません。
監査範囲
フィルターでフィルタリングできる次元には、アカウント、イベントタイプ、イベント属性などが含まれます。各フィルターでは、フィルタリングされたイベントを監査するかどうかを選択できます。
使用制限と注意事項
- 式は、
SELECTステートメントの出力列(select item)に直接かつ一意に配置する必要があり、親式(parent expr)の制限はありません。 - 式はサブクエリ内に記述できません。
- フィルターを定義した後、ユーザーに設定して初めて有効になります。
- フィルターとユーザーは1対多の関係です。つまり、1つのフィルターを複数のユーザーに設定でき、1人のユーザーには1つのフィルターしか設定できません。
- 接続時に、現在のセッションが使用する監査フィルター(Audit Filter)が決定され、そのセッションのライフサイクル全体で変更されません。
監査ログの暗号化
説明
監査ログの暗号化機能は、V4.4.2 BP1バージョンからサポートされています。
MySQLテナントの監査ログは、平文または暗号化された形式でディスクに保存および外部出力することができます。具体的な設定方法については、本文末の関連ドキュメントを参照してください。
フィルターの作成
MySQLテナントの監査モードを有効にするには、フィルターを作成します。フィルターはイベントタイプ(Class)で記録するかどうかを制御し、さらにイベントタイプの細分化(Event Type)、イベントフィールド(Event Field)のフィルタリング、およびイベントフィールド条件に対する AND / OR の論理組み合わせをサポートしています。
説明
イベントタイプの細分化、フィールドフィルタリング、論理組み合わせ演算機能は、V4.4.2 BP1バージョンからサポートされています。V4.4.2バージョンでは、イベントタイプのフィルタリングのみがサポートされています。
構文
AUDIT_LOG_FILTER_SET_FILTER 関数を使用してフィルターを作成します。コマンドは以下のとおりです:
AUDIT_LOG_FILTER_SET_FILTER('filter_name', 'definition_of_filters');
パラメータの説明は以下のとおりです:
フィールド |
説明 |
|---|---|
| filter_name | フィルター名を指定するために使用します。
説明
|
| definition_of_filters | 監査フィルターの具体的な設定を定義するために使用し、JSON文字列形式で表現します。イベントタイプに加えて、イベントタイプの細分化、イベントフィールド、およびフィールド条件間の AND / OR の組み合わせを設定できます。 |
具体的なパラメータの説明は以下のとおりです:
- イベントタイプの細分化(Event Type):指定したイベントタイプをさらに細分化およびフィルタリングするために使用します。JSON文字列では、
classの下のeventの下のnameパラメータを使用して関連フィールドを指定します。例:{"class": [{"name": "connection", "event": [{"name": "disconnect"}]}]}。 - イベントフィールド(Event Field)のフィルタリング:イベントフィールドは、指定したイベントタイプをさらに細分化およびフィルタリングするために使用します。
fieldパラメータを設定することで、connection、general、table_access の3種類のイベントの具体的なフィールド(field)をフィルタリングできます。JSON文字列では、eventの下のlogパラメータを使用して関連フィールドを指定します。例:"event": [{"name": "read", "log": {"field": {"name": "table_name", "value": "t1"}}}]。 - 論理組み合わせ:
AND/ORを使用して複数のフィールドを論理的に組み合わせることができます。
イベントタイプの細分化でサポートされているサブタイプ:
イベントタイプ(Class) |
説明 |
細分化可能なサブタイプ(Event Type) |
|---|---|---|
| connection | ログイン・ログアウト文を含む |
|
| general | すべての非DML文を含む |
|
| table_access | DMLでのみ使用可能 |
|
イベントフィールドのフィルタリングでサポートされているフィールド:
connection、general、table_access の3つのイベントタイプが含まれます。各イベントタイプは複数のイベントフィールドをサポートしており、詳細は次の表を参照してください:
イベントタイプ |
イベントフィールド(Event Field) |
データ型 |
説明 |
|---|---|---|---|
| connection | connection_id | Int | 接続の一意の識別子 |
| connection | user | String | 監査対象のログインユーザー名 |
| connection | database | String | 接続時に指定したデータベース名 |
| connection | ip | String | 接続したユーザーが使用するクライアントIPアドレス |
| connection | server_ip | String | 接続先OBServerのサーバーIPアドレス |
| connection | server_host | String | 接続先OBServerのサーバーホスト名 |
| general | general_user | String | 監査対象のユーザー名 |
| general | general_sql_command | String | 監査対象のSQLコマンドタイプ。現在、すべての非DML文タイプをカバーできます。具体的な文については、表の下部の説明を参照してください。 |
| table_access | table_database | String | イベントが属するデータベース名 |
| table_access | table_name | String | イベントに関連するテーブル。2つの使い方があります:
|
説明
general_sql_commandがサポートする完全なSQLタイプについては、記事の最後にある関連ドキュメントを参照してください。
log フィールドの階層、違い、およびデフォルト動作
ログ記録の動作は、log の値、および class または event アイテムが指定されているかどうかによって決まります。
階層 |
値 |
説明 |
指定なし時の動作 |
|---|---|---|---|
filter.log |
true/false | フィルターの総合スイッチで、デフォルトでの記録/非記録を制御します。 | class または event が指定されていない場合、デフォルトで true として処理されます。 |
filter.class[].log |
true/false/JSON文字列 | 単一の class アイテムに対してローカルスイッチまたは条件フィルタリングを行います。 |
明示的に設定できます。設定されていない場合、上位レベルのルールに従って処理されます。 |
filter.class[].event[].log |
true/false/JSON文字列 | 単一の event アイテムに対してローカルスイッチまたは条件フィルタリングを行います。 |
明示的に設定できます。設定されていない場合、上位レベルのルールに従って処理されます。 |
その他の説明:
- 表の階層列はパス表現の略です。ここでは以下のようになります:
filter.logはfilterオブジェクトのlogプロパティを表します。例:{"filter": {"log": true}}。filter.class[].logはfilterオブジェクトのclass配列内の個々の要素のlogプロパティを表します。例:{"filter": {"class": [{"log": true}]}}。filter.class[].event[].logはfilterオブジェクトのclass配列内の個々の要素のevent配列内の個々の要素のlogプロパティを表します。例:{"filter":{"class":[{"name":"table_access","event":[{"name":"read","log":true}]}]}}。
- ドキュメント内の「JSON外層
log」と「class/event階層log」は重複する設定ではありません。前者は総合スイッチであり、後者はローカル上書きまたは条件フィルタリングです。
definition_of_filters の簡単な例
以下は、フィルター definition_of_filters フィールドのJSONに関する簡単な例です。より詳細な例については、記事の最後にある関連ドキュメントの AUDIT_LOG_FILTER_SET_FILTER 関数のリファレンスドキュメントを参照してください。
すべてのイベントを記録する:
logをtrueに設定するだけで済みます(すべてのClassを記録することと同じです)。{ "filter": { "log": true } }イベントタイプを
connectイベントに細分化して記録する(connectionタイプでは接続の確立のみを保持し、disconnectは含まれません):{ "filter": { "log": true, "class": [ { "name": "connection", "event": [ { "name": "connect" } ] } ] } }
例
このセクションでは、完全な例を示します。
すべてのイベントを記録するフィルター
log_allを作成します。obclient [test]>SELECT AUDIT_LOG_FILTER_SET_FILTER('log_all', '{ "filter": { "log": true } }');DDL実行が成功した場合、式は
OKを返します。+-------------------------------------------------------------------------+ | AUDIT_LOG_FILTER_SET_FILTER('log_all', '{ "filter": { "log": true } }') | +-------------------------------------------------------------------------+ | OK | +-------------------------------------------------------------------------+ 1 row in setDDLが失敗した場合でも、
SELECTステートメントは正常に実行され、式の出力結果はエラーメッセージとなります。obclient [test]>SELECT AUDIT_LOG_FILTER_SET_FILTER('log_err', '1');実行結果は次のとおりです:
+---------------------------------------------+ | AUDIT_LOG_FILTER_SET_FILTER('log_err', '1') | +---------------------------------------------+ | ERROR: JSON parsing error. | +---------------------------------------------+ 1 row in set
mysql.audit_log_filterビューを使用して監査フィルターの定義を確認します。ビューの完全な構文と例については、記事の最後に記載されている関連ドキュメントを参照してください。obclient [test]> select * from mysql.audit_log_filter;実行結果は次のとおりです:
+---------+-------------------------------+ | NAME | FILTER | +---------+-------------------------------+ | log_all | { "filter": { "log": true } } | +---------+-------------------------------+ 1 row in set (0.003 sec)各フィールドの説明は以下のとおりです:
フィールド名説明NAME フィルター名 FILTER フィルター定義
フィルターの設定
フィルターを対応するユーザーに設定した後、バックグラウンドスレッドが監査ログを出力できるようになります。
構文
AUDIT_LOG_FILTER_SET_USER 関数を使用して、ユーザーにフィルターを設定します。
AUDIT_LOG_FILTER_SET_USER('user_name', 'filter_name');
各フィールドの説明は以下のとおりです:
フィールド |
説明 |
|---|---|
| user_name | ユーザー名を指定するために使用されます。
説明
|
| filter_name | フィルター名を指定するために使用されます。
説明
|
例
ユーザー
user001にフィルターlog_allを設定します。obclient [test]> SELECT AUDIT_LOG_FILTER_SET_USER('user001', 'log_all');DDL 実行が成功した場合、式は
OKを返します。+-------------------------------------------------+ | AUDIT_LOG_FILTER_SET_USER('user001', 'log_all') | +-------------------------------------------------+ | OK | +-------------------------------------------------+ 1 row in setDDL 実行が失敗した場合、
SELECTステートメントは正常に実行され、式の出力結果はエラーメッセージとなります。obclient [test]>SELECT AUDIT_LOG_FILTER_SET_USER('log_err', '1');実行結果は次のとおりです:
+--------------------------------------------+ | AUDIT_LOG_FILTER_SET_USER('log_err', '1') | +--------------------------------------------+ | ERROR: Invalid character in the user name. | +--------------------------------------------+ 1 row in set (0.001 sec)
mysql.audit_log_userビューを使用して、監査フィルターとユーザーのマッピング関係を確認します。ビューの完全な構文と例については、記事の最後に記載されている関連ドキュメントを参照してください。obclient [test]> select * from mysql.audit_log_user;実行結果は次のとおりです:
+---------+------+------------+ | USER | HOST | FILTERNAME | +---------+------+------------+ | user001 | % | log_all | +---------+------+------------+ 1 row in set (0.003 sec)各フィールドの説明は以下のとおりです:
フィールド名説明USER ユーザー名 HOST ホスト名 FILTERNAME フィルター名
監査の有効化
パラメータ audit_log_enable を使用して、MySQLテナント内の監査機能を有効にします。パラメータの詳細については、本文末の関連ドキュメントを参照してください。
obclient> ALTER SYSTEM SET audit_log_enable=TRUE;
関連ドキュメント
- 監査ログポリシーの設定(書き込み、圧縮、ローテーション、クリーンアップ、暗号化など):監査ルールの設定
- フィルター作成関数:AUDIT_LOG_FILTER_SET_FILTER
- フィルター設定関数:AUDIT_LOG_FILTER_SET_USER
- フィルタービューの確認:mysql.audit_log_filter
- ユーザーマッピングビュー:mysql.audit_log_user
- 監査有効化パラメータ:audit_log_enable
- 付録:general_sql_commandがサポートする完全なSQLタイプ