使用 MySQL 資料庫稽核

本主題說明如何啟用及使用 Cloud SQL 適用的 MySQL 稽核外掛程式。如需概略說明,請參閱「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 執行個體」頁面。

    前往 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 稽核外掛程式設定

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

  • cloudsql_mysql_audit_data_masking_regex

    用於資料遮罩的規則運算式,符合 Perl 相容規則運算式 (PCREs) 規範。

    根據預設,在輸出的稽核記錄中,使用者密碼 (<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. 前往 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 方法和網址:

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_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 作業狀態,可以是 successunsuccessful
date 指示稽核事件產生時間的時間戳記。
threadId MySQL 執行緒的 ID。
queryId MySQL 查詢的 ID。
user 代表用戶端傳送的使用者名稱的字串。這可能與 privUser 值不同。
privUser 代表伺服器以哪位使用者身分驗證用戶端的字串。這是伺服器用於檢查權限的使用者名稱。可能與使用者值不同。
gcpIamAccount 代表 GCP IAM 帳戶或服務帳戶的字串。
ip 代表用戶端 IP 位址的字串。
host 代表用戶端主機名稱的字串。
errCode 作業失敗的 MySQL 錯誤代碼。請參閱 MySQL 伺服器錯誤訊息參考資料
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"
}

停用資料庫稽核功能

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

控制台

  1. 前往 Google Cloud 控制台的「Cloud SQL 執行個體」頁面。

    前往 Cloud SQL 執行個體

  2. 開啟執行個體並按一下 [編輯]
  3. 向下捲動至「旗標」區段。
  4. 如要設定在執行個體中未設定過的標記,請按一下「Add flag」,從下拉式選單中選擇 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 稽核記錄? 您必須啟用資料存取稽核記錄 (如設定資料存取稽核記錄一文所述)。此外,Cloud SQL 適用的 MySQL 稽核外掛程式需要稽核規則,才能稽核所需的稽核記錄。使用含有 `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

後續步驟