使用 MySQL 資料庫稽核

本主題說明如何啟用及使用 MySQL 適用的 Cloud SQL 稽核外掛程式。如需總覽,請參閱「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 使用者除外) 都是管理員,擁有 FILE 和 SUPER 以外的所有權限,包括稽核預存程序的權限。根據預設,IAM 資料庫使用者沒有任何權限。

啟用 MySQL 適用的 Cloud SQL 稽核外掛程式

MySQL 適用的 Cloud SQL 稽核外掛程式 (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 欄中。

控制台

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往 Cloud SQL 執行個體

  2. 開啟執行個體並按一下 [編輯]。
  3. 向下捲動至「旗標」區段。
  4. 如要設定先前未在執行個體上設定的旗標,請按一下「Add flag」(新增旗標),從下拉式選單中選擇 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 方法和網址:

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 方法和網址:

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

JSON 要求主體:

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

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

MySQL 適用的 Cloud SQL 稽核外掛程式設定

您可以使用下列旗標調整 MySQL 適用的 Cloud SQL 稽核外掛程式行為。所有旗標都可變更,不需重新啟動資料庫。如要瞭解如何管理旗標,請參閱「設定資料庫旗標」。

  • 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 (毫秒)。

控制台

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面。

    前往「Cloud SQL Instances」(Cloud SQL 執行個體) 頁面

  2. 開啟執行個體並按一下 [編輯]。
  3. 向下捲動至「旗標」區段。
  4. 如要設定先前未在執行個體上設定的旗標,請按一下「Add flag」(新增旗標),從下拉式選單中選擇上述清單中的資料庫旗標,然後設定其值。
  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 方法和網址:

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 方法和網址:

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

JSON 要求主體:

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

請展開以下其中一個選項,以傳送要求:

您應該會收到如下的 JSON 回覆:

設定資料庫稽核

管理稽核規則

Cloud SQL 會使用一組儲存程序,管理 MySQL 適用的 Cloud SQL 稽核外掛程式稽核規則。您可以使用四種預存程序,建立、列出、更新及刪除稽核規則。

每個預存程序都會傳回兩個變數:@outval 和 @outmsg。這些變數分別代表預存程序的狀態碼和錯誤訊息。您可以使用星號 (*) 做為萬用字元,搜尋使用者、主機、資料庫和資料表名稱。星號可做為字尾、字首或兩者皆是。此外,萬用字元 % 只能用於主機。您可以使用反引號 (`) 指出應以字面意義使用字串。舉例來說,`ta*ble` 會完全相符。

如要讓新變更生效,請使用輸入參數 reload_mode=1 執行預存程序,或呼叫 mysql.cloudsql_reload_audit_rule(1)。

建立稽核規則

您可以使用 mysql.cloudsql_create_audit_rule 建立新的稽核規則。

如要建立稽核規則並在一次呼叫中重新載入,請使用下列陳述式:

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)。 S、U 或 B
reload_mode 整數 0 (不重新載入規則) 和 1 (重新載入規則)。 0或1
輸出參數
名稱 類型 說明 範例
@outval 整數 預存程序的狀態碼。 0 為成功,1 為失敗。
@outmsg 字串 預存程序的錯誤訊息。

稽核規則有下列限制:

限制
user、db、obj 和 ops 的長度。 大小上限為 2048 個半形字元。
user、db、obj 和 ops 的組合數量。 最多 1,000 個組合。舉例來說,如果稽核規則稽核 user1,user2、db1, db2、table1,table2 和 select,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 更新現有的稽核規則。

如要更新稽核規則並在一次呼叫中重新載入,請使用下列陳述式:

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

您可能想在一個工作階段中更新多項稽核規則,然後再重新載入規則。您可以使用下列預存程序,在一個步驟中更新規則,然後在後續步驟中重新載入這些規則。

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) 的作業。 S、U 或 B
reload_mode 整數 0 (不重新載入規則) 和 1 (重新載入規則)。 0或1
輸出參數
名稱 類型 說明 範例
@outval 整數 預存程序的狀態碼。 0 為成功,1 為失敗。
@outmsg 字串 預存程序的錯誤訊息。

稽核規則有下列限制:

限制
user、db、obj 和 ops 的長度。 長度上限為 2048 個半形字元。
user、db、obj 和 ops 的組合數量。 最多 1,000 個組合。舉例來說,稽核規則稽核 user1,user2、db1, db2、table1,table2 和 select,delete,會產生 2 x 2 x 2 x 2 = 16 種組合。

刪除稽核規則

您可以使用 mysql.cloudsql_delete_audit_rule 刪除現有的稽核規則。

如要刪除稽核規則並在一次呼叫中重新載入,請使用下列陳述式:

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 字串 預存程序的錯誤訊息。

作業群組

MySQL 適用的 Cloud SQL 稽核外掛程式支援在規則定義中使用作業群組,稽核活動集合。您可以使用下列作業群組,簡化稽核規則的建立程序。

作業群組 包含的作業
dql select
dml delete、delete_multi、 insert、insert_select、 load、replace、 replace_select、truncate、 update、update_multi、
ddl alter_db、alter_event、 alter_function、alter_procedure、 alter_table、alter_user、 create_db、create_event、 create_function、create_index、 create_procedure、create_table、 create_trigger、create_user、 create_udf、create_view、 drop_db、drop_event、 drop_function、drop_index、 drop_procedure、drop_table、 drop_trigger、drop_user、 drop_view、rename_table、 rename_user
dcl grant、revoke、revoke_all
show show_binlog_events、show_create_func、show_create_proc、show_procedure_code、show_create_event、show_create_trigger、show_events、show_function_code、show_grants、show_relaylog_events、show_triggers
call call_procedure

查看 Cloud SQL 資料庫稽核記錄

在 Cloud Logging 查看資料庫稽核記錄

如要查看資料庫稽核記錄,請先確認您已為專案啟用資料存取稽核記錄。特定執行個體產生的 MySQL 稽核記錄,會以資料存取稽核記錄的形式傳送至 Cloud Logging。您可以使用「記錄檔探索工具」頁面,查看產生的 MySQL 資料庫稽核記錄。

在 Logs Explorer 中,您可以使用下列查詢來查看 MySQL 稽核記錄,顯示特定 Cloud SQL 專案的所有 MySQL 資料庫稽核記錄。

更改下列內容:

  • PROJECT_ID:要查詢稽核記錄的專案 ID。
    resource.type="cloudsql_database"
    log_name="projects/PROJECT_ID/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 代表 IAM 帳戶或服務帳戶的字串。
ip 代表用戶端 IP 位址的字串。
host 代表用戶端主機名稱的字串。
errCode 作業失敗時的 MySQL 錯誤代碼。請參閱 MySQL 伺服器錯誤訊息參考資料。
cmd 指出要使用的 SQL 陳述式 (作業類型) 的字串。例如:INSERT、UPDATE 或 DELETE。
objects 稽核物件。通常是表格。這個欄位包含物件的下列資訊:

db 代表預設資料庫名稱的字串。
name 代表物件名稱的字串。通常是資料表名稱。
objType 代表物件類型的字串。 原價 TABLE。
query SQL 陳述式 (直接執行)。
chunkCount 如果稽核記錄查詢大小超過 cloudsql_mysql_audit_event_split_threshold (9 萬),則為區塊總數。
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"
}

停用資料庫稽核功能

如要停用 MySQL 適用的 Cloud SQL 稽核外掛程式,您可以將資料庫旗標「cloudsql_mysql_audit」cloudsql_mysql_audit設為 OFF,或是移除該旗標。

控制台

  1. 前往 Cloud de Confiance 控制台的「Cloud SQL Instances」(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 方法和網址:

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 方法和網址:

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. 稽核單一使用者 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 稽核記錄? 您必須啟用資料存取稽核記錄 (如「設定資料存取稽核記錄」一文所述)。此外,MySQL 適用的 Cloud SQL 稽核外掛程式也需要稽核規則,才能稽核所需的稽核記錄。使用 reload_mode=1 的預存程序建立稽核規則,或執行下列指令或重新啟動資料庫,讓新加入的稽核規則生效:

CALL mysql.cloudsql_reload_audit_rule(1)

此外,請確認您具備必要的 IAM 角色,才能在 Logs Explorer 中查看記錄,例如 _Default bucket 中資料存取稽核記錄的「私人記錄檢視器」(roles/logging.privateLogViewer) 角色。詳情請參閱「必要的角色」。
更新資料庫旗標時,我看到以下錯誤:

錯誤 1193:不明系統變數 「cloudsql_mysql_audit_xxx」
cloudsql_mysql_audit_xxx 旗標只有在稽核外掛程式啟用時才會生效。從執行個體中移除任何現有的 cloudsql_mysql_audit_xxx 旗標,然後使用下列指令啟用外掛程式,再更新 cloudsql_mysql_audit_xxx 旗標:

cloudsql_mysql_audit=ON
即使我未設定任何稽核規則,仍可看到產生的稽核記錄。 根據預設,系統會記錄稽核規則資料表 (mysql.audit_log_rules 和 mysql.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);
但我看到與這個資料表無關的稽核記錄,例如 disconnect 和 connect。
部分作業 (例如中斷連線或連線) 屬於全域作業。系統會忽略輸入 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
我無法使用 gcloud 設定 cloudsql_mysql_audit_data_masking_cmds 和 cloudsql_mysql_audit_data_masking_regexp。 gcloud 必須使用 --flags-file 引數來設定複雜的旗標值 (包含特殊字元的旗標)。
我使用 CREATE USER 陳述式建立預存程序,但密碼未經過遮蓋。 根據預設,遮罩功能僅適用於 cmds (作業),例如:

CREATE_USER、ALTER_USER、GRANT、UPDATE。

如要在建立預存程序時篩選密碼,請將 create_procedure 新增至 cloudsql_mysql_audit_data_masking_cmds。
嘗試建立、更新或刪除稽核規則時,收到鎖定等待逾時錯誤。 通常,如果兩個以上的工作階段嘗試同時修改稽核規則,就會發生這個錯誤。如果這種情況經常發生,請提高 innodb_lock_wait_timeout 變數的值。您可以全域增加 (使用資料庫旗標),或只針對工作階段增加,例如使用下列指令:
SET innodb_lock_wait_timeout=120
。

後續步驟