MySQL データベースの監査を使用する

このトピックでは、Cloud SQL for MySQL 監査プラグインを有効にして使用する方法について説明します。概要については、MySQL データベースの監査をご覧ください。MySQL プラグインの詳細については、MySQL プラグインの読み込みをご覧ください。

始める前に

データアクセス監査ログ

データアクセス監査ログを有効にして構成します。データアクセス監査ログの構成をご覧ください。

監査ユーザーに必要な権限

監査ストアド プロシージャを実行するための EXECUTE 権限が必要です。監査者のアクセス権を監査ストアド プロシージャに変更する場合は、mysql クライアントで GRANT コマンドまたは REVOKE コマンドを使用する必要があります。ユーザー権限の詳細については、MySQL のユーザー権限をご覧ください。たとえば、管理者が user という名前の監査者にアクセス権を付与し、監査ルールを管理する場合は、次のステートメントを使用して権限を付与します。

CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT EXECUTE ON PROCEDURE mysql.cloudsql_list_audit_rule TO 'user'@'%';

監査者が後でアクセス権を取り消す場合は、次のステートメントを使用して権限を取り消すことができます。

REVOKE ALL ON PROCEDURE mysql.cloudql_list_audit_rule FROM 'user'@'%';

デフォルトでは、Cloud SQL を使用して作成されたユーザー(IAM ユーザーを除く)は、FILESUPER を除いて、すべての権限(監査ストアド プロシージャに対するすべての権限を含む)を持つ管理者です。デフォルトでは、IAM データベース ユーザーには権限が付与されません。

Cloud SQL for MySQL 監査プラグインを有効にする

Cloud SQL for MySQL 監査プラグイン(cloudsql_mysql_audit)は、特定のデータベース インスタンスの監査動作を制御します。このプラグインを使用するには、まず Cloud SQL インスタンスでプラグインを有効にする必要があります。

cloudsql_mysql_audit プラグインを有効にするには、次のいずれかのオプションを使用します。

  • --cloudsql_mysql_audit=ON

    プラグインを有効にするようサーバーに指示する。プラグインの初期化に失敗すると、プラグインを無効にしてサーバーが実行されます。

  • --cloudsql_mysql_audit=FORCE

    プラグインを有効にするようサーバーに指示するが、プラグインの初期化に失敗した場合はサーバーを起動しない。このオプションを有効にすると、プラグインが有効な場合にサーバーを実行し、無効の場合は実行しません。

  • --cloudsql_mysql_audit=FORCE_PLUS_PERMANENT

    FORCE と似ていますが、実行時にプラグインはアンロードされません。ユーザーが UNINSTALL PLUGIN を使用してプラグインをアンロードしようとすると、エラーが発生します。

プラグインが有効かどうかは、INFORMATION_SCHEMA.PLUGINS テーブルの PLUGIN_STATUS 列に表示されます。

Console

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスを開き、[編集] をクリックします。
  3. 下方向にスクロールして [フラグ] セクションを表示します。
  4. インスタンスで設定したことのないフラグを設定するには、[フラグを追加] をクリックし、cloudsql_mysql_audit をプルダウン メニューから選択して、その値を ON に設定します。
  5. [保存] をクリックして、変更を保存します。
  6. [概要] ページの [フラグ] で、変更を確認します。

gcloud

次のように置き換えます。

  • INSTANCE_NAME: フラグを設定するインスタンスの名前。
gcloud sql instances patch INSTANCE_NAME \
           --database-flags cloudsql_mysql_audit=ON

このコマンドでは、以前に設定されたすべてのデータベース フラグが上書きされます。これらを保持し、新しいフラグを追加するには、インスタンスに設定するすべてのフラグの値を含めます。具体的に含まれていないフラグはデフォルト値に設定されます。フラグに値がない場合は、フラグ名の後に等号(=)を付けてください。

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "ON"
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

Cloud SQL for MySQL 監査プラグインの設定

以下のフラグを使用して、Cloud SQL for MySQL 監査プラグインの動作を調整できます。これらのフラグはすべて、データベースを再起動せずに変更できます。フラグの管理方法については、データベース フラグを構成するをご覧ください。

  • cloudsql_mysql_audit_data_masking_regex

    Perl 互換正規表現(PCRE)に準拠したデータ マスキングに使用される正規表現。

    デフォルトでは、出力の監査ログではユーザー パスワード(<psw>)が *** のパスワード マスクに置き換えられます。

    正規表現は、cloudsql_mysql_audit_data_masking_cmds で指定したコマンドタイプを含むステートメントにのみ適用されます。gcloud を使用する場合は、フラグファイルを使用して、複雑な特殊文字を含む値を設定する必要があります。

    このフラグのデフォルト値:

    
    identified(?:/\*.*?\*/|\s)*?by(?:/\*.*?\*/|\s)*?(?:password)?(?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?\((?:/\*.*?\*/|
    \s)*?['|"](?<psw>.*?)(?<!\\)['|"](?:/\*.*?\*/|\s)*?\)|password(?:/\*.*?\*/|
    \s)*?(?:for(?:/\*.*?\*/|\s)*?\S+?)?(?:/\*.*?\*/|\s)*?=(?:/\*.*?\*/|\s)*?[
    '|"](?<psw>.*?)(?<!\\)['|"]|password(?:/\*.*?\*/|\s)*?['|"](?<psw>.*?)
    (?<!\\)['|"]
    
    

    次の例をご覧ください。

    • cloudsql_mysql_audit_data_masking_regex を使用しないと、ユーザーの作成コマンドを記述する監査ログエントリが次のように記録されます。

      {..."cmd":"create_user","query":"create user user1@'localhost' identified
      by 'pw'"}
      
    • デフォルト値の cloudsql_mysql_audit_data_masking_regex を使用すると、同じ監査ログが次のように変更されます。

      {..."cmd":"create_user","query":"create user user1@'localhost' identified by
      '***'"}
      
    • cloudsql_mysql_audit_data_masking_regex(?<psw>.*) に設定すると、Cloud SQL はすべてのクエリの内容をフィルタリングできます。

      {..."cmd":"create_user","query":"***"}
      
  • cloudsql_mysql_audit_data_masking_cmds

    データ マスキングの正規表現(cloudsql_mysql_audit_data_masking_regex)が適用されるコマンドのカンマ区切りリスト。フィルタリングを停止するには、空の文字列("")を設定します。gcloud を使用する場合は、フラグファイルを使用してカンマ区切りリストを設定する必要があります。デフォルト値には、次のパスワード句を含む MySQL コマンドが含まれます。

    create_user,alter_user,grant,update
    
  • cloudsql_mysql_audit_max_query_length

    監査ログに記録するクエリの最大長を制御します。クエリの詳細を表示する必要がない場合は、0 を使用できます。その場合、クエリは監査ログに記録されません。これにより、ログの容量を節約でき、コストも削減できます。-1 は、制限がないことを意味します。デフォルトは -1 です。

  • cloudsql_mysql_audit_log_write_period

    ログの書き込み期間。ライター スレッドは、このフラグ オプションに設定したミリ秒数に達した後、またはバッファがいっぱいになったときに、バッファの内容をディスクに書き込みます。このフラグ オプションを 0 に設定すると、ライター スレッドから書き込みの完了通知が届くまでユーザー スレッドは待機状態になります。デフォルトは 500(ミリ秒)です。

Console

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスを開き、[編集] をクリックします。
  3. 下方向にスクロールして [フラグ] セクションを表示します。
  4. インスタンスで設定したことのないフラグを設定するには、[フラグを追加] をクリックし、プルダウン メニューのリストからデータベース フラグを選択して、その値を設定します。
  5. [保存] をクリックして、変更を保存します。
  6. [概要] ページの [フラグ] で、変更を確認します。

gcloud

次のように置き換えます。

  • INSTANCE_NAME: フラグを設定するインスタンスの名前。
  • FLAG_NAME: 構成フラグの名前。
  • FLAG_VALUE: フラグに使用する値。

        gcloud sql instances patch INSTANCE_NAME /
                   --database-flags FLAG_NAME=FLAG_VALUE
    

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "flag_name",
        "value": "flag_value"
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

データベース監査を構成する

監査ルールを管理する

Cloud SQL は、ストアド プロシージャのセットを使用して、Cloud SQL for MySQL 監査プラグインの監査ルールを管理します。監査ルールの作成、一覧表示、更新、削除に使用できるストアド プロシージャは 4 つあります。

ストアド プロシージャはそれぞれ、@outval@outmsg の 2 つの変数を返します。これらの変数には、それぞれストアド プロシージャのステータス コードとエラー メッセージが格納されます。ユーザー名、ホスト、データベース、テーブル名を検索する場合は、ワイルドカードとしてアスタリスク(*)を使用できます。アスタリスクをサフィックス、プレフィックス、またはその両方で使用します。また、ワイルドカード文字 % はホストにのみ使用できます。文字列をリテラルで使用する必要がある場合は、バッククォート(`)を使用します。たとえば、`ta*ble` は文字どおり一致します。

新しい変更を有効にするには、入力パラメータ reload_mode=1 を使用してストアド プロシージャを実行するか、mysql.cloudsql_reload_audit_rule(1) を呼び出して新しい変更を有効にする必要があります。

監査ルールを作成する

mysql.cloudsql_create_audit_rule を使用すると、新しい監査ルールを作成できます。

監査ルールを作成して 1 回の呼び出しで再読み込みを行うには、次のステートメントを使用します。

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',1, @outval,@outmsg);
SELECT @outval, @outmsg;

ルールを作成して別の呼び出しで再読み込みを行うには、次のステートメントを使用します。

CALL mysql.cloudsql_create_audit_rule('user@host','db','obj','ops','op_result',0, @outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

上記のコマンドを使用すると、複数のルールを作成してから、すべての変更を同時に再読み込みできます。

次の表に、前のコマンドの入力パラメータと出力パラメータを示します。

入力パラメータ
名前 説明
user@host または user@ip 文字列 監査するデータベース ユーザーのカンマ区切りのリスト。user@host または user@ip 形式を使用します。

user1@localhost
user1@*
user1@%
user@ip
db 文字列 監査するデータベースのカンマ区切りのリスト。 db1,db2,db3*
obj 文字列 監査するデータベース オブジェクトのカンマ区切りのリスト。 table1,table2,table3*
ops 文字列 監査するデータベース アクションのカンマ区切りのリスト。 select,delete,insert
op_result 文字列 監査の成功(S)、失敗(U)、または成功と失敗の両方のオペレーション(B)。 SU、または B
reload_mode 整数 ルールを再読み込みしない場合は 0、再読み込みする場合は 1 0 または 1
出力パラメータ
名前 説明
@outval 整数 ストアド プロシージャのステータス コード。 0(成功の場合)、1(失敗の場合)。
@outmsg 文字列 ストアド プロシージャのエラー メッセージ。

監査ルールには次の制限があります。

制限事項
userdbobjops の長さ。 最大サイズは 2,048 文字です。
userdbobjops の組み合わせの数。 最大 1,000 の組み合わせ。たとえば、user1,user2db1, db2table1,table2select,delete を監査する監査ルールでは、2 x 2 x 2 x 2 = 16 の組み合わせが生成されます。

監査ルールを一覧表示する

監査者は、mysql.cloudsql_list_audit_rule を使用して既存の監査ルールを一覧表示できます。

監査ルール 1 と 2 を一覧表示するには、次のコマンドを使用します。

CALL mysql.cloudsql_list_audit_rule('1,2',@outval,@outmsg);
SELECT @outval, @outmsg;

すべての監査ルールを一覧表示するには、次のようにします。

CALL mysql.cloudsql_list_audit_rule('*',@outval,@outmsg);
SELECT @outval, @outmsg;

次の表に、前のコマンドの入力パラメータと出力パラメータを示します。

入力パラメータ
名前 説明
rule_id 文字列 削除するルール ID のカンマ区切りのリスト。 1,2,3
出力パラメータ
名前 説明
@outval 整数 ストアド プロシージャのステータス コード。 0(成功の場合)、1(失敗の場合)。
@outmsg 文字列 ストアド プロシージャのエラー メッセージ。

監査ルールを更新する

mysql.cloudsql_update_audit_rule を使用すると、既存の監査ルールを更新できます。

監査ルールを更新して 1 回の呼び出しで再読み込みを行うには、次のステートメントを使用します。

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',1,@outval,@outmsg);
SELECT @outval, @outmsg;

ルールを再読み込みする前に、1 つのセッションで複数の監査ルールを更新することをおすすめします。次のストアド プロシージャを使用すると、1 つのステップでルールを更新し、後のステップでルールを再読み込みできます。

CALL mysql.cloudsql_update_audit_rule(1,'user@host','db','obj','ops','op_result',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL mysql.cloudsql_reload_audit_rule(1);

次の表に、前のコマンドの入力パラメータと出力パラメータを示します。

入力パラメータ
名前 説明
rule_id 整数 更新するルールの ID。 5
user@host 文字列 監査するデータベース ユーザーのカンマ区切りのリスト。user@host の形式を使用します。

user1@localhost,user1@*
user1@%
db 文字列 監査するデータベースのカンマ区切りのリスト。 db1,db2,db3*
obj 文字列 監査するデータベース オブジェクトのカンマ区切りのリスト。 table1,table2,table3*
ops 文字列 監査するデータベース アクションのカンマ区切りのリスト。 SELECT,DELETE,INSERT
op_result 文字列 監査の成功(S)、失敗(U)、または成功と失敗の両方のオペレーション(B)。 SU、または B
reload_mode 整数 ルールを再読み込みしない場合は 0、再読み込みする場合は 1 0 または 1
出力パラメータ
名前 説明
@outval 整数 ストアド プロシージャのステータス コード。 0(成功の場合)、1(失敗の場合)。
@outmsg 文字列 ストアド プロシージャのエラー メッセージ。

監査ルールには次の制限があります。

制限事項
userdbobjops の長さ。 最大サイズは 2,048 文字です。
userdbobjops の組み合わせの数。 最大 1,000 の組み合わせ。たとえば、user1,user2db1, db2table1,table2select,delete を監査する監査ルールでは、2 x 2 x 2 x 2 = 16 の組み合わせが生成されます。

監査ルールを削除する

mysql.cloudsql_delete_audit_rule を使用すると、既存の監査ルールを削除できます。

監査ルールを削除して 1 回の呼び出しで再読み込みを行うには、次のステートメントを使用します。

CALL mysql.cloudsql_delete_audit_rule('1,2',1,@outval,@outmsg);
SELECT @outval, @outmsg;

ルールを削除して別の呼び出しで再読み込みを行うには、次のステートメントを使用します。

CALL mysql.cloudsql_delete_audit_rule('1,2',0,@outval,@outmsg);
SELECT @outval, @outmsg;
CALL cloudsql_reload_audit_rule(1);

上記のコマンドを使用すると、複数のルールを削除してから、すべての変更を同時に再読み込みできます。

次の表に、前のコマンドの入力パラメータと出力パラメータを示します。

入力パラメータ
名前 説明
rule_id 文字列 削除するルール ID のカンマ区切りのリスト。 1,2,3
reload_mode 整数 ルールを再読み込みしない場合は 0、再読み込みする場合は 1 0 または 1
出力パラメータ
名前 説明
@outval 整数 ストアド プロシージャのステータス コード。 0(成功の場合)、1(失敗の場合)。
@outmsg 文字列 ストアド プロシージャのエラー メッセージ。

オペレーション グループ

Cloud SQL for MySQL 監査プラグインは、ルール定義でオペレーション グループを使用してアクティビティのコレクションを監査できます。次のオペレーション グループを使用すると、監査ルールの作成を簡素化できます。

オペレーション グループ 含まれるオペレーション
dql select
dml deletedelete_multiinsertinsert_selectloadreplacereplace_selecttruncateupdateupdate_multi
ddl alter_dbalter_eventalter_functionalter_procedurealter_tablealter_usercreate_dbcreate_eventcreate_functioncreate_indexcreate_procedurecreate_tablecreate_triggercreate_usercreate_udfcreate_viewdrop_dbdrop_eventdrop_functiondrop_indexdrop_proceduredrop_tabledrop_triggerdrop_userdrop_viewrename_tablerename_user
dcl grantrevokerevoke_all
show show_binlog_eventsshow_create_funcshow_create_procshow_procedure_codeshow_create_eventshow_create_triggershow_eventsshow_function_codeshow_grantsshow_relaylog_eventsshow_triggers
call call_procedure

Cloud SQL データベースの監査ログを表示する

Cloud Logging でデータベースの監査ログレコードを表示する

データベース監査ログを表示するには、まず、プロジェクトでデータアクセス監査ログを有効にします。特定のインスタンスに生成された MySQL 監査ログは、データアクセス監査ログとして Cloud Logging に送信されます。生成された MySQL データベースの監査ログは、ログ エクスプローラ アプリケーションで表示できます。

ログ エクスプローラで、次のクエリを実行し、高度なフィルタ インターフェースを使用すると、特定の Cloud SQL プロジェクトのすべての MySQL データベース監査ログを表示できます。これにより、MySQL 監査ログを確認できます。

次のように置き換えます。

  • PROJECT_NAME: 監査ログを取得するプロジェクトの名前。
    resource.type="cloudsql_database"
    logName="projects/PROJECT_NAME/logs/cloudaudit.googleapis.com%2Fdata_access"
    protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"

また、cloudaudit.googleapis.com/data_access ログフィルタを選択することもできます。

監査ログ形式

監査ログには次のフィールドがあります。

フィールド名 説明
msgType 監査ログのメッセージ タイプを表す文字列。msgType の値は activity のみです。
status オペレーションのステータス(success または unsuccessful)。
date 監査イベントの生成時刻を示すタイムスタンプ。
threadId MySQL スレッドの ID。
queryId MySQL クエリの ID。
user クライアントによって送信されたユーザー名を表す文字列。privUser 値と異なる場合があります。
privUser サーバーがクライアントを認証したユーザーを示す文字列。これは、サーバーが権限チェックに使用するユーザー名です。ユーザー値と異なる場合があります。
gcpIamAccount GCP IAM アカウントまたはサービス アカウントを表す文字列。
ip クライアント IP アドレスを表す文字列。
host クライアントのホスト名を表す文字列。
errCode オペレーションの失敗に関する MySQL エラーコード。MySQL Server のエラー メッセージのリファレンスをご覧ください。
cmd 使用する SQL ステートメント(オペレーション タイプ)を示す文字列。たとえば、INSERTUPDATEDELETE です。
objects 監査オブジェクト。通常はテーブルです。このフィールドには、オブジェクトに関する次の情報が含まれます。

db デフォルトのデータベース名を表す文字列。
name オブジェクト名を表す文字列。通常はテーブル名です。
objType オブジェクトのタイプを表す文字列。通常は TABLE です。
query SQL ステートメント(直接実行)。
chunkCount 監査ログのクエリサイズが cloudsql_mysql_audit_event_split_threshold(90,000)を超える場合のチャンクの合計。
chunkIndex チャンクのインデックス。chunk_index は 1 から開始します。
@type タイプは常に type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry です。

監査ログエントリの例を次に示します。

{
"msgType":"activity",
"status":"unsuccessful",
"date":"2021-11-11T06:16:16.163603Z",
"threadId":"750",
"queryId":"26763",
"user":"root",
"priv_user":"root",
"ip":"",
"host":"localhost",
"errCode":"1146",
"cmd":"select",
"objects":[{"db":"test","name":"t4","obj_type":"TABLE"}],
"query":"select * from test.t4",
"chunkCount":2,
"chunkIndex":2,
"@type":"type.googleapis.com/google.cloud.sql.audit.v1.MysqlAuditEntry"
}

データベース監査を無効にする

Cloud SQL for MySQL 監査プラグインを無効にするには、データベース フラグ cloudsql_mysql_audit を OFF に設定するか、フラグを削除します。

Console

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスを開き、[編集] をクリックします。
  3. 下方向にスクロールして [フラグ] セクションを表示します。
  4. インスタンスで設定したことのないフラグを設定するには、[フラグを追加] をクリックし、cloudsql_mysql_audit をプルダウン メニューから選択して、その値を OFF に設定します。
  5. [保存] をクリックして、変更を保存します。
  6. [概要] ページの [フラグ] で、変更を確認します。

gcloud

次のように置き換えます。

  • INSTANCE_NAME: フラグを設定するインスタンスの名前。

    gcloud sql instances patch INSTANCE_NAME \
               --database-flags cloudsql_mysql_audit=OFF
    

REST v1beta4

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • instance-id: インスタンス ID

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1/projects/project-id/instances/instance-id

リクエストの本文(JSON):

{
  "settings":
  {
    "databaseFlags":
    [
      {
        "name": "cloudsql_mysql_audit",
        "value": "OFF"
      }
    ]
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

監査ルールの例

  1. すべてのユーザーのすべてのアクティビティを監査します。

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','B',1,@outval,@outmsg);
    
  2. 1 人のユーザー(user1)に関するすべてのアクティビティを監査します。

    CALL mysql.cloudsql_create_audit_rule('user1@*','*','*','*','B',1,@outval,@outmsg);
    
  3. user で始まるすべてのユーザーのアクティビティをすべて監査します。

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','B',1, @outval,@outmsg);
    
  4. すべてのユーザーのすべての DML オペレーションを監査します。

    CALL mysql.cloudsql_create_audit_rule('*','*','*','dml','B',1,@outval,@outmsg);
    
  5. 特殊なデータベース db1 の選択オペレーションを監査します。

    CALL mysql.cloudsql_create_audit_rule('*','db1','*','select','B',1,@outval,@outmsg);
    
  6. 特殊文字 db~1 を含むデータベースのすべてのアクティビティを監査します。

    CALL mysql.cloudsql_create_audit_rule('*','`db~1`','*','*','B',1,@outval,@outmsg);
    
  7. テーブル db1.table1 の選択オペレーションと削除オペレーションを監査します。

    CALL mysql.cloudsql_create_audit_rule('*','db1','table1','select,delete','B',1,@outval,@outmsg);
    
  8. 成功したすべてのオペレーションを監査します。

    CALL mysql.cloudsql_create_audit_rule('*','*','*','*','S',1,@outval,@outmsg);
    
  9. user で始まるすべてのユーザーのすべてのアクティビティを監査しません。

    CALL mysql.cloudsql_create_audit_rule('user*@*','*','*','*','E',1, @outval,@outmsg);
    

トラブルシューティング

問題 トラブルシューティング
次のコマンドを呼び出したときに、cloudsql_mysql_audit が表示されません。

SHOW (global) variables
cloudsql_mysql_audit はプラグインの名前です。有効になっているかどうかを確認するには、次のコマンドを使用します。


SHOW PLUGINS

status エントリを確認します。
cloudsql_mysql_audit を有効にした後、MySQL 監査ログが表示されません。 データアクセス監査ログを有効にする必要があります(データアクセス監査ログを構成するを参照)。また、Cloud SQL for MySQL 監査プラグインで目的の監査ログを監査するには、監査ルールが必要です。ストアド プロシージャと reload_mode=1 を使用して監査ルールを作成します。または、次のコマンドを実行するか、データベースを再起動して、新たに追加された監査ルールを有効にします。


CALL mysql.cloudsql_reload_audit_rule(1)
データベース フラグを更新すると、次のエラーが表示されます。

Error 1193: Unknown system variable 'cloudsql_mysql_audit_xxx'
cloudsql_mysql_audit_xxx フラグは、監査プラグインがアクティブな場合にのみ機能します。インスタンスから既存の cloudsql_mysql_audit_xxx フラグを削除し、cloudsql_mysql_audit_xxx フラグを更新する前に、次のコマンドを使用してプラグインを有効にします。


cloudsql_mysql_audit=ON
監査ログを設定していないにもかかわらず、監査ログが生成されています。 デフォルトでは、監査ルールテーブル(mysql.audit_log_rulesmysql.audit_log_rules_expanded)と監査ストアド プロシージャ(mysql.cloudsql_xxxx_audit_rule)への変更が記録されます。
プライマリ インスタンスに変更を加えた後、レプリカ インスタンスの監査ログが表示されません。 レプリケーション スレッドとクラッシュ リカバリ スレッドがログに記録されません。Cloud SQL は、プライマリ インスタンスのアクティビティを監査しますが、レプリカ インスタンスのアクティビティは監査しません。
次のコマンドでカンマ区切りリストから値を設定しようとしましたが、機能しません。

gcloud instances patch --database-flags
gcloud コマンドを使用してフラグ値のカンマ区切りリストを指定する場合は、--flags-file 引数を使用します。まず、次の情報を含むファイルを作成します。


--database-flags:
general_log: OFF
cloudsql_mysql_audit_max_query_length: '20'
cloudsql_mysql_audit_data_masking_cmds: select,update

その後、次のコマンドを実行します。


gcloud sql instances patch --flags-file=flagfile
次のコマンドがエラーを返します。

CALL mysql.cloudsql_create_canonical_rules
これは想定どおりの動作です。mysql.cloudsql_create_canonical_rules は、mysql.cloudsql_create_audit_rule mysql.cloudsql_update_audit_rule によって内部でのみ呼び出す必要があります。
どのオペレーションを監査できますか? サポートされているオペレーションは、サポートされているオペレーションのリストに記載されています。次のようなオペレーションはデータベースに影響しないため、監査されません。


USE db_name


または


SHOW VARIABLES


また、関数がオブジェクトとして監査できない場合もあります(サポートされていない機能)。
特定のテーブルに対するすべてのオペレーションを監査するため、次の監査ルールを作成しました。

mysql.cloudsql_create_audit_rule("user@*","db", "table","*","B",1,@1,@2);
しかし、disconnectconnect など、このテーブルに関係のない監査ログが表示されます。
切断や接続などの一部のオペレーションはグローバルとみなされます。入力の db フィールドと object フィールドは無視されます。
ストアド プロシージャを使用して監査ルールを作成、更新、または削除すると、次のエラーが表示されます。

MySQL サーバーは read-only オプションで実行されているため、このステートメントを実行できません。
Cloud SQL では、読み取り専用インスタンスのストアド プロシージャは変更できません。インスタンスがプライマリの場合は、read_only フラグを削除します。インスタンスがレプリカ インスタンスの場合、プライマリ インスタンスで変更を行います。ルールの変更がレプリカ インスタンスに複製された後、レプリカ インスタンスで次のコマンドを実行して、ルールをレプリカに再度読み込みます。

CALL mysql.cloudsql_reload_audit_rule(1)
監査ルールを作成、更新、または削除すると、変更が成功しても、次のエラーが表示されます。

0 rows affected
0 rows affected レスポンスは、テーブルではなく、ストアド プロシージャで最後に実行されたステートメントに対するものです。監査ルールが変更されたかどうかを確認するには、次のコマンドを使用します。


mysql.cloudsql_list_audit_rule
gcloudcloudsql_mysql_audit_data_masking_cmdscloudsql_mysql_audit_data_masking_regexp を設定できません。 gcloud では、--flags-file フラグを使用して複雑なフラグ値(特殊文字を含むフラグ)を設定する必要があります。
CREATE USER ステートメントを使用してストアド プロシージャを作成しましたが、パスワードがマスキングされていません。 デフォルトでは、マスキングは以下のような cmds(オペレーション)に対してのみ機能します。

CREATE_USERALTER_USERGRANTUPDATE

ストアド プロシージャの作成時にパスワードをフィルタリングするには、create_procedurecloudsql_mysql_audit_data_masking_cmds に追加します。
監査ルールを作成、更新、または削除しようとしたときに、ロック待機のタイムアウト超過エラーが発生しました。 通常、このエラーは、2 つ以上のセッションが監査ルールを同時に変更しようとした場合に発生します。この状況が頻繁に発生する場合は、innodb_lock_wait_timeout 変数の値を増やしてください。グローバルに増やすことも(データベース フラグを使用)、セッションでのみ増やすこともできます(たとえば、次のコマンドを使用)。

SET innodb_lock_wait_timeout=120

次のステップ