共用方式為


SQL Server Audit(資料庫引擎)

適用於:SQL ServerAzure SQL 受控執行個體

Auditing SQL Server Database Engine或個別資料庫的實例涉及追蹤並記錄資料庫引擎上發生的事件。 SQL Server 審計允許你建立伺服器稽核,這些稽核可以包含伺服器層級事件的伺服器稽核規範,以及資料庫層級事件的稽核規範。 稽核的事件可以寫入事件記錄或稽核檔案。

SQL Server 有多個稽核層級,視政府或安裝標準要求而定。 SQL Server Audit 提供你必須具備的工具與流程,以啟用、儲存及檢視各種伺服器與資料庫物件的稽核。

您可以依執行個體記錄伺服器稽核動作群組,並依資料庫記錄資料庫稽核動作群組或資料庫稽核動作。 每次遇到可稽核的動作時,就會發生此稽核事件。

本文適用於 SQL Server 與 Azure SQL 受控執行個體。

  • 所有版本的 SQL Server 都支援伺服器層級的稽核。 在 SQL Server 2016(13.x)及服務包 1 及更新版本中,所有版本皆支援資料庫層級稽核。 在 SQL Server 2016(13.x)之前,資料庫層級的審計僅限於企業版、開發版和評估版。 欲了解更多資訊,請參閱 Editions 及 2016 SQL Server 的支援功能。
  • 在 Azure SQL 受控執行個體 中,SQL Server 審計是受到支援的。此外,Azure SQL 受控執行個體 中的資料庫與 SQL Server 中的資料庫之間存在差異。
  • 關於 SQL 資料庫,請參見 Azure SQL Database 的稽核

SQL Server 審計元件

「稽核」 是針對特定伺服器動作或資料庫動作群組將幾個元素組合成單一封裝的動作。 SQL Server 稽核的各個元件結合起來產生稱為稽核的輸出,就像報告定義結合圖形和資料元素產生報告一樣。

SQL Server稽核使用 Extended Events來協助建立稽核。 如需擴充事件的詳細資訊,請參閱 擴充事件概觀

SQL Server 稽核

SQL Server Audit 物件收集單一伺服器或資料庫層級的動作實例,以及需監控的行動群組。 稽核是在 SQL Server 實例層級進行的。 你可以在每個 SQL Server 實例中進行多次稽核。

當您定義稽核時,會針對結果的輸出指定位置, 這就是稽核目的地。 這個稽核是在停用狀態建立的,且不會自動執行稽核。 在啟用稽核之後,稽核目的地會從稽核系統接收資料。

伺服器稽核規格

「伺服器稽核規格」物件屬於稽核。 你可以為每個稽核建立一個伺服器稽核規範,因為兩者都是在 SQL Server 實例範圍內建立的。

伺服器稽核規格會收集由擴充的事件功能所引發的許多伺服器層級動作群組。 您可以將「稽核動作群組」 併入伺服器稽核規格中。 稽核動作群組是預先定義的動作群組,這些動作是發生在 資料庫引擎 中的原子事件。 這些動作會傳送給稽核,然後它會在目標中記錄這些動作。

伺服器層級的稽核行動群組詳見文章SQL Server稽核行動群組與行動

注意

由於效能限制, tempdb 臨時資料表不會被稽核。 雖然批次完成的動作群組會擷取針對臨時表的語句,但可能無法正確填入物件名稱。 不過,一律會稽核源數據表,確保記錄從源數據表到臨時表的所有插入。

資料庫稽核規格

資料庫稽核規範物件也屬於SQL Server稽核。 你可以為每個稽核中的每個 SQL Server 資料庫建立一個資料庫稽核規範。

資料庫稽核規格會收集由擴充的事件功能所引發的資料庫層級稽核動作。 您可以將稽核動作群組或稽核事件加入資料庫稽核規格。 審計事件 是 SQL Server 引擎可稽核的原子動作。 「稽核動作群組」 是預先定義的動作群組。 兩者都屬於 SQL Server 資料庫範圍。 這些動作會傳送給稽核,然後它會在目標中記錄這些動作。 請勿在使用者資料庫稽核規範中包含伺服器範圍的對象,例如,系統檢視表。

資料庫層級的稽核行動群組與稽核行動,詳見文章 SQL Server稽核行動群組與行動

目標

稽核結果會傳送到目標,目標可能是檔案、Windows 安全性 事件日誌或 Windows 應用程式事件日誌。 記錄檔必須定期檢閱及封存,以確保目標有足夠的空間來寫入更多記錄。

重要

任何經過認證的使用者都可以讀取並寫入 Windows 應用程式事件日誌。 應用程式事件日誌所需的權限低於 Windows 安全性 事件日誌,且安全性低於 Windows 安全性 事件日誌。

寫入 Windows 安全性日誌需要將 SQL Server 服務帳號加入到 生成安全稽核政策。 根據預設,本機系統、本機服務和網路服務都是此原則的一部分。 您可以使用安全性原則嵌入式管理單元 (secpol.msc) 來設定這項設置。 此外,「稽核物件存取」安全性政策必須同時啟用「成功」和「失敗」。 您可以使用安全性原則嵌入式管理單元 (secpol.msc) 來設定這項設置。 在 Windows Vista 或 Windows Server 2008(及更高版本)中,你可以透過 audit policy 程式(AuditPol.exe)從命令列設定更細緻的 應用程式生成的 政策。 如需了解有關啟用寫入 Windows 安全性日誌步驟的更多資訊,請參閱 Write SQL Server Audit events to the Security log。 如需 Auditpol.exe 程式的詳細資訊,請參閱知識庫文章 921469: 如何使用「群組原則」進行詳細的安全性稽核設定。 Windows 事件日誌是全域性的,適用於 Windows 作業系統。 欲了解更多關於Windows事件日誌的資訊,請參閱 事件檢視器 Overview。 如果您需要更精確的稽核權限,請使用二進位檔案目標。

當您將稽核資訊儲存到檔案時,為了避免遭到篡改,您可以使用以下方式來限制對檔案位置的存取:

  • SQL Server 服務帳號必須同時具備讀取與寫入權限。

  • 稽核管理員通常需要讀取和寫入權限。 這假設稽核管理員是用於管理稽核檔案的 Windows 帳號,例如:複製檔案到不同共享資料夾、備份等。

  • 被授權可讀取稽核檔案的稽核讀取者必須擁有讀取權限。

即使 資料庫引擎 正在寫入檔案,其他 Windows 使用者只要有權限也能讀取該審核檔案。 資料庫引擎 不會使用獨佔鎖來阻止讀取操作。

由於資料庫引擎能存取檔案,SQL Server 擁有 CONTROL SERVER 權限的登入者可以使用該資料庫引擎存取稽核檔案。 在 SQL Server 2022(16.x)及之後版本中,VIEW SERVER SECURITY AUDIT 權限足以使用 fn_get_audit_file 讀取稽核檔案。 若要記錄正在讀取稽核檔案的任何使用者,請在 master.sys.fn_get_audit_file 上定義稽核。 此系統記錄透過 SQL Server 存取稽核檔案的 CONTROL SERVER 權限登入。 關於權限的更多資訊 fn_get_audit_file ,請參見 sys.fn_get_audit_file

如果稽核管理員將檔案複製到其他位置 (基於類似封存的理由),新位置的存取控制清單 (ACL) 應該降低為以下權限:

  • 稽核管理員 - 讀取/寫入
  • 審核閱讀器 - 閱讀

我們建議您從獨立的 SQL Server 實例產生稽核報告,例如 SQL Server Express 實例,該實例僅供稽核管理員或稽核讀取器存取。 透過使用獨立的 資料庫引擎 實例來報告,您可以協助防止未經授權的使用者取得稽核紀錄的存取權。

你可以透過使用 Windows BitLocker Drive 加密或 Windows 加密檔案系統,對存放稽核檔案的資料夾進行加密,提供額外的防範未經授權存取的保護。

欲了解更多寫入目標公司的審計紀錄資訊,請參閱SQL Server審計紀錄

使用 SQL Server 審計概述

你可以使用 SQL Server Management Studio 或 Transact-SQL 來定義審計。 建立並啟用稽核之後,目標會收到條目。

你可以用 Windows 裡的 事件檢視器 工具來讀取Windows事件日誌。 對於檔案目標,你可以使用 SQL Server Management Studio 中的 Log 檔案檢視器,或是 fn_get_audit_file 函式來讀取目標檔案。

建立及使用稽核的一般程序如下所示。

  1. 建立稽核,並定義目標。
  2. 建立與稽核對應的伺服器稽核規格或資料庫稽核規格。 啟用該稽核規格。
  3. 啟用稽核。
  4. 可使用 Windows 事件檢視器Log 檔案檢視器,或 fn_get_audit_file 函式讀取稽核事件。

如需詳細資訊,請參閱 建立伺服器稽核和伺服器稽核規格建立伺服器稽核和資料庫稽核規格

考量

在稽核初始期間發生失敗時,伺服器不會啟動。 在此情況下,可以使用命令行上的 選項來啟動 -f 伺服器。

當稽核失敗並因為稽核指定了 ON_FAILURE = SHUTDOWN 導致伺服器關閉或無法啟動時,MSG_AUDIT_FORCED_SHUTDOWN 事件會寫入記錄檔。 由於關閉將發生在初次遇到此設定時,所以此事件會寫入一次。 當稽核的失敗訊息造成伺服器關閉之後,將會寫入此事件。 管理員可以透過使用 -m 旗標以單一使用者模式啟動SQL Server,繞過稽核引發的關機。 如果您以單一使用者模式啟動,您會將指定在該 ON_FAILURE = SHUTDOWN 工作階段中執行的任何稽核降級為 ON_FAILURE = CONTINUE。 當SQL Server以 -m 旗標啟動時,錯誤日誌會寫入 MSG_AUDIT_SHUTDOWN_BYPASSED 訊息。

欲了解更多服務啟動選項資訊,請參閱 資料庫引擎 服務啟動選項

Azure SQL 受控執行個體 中的內部操作

  • 在 Azure SQL Database 與 Azure SQL 受控執行個體 中,由 SQLDBControlPlaneFirstPartyApp 引發的事件是 Azure SQL Database 控制平面 的內部 Azure 功能。 由 SQLDBControlPlaneFirstPartyApp 發起的事件是 SQL 引擎與 Azure Resource Manager 之間內部同步操作的一部分。 這些事件是資源管理的正常部分,是 Azure 中正確表示與運作所必需的。

附加具有已定義審核功能的資料庫

附加具有稽核規格的資料庫後,如果指定的 GUID 在伺服器中不存在,將導致稽核規格處於「孤立狀態」。 因為具有相符 GUID 的稽核不存在於伺服器執行個體上,所以不會記錄任何稽核事件。 若要更正這種情況,請使用 ALTER DATABASE AUDIT SPECIFICATION 命令將孤立的稽核規格連接到現有的伺服器稽核。 或者,使用 CREATE SERVER AUDIT 命令以指定的 GUID 建立新的伺服器稽核。

你可以將定義有稽核規範的資料庫附加到另一個不支援 SQL Server 稽核的 SQL Server 版本,例如 SQL Server Express,但它不會記錄稽核事件。

資料庫鏡像與 SQL Server 稽核

已定義資料庫稽核規格且使用資料庫鏡像的資料庫包含資料庫稽核規格。 若要在鏡像的 SQL 執行個體上正確運作,必須設定下列項目:

  • 鏡像伺服器必須具有相同 GUID 的審核,才能使資料庫審核規格能夠寫入審核記錄。 這可以使用 命令 CREATE AUDIT WITH GUID = <guid-from-source-server-audit>來設定。

  • 如果是二進位檔案目標,鏡像伺服器服務帳戶必須具有寫入稽核記錄之位置的適當權限。

  • 對於 Windows 事件日誌目標,鏡像伺服器所在電腦的安全政策必須允許服務帳號存取安全或應用程式事件日誌。

審計管理員的活動

系統管理員 固定伺服器角色的成員會識別為每個資料庫中的 dbo 使用者。 若要稽核系統管理員的動作,請稽核 dbo 使用者的動作。

權限

SQL Server Audit 的每個功能與指令都有獨立的權限要求。

若要建立、改變或卸除伺服器稽核或伺服器稽核規格,伺服器主體需要 ALTER ANY SERVER AUDITCONTROL SERVER 許可權。 若要建立、修改或移除資料庫稽核規格,資料庫主體需要擁有ALTER ANY DATABASE AUDIT 的許可權或在該資料庫上具有 ALTERCONTROL 的許可權。 此外,主體必須具有連線到資料庫的許可權,或ALTER ANY SERVER AUDITCONTROL SERVER許可權。

許可權 VIEW ANY DEFINITION 提供檢視伺服器層級稽核檢視的存取權,並提供 VIEW DEFINITION 檢視資料庫層級稽核檢視的存取權。 拒絕這些許可權會使檢視目錄的能力失效,即使主體具有 ALTER ANY SERVER AUDITALTER ANY DATABASE AUDIT 許可權也是如此。

若要使用 fn_get_audit_file 讀取稽核資料,SQL Server 2019(15.x)及更早版本需要伺服器上的 CONTROL SERVER 權限,而 SQL Server 2022(16.x)及以後版本則需要 VIEW SERVER SECURITY AUDIT 權限。 欲了解更多資訊,請參見 sys.fn_get_audit_file

如需如何授與許可權的詳細資訊,請參閱 GRANT

警告

系統管理員角色中的主體可以竄改任何稽核元件,而db_owner角色中的主體可能會竄改資料庫中的稽核規格。 SQL Server Audit 驗證建立或變更稽核規範的登入至少擁有 ALTER ANY DATABASE AUDIT 權限。 但是,當您附加資料庫時,它不會進行任何驗證。 您應該假設所有資料庫稽核規格只與 系統管理員db_owner 角色中的主體一樣值得信任。

使用 Transact-SQL 建立和管理稽核

你可以使用 DDL 語句、動態管理檢視與函式,以及目錄檢視來實作 SQL Server Audit 的所有面向。

數據定義語言語句

您可以使用下列 DDL 陳述式來建立、改變和卸除稽核規格:

DDL 陳述式 描述
變更授權 變更安全性實體的擁有權。
更改資料庫稽核規範 透過 SQL Server 稽核功能,變更資料庫稽核規範物件。
變更伺服器稽核 利用 SQL Server 審計功能來轉換伺服器稽核物件。
更改伺服器審核規範 使用 SQL Server 審計功能來變更伺服器審計規範物件。
建立資料庫稽核規格 利用 SQL Server 稽核功能建立資料庫稽核規範物件。
建立伺服器稽核 使用 SQL Server Audit 建立伺服器稽核物件。
建立伺服器稽核規格 利用 SQL Server Audit 功能建立伺服器稽核規範物件。
刪除資料庫稽核規格 使用 SQL Server Audit 功能丟棄資料庫稽核規範物件。
DROP 伺服器稽核 利用 SQL Server 稽核功能丟棄伺服器稽核物件。
刪除伺服器審核規範 使用 SQL Server Audit 功能丟棄伺服器稽核規範物件。

動態檢視與功能

下表列出可用於 SQL Server 稽核的動態檢視與函式。

動態檢視與功能 描述
sys.dm_audit_actions 回傳每個可在稽核日誌中報告的稽核動作,以及可配置為 SQL Server Audit 一部分的稽核動作群組。
sys.dm_server_audit_status 提供有關稽核之目前狀態的資訊。
sys.dm_audit_class_type_map 傳回一個資料表,它會將稽核記錄檔中的 class_type 欄位對應到 sys.dm_audit_actions 中的 class_desc 欄位。
函數_取得稽核檔案 從伺服器稽核建立的稽核檔案中傳回資訊。

目錄視圖

下表列出可用於 SQL Server 稽核的目錄檢視。

目錄視圖 描述
sys.database_audit_specifications 包含關於 SQL Server 對伺服器實例稽核時資料庫稽核規範的資訊。
sys.database_audit_specification_details 包含對所有資料庫實例進行 SQL Server 稽核時,資料庫稽核規範的資訊。
sys.server_audits 包含伺服器實例中每個 SQL Server 稽核的一列。
sys.server_audit_specifications 包含伺服器實例 SQL Server 稽核時的伺服器稽核規範資訊。
sys.server_audit_specifications_details(日語伺服器監查規範細節) 包含關於伺服器稽核規範細節(動作)的資訊,適用於伺服器實例的 SQL Server 稽核。
sys.server_file_audits 包含關於在伺服器實例上的 SQL Server 稽核中檔案稽核類型的擴充資訊。

下一個步驟