セキュリティ監査を有効にした後、ユーザーの操作を監査するための具体的なセキュリティ監査ルールを設定する必要があります。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity Editionは、現在監査機能をサポートしていません。
ログストラテジーの設定
パラメータ audit_log_strategy を使用して監査ログのストラテジーを設定します。ASYNCHRONOUS、PERFORMANCE、SYNCHRONOUS の3種類のログ書き込みストラテジーをサポートしており、必要に応じて対応する書き込みストラテジーを選択することで、パフォーマンスとログの完全性のバランスを実現できます。パラメータの詳細な説明については、本文末の関連ドキュメントを参照してください。
ASYNCHRONOUS:非同期ログ書き込みを表します。bufferがいっぱいになると同期的に待機します。このストラテジーはデフォルトです。
PERFORMANCE:非同期ログ書き込みを表します。bufferがいっぱいになるとデータは破棄されます。
SYNCHRONOUS:同期ログ書き込みを表します。
例えば、監査レコードのファイル書き込みストラテジーを非同期ログ書き込みに設定すると、bufferがいっぱいになると同期的に待機します。
obclient [test]> ALTER SYSTEM SET audit_log_strategy='ASYNCHRONOUS';
非同期ログ書き込みを使用する場合、パラメータ audit_log_buffer_size を使用して buffer サイズを制御できます。パラメータの詳細な説明については、本文末の関連ドキュメントを参照してください。
ログ形式の設定
パラメータ audit_log_format を設定して監査ログの形式を選択します。現在は CSV 形式のみをサポートしています。パラメータの詳細な説明については、本文末の関連ドキュメントを参照してください。
obclient [test]> ALTER SYSTEM SET audit_log_format='CSV';
データマスキングの設定
パラメータ audit_log_query_sql を使用して監査レコード内のSQLステートメントを選択します。値には ALL と NONE の2種類が含まれます。パラメータの詳細な説明については、本文末の関連ドキュメントを参照してください。
ALL:すべてのQuery SQLを記録します。
NONE:Query SQLを記録しません。
例えば、監査レコード内のSQLステートメントを記録しないように設定します。
obclient [test]> ALTER SYSTEM SET audit_log_query_sql='NONE';
Query SQLを記録する際、監査ファイルでは以下のステートメントに対してデータマスキングが実施されました:
- CMD:パスワード、AK/SKなどの機密情報を含むステートメント(ユーザー作成、バックアップ・リカバリの開始、パラメータの変更など)は、一律に
***として記録されます。その他のタイプのCMDステートメントは、元のSQLを直接記録します。 - ステートメントのタイプが判断できない場合:例えばParser失敗の場合も、
***として記録されます。
出力パスの設定
パラメータ audit_log_path を使用して監査ログの出力パスを設定します。ローカルストレージとクラウドストレージをサポートしています。audit_log_path の値を指定しない場合、デフォルトで現在の作業パス ${WORK_DIR}/audit が使用されます。パラメータの詳細な説明については、本文末の関連ドキュメントを参照してください。
説明
監査を有効にした後に出力パスを変更した場合、audit_log_path を変更しても即座に新しいディレクトリに切り替わるわけではありません。現在の audit.log がいっぱいになり、ローテーションがトリガーされる(audit_log_rotate_on_size によって制御されます。詳細は後述の ログアーカイブの設定 を参照)まで待たなければなりません。その後、新しく生成されたログが新しいパスに書き込まれます。
ローカルストレージの場合
同一テナント内で、異なるOBServerの監査ログは異なるディレクトリに出力されます。同一クラスタ内で、ユーザーが異なるテナントの出力パスを同じものに設定した場合、ディレクトリ構造に
tenant_idの階層が追加されます。ローカル出力ディレクトリ構造は以下のとおりです:- ${audit_log_path} - tenant_id_1 - ip1:port1 - audit.log.20231031080646317[.zst] - audit.log.20231031084835263[.zst] - audit.log - ip2:port2 - audit.log.20231031072457838[.zst] - audit.log.20231031093023607[.zst] - audit.log.20231031101213751[.zst] - audit.log - tenant_id_2監査ログの出力ディレクトリをローカルに設定する例を以下に示します。
obclient [test]> ALTER SYSTEM SET audit_log_path='file:///logs/audit';クラウドストレージシナリオ
OceanBaseデータベースは、複数のOBServerが同一の
oss/nfsディレクトリに出力する構成をサポートしています。ただし、ファイルの並行追記におけるパフォーマンスや、その後の圧縮・暗号化処理ではローカルファイルに対する操作が必要となる点を考慮し、アーカイブ済みのファイルのみがクラウドストレージに保存されます。アクティブなログの追記は、各OBServerのローカルにあるauditディレクトリ内のファイルに対して行われます。このため、下流のシステムがクラウドストレージ上の監査ログを利用する際、最新のログレコードの一部はまだOBServerのローカルにしか存在せず、下流からは参照できません。監査ログの出力ディレクトリを
OSSに設定する例を以下に示します。obclient [test]> ALTER SYSTEM SET audit_log_path = 'oss://ob-audit/audit/?host=$OSS_HOST&access_id=$OSS_ACCESS_ID&access_key=$OSS_ACCESS_KEY';ここで、
$OSS_HOST、$OSS_ACCESS_ID、$OSS_ACCESS_KEYは実際のホストアドレス、アクセスキーID、アクセスキーに置き換えてください。アクセスキーは暗号化されて保存されます。
ログアーカイブの設定
監査レコードは継続的に audit.log ファイルに追記されます。パラメータ audit_log_rotate_on_size を設定することでログの自動アーカイブを有効にできます。audit.log のサイズが指定された値に達すると、新しいファイルが自動的に生成されます。アーカイブ機能は個々のログファイルのサイズを制御する役割を果たすのみで、古いファイルをクリーンアップする役割は担いません。パラメータの詳細については、本文末の関連ドキュメントを参照してください。
例えば、監査レコードの単一ファイルのサイズを256MBに設定します。
obclient [test]> ALTER SYSTEM SET audit_log_rotate_on_size='256M';
ログクリーンアップの設定
パラメータ audit_log_max_size と audit_log_prune_seconds を使用して、アーカイブ済みの監査ログの容量と保存期間を制御します。これらは同時に有効にすることができます。新しいアーカイブファイルが生成されるたびに、ログのクリーンアップが必要かどうかのチェックが実行されます。ログの合計サイズは、各OBServerのディレクトリ単位で個別に計算されます。
パラメータ audit_log_max_size を設定して、単一のOBServer上に保存される監査ログの最大量を制御します。デフォルト値は0MBで、監査ログを保存しないことを意味します。
例えば、単一のOBServer上に保存される監査ログの最大量を1GBに設定します。
obclient [test]> ALTER SYSTEM SET audit_log_max_size='1G';
パラメータ audit_log_prune_seconds を設定して、監査ログの最大保存時間を制御します。単位は秒です。設定時に単位を指定する必要はありません。デフォルト値0は監査ログを保存しないことを意味します。
例えば、監査ログの最大保存時間を2時間に設定します。
obclient [test]> ALTER SYSTEM SET audit_log_prune_seconds=7200;
パラメータの詳細については、本文末の関連ドキュメントを参照してください。
ログ圧縮の設定(オプション)
パラメータ audit_log_compression を設定して、ログ圧縮の有効化を制御します。圧縮を有効にすると、ログアーカイブ時に直接圧縮済みファイルが生成されます。圧縮アルゴリズムは ZSTD のみをサポートしており、ストリーミング圧縮も可能です。圧縮後のファイルは外部ツール zstd で直接解凍できます。パラメータの詳細については、本文末の関連ドキュメントを参照してください。
説明
圧縮されるのはアーカイブ済みファイルのみで、audit.log ファイルは圧縮されません。
例えば、監査ログで使用する圧縮アルゴリズムを ZSTD に設定します。
obclient [test]> ALTER SYSTEM SET audit_log_compression='ZSTD';
ログ暗号化の設定(オプション)
説明
この機能はV4.4.2 BP1バージョンから導入されました。
MySQLテナントでは、監査ログの暗号化ストレージをサポートしています。暗号化を有効にすると、アーカイブで生成されたログファイルをキー識別子に基づいてディスクに保存でき、圧縮、ローテーション、クリーンアップなどのポリシーと組み合わせて使用しやすくなります。必要に応じて、以下のセクションの手順に従って順次操作してください。
ログ暗号化機能の有効化
パラメータaudit_log_encryptionを使用して監査ログの暗号化を有効にするかどうかを制御します。値は以下のとおりです:
NONE:暗号化を有効にしません。デフォルト値です。AES:暗号化を有効にします。アルゴリズムはAES-256-CBCのストリーム暗号化(アーカイブ書き込み中のストリーム暗号化)です。
例えば、現在のテナントで監査ログの暗号化を有効にするには:
obclient [test]> ALTER SYSTEM SET audit_log_encryption='AES';
パラメータの詳細については、文末の関連ドキュメントを参照してください。
ログアーカイブとパスワードの生成
以下の関数を呼び出すことで、ログアーカイブとパスワードの生成を実装します:
AUDIT_LOG_ENCRYPTION_PASSWORD_SET():パラメータなし。現在書き込み中の監査ログのアーカイブをトリガーし、新しい暗号化キーを生成します。その後に新規に生成されるアーカイブファイルは、新しいキーで暗号化されます。関数の詳細については、文末の関連ドキュメントを参照してください。
注意
この関数を使用するには、SUPER権限が必要です。
例:
obclient [test]> SELECT AUDIT_LOG_ENCRYPTION_PASSWORD_SET();
注意
audit_log_encryptionパラメータが有効であり、かつこの手順が正常に実行された場合にのみ、アーカイブで生成された監査ログファイルは暗号化されて保存されます。
ログパスワードの取得
以下の関数を呼び出すことで、ログファイルの暗号化パスワードを取得します:
AUDIT_LOG_ENCRYPTION_PASSWORD_GET(pwd_id):パラメータpwd_idはInt型で、ログファイルのタイムスタンプ接尾辞を表します。ログファイルのタイムスタンプ接尾辞に基づいて、対応するアーカイブログファイルの暗号化パスワードを返します。パラメータを指定しない場合、最新のpwd_idに対応するパスワードを取得します。関数の詳細については、文末の関連ドキュメントを参照してください。
説明
この関数を使用するには、SUPER権限が必要です。
最新のアーカイブログの暗号化パスワードを取得します:
obclient [test]> SELECT AUDIT_LOG_ENCRYPTION_PASSWORD_GET();
指定されたログの暗号化パスワードを取得します:
obclient [test]> SELECT AUDIT_LOG_ENCRYPTION_PASSWORD_GET('1682089200');
ログの復号化
監査ログの暗号化は、opensslが提供するインターフェースを使用します。opensslでログファイルを暗号化または復号化するには、keyとiv、またはpasswordを指定する必要があります。コマンド例は以下のとおりです:
# -dは復号化を示します。
# -aes-256-cbcはAES-256-CBCアルゴリズムの使用を示します。
# -pass pass:passwordはpasswordをパスワードとして使用することを示します。
# -md sha256はSHA-256アルゴリズムの使用を示します。
# -in encrypted_log_fileは入力される暗号化ログファイルを示します。
# -out decrypted_fileは出力される復号化ログファイルを示します。
obclient > openssl enc -d -aes-256-cbc -pass pass:password -md sha256 -in encrypted_log_file -out decrypted_file
付録:ログファイル名形式の説明
アーカイブ後の監査ログファイル名は、タイムスタンプのサフィックスに基づき、圧縮・暗号化の有無に応じて、規定のフラグメント(pwd_idはキー識別子で、ビューおよび関数パラメータに対応します)を追加します。
シナリオ |
ファイル名形式 |
|---|---|
| 圧縮なし、暗号化なし | audit.log.timestamp |
| 圧縮のみ | audit.log.timestamp.zst |
| 暗号化のみ | audit.log.timestamp.enc.pwd_id |
| 圧縮かつ暗号化 | audit.log.timestamp.zst.enc.pwd_id |
ここで、timestampは本記事「出力パスの設定」にあるローテーションファイル名ルールと一致します。圧縮を同時に有効にした場合、圧縮拡張子は設定と実装に準じます(現在の圧縮アルゴリズムがZSTDの場合は.zstに対応します)。
関連ドキュメント
- ログポリシーの設定:audit_log_strategy
- 非同期書き込み時のログバッファサイズの設定:audit_log_buffer_size
- ログ形式の設定:audit_log_format
- データマスキングの設定に使用する監査レコード内のSQL文の選択:audit_log_query_sql
- ログ出力パスの設定:audit_log_path
- ログアーカイブサイズの設定:audit_log_rotate_on_size
- ログクリーンアップサイズの設定:audit_log_max_size
- ログクリーンアップ時間の設定:audit_log_prune_seconds
- ログ圧縮の設定:audit_log_compression
- ログ暗号化の設定:audit_log_encryption
- ログアーカイブと復号化の設定関数:AUDIT_LOG_ENCRYPTION_PASSWORD_SET
- ログアーカイブと復号化のクエリ関数:AUDIT_LOG_ENCRYPTION_PASSWORD_GET
- ログローテーションの設定:audit_log_rotate_on_size