文件首頁
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


8.4.5.7 稽核日誌篩選

注意

若要讓稽核日誌篩選如這裡所述般運作,稽核日誌外掛程式以及隨附的稽核表格和函數必須安裝。如果安裝外掛程式時沒有隨附規則式篩選所需的稽核表格和函數,則外掛程式將以舊式篩選模式運作,如第 8.4.5.10 節,「舊式模式稽核日誌篩選」中所述。舊式模式(已棄用)是 MySQL 5.7.13 之前的篩選行為;也就是說,在引入規則式篩選之前。

稽核日誌篩選的屬性

稽核日誌外掛程式能夠藉由篩選稽核事件來控制其記錄

  • 可以使用下列特性篩選稽核事件

    • 使用者帳戶

    • 稽核事件類別

    • 稽核事件子類別

    • 稽核事件欄位,例如指示操作狀態或已執行 SQL 陳述式的欄位

  • 稽核篩選是規則式的

    • 篩選定義會建立一組稽核規則。可以將定義設定為根據剛剛描述的特性,包含或排除事件以進行記錄。

    • 篩選規則除了現有的事件記錄功能外,還能夠封鎖(中止)符合條件的事件的執行。

    • 可以定義多個篩選,並且任何指定的篩選都可以指派給任意數量的使用者帳戶。

    • 可以定義預設篩選,以用於沒有明確指派篩選的任何使用者帳戶。

    稽核日誌篩選用於實作元件服務。若要取得該版本提供的選擇性查詢統計資料,請使用服務元件將其設定為篩選,該元件會實作將統計資料寫入稽核日誌的服務。如需設定此篩選的指示,請參閱新增離群值偵測查詢統計資料

    如需撰寫篩選規則的相關資訊,請參閱第 8.4.5.8 節,「撰寫稽核日誌篩選定義」

  • 可以使用以函數呼叫為基礎的 SQL 介面來定義和修改稽核篩選。若要顯示稽核篩選,請查詢 mysql.audit_log_filter 表格。

  • 稽核篩選器定義儲存在 mysql 系統資料庫的表格中。

  • 在給定的連線階段中,唯讀的 audit_log_filter_id 系統變數值會指示是否有篩選器被指派給該連線階段。

注意

預設情況下,基於規則的稽核日誌篩選不會記錄任何使用者的可稽核事件。若要記錄所有使用者的所有可稽核事件,請使用以下陳述式,這些陳述式會建立一個簡單的篩選器來啟用記錄,並將其指派給預設帳戶。

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('%', 'log_all');

指派給 % 的篩選器用於來自任何沒有明確指派篩選器的帳戶的連線 (這在最初對所有帳戶來說都是如此)。

如先前所述,稽核篩選控制的 SQL 介面是基於函數的。以下列表簡要總結了這些函數:

關於篩選函數的使用範例和完整詳細資訊,請參閱使用稽核日誌篩選函數稽核日誌函數

稽核日誌篩選函數的限制

稽核日誌篩選函數受限於以下限制:

  • 若要使用任何篩選函數,必須啟用 audit_log 外掛程式,否則會發生錯誤。此外,稽核表格必須存在,否則也會發生錯誤。若要安裝 audit_log 外掛程式及其隨附的函數和表格,請參閱第 8.4.5.2 節,「安裝或解除安裝 MySQL Enterprise Audit」

  • 若要使用任何篩選函數,使用者必須擁有 AUDIT_ADMINSUPER 權限,否則會發生錯誤。若要將其中一個權限授予使用者帳戶,請使用以下陳述式:

    GRANT privilege ON *.* TO user;

    或者,如果您希望避免授予 AUDIT_ADMINSUPER 權限,同時仍允許使用者存取特定的篩選函數,則可以定義 包裝函式 預存程式。此技術在金鑰環函數的背景下進行描述,請參閱使用通用金鑰環函數;它可以調整用於篩選函數。

  • 如果安裝了 audit_log 外掛程式,但未建立隨附的稽核表格和函數,則該外掛程式會以舊版模式執行。外掛程式會在伺服器啟動時將這些訊息寫入錯誤日誌:

    [Warning] Plugin audit_log reported: 'Failed to open the audit log filter tables.'
    [Warning] Plugin audit_log reported: 'Audit Log plugin supports a filtering,
    which has not been installed yet. Audit Log plugin will run in the legacy
    mode, which will be disabled in the next release.'

    在已棄用的舊版模式中,只能根據事件帳戶或狀態進行篩選。有關詳細資訊,請參閱第 8.4.5.10 節,「舊版模式稽核日誌篩選」

  • 理論上,具有足夠權限的使用者可能會錯誤地在稽核日誌篩選器中建立一個 中止 項目,導致他們自己和其他管理員無法存取系統。AUDIT_ABORT_EXEMPT 權限可允許使用者帳戶的查詢始終執行,即使 中止 項目會阻止它們。因此,具有此權限的帳戶可用於在稽核錯誤配置後重新取得對系統的存取權。查詢仍會記錄在稽核日誌中,但由於該權限,查詢會被允許,而不是被拒絕。

    使用 SYSTEM_USER 權限建立的帳戶在建立時會自動指派 AUDIT_ABORT_EXEMPT 權限。如果您執行升級程序,且沒有現有帳戶指派了該權限,則也會將 AUDIT_ABORT_EXEMPT 權限指派給具有 SYSTEM_USER 權限的現有帳戶。

使用稽核日誌篩選函數

在使用稽核日誌函數之前,請按照第 8.4.5.2 節,「安裝或解除安裝 MySQL Enterprise Audit」中提供的說明安裝它們。使用這些函數中的任何一個都需要 AUDIT_ADMINSUPER 權限。

稽核日誌篩選函數透過提供介面來建立、修改和移除篩選器定義,並將篩選器指派給使用者帳戶,從而實現篩選控制。

篩選器定義是 JSON 值。有關在 MySQL 中使用 JSON 資料的資訊,請參閱第 13.5 節,「JSON 資料類型」。本節將顯示一些簡單的篩選器定義。有關篩選器定義的更多資訊,請參閱第 8.4.5.8 節,「撰寫稽核日誌篩選器定義」

當連線到達時,稽核日誌外掛程式會透過在目前的篩選器指派中搜尋使用者帳戶名稱來決定要用於新連線階段的篩選器:

  • 如果篩選器已指派給使用者,則稽核日誌會使用該篩選器。

  • 否則,如果不存在使用者特定的篩選器指派,但存在指派給預設帳戶 (%) 的篩選器,則稽核日誌會使用預設篩選器。

  • 否則,稽核日誌不會從連線階段中選取任何稽核事件進行處理。

如果在連線階段期間發生變更使用者操作 (請參閱 mysql_change_user()),則會使用相同的規則更新連線階段的篩選器指派,但適用於新使用者。

預設情況下,沒有帳戶指派篩選器,因此不會對任何帳戶執行可稽核事件的處理。

假設您想要將預設值變更為僅記錄與連線相關的活動 (例如,查看連線、變更使用者和斷開連線事件,但不查看使用者在連線時執行的 SQL 陳述式)。若要達成此目的,請定義一個篩選器 (此處顯示為名為 log_conn_events),該篩選器僅啟用記錄 connection 類別中的事件,並將該篩選器指派給預設帳戶,以 % 帳戶名稱表示。

SET @f = '{ "filter": { "class": { "name": "connection" } } }';
SELECT audit_log_filter_set_filter('log_conn_events', @f);
SELECT audit_log_filter_set_user('%', 'log_conn_events');

現在,稽核日誌會針對來自任何沒有明確定義篩選器的帳戶的連線使用此預設帳戶篩選器。

若要明確將篩選器指派給特定使用者帳戶或多個帳戶,請定義篩選器,然後將其指派給相關的帳戶:

SELECT audit_log_filter_set_filter('log_all', '{ "filter": { "log": true } }');
SELECT audit_log_filter_set_user('user1@localhost', 'log_all');
SELECT audit_log_filter_set_user('user2@localhost', 'log_all');

現在,已針對 user1@localhostuser2@localhost 啟用完整記錄。來自其他帳戶的連線會繼續使用預設帳戶篩選器進行篩選。

若要將使用者帳戶與其目前的篩選器取消關聯,請解除指派篩選器或指派不同的篩選器:

  • 若要解除指派使用者帳戶的篩選器:

    SELECT audit_log_filter_remove_user('user1@localhost');

    該帳戶的目前連線階段的篩選不受影響。來自該帳戶的後續連線會使用預設帳戶篩選器 (如果有的話) 進行篩選,否則不會記錄。

  • 若要將不同的篩選器指派給使用者帳戶:

    SELECT audit_log_filter_set_filter('log_nothing', '{ "filter": { "log": false } }');
    SELECT audit_log_filter_set_user('user1@localhost', 'log_nothing');

    該帳戶的目前連線階段的篩選不受影響。來自該帳戶的後續連線會使用新的篩選器進行篩選。對於此處顯示的篩選器,這表示不會記錄來自 user1@localhost 的新連線。

對於稽核日誌篩選,使用者名稱和主機名稱的比較區分大小寫。這與用於權限檢查的比較不同,後者主機名稱的比較不區分大小寫。

若要移除篩選器,請執行以下操作:

SELECT audit_log_filter_remove_filter('log_nothing');

移除篩選器也會將其從指派給它的任何使用者解除指派,包括這些使用者的任何目前連線階段。

剛剛描述的篩選函數會立即影響稽核篩選,並更新 mysql 系統資料庫中儲存篩選器和使用者帳戶的稽核日誌表格 (請參閱稽核日誌表格)。也可以使用 INSERTUPDATEDELETE 等陳述式直接修改稽核日誌表格,但此類變更不會立即影響篩選。若要刷新您的變更並使其生效,請呼叫 audit_log_filter_flush()

SELECT audit_log_filter_flush();
警告

audit_log_filter_flush() 應僅在直接修改稽核表格後使用,以強制重新載入所有篩選器。否則,應避免使用此函數。實際上,它是卸載和重新載入 audit_log 外掛程式的簡化版本,使用 UNINSTALL PLUGININSTALL PLUGIN

audit_log_filter_flush() 會影響所有目前的連線階段,並使其與之前的篩選器分離。除非目前連線階段斷開連線並重新連線,或執行變更使用者操作,否則不再記錄它們。

若要判斷篩選器是否已指派給目前的連線階段,請檢查唯讀的 audit_log_filter_id 系統變數的連線階段值。如果值為 0,則表示未指派篩選器。非零值表示指派的篩選器在內部維護的 ID。

mysql> SELECT @@audit_log_filter_id;
+-----------------------+
| @@audit_log_filter_id |
+-----------------------+
|                     2 |
+-----------------------+