本頁面說明如何使用 pgAudit 擴充功能稽核資料庫,協助您設定許多通常需要遵守政府、金融和 ISO 認證的記錄。
如要瞭解 Cloud SQL 中的 PostgreSQL 擴充功能,請參閱「PostgreSQL 擴充功能」。
總覽
PostgreSQL 適用的 Cloud SQL 資料庫稽核功能,可透過開放原始碼 pgAudit 擴充功能使用。
使用這項擴充功能,您可以選擇性記錄及追蹤對特定資料庫執行個體執行的 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。使用者可以透過 Logs Explorer 應用程式,查看產生的 pgAudit 記錄。
在Logs Explorer應用程式中,選取 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欄位的說明。 - command。例如:
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';
遮蓋稽核記錄中的機密資料
為強化資料隱私權和安全性,您可以設定 pgAudit,使用 cloudsql.pgaudit_mask_literals 旗標遮蓋記錄的 SQL 陳述式中的常值。啟用這項功能後,稽核記錄中的字串常數、數字和其他常值,都會替換為位置預留位置。這樣一來,您就能稽核查詢結構和執行的作業,而不必記錄可能含有機密資料的值。
優點
- 防止查詢中可能嵌入的機密資料出現在稽核記錄中,包括以下範例:
- 密碼
- 個人資訊
- 密鑰
- 有助於遵守資料隱私權相關法規。
運作方式
cloudsql.pgaudit_mask_literals 旗標設為 on 時,pgAudit 擴充功能會先處理 SQL 陳述式,再寫入稽核記錄。如果擴充功能在查詢中找到常值,就會先替換這些值,再記錄查詢:
原始陳述:
INSERT INTO users (id, email) VALUES (123, 'sensitive@example.com');稽核記錄中的陳述式 (已啟用遮蓋功能):
INSERT INTO users (id, email) VALUES ($1, $2);
請注意,傳回的稽核記錄中,ID 和電子郵件的常值會遭到替換。
需求條件
- PostgreSQL 適用的 Cloud SQL 14 以上版本支援
cloudsql.pgaudit_mask_literals旗標。 cloudsql.enable_pgaudit旗標預設為停用,必須設為on才能使用。
啟用遮蓋功能
如要啟用常值遮蓋功能,請將 cloudsql.pgaudit_mask_literals 資料庫旗標設為 on。您可以使用 Google Cloud 控制台、gcloud CLI 或 Cloud SQL Admin API 設定資料庫旗標。
詳情請參閱「設定資料庫旗標」。
gcloud sql instances patch INSTANCE_NAME \
--database-flags cloudsql.enable_pgaudit=on,cloudsql.pgaudit_mask_literals=on
將 INSTANCE_NAME 替換為執行個體名稱。
停用遮蓋功能
如要停用常值遮蓋功能,請將 cloudsql.pgaudit_mask_literals 旗標設為 off。
gcloud sql instances patch INSTANCE_NAME \
--database-flags cloudsql.enable_pgaudit=on,cloudsql.pgaudit_mask_literals=off
將 INSTANCE_NAME 替換為執行個體名稱。
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 指標。
- 如有需要,請減少查詢或稽核作業,降低磁碟用量。
- 如果可用磁碟空間用盡,部分查詢的稽核記錄可能會遺失。