文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  編寫稽核日誌篩選器定義

8.4.5.8 編寫稽核日誌篩選器定義

篩選器定義是 JSON 值。如需在 MySQL 中使用 JSON 資料的相關資訊,請參閱第 13.5 節, 「JSON 資料類型」

篩選器定義具有以下格式,其中 actions 表示如何進行篩選

{ "filter": actions }

以下討論描述篩選器定義中允許的結構。

記錄所有事件

若要明確啟用或停用記錄所有事件,請在篩選器中使用 log 項目

{
  "filter": { "log": true }
}

log 值可以是 truefalse

上述篩選器會啟用記錄所有事件。它等同於

{
  "filter": { }
}

記錄行為取決於 log 值,以及是否指定 classevent 項目

  • 若指定 log,則會使用其指定的值。

  • 若未指定 log,則如果未指定 classevent 項目,記錄為 true,否則為 false(在這種情況下,classevent 可以包含自己的 log 項目)。

記錄特定事件類別

若要記錄特定類別的事件,請在篩選器中使用 class 項目,其 name 欄位表示要記錄的類別名稱

{
  "filter": {
    "class": { "name": "connection" }
  }
}

name 值可以是 connectiongeneraltable_access,分別記錄連線、一般或資料表存取事件。

上述篩選器會啟用記錄 connection 類別中的事件。它等同於下列篩選器,其中 log 項目為明確

{
  "filter": {
    "log": false,
    "class": { "log": true,
               "name": "connection" }
  }
}

若要啟用記錄多個類別,請將 class 值定義為 JSON 陣列元素,其中命名類別

{
  "filter": {
    "class": [
      { "name": "connection" },
      { "name": "general" },
      { "name": "table_access" }
    ]
  }
}
注意

當在篩選器定義中的同一層級出現多個給定項目的實例時,這些項目的值可以合併到一個陣列值中的單個項目實例中。先前的定義可以這樣寫:

{
  "filter": {
    "class": [
      { "name": [ "connection", "general", "table_access" ] }
    ]
  }
}
記錄特定事件子類別

若要選取特定的事件子類別,請使用包含 name 項目的 event 項目,其中 name 項目會指定子類別的名稱。由 event 項目選取的事件預設動作是記錄它們。例如,以下篩選器啟用具名事件子類別的記錄功能:

{
  "filter": {
    "class": [
      {
        "name": "connection",
        "event": [
          { "name": "connect" },
          { "name": "disconnect" }
        ]
      },
      { "name": "general" },
      {
        "name": "table_access",
        "event": [
          { "name": "insert" },
          { "name": "delete" },
          { "name": "update" }
        ]
      }
    ]
  }
}

event 項目也可以包含明確的 log 項目,以指示是否要記錄符合條件的事件。此 event 項目會選取多個事件,並明確指出它們的記錄行為:

"event": [
  { "name": "read", "log": false },
  { "name": "insert", "log": true },
  { "name": "delete", "log": true },
  { "name": "update", "log": true }
]

如果 event 項目包含 abort 項目,也可以指示是否要封鎖符合條件的事件。如需詳細資訊,請參閱封鎖特定事件的執行

表 8.35,「事件類別和子類別組合」說明每個事件類別允許的子類別值。

表 8.35 事件類別和子類別組合

事件類別 事件子類別 描述
connection connect 連線初始化(成功或失敗)
connection change_user 在工作階段期間使用不同的使用者/密碼重新驗證使用者
connection disconnect 連線終止
general status 一般操作資訊
message internal 內部產生的訊息
message user audit_api_message_emit_udf() 產生的訊息
table_access read 資料表讀取語句,例如 SELECTINSERT INTO ... SELECT
table_access delete 資料表刪除語句,例如 DELETETRUNCATE TABLE
table_access insert 資料表插入語句,例如 INSERTREPLACE
table_access update 資料表更新語句,例如 UPDATE

表 8.36,「每個事件類別和子類別組合的記錄和中止特性」描述每個事件子類別是否可以記錄或中止。

表 8.36 每個事件類別和子類別組合的記錄和中止特性

事件類別 事件子類別 可以記錄 可以中止
connection connect
connection change_user
connection disconnect
general status
message internal
message user
table_access read
table_access delete
table_access insert
table_access update

包含式和排除式記錄

篩選器可以定義為包含式或排除式模式

  • 包含式模式只會記錄明確指定的項目。

  • 排除式模式會記錄所有項目,但明確指定的項目除外。

若要執行包含式記錄,請全域停用記錄功能,並為特定類別啟用記錄功能。此篩選器會記錄 connection 類別中的 connectdisconnect 事件,以及 general 類別中的事件:

{
  "filter": {
    "log": false,
    "class": [
      {
        "name": "connection",
        "event": [
          { "name": "connect", "log": true },
          { "name": "disconnect", "log": true }
        ]
      },
      { "name": "general", "log": true }
    ]
  }
}

若要執行排除式記錄,請全域啟用記錄功能,並為特定類別停用記錄功能。此篩選器會記錄所有項目,但 general 類別中的事件除外:

{
  "filter": {
    "log": true,
    "class":
      { "name": "general", "log": false }
  }
}

此篩選器會記錄 connection 類別中的 change_user 事件、message 事件和 table_access 事件,因為它不會記錄其他所有項目:

{
  "filter": {
    "log": true,
    "class": [
      {
        "name": "connection",
        "event": [
          { "name": "connect", "log": false },
          { "name": "disconnect", "log": false }
        ]
      },
      { "name": "general", "log": false }
    ]
  }
}
測試事件欄位值

若要根據特定的事件欄位值啟用記錄功能,請在 log 項目中指定一個 field 項目,其中指示欄位名稱及其預期的值:

{
  "filter": {
    "class": {
    "name": "general",
      "event": {
        "name": "status",
        "log": {
          "field": { "name": "general_command.str", "value": "Query" }
        }
      }
    }
  }
}

每個事件都包含事件類別特定的欄位,可以從篩選器內存取這些欄位,以執行自訂的篩選功能。

connection 類別中的事件表示工作階段期間發生與連線相關的活動,例如使用者連線或中斷與伺服器的連線。表 8.37,「連線事件欄位」表示 connection 事件允許的欄位。

表 8.37 連線事件欄位

欄位名稱 欄位類型 描述
status integer

事件狀態

0:確定

其他:失敗

connection_id unsigned integer 連線 ID
user.str string 驗證期間指定的使用者名稱
user.length unsigned integer 使用者名稱長度
priv_user.str string 已驗證的使用者名稱(帳戶使用者名稱)
priv_user.length unsigned integer 已驗證的使用者名稱長度
external_user.str string 外部使用者名稱(由第三方驗證外掛程式提供)
external_user.length unsigned integer 外部使用者名稱長度
proxy_user.str string Proxy 使用者名稱
proxy_user.length unsigned integer Proxy 使用者名稱長度
host.str string 連線的使用者主機
host.length unsigned integer 連線的使用者主機長度
ip.str string 連線的使用者 IP 位址
ip.length unsigned integer 連線的使用者 IP 位址長度
database.str string 連線時指定的資料庫名稱
database.length unsigned integer 資料庫名稱長度
connection_type integer

連線類型

0 或 "::undefined":未定義

1 或 "::tcp/ip":TCP/IP

2 或 "::socket":Socket

3 或 "::named_pipe":具名管道

4 或 "::ssl":使用加密的 TCP/IP

5 或 "::shared_memory":共用記憶體


"::xxx" 值是符號偽常數,可以給定而不是文字數值。它們必須以字串形式引號,且區分大小寫。

general 類別中的事件表示操作的狀態碼及其詳細資料。表 8.38,「一般事件欄位」表示 general 事件允許的欄位。

表 8.38 一般事件欄位

欄位名稱 欄位類型 描述
general_error_code integer

事件狀態

0:確定

其他:失敗

general_thread_id unsigned integer 連線/執行緒 ID
general_user.str string 驗證期間指定的使用者名稱
general_user.length unsigned integer 使用者名稱長度
general_command.str string 命令名稱
general_command.length unsigned integer 命令名稱長度
general_query.str string SQL 語句文字
general_query.length unsigned integer SQL 語句文字長度
general_host.str string 主機名稱
general_host.length unsigned integer 主機名稱長度
general_sql_command.str string SQL 命令類型名稱
general_sql_command.length unsigned integer SQL 命令類型名稱長度
general_external_user.str string 外部使用者名稱(由第三方驗證外掛程式提供)
general_external_user.length unsigned integer 外部使用者名稱長度
general_ip.str string 連線的使用者 IP 位址
general_ip.length unsigned integer 連線使用者 IP 位址長度

general_command.str 表示命令名稱:QueryExecuteQuitChange user

general_command.str 欄位設定為 QueryExecutegeneral 事件包含設定為值的 general_sql_command.str,該值指定 SQL 命令的類型:alter_dbalter_db_upgradeadmin_commands 等等。可以將可用的 general_sql_command.str 值視為此語句顯示的 Performance Schema 工具的最後組件:

mysql> SELECT NAME FROM performance_schema.setup_instruments
       WHERE NAME LIKE 'statement/sql/%' ORDER BY NAME;
+---------------------------------------+
| NAME                                  |
+---------------------------------------+
| statement/sql/alter_db                |
| statement/sql/alter_db_upgrade        |
| statement/sql/alter_event             |
| statement/sql/alter_function          |
| statement/sql/alter_instance          |
| statement/sql/alter_procedure         |
| statement/sql/alter_server            |
...

table_access 類別中的事件提供有關特定類型資料表存取權的資訊。表 8.39,「資料表存取事件欄位」表示 table_access 事件允許的欄位。

表 8.39 資料表存取事件欄位

欄位名稱 欄位類型 描述
connection_id unsigned integer 事件連線 ID
sql_command_id integer SQL 命令 ID
query.str string SQL 語句文字
query.length unsigned integer SQL 語句文字長度
table_database.str string 與事件相關聯的資料庫名稱
table_database.length unsigned integer 資料庫名稱長度
table_name.str string 與事件相關聯的資料表名稱
table_name.length unsigned integer 資料表名稱長度

以下清單顯示哪些語句產生哪些資料表存取事件

  • read 事件

    • SELECT

    • INSERT ... SELECT(用於 SELECT 子句中參考的資料表)

    • REPLACE ... SELECT(用於 SELECT 子句中參考的資料表)

    • UPDATE ... WHERE(用於 WHERE 子句中參考的資料表)

    • HANDLER ... READ

  • delete 事件

    • DELETE

    • TRUNCATE TABLE

  • insert 事件

    • INSERT

    • INSERT ... SELECT(用於 INSERT 子句中參考的資料表)

    • REPLACE

    • REPLACE ... SELECT(用於 REPLACE 子句中參考的資料表)

    • LOAD DATA

    • LOAD XML

  • update 事件

    • UPDATE

    • UPDATE ... WHERE(用於 UPDATE 子句中參考的資料表)

封鎖特定事件的執行

event 項目可以包含 abort 項目,此項目指示是否要防止符合條件的事件執行。abort 啟用規則的撰寫,可以封鎖特定 SQL 語句的執行。

重要事項

理論上,擁有足夠權限的使用者可能會錯誤地在稽核日誌篩選器中建立 abort 項目,而該項目會阻止他們自己和其他管理員存取系統。 AUDIT_ABORT_EXEMPT 權限可用於允許使用者帳戶的查詢始終執行,即使 abort 項目會封鎖它們。因此,擁有此權限的帳戶可用於在稽核組態錯誤後重新取得系統存取權。查詢仍然會記錄在稽核日誌中,但它會因為該權限而被允許執行,而不是被拒絕。

使用 SYSTEM_USER 權限建立的帳戶,在建立時會自動被賦予 AUDIT_ABORT_EXEMPT 權限。當您執行升級程序時,如果沒有現有帳戶被賦予該權限,則具有 SYSTEM_USER 權限的現有帳戶也會被賦予 AUDIT_ABORT_EXEMPT 權限。

abort 項目必須出現在 event 項目內。例如:

"event": {
  "name": qualifying event subclass names
  "abort": condition
}

對於由 name 項目選取的事件子類別,abort 動作會根據 condition 的評估結果為 true 或 false。如果條件評估結果為 true,則事件會被封鎖。否則,事件會繼續執行。

condition 規範可以簡單到如 truefalse,也可以更複雜,使其評估取決於事件的特性。

此篩選器會封鎖 INSERTUPDATEDELETE 陳述式

{
  "filter": {
    "class": {
      "name": "table_access",
      "event": {
        "name": [ "insert", "update", "delete" ],
        "abort": true
      }
    }
  }
}

這個更複雜的篩選器會封鎖相同的陳述式,但僅針對特定資料表 (finances.bank_account)

{
  "filter": {
    "class": {
      "name": "table_access",
      "event": {
        "name": [ "insert", "update", "delete" ],
        "abort": {
          "and": [
            { "field": { "name": "table_database.str", "value": "finances" } },
            { "field": { "name": "table_name.str", "value": "bank_account" } }
          ]
        }
      }
    }
  }
}

篩選器所比對和封鎖的陳述式會向用戶端傳回錯誤

ERROR 1045 (28000): Statement was aborted by an audit log filter

並非所有事件都可以被封鎖(請參閱表 8.36,「每個事件類別和子類別組合的記錄和中止特性」)。對於無法封鎖的事件,稽核日誌會在錯誤日誌中寫入警告,而不是封鎖它。

對於嘗試定義 abort 項目出現在 event 項目以外的位置的篩選器,會發生錯誤。

邏輯運算子

邏輯運算子 (andornot) 允許建構複雜的條件,從而能夠編寫更進階的篩選設定。以下 log 項目僅記錄具有特定值和長度的 general_command 欄位的 general 事件

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "log": {
          "or": [
            {
              "and": [
                { "field": { "name": "general_command.str",    "value": "Query" } },
                { "field": { "name": "general_command.length", "value": 5 } }
              ]
            },
            {
              "and": [
                { "field": { "name": "general_command.str",    "value": "Execute" } },
                { "field": { "name": "general_command.length", "value": 7 } }
              ]
            }
          ]
        }
      }
    }
  }
}
參考預先定義的變數

若要在 log 條件中參考預先定義的變數,請使用 variable 項目,該項目會採用 namevalue 項目,並測試指定變數與給定值是否相等

"variable": {
  "name": "variable_name",
  "value": comparison_value
}

如果 variable_name 的值為 comparison_value,則為 true,否則為 false。

範例

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "log": {
          "variable": {
            "name": "audit_log_connection_policy_value",
            "value": "::none"
          }
        }
      }
    }
  }
}

每個預先定義的變數都對應到一個系統變數。透過編寫測試預先定義變數的篩選器,您可以在不重新定義篩選器的情況下,透過設定對應的系統變數來修改篩選器的操作。例如,透過編寫測試 audit_log_connection_policy_value 預先定義變數的值的篩選器,您可以透過變更 audit_log_connection_policy 系統變數的值來修改篩選器的操作。

audit_log_xxx_policy 系統變數用於已棄用的舊版模式稽核日誌(請參閱第 8.4.5.10 節,「舊版模式稽核日誌篩選」)。使用以規則為基礎的稽核日誌篩選時,這些變數仍然可見(例如,使用 SHOW VARIABLES),但除非您編寫包含參考它們的結構的篩選器,否則對它們的變更沒有任何作用。

以下清單描述了 variable 項目允許的預先定義變數

  • audit_log_connection_policy_value

    此變數對應於 audit_log_connection_policy 系統變數的值。該值是一個不帶正負號的整數。表 8.40,「audit_log_connection_policy_value 值」顯示允許的值和對應的 audit_log_connection_policy 值。

    表 8.40 audit_log_connection_policy_value 值

    對應的 audit_log_connection_policy 值
    0"::none" NONE
    1"::errors" ERRORS
    2"::all" ALL

    "::xxx" 值是符號偽常數,可以給定而不是文字數值。它們必須以字串形式引號,且區分大小寫。

  • audit_log_policy_value

    此變數對應於 audit_log_policy 系統變數的值。該值是一個不帶正負號的整數。表 8.41,「audit_log_policy_value 值」顯示允許的值和對應的 audit_log_policy 值。

    表 8.41 audit_log_policy_value 值

    對應的 audit_log_policy 值
    0"::none" NONE
    1"::logins" LOGINS
    2"::all" ALL
    3"::queries" QUERIES

    "::xxx" 值是符號偽常數,可以給定而不是文字數值。它們必須以字串形式引號,且區分大小寫。

  • audit_log_statement_policy_value

    此變數對應於 audit_log_statement_policy 系統變數的值。該值是一個不帶正負號的整數。表 8.42,「audit_log_statement_policy_value 值」顯示允許的值和對應的 audit_log_statement_policy 值。

    表 8.42 audit_log_statement_policy_value 值

    對應的 audit_log_statement_policy 值
    0"::none" NONE
    1"::errors" ERRORS
    2"::all" ALL

    "::xxx" 值是符號偽常數,可以給定而不是文字數值。它們必須以字串形式引號,且區分大小寫。

參考預先定義的函數

若要在 log 條件中參考預先定義的函數,請使用 function 項目,該項目會採用 nameargs 項目,以分別指定函數名稱及其引數

"function": {
  "name": "function_name",
  "args": arguments
}

name 項目應僅指定函數名稱,不帶括號或引數清單。

args 項目必須滿足以下條件

  • 如果函數不帶引數,則不應給定 args 項目。

  • 如果函數確實帶有引數,則需要 args 項目,並且引數必須按照函數描述中列出的順序給定。引數可以參考預先定義的變數、事件欄位或字串或數值常數。

如果引數數量不正確,或引數不是函數所需的正確資料類型,則會發生錯誤。

範例

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "log": {
          "function": {
            "name": "find_in_include_list",
            "args": [ { "string": [ { "field": "user.str" },
                                    { "string": "@"},
                                    { "field": "host.str" } ] } ]
          }
        }
      }
    }
  }
}

先前的篩選器會根據目前使用者是否在 audit_log_include_accounts 系統變數中找到,來決定是否記錄 general 類別 status 事件。該使用者是使用事件中的欄位建構的。

以下清單描述了 function 項目允許的預先定義函數

  • audit_log_exclude_accounts_is_null()

    檢查 audit_log_exclude_accounts 系統變數是否為 NULL。在定義對應於舊版稽核日誌實作的篩選器時,此函數可能會很有用。

    引數

    無。

  • audit_log_include_accounts_is_null()

    檢查 audit_log_include_accounts 系統變數是否為 NULL。在定義對應於舊版稽核日誌實作的篩選器時,此函數可能會很有用。

    引數

    無。

  • debug_sleep(millisec)

    休眠指定的毫秒數。此函數用於效能測量。

    debug_sleep() 僅適用於偵錯組建。

    引數

    • millisec:一個不帶正負號的整數,指定要休眠的毫秒數。

  • find_in_exclude_list(account)

    檢查稽核日誌排除清單(audit_log_exclude_accounts 系統變數的值)中是否存在帳戶字串。

    引數

    • account:一個字串,指定使用者帳戶名稱。

  • find_in_include_list(account)

    檢查稽核日誌包含清單(audit_log_include_accounts 系統變數的值)中是否存在帳戶字串。

    引數

    • account:一個字串,指定使用者帳戶名稱。

  • query_digest([str])

    此函數的行為會因是否給定引數而異

    • 若不帶引數,query_digest 會傳回目前事件中與陳述式文字對應的陳述式摘要值。

    • 若帶有引數,query_digest 會傳回一個布林值,指示引數是否等於目前的陳述式摘要。

    引數

    • str:此引數為選用。如果給定,則它會指定要與目前事件中陳述式的摘要進行比較的陳述式摘要。

    範例

    這個 function 項目不包含引數,因此 query_digest 會以字串形式傳回目前的陳述式摘要

    "function": {
      "name": "query_digest"
    }

    這個 function 項目包含引數,因此 query_digest 會傳回一個布林值,指示引數是否等於目前的陳述式摘要

    "function": {
      "name": "query_digest",
      "args": "SELECT ?"
    }
  • string_find(text, substr)

    檢查 substr 值是否包含在 text 值中。此搜尋會區分大小寫。

    引數

    • text:要搜尋的文字字串。

    • substr:要在 text 中搜尋的子字串。

事件欄位值取代

稽核篩選器定義支援取代某些稽核事件欄位,以便記錄的事件包含取代值,而不是原始值。此功能讓記錄的稽核記錄能夠包含陳述式摘要,而不是文字陳述式,這對於陳述式可能會暴露敏感值的 MySQL 部署很有用。

稽核事件中的欄位取代是這樣運作的

  • 欄位取代是在稽核篩選器定義中指定的,因此必須依照第 8.4.5.7 節,「稽核日誌篩選」所述啟用稽核日誌篩選。

  • 並非所有欄位都可以被取代。表 8.43,「可取代的事件欄位」顯示哪些欄位可在哪些事件類別中取代。

    表 8.43 可取代的事件欄位

    事件類別 欄位名稱
    general general_query.str
    table_access query.str

  • 取代是有條件的。篩選器定義中的每個取代規範都包含一個條件,能夠根據條件結果變更或保留可取代的欄位。

  • 如果發生取代,則取代規範會使用允許用於該用途的函數來指示取代值。

表 8.43,「可替換的事件欄位」所示,目前唯一可替換的欄位是那些包含陳述式文字的欄位(發生在generaltable_access類別的事件中)。此外,指定替換值的唯一允許函數是query_digest。這表示唯一允許的替換操作是用其對應的摘要替換陳述式文字。

由於欄位替換發生在早期稽核階段(在篩選期間),無論稍後寫入的日誌格式如何(也就是說,無論稽核日誌外掛程式產生 XML 還是 JSON 輸出),是否寫入陳述式文字或摘要值的選擇都適用。

欄位替換可以在不同的事件粒度層級發生

  • 若要對類別中的所有事件執行欄位替換,請在類別層級篩選事件。

  • 若要以更細微的方式執行替換,請加入其他事件選取項目。例如,您可以僅對給定事件類別的特定子類別執行欄位替換,或者僅在欄位具有特定特性的事件中執行。

在篩選定義中,透過包含print項目來指定欄位替換,其語法如下

"print": {
  "field": {
    "name": "field_name",
    "print": condition,
    "replace": replacement_value
  }
}

print項目中,其field項目會採用以下三個項目,以指示是否以及如何進行替換

  • name:可能發生替換的欄位。field_name必須是表 8.43,「可替換的事件欄位」中顯示的其中一個。

  • print:決定保留原始欄位值或替換它的條件

    • 如果condition評估為true,則欄位保持不變。

    • 如果condition評估為false,則會使用replace項目的值進行替換。

    若要無條件地替換欄位,請指定如下的條件

    "print": false
  • replace:當print條件評估為false時要使用的替換值。使用function項目指定replacement_value

例如,此篩選定義適用於general類別中的所有事件,將陳述式文字替換為其摘要

{
  "filter": {
    "class": {
      "name": "general",
      "print": {
        "field": {
          "name": "general_query.str",
          "print": false,
          "replace": {
            "function": {
              "name": "query_digest"
            }
          }
        }
      }
    }
  }
}

前面的篩選器使用此print項目來無條件地將general_query.str中包含的陳述式文字替換為其摘要值

"print": {
  "field": {
    "name": "general_query.str",
    "print": false,
    "replace": {
      "function": {
        "name": "query_digest"
      }
    }
  }
}

print項目可以用不同的方式編寫,以實作不同的替換策略。剛才顯示的replace項目使用此function建構來指定替換文字,以傳回表示目前陳述式摘要的字串

"function": {
  "name": "query_digest"
}

query_digest函數也可以另一種方式使用,作為傳回布林值的比較器,使其能夠在print條件中使用。若要執行此操作,請提供一個引數,指定比較陳述式摘要

"function": {
  "name": "query_digest",
  "args": "digest"
}

在這種情況下,query_digest會根據目前的陳述式摘要是否與比較摘要相同而傳回truefalse。以這種方式使用query_digest可讓篩選定義偵測符合特定摘要的陳述式。以下建構中的條件僅對於摘要等於SELECT ?的陳述式為真,因此僅對不符合摘要的陳述式執行替換

"print": {
  "field": {
    "name": "general_query.str",
    "print": {
      "function": {
        "name": "query_digest",
        "args": "SELECT ?"
      }
    },
    "replace": {
      "function": {
        "name": "query_digest"
      }
    }
  }
}

若要僅對符合摘要的陳述式執行替換,請使用not反轉條件

"print": {
  "field": {
    "name": "general_query.str",
    "print": {
      "not": {
        "function": {
          "name": "query_digest",
          "args": "SELECT ?"
        }
      }
    },
    "replace": {
      "function": {
        "name": "query_digest"
      }
    }
  }
}

假設您希望稽核日誌僅包含陳述式摘要,而不包含文字陳述式。若要達成此目的,您必須對包含陳述式文字的所有事件執行替換;也就是說,generaltable_access類別中的事件。先前的篩選定義說明了如何無條件地替換general事件的陳述式文字。若要對table_access事件執行相同操作,請使用類似的篩選器,但將類別從general變更為table_access,並將欄位名稱從general_query.str變更為query.str

{
  "filter": {
    "class": {
      "name": "table_access",
      "print": {
        "field": {
          "name": "query.str",
          "print": false,
          "replace": {
            "function": {
              "name": "query_digest"
            }
          }
        }
      }
    }
  }
}

結合generaltable_access篩選器會產生單一篩選器,其會對所有包含陳述式文字的事件執行替換

{
  "filter": {
    "class": [
      {
        "name": "general",
        "print": {
          "field": {
            "name": "general_query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        }
      },
      {
        "name": "table_access",
        "print": {
          "field": {
            "name": "query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        }
      }
    ]
  }
}

若要僅對類別中的某些事件執行替換,請將項目新增至篩選器,以更具體地指示何時執行替換。以下篩選器適用於table_access類別中的事件,但僅對insertupdate事件執行替換(將readdelete事件保持不變)

{
  "filter": {
    "class": {
      "name": "table_access",
      "event": {
        "name": [
          "insert",
          "update"
        ],
        "print": {
          "field": {
            "name": "query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        }
      }
    }
  }
}

此篩選器對應於所列帳戶管理陳述式的general類別事件執行替換(其效果是隱藏陳述式中的憑證和資料值)

{
  "filter": {
    "class": {
      "name": "general",
      "event": {
        "name": "status",
        "print": {
          "field": {
            "name": "general_query.str",
            "print": false,
            "replace": {
              "function": {
                "name": "query_digest"
              }
            }
          }
        },
        "log": {
          "or": [
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "alter_user"
              }
            },
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "alter_user_default_role"
              }
            },
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "create_role"
              }
            },
            {
              "field": {
                "name": "general_sql_command.str",
                "value": "create_user"
              }
            }
          ]
        }
      }
    }
  }
}

有關可能的general_sql_command.str值,請參閱測試事件欄位值

替換使用者篩選器

在某些情況下,可以動態變更篩選定義。若要執行此操作,請在現有的filter中定義filter組態。例如

{
  "filter": {
    "id": "main",
    "class": {
      "name": "table_access",
      "event": {
        "name": [ "update", "delete" ],
        "log": false,
        "filter": {
          "class": {
            "name": "general",
            "event" : { "name": "status",
                        "filter": { "ref": "main" } }
          },
          "activate": {
            "or": [
              { "field": { "name": "table_name.str", "value": "temp_1" } },
              { "field": { "name": "table_name.str", "value": "temp_2" } }
            ]
          }
        }
      }
    }
  }
}

當子篩選器中的activate項目評估為true時,會啟用新的篩選器。不允許在頂層filter中使用activate

可以使用子篩選器內的ref項目來參考原始篩選器的id,將新的篩選器替換為原始篩選器。

顯示的篩選器運作方式如下

  • main篩選器會等待table_access事件,即updatedelete

  • 如果在temp_1temp_2表格上發生updatedelete table_access事件,則篩選器會被內部篩選器取代(不使用id,因為不需要明確參考)。

  • 如果命令的結尾有訊號(general / status事件),則會將項目寫入稽核日誌檔案,並將篩選器取代為main篩選器。

篩選器可用於記錄更新或刪除temp_1temp_2表格中任何內容的陳述式,例如這個陳述式

UPDATE temp_1, temp_3 SET temp_1.a=21, temp_3.a=23;

該陳述式會產生多個table_access事件,但稽核日誌檔案僅包含general / status項目。

注意

定義中使用的任何id值都僅相對於該定義進行評估。它們與audit_log_filter_id系統變數的值無關。