使用 MySQL 資料庫稽核

本主題說明如何啟用及使用 MySQL 適用的 Cloud SQL 稽核外掛程式。如需總覽資訊,請參閱「MySQL 資料庫稽核」。如要進一步瞭解 MySQL 外掛程式,請參閱 MySQL 外掛程式載入

事前準備

資料存取稽核記錄

啟用及設定資料存取稽核記錄。請參閱「設定資料存取稽核記錄」。

稽核使用者所需的權限

您必須具備稽核預存程序的 EXECUTE 權限,才能執行這些程序。如果管理員需要變更稽核員對稽核預存程序的存取權限,請在 mysql 用戶端中使用 GRANTREVOKE 指令。如要瞭解使用者權限的詳細資訊,請參閱 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 資料庫使用者沒有任何權限。

啟用 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. 前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。

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

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>) 會以 *** 密碼遮罩取代。

    Regex 只會套用至使用 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

    以半形逗號分隔的指令清單,資料遮蓋 regex (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. 前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。

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

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@hostuser@ip 字串 以半形逗號分隔的資料庫使用者清單,用於稽核。請使用 user@hostuser@ip 格式。

user1@localhost
user1@*
user1@%
user@ip
db 字串 以半形逗號分隔的資料庫清單,用於稽核。 db1,db2,db3*
obj 字串 以半形逗號分隔的資料庫物件清單,用於稽核。 table1,table2,table3*
ops 字串 以半形逗號分隔的稽核資料庫動作清單。 select,delete,insert
op_result 字串 稽核成功 (S)、失敗 (U) 或成功和失敗 (B) 的作業。 SUB
reload_mode 整數 0 則不會重新載入規則,1 則會重新載入。 01
輸出參數
名稱 類型 說明 示例
@outval 整數 預存程序的狀態碼。 0 為成功,1 為失敗。
@outmsg 字串 預存程序的錯誤訊息。

稽核規則有下列限制:

限制
userdbobjops 的長度。 長度上限為 2048 個半形字元。
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 更新現有的稽核規則。

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

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

稽核規則有下列限制:

限制
userdbobjops 的長度。 長度上限為 2048 個半形字元。
userdbobjops 的組合數量。 最多 1,000 種組合。舉例來說,稽核規則稽核 user1,user2db1, db2table1,table2select,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 則會重新載入。 01
輸出參數
名稱 類型 說明 示例
@outval 整數 預存程序的狀態碼。 0 為成功,1 為失敗。
@outmsg 字串 預存程序的錯誤訊息。

作業群組

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

作業群組 包含的作業
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_events, show_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。您可以透過 Logs Explorer 應用程式,查看產生的 MySQL 資料庫稽核記錄。

在記錄檔探索工具中,您可以使用下列查詢,透過「進階篩選器」介面,顯示特定 Cloud SQL 專案的所有 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 作業狀態,可以是 successunsuccessful
date 稽核事件的產生時間戳記。
threadId MySQL 執行緒的 ID。
queryId MySQL 查詢的 ID。
user 代表用戶端傳送的使用者名稱的字串。這可能與 privUser 值不同。
privUser 字串,代表伺服器驗證用戶端身分時所用的使用者。這是伺服器用於檢查權限的使用者名稱。這可能與使用者值不同。
gcpIamAccount 代表 GCP IAM 帳戶或服務帳戶的字串。
ip 代表用戶端 IP 位址的字串。
host 代表用戶端主機名稱的字串。
errCode 作業失敗的 MySQL 錯誤代碼。請參閱「 MySQL Server Error Message Reference」。
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,或移除該旗標。

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL Instances」頁面。

    前往 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)
更新資料庫標記時,我看到下列錯誤:

錯誤 1193:不明系統變數 「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
部分作業 (例如中斷連線或連線) 屬於全域作業。並忽略輸入的 dbobject 欄位。
使用預存程序建立、更新或刪除稽核規則時,我看到下列錯誤。

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_cmdscloudsql_mysql_audit_data_masking_regexp gcloud 需要使用 --flags-file 引數來設定複雜的旗標值 (包含特殊字元的旗標)。
我使用 CREATE USER 陳述式建立預存程序,但密碼未經過遮蓋。 根據預設,遮蓋功能僅適用於 cmds (作業),例如:

CREATE_USERALTER_USERGRANTUPDATE

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

後續步驟