文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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.34,「事件類別和子類別組合」描述了每個事件類別允許的子類別值。

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

事件類別 事件子類別 描述
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.35,「每個事件類別和子類別組合的記錄和中止特性」描述了每個事件子類別是否可以記錄或中止。

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

事件類別 事件子類別 可以記錄 可以中止
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.36,「連線事件欄位」指示 connection 事件允許的欄位。

表 8.36 連線事件欄位

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

事件狀態

0:正常

其他:失敗

connection_id 無號整數 連線 ID
user.str 字串 驗證期間指定的使用者名稱
user.length 無號整數 使用者名稱長度
priv_user.str 字串 已驗證的使用者名稱(帳戶使用者名稱)
priv_user.length 無號整數 已驗證的使用者名稱長度
external_user.str 字串 外部使用者名稱(由協力廠商驗證外掛程式提供)
external_user.length 無號整數 外部使用者名稱長度
proxy_user.str 字串 Proxy 使用者名稱
proxy_user.length 無號整數 Proxy 使用者名稱長度
host.str 字串 已連線的使用者主機
host.length 無號整數 已連線的使用者主機長度
ip.str 字串 已連線的使用者 IP 位址
ip.length 無號整數 已連線的使用者 IP 位址長度
database.str 字串 連線時指定的資料庫名稱
database.length 無號整數 資料庫名稱長度
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.37,「一般事件欄位」指示 general 事件允許的欄位。

表 8.37 一般事件欄位

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

事件狀態

0:正常

其他:失敗

general_thread_id 無號整數 連線/執行緒 ID
general_user.str 字串 驗證期間指定的使用者名稱
general_user.length 無號整數 使用者名稱長度
general_command.str 字串 命令名稱
general_command.length 無號整數 命令名稱長度
general_query.str 字串 SQL 語句文字
general_query.length 無號整數 SQL 語句文字長度
general_host.str 字串 主機名稱
general_host.length 無號整數 主機名稱長度
general_sql_command.str 字串 SQL 命令類型名稱
general_sql_command.length 無號整數 SQL 命令類型名稱長度
general_external_user.str 字串 外部使用者名稱(由協力廠商驗證外掛程式提供)
general_external_user.length 無號整數 外部使用者名稱長度
general_ip.str 字串 已連線的使用者 IP 位址
general_ip.length 無號整數 連線使用者 IP 位址長度

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

general_command.str 欄位設定為 QueryExecute 時,general 事件會包含設定為值的 general_sql_command.str,該值會指定 SQL 命令的類型:alter_dbalter_db_upgradeadmin_commands 等等。可用的 general_sql_command.str 值可以視為此語句顯示的效能架構工具的最後一個組件:

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.38,「資料表存取事件欄位」指示 table_access 事件允許的欄位。

表 8.38 資料表存取事件欄位

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

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

  • 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 權限。當您執行升級程序時,如果沒有現有帳戶已指派該權限,則也會將 AUDIT_ABORT_EXEMPT 權限指派給具有 SYSTEM_USER 權限的現有帳戶。

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

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

對於由 name 項目選取的事件子類別,abort 動作為 true 或 false,具體取決於 condition 評估結果。如果條件評估為 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.35,“每個事件類別和子類別組合的記錄和中止特性”)。對於無法被封鎖的事件,稽核日誌會在錯誤日誌中寫入警告,而不是封鎖它。

對於嘗試定義一個篩選器,其中 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,則此條件為真,否則為假。

範例

{
  "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.39,“audit_log_connection_policy_value 值” 顯示了允許的值以及對應的 audit_log_connection_policy 值。

    表 8.39 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.40,“audit_log_policy_value 值” 顯示了允許的值以及對應的 audit_log_policy 值。

    表 8.40 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.41,“audit_log_statement_policy_value 值” 顯示了允許的值以及對應的 audit_log_statement_policy 值。

    表 8.41 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.42,“可以取代的事件欄位” 顯示了哪些欄位可以在哪些事件類別中被取代。

    表 8.42 可以取代的事件欄位

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

  • 取代是有條件的。篩選器定義中的每個取代規格都包含一個條件,使得可取代的欄位可以被變更或保持不變,具體取決於條件結果。

  • 如果發生取代,則取代規格會使用允許用於該目的的函式指示取代值。

表 8.42,“可以取代的事件欄位” 所示,目前唯一可以取代的欄位是包含陳述式文字的欄位 (發生在 generaltable_access 類別的事件中)。此外,唯一允許用於指定取代值的函式是 query_digest。這表示唯一允許的取代操作是將陳述式文字取代為其對應的摘要。

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

欄位替換可以在不同的事件細微度層級進行

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

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

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

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

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

  • name:要進行(可能)替換的欄位。field_name 必須是表 8.42,「受替換影響的事件欄位」中顯示的其中一個欄位。

  • 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 ? 的陳述式為 true,因此僅對不符合摘要的陳述式執行替換

"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 系統變數的值無關。