本頁說明如何使用 pgAudit 擴充功能稽核資料庫,這項功能可協助您設定許多記錄,以符合政府、金融和 ISO 認證的常見規定。
如要瞭解 Cloud SQL 中的 PostgreSQL 擴充功能,請參閱「PostgreSQL 擴充功能」。
總覽
您可以使用開放原始碼的 pgAudit 擴充功能,在 PostgreSQL 適用的 Cloud SQL 中執行資料庫稽核作業。
使用這個擴充功能,您可以選擇性地記錄及追蹤針對特定資料庫執行個體執行的 SQL 作業。這項擴充功能提供稽核功能,可監控及記錄特定作業子集。
pgAudit 擴充功能適用於執行的 SQL 指令和查詢。相較之下,Cloud 稽核記錄則是用來稽核 Cloud SQL 執行個體上執行的管理和維護作業。
如要進一步瞭解 Cloud SQL 中的稽核記錄,請參閱「稽核記錄」頁面。
在 Cloud SQL 中設定資料庫稽核
使用 pgAudit 擴充功能執行稽核記錄的步驟包括:
- 在 Cloud SQL 中啟用
cloudsql.enable_pgaudit
旗標。 - 執行指令來建立 pgAudit 擴充功能。
- 為
pgaudit.log
旗標設定值。
設定資料庫稽核後,您可以查看記錄,並視需要停用記錄功能。
設定稽核
本節說明設定資料庫稽核作業的基本概念。
啟用稽核功能的初始標記
在 Cloud SQL 中,您可以使用資料庫標記執行許多作業,包括調整 PostgreSQL 參數及設定執行個體。cloudsql.enable_pgaudit
標記可為特定資料庫執行個體啟用稽核功能。您可以透過 Google Cloud 控制台或 gcloud
指令,變更 cloudsql.enable_pgaudit
標記的值。
請按照旗標的標準操作說明啟用 cloudsql.enable_pgaudit
旗標,並將值設為 on
。舉例來說,如要使用 gcloud
指令,請指定下列項目,並將 [INSTANCE_NAME]
替換為執行個體名稱:
gcloud sql instances patch [INSTANCE_NAME] --database-flags cloudsql.enable_pgaudit=on
cloudsql.enable_pgaudit
標記會與其他支援的標記一併列出,且僅適用於 Cloud SQL。
執行指令來建立 pgAudit 擴充功能
啟用資料庫旗標後,請使用相容的 psql 用戶端執行 CREATE EXTENSION
指令。下列指令會為 Cloud SQL 執行個體中的所有資料庫建立 pgAudit 擴充功能:
CREATE EXTENSION pgaudit;
設定 pgaudit.log
旗標的值
請使用旗標的標準指示,為 pgaudit.log
旗標設定值。
舉例來說,如要為執行個體上的所有資料庫作業啟用稽核功能,可以使用下列 gcloud
指令:
gcloud sql instances patch [INSTANCE_NAME] --database-flags \
cloudsql.enable_pgaudit=on,pgaudit.log=all
設定資料庫的其他設定
如要設定資料庫的稽核設定,請按照「自訂資料庫稽核記錄」一節中的程序操作。
查看資料庫稽核記錄
如要查看稽核記錄,請為專案啟用資料存取稽核記錄。系統會將特定執行個體產生的 pgAudit 記錄,以資料存取稽核記錄的形式傳送至 Cloud Logging。使用者可以透過記錄檔探索工具應用程式查看產生的 pgAudit 記錄。
在「記錄檔總管」應用程式中,選取 cloudaudit.googleapis.com/data_access 記錄篩選器,即可查看 pgAudit 記錄。
或者,您也可以使用下列查詢,顯示特定 Cloud SQL 專案的所有 pgAudit 記錄:
resource.type="cloudsql_database"
logName="projects/<your-project-name>/logs/cloudaudit.googleapis.com%2Fdata_access"
protoPayload.request.@type="type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry"
pgAudit 的記錄格式
資料存取稽核記錄中的每個 pgAudit 記錄項目都有欄位,代表為查詢收集的資訊。
範例如下:
{ protoPayload: { @type: "type.googleapis.com/google.cloud.audit.AuditLog" methodName: "cloudsql.instances.query" request: { @type: "type.googleapis.com/google.cloud.sql.audit.v1.PgAuditEntry" auditClass: "READ" auditType: "SESSION" chunkCount: "1" chunkIndex: "1" command: "SELECT" database: "finance" databaseSessionId: 2209692 parameter: "[not logged]" statement: "SELECT * FROM revenue" statementId: 2 substatementId: 1 user: "alice" } } }
以下是資料存取稽核記錄中的欄位說明:
- auditClass。系統記錄的陳述類型。可能的值為
READ
、WRITE
、FUNCTION
、ROLE
、DDL
、MISC
和MISC_SET
。 - auditType。
SESSION
或OBJECT
。 - chunkCount。
parameter
和statement
欄位中提供的資料可能會分塊。chunkCount
欄位表示區塊總數。另請參閱chunkIndex
欄位的說明。 - chunkIndex。指定
parameter
和statement
欄位 (位於目前request
容器中) 的資料區塊索引編號。初始號碼為1
。 另請參閱chunkCount
欄位的說明。 - 指令。例如
ALTER TABLE
或SELECT
。 - 參數。
chunkIndex
欄位可決定這個欄位的內容;請參閱chunkIndex
欄位的說明。如果已設定pgaudit.log_parameter
的值,parameter
欄位可以包含以 CSV 資料形式引號括住的陳述式參數。如果沒有參數,這個欄位會包含[none]
。 否則,這個欄位會包含[not logged]
。 - 聲明。在後端執行的陳述式。
chunkIndex
欄位可決定statement
欄位的內容;請參閱chunkIndex
欄位的說明。 - statementId。這個工作階段的專屬陳述式 ID。每個陳述式 ID 代表一次後端呼叫。即使系統未記錄某些陳述式,陳述式 ID 仍會依序編號。
- substatementId。主要陳述式中每個子陳述式的序號 ID。
其中部分欄位也會在 pgAudit 說明文件中說明。
停用稽核功能
如要停用資料庫稽核功能,請將 cloudsql.enable_pgaudit
旗標的值設為 off
。您可以透過 Google Cloud 控制台或 gcloud
指令變更值。請按照旗標的標準指示停用 cloudsql.enable_pgaudit
旗標。
此外,請使用相容的 psql 用戶端執行 DROP EXTENSION
指令,移除擴充功能狀態:
DROP EXTENSION pgaudit;
在 Cloud SQL 中自訂資料庫稽核記錄
本節說明如何自訂資料庫執行個體的稽核行為。
如要瞭解擴充功能的其他功能,請參閱 pgAudit 說明文件。
超級使用者權限需求
在 Cloud SQL 中,只有屬於 cloudsqlsuperuser
角色的使用者可以建立擴充功能。建立新的 PostgreSQL 執行個體時,系統會為您建立預設的 PostgreSQL 使用者 (但您必須設定該使用者的密碼)。預設 PostgreSQL 使用者屬於 cloudsqlsuperuser
角色。詳情請參閱 PostgreSQL 使用者。
為執行個體上的所有資料庫作業設定稽核功能
如要為執行個體中的所有資料庫設定稽核,您必須在系統層級套用 pgAudit 設定。系統層級的稽核參數只能透過 Google Cloud 控制台或 gcloud
指令,以資料庫標記的形式設定。舉例來說,如要為執行個體上的所有資料庫作業啟用稽核功能,可以使用下列 gcloud
指令:
gcloud sql instances patch [INSTANCE_NAME] --database-flags \
cloudsql.enable_pgaudit=on,pgaudit.log=all
對所有執行個體資料庫設定特定作業
如要稽核所有執行個體資料庫,可以使用Google Cloud 控制台或 gcloud
指令。舉例來說,如要只針對執行個體的讀取和寫入作業啟用稽核功能,可以使用下列 gcloud
指令。本範例使用以清單為基礎的語法指定多個值:
gcloud sql instances patch [INSTANCE_NAME] \
--database-flags ^:^cloudsql.enable_pgaudit=on:pgaudit.log=read,write
這項指令會覆寫現有的資料庫旗標。
為特定資料庫設定稽核功能
如要為特定資料庫設定稽核功能,請在資料庫層級設定 pgAudit 參數。舉例來說,下列 SQL 指令可用於為名為 finance
的資料庫啟用讀取/寫入稽核:
finance=> ALTER DATABASE finance SET pgaudit.log = 'read,write';
設定關係的稽核功能
關係的稽核範圍比特定資料庫的稽核範圍窄。
稽核關係時,系統會將專屬稽核員角色指派給 pgaudit.role
參數。系統會記錄授予這個角色的任何物件或關係。
舉例來說,如要為 employee
資料庫中 salary
關係的所有 SELECT
查詢設定稽核,可以使用下列指令:
employee=> CREATE ROLE auditor WITH NOLOGIN;
employee=> ALTER DATABASE employee SET pgaudit.role = 'auditor';
employee=> GRANT SELECT ON salary TO auditor;
您也可以稽核特定關係的資料欄子集。
舉例來說,下列指令會將稽核記錄設為僅在從 salary
關係存取 income
和 tax_status
資料欄時發生:
employee=> GRANT SELECT(income, tax_status) ON salary TO auditor;
設定資料庫使用者的稽核功能
如要為特定使用者啟用稽核功能,請在每個 ROLE
層級設定 pgaudit.log
參數。
舉例來說,下列 SQL 指令會為使用者 Alice
執行的所有資料庫作業設定稽核:
finance=> ALTER ROLE alice SET pgaudit.log = 'all';
Cloud SQL 稽核管理提示
自訂稽核行為時,請注意下列事項:
- 資料庫旗標
cloudsql.enable_pgaudit
關閉後,稽核記錄會立即停止。不過,除非明確移除,否則系統會保留套用的 pgAudit 設定 (例如pgaudit.log
參數設定)。 - 只要變更
cloudsql.enable_pgaudit
的資料庫標記值,資料庫執行個體就會重新啟動。 - 透過明確
CREATE ROLE
指令建立的資料庫使用者沒有修改稽核設定的權限。只有透過 Google Cloud 控制台和gcloud
指令建立的資料庫使用者,才能修改稽核設定。 - 同時啟用工作階段稽核記錄和物件稽核記錄後,系統會將兩者相關的陳述式新增至記錄。工作階段記錄和物件記錄不會互相取消或修改。
PostgreSQL 適用的 Cloud SQL 中 pgAudit 擴充功能的限制
稽核記錄會暫時寫入執行個體的磁碟,佔用磁碟空間,然後再傳送至 Cloud Logging。因此,請先詳閱下列資訊再使用這項功能:
- 記錄檔擷取率為每秒 4 MB。如果記錄檔產生作業的負載超過擷取率,可能會發生下列情況:
- 磁碟使用量可能會不必要地增加。
- 磁碟空間可能會用盡。
- 如果您已啟用這項功能,且執行許多符合稽核條件的查詢,磁碟用量可能會快速增加。
- 使用這項功能前,請先規劃:
- 啟用自動增加儲存空間。
- 監控整體磁碟用量;無法單獨監控記錄產生作業的負載。在 Metrics Explorer 中使用 cloudsql.googleapis.com/database/disk/utilization 指標。
- 如有需要,請減少查詢次數或降低稽核頻率,以減少磁碟用量。
- 如果可用磁碟空間不足,部分查詢的稽核記錄可能會遺失。