稽核記錄與透明度簡介
在多租戶的雲端環境中,「誰在何時、何地做了什麼?」是安全維運中最關鍵的問題。對於專業雲端架構師 (Professional Cloud Architect) 而言,設計稽核策略不僅僅是啟用記錄,還需要平衡資料量、成本、法規保留要求,以及偵測未經授權存取的能力(即使是來自雲端供應商本身的存取)。
Google Cloud 提供了三大能見度支柱:Cloud Audit Logs、Access Transparency 以及 Access Approval。
一組記錄 Google Cloud 內行政操作和資料存取的日誌。它們是不可變的 (immutable),且可以匯出進行長期儲存或分析。參考:https://cloud.google.com/logging/docs/audit
白話文解釋(Plain English Explanation)
能見度就像是你雲端環境中的「黑盒子飛行記錄器」。
比喻 1 — 建築物監視器 (Audit Logs)
可以將 Cloud Audit Logs 想像成辦公大樓裡的監視器。Admin Activity Logs 是大門口和機房的監視器 — 它們記錄每次有人進入或更換鎖具。Data Access Logs 則是檔案櫃內部的監視器 — 它們記錄每次有人拉開抽屜讀取文件。
比喻 2 — 房東的鑰匙 (Access Transparency)
想像你租了一間公寓。通常,你不知道房東 (Google) 是否在你上班時使用萬能鑰匙進入。Access Transparency 是一個系統,規定房東每次進入時「必須」在桌上留下一張紙條,詳細說明他們為何在那裡(例如:「維修漏水的水管」)。它讓你對服務供應商的行為具有能見度。
比喻 3 — 帶有遠端鎖的門鈴相機 (Access Approval)
Access Approval 是將房東的比喻更進一步。這就像裝了一個智慧鎖,除非你在手機上點擊「批准」,否則房東甚至無法使用他們的萬能鑰匙。你會看到他們的請求和原因,然後才決定是否讓他們進入。
Cloud Audit Logs 的類型
Google Cloud 將稽核記錄分為四個主要類型:
- Admin Activity Logs: 記錄 API 呼叫或其他修改資源配置或中繼資料的操作(例如:建立 VM、更改 IAM 角色)。預設啟用,不收費。
- Data Access Logs: 記錄建立、修改或讀取使用者提供資料的 API 呼叫(例如:讀取 BigQuery 資料表、從 GCS 下載檔案)。預設停用(BigQuery 除外),資料量大且可能產生高額成本。
- System Event Logs: 記錄非由使用者直接操作觸發的 Google Cloud 行政行為(例如:系統觸發的 VM 即時遷移)。
- Policy Denied Logs: 記錄使用者或服務帳戶因違反安全政策而被拒絕存取的情況(例如:VPC Service Controls)。
Admin Activity vs Data Access vs System Event vs Policy Denied:保留期與啟用方式
這四種稽核記錄串流在預設保留期、成本、以及讀取所需的 IAM 權限上行為差異極大。架構師若混淆這些差別,不是把儲存費燒爆,就是因為錯誤的串流沒開而稽核失敗。
Admin Activity Logs — 400 天、免費、永遠開啟
它們記錄每一次寫入類 API 呼叫(SetIamPolicy、Insert、Delete、Update),會出現在 cloudaudit.googleapis.com/activity 記錄名稱中。_Required 儲存桶會以免費方式保留 400 天,且無法停用。它們是 SOC 2 CC6.1 與 ISO 27001 A.12.4.1(事件記錄)控制項的主要證據來源。讀取需要 roles/logging.privateLogViewer,或者 roles/logging.viewer 加上 logging.privateLogEntries.list。
Data Access Logs — 30 天、需手動啟用、昂貴
涵蓋 DATA_READ、DATA_WRITE、ADMIN_READ 三種子類型。除了 BigQuery(DATA_READ 預設開啟)以外,必須在 IAM Audit Config(auditConfigs[])裡明確逐一服務啟用。它們會進到 _Default 儲存桶,預設只保留 30 天,而且通常是企業 Cloud Logging 帳單最大的單一來源。一個吵雜的 Cloud Storage 儲存桶每天就能產生數十 GiB。可以用 exemptedMembers 把 Dataflow worker 之類的吵雜服務帳戶排除。
System Event Logs — 400 天、免費、Google 觸發
來自 Google 自身的自動化動作:VM 即時遷移、VM 自動重啟、Cloud SQL 維護重啟。保留期與 Admin Activity 相同,都是免費 400 天。在事後檢討「為什麼我的 VM 在 03:14 重開機?」時極為珍貴。
Policy Denied Logs — 30 天、收費
當 VPC Service Controls、Org Policy 或 IAM Conditions 擋掉一個操作時,會寫一筆 Policy Denied 條目。架構師通常把這些導入 Pub/Sub 再進 Chronicle 或 SIEM,因為它們是資料外洩嘗試或服務帳戶設定錯誤的早期警報。
在 PCA 考試中,若情境是「我們需要知道過去一年每一次讀取 PII 的 BigQuery 查詢」,你必須:(1) 在 IAM audit config 為 BigQuery 啟用 DATA_READ Data Access Logs,並 (2) 建立一個 log sink 導到長期保留的 Log Bucket 或 Cloud Storage —— 因為 _Default 儲存桶預設的 30 天保留期不夠用。
Access Transparency:看見 Google 對你內容的管理員存取
Audit Logs 回答的是「我的使用者做了什麼」。Access Transparency (AXT) 回答的是「Google 的工程師做了什麼」。當 Cloud Customer Care 客服打開一個支援工單並查看你的 bucket metadata,或當值班 SRE 存取你 VM 所在的 hypervisor 時,一筆 Access Transparency 條目會在幾分鐘內寫入。
所需資格與支援服務
Access Transparency 僅限 Enterprise / Premium Support 或 Assured Workloads 等級。支援的服務包含 Compute Engine、GKE、Cloud Storage、BigQuery、Cloud SQL、Spanner、Persistent Disk、Cloud Logging 等數十項 —— 但並非所有 API。在向客戶承諾「100% Google 存取能見度」之前,請對照 cloud.google.com/assured-workloads/access-transparency/docs/supported-services 上的最新清單。
AXT 條目的結構
每一筆條目包含一個理由代碼 (justification reason),例如 CUSTOMER_INITIATED_SUPPORT、GOOGLE_INITIATED_SERVICE 或 THIRD_PARTY_DATA_REQUEST,外加存取者的辦公室所在地(例如 "US")、被存取的資源以及執行的動作。accesses[].methodName 與 accesses[].resourceName 欄位讓你能把該存取對應到特定的使用者影響事件。
路由 AXT 記錄
Access Transparency 條目會出現在 Cloud Logging 中,資源類型為 audited_resource,logName 為 projects/PROJECT/logs/cloudaudit.googleapis.com%2Faccess_transparency。大多數受監管的客戶會用資料夾層級 log sink 把它們導進集中式安全專案,並對任何 justificationReason 為 GOOGLE_INITIATED_SERVICE 而落在預期維護視窗之外的條目發出告警。
請透過 gcloud access-context-manager 或 Cloud Console「Access Transparency」頁面在組織 (Organization) 層級啟用 Access Transparency,這樣現有和未來新建的每個專案都會自動繼承。逐專案啟用是常見的稽核缺失,因為新建專案會悄悄缺少這個控制項。
Access Approval:要求 Google 在存取你的資料前先請求批准
如果 Access Transparency 是「後照鏡」,Access Approval (AXA) 就是「大門對講機」。當 Google 工程師需要存取你受涵蓋的資源時,請求會進入待批准狀態,並送出一個 approval_request Pub/Sub 通知。直到指定的批准者在 Console 點 Approve、或呼叫 gcloud access-approval requests approve,存取才會真正發生。
批准者流程
你會透過 gcloud access-approval settings update --enrolled_services=all [email protected] 設定一個或多個批准者群組(通常是一個安全部門的群組電子郵件)。批准者會收到電子郵件以及一個 Pub/Sub 事件,內容包含被請求的資源、理由與到期時間(預設 24 小時)。若沒有人在期限內批准,存取就會被拒絕,Google 客服無法繼續處理該工單。
不受 AXA 涵蓋的情境
Access Approval 不會擋下:
- 為了服務健康監測而由自動化系統發起的唯讀存取(Access Transparency 會記錄,但 AXA 不會擋)。
- Google 在法律程序(法院命令)下被強制配合的請求。
- 你主動開了 P1 工單且勾選「auto-approve」旗標的緊急情境。
架構整合
PCA 考試常見的模式是把 Access Approval 的 Pub/Sub 主題接到 Cloud Function,再貼文到私密 Slack 頻道並開一張 ServiceNow 工單。批准動作本身仍留在 Cloud Console 並搭配強制 2FA,避免社交工程繞過。
對於 FedRAMP High、ITAR、或主權 EU(Assured Workloads EU Regions and Support)等受監管工作負載,Access Approval 是強制控制項。停用它、或放任請求自動過期視為「已批准」,會直接破壞 Assured Workloads 溢價所對應的資料主權保證。
Log Sink 到 Cloud Storage 搭配 Bucket Lock:防竄改的稽核保留
對於 7 年甚至 10 年的保留期(HIPAA §164.316(b)(2)(i)、SEC 17a-4(f)、FINRA 4511),最便宜也最有法律站得住腳的目的地是 Log Sink 到 Cloud Storage 搭配 Bucket Lock。
流水線設計
- 在組織層級建立一個彙整 sink (aggregated sink):
gcloud logging sinks create org-audit-archive storage.googleapis.com/audit-archive-bucket --organization=ORG_ID --include-children --log-filter='logName:"cloudaudit.googleapis.com"'。 - 授予這個 sink 的 writer identity
roles/storage.objectCreator權限到目的儲存桶。 - 對該儲存桶套用 2555 天 (7 年) 的 retention policy,然後鎖定它:
gcloud storage buckets update gs://audit-archive-bucket --retention-period=2555d,接著gcloud storage buckets update gs://audit-archive-bucket --lock-retention-policy。 - 啟用 Object Versioning 與 Bucket Lock,這樣即使是擁有
storage.objects.delete權限的專案擁有者,也無法在保留期到期之前刪除物件。
儲存類別與成本
sink 目的儲存桶請使用 Archive 類別 —— $0.0012/GB-month、毫秒級存取。每天 50 GiB 的稽核流量保留 7 年,使用 Archive 每月大約 $150 美元;若用 Standard 則要 $4,500 美元。因為記錄是 write-once,不需要設 lifecycle 規則。
為什麼一定要 Bucket Lock
沒有 Bucket Lock 的話,遭到入侵的 Organization Admin 可以一行 gcloud storage rm 把整個保存庫抹掉。有了 Bucket Lock,保留政策本身就是不可變的 —— 連 Google 客服都無法縮短它。這滿足 SEC 17a-4 對「不可抹除、不可改寫」(WORM) 的要求。
請不要把 Log Bucket 的保留期(在 Cloud Logging 內)與 GCS Bucket Lock 的保留期搞混。Log Bucket 的保留期可被擁有 logging.admin 的管理員縮短,甚至整個刪除。只有 GCS Bucket Lock 才能提供 SEC 與 FINRA 稽核可接受的 WORM 保證。
BigQuery Log Analytics:以 SQL 分析 PB 級稽核資料
當問題從「把記錄收起來」變成「找出針尖上的那根針」時,就把稽核記錄導入 BigQuery。
兩種路由方式
- Log Analytics 升級的 Log Bucket: Cloud Logging 在 2023 之後推出的功能,可以直接對 Log Bucket 跑 SQL,不需要再匯出一份。對於臨時查詢更便宜,因為沒有儲存重複。
- 傳統 BigQuery sink: 透過
bigquery.googleapis.com/datasets/audit_logs匯出,採用每日分區資料表。當你需要把稽核資料與非記錄資料(HR 系統、資產清單)做 join,或灌進 Looker 儀表板時更適合。
實用查詢
-- 偵測指派給外部(非公司)身分的 IAM 角色授權
SELECT
timestamp,
protopayload_auditlog.authenticationInfo.principalEmail AS actor,
protopayload_auditlog.resourceName,
protopayload_auditlog.serviceData
FROM `security-project.audit_logs.cloudaudit_googleapis_com_activity_*`
WHERE protopayload_auditlog.methodName = 'SetIamPolicy'
AND NOT REGEXP_CONTAINS(
TO_JSON_STRING(protopayload_auditlog.serviceData),
r'@mycompany\.com'
)
AND _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE());
成本控制
務必以 _PARTITIONTIME 分區,並在資料集上要求 partition filter(require_partition_filter = true)。一個沒有分區條件的 SELECT * 跑過一年的稽核資料可能掃描數 TB,單一查詢就會花掉數百美元。
對 IAM 政策變更與其他高風險事件發出告警
在任何 GCP 環境中,最高訊號值的記錄告警永遠是「有人改了 IAM」。這是資料外洩最常見的前置動作。
基於記錄的指標 (log-based metric)
對下列過濾條件建立一個計數器指標:
logName:"cloudaudit.googleapis.com/activity"
protoPayload.methodName:("SetIamPolicy" OR "google.iam.admin.v1.CreateServiceAccountKey")
告警政策
在 Cloud Monitoring 中建立一個告警,在 1 分鐘視窗內只要值不為零就觸發;對 roles/owner 或 roles/iam.securityAdmin 授權通知 PagerDuty,對較低權限授權則走較緩和的 Slack 頻道。在通知範本中放入發動者的 principal email,讓值班人員能立即驗證合法性。
其他必告警的過濾條件
protoPayload.methodName="google.cloud.kms.v1.KeyManagementService.DestroyCryptoKeyVersion"— 有人正在銷毀 KMS 金鑰。protoPayload.methodName="storage.buckets.update"且protoPayload.serviceData.policyDelta涉及allUsers— 有儲存桶被改成公開。protoPayload.methodName="compute.firewalls.insert"且sourceRanges:"0.0.0.0/0"— 出現大開的防火牆規則。
請對 SetIamPolicy、CreateServiceAccountKey、DestroyCryptoKeyVersion、以及 allUsers / allAuthenticatedUsers 的政策授權發出告警 —— 根據 Google 威脅研究團隊的資料,這四條過濾條件可涵蓋約 80% 的雲端原生入侵情境。
稽核記錄排除過濾器:在不破壞合規的前提下控制成本
吵雜服務(Dataflow、Cloud Run、GKE control plane)的 Data Access 記錄可以瞬間吃掉你的記錄帳單大半。Log Router 提供兩種減量工具。
Sink exclusions
在 _Default sink 上加入 exclusions[] 過濾條件,讓條目在計費前就被丟掉:
gcloud logging sinks update _Default \
--add-exclusion=name=dataflow-workers,filter='resource.type="dataflow_step"
protoPayload.authenticationInfo.principalEmail:"dataflow-service-account@"' \
--add-exclusion=name=health-check-noise,filter='httpRequest.userAgent:"GoogleHC"'
被排除的條目不會儲存、不會計費、也無法搜尋。請只對 100% 確定沒有合規價值的條目使用。
IAM Audit Config exempted members
針對 Data Access 記錄,可以把服務帳戶標記為 exemptedMembers,這樣它的讀寫從一開始就不會產生記錄。比 sink exclusion 更細緻,因為是在「產生記錄」這一步就阻止,而非事後丟棄。
絕對不可排除的項目
cloudaudit.googleapis.com/activity(Admin Activity)內的任何條目 —— 這是合規基線。- Access Transparency 條目 —— 稽核人員會要求一條不間斷的軌跡。
- Policy Denied 條目 —— 成本極低、安全價值極高。
為稽核人員蒐集合規證據
PCA 考題常常出現「外部稽核人員(PwC、Deloitte、HIPAA 評估員)要求提供控制項『證據』」的情境。把那段話翻譯成 GCP 上的具體產物就是架構師的工作。
標準證據組合
| 控制項類別 | 證據產物 | 如何蒐集 |
|---|---|---|
| 存取控制 (SOC 2 CC6.1) | 稽核期間所有的 SetIamPolicy 事件 |
對已歸檔的 cloudaudit_googleapis_com_activity_* 資料表跑 BigQuery 查詢 |
| 特權存取監控 (ISO 27001 A.9.2.3) | 理由為 GOOGLE_INITIATED_SERVICE 的 Access Transparency 條目 |
用 Log Analytics 或 BigQuery 匯出 access_transparency 記錄 |
| 資料主權 (GDPR Art. 28) | Access Approval 顯示批准/拒絕的軌跡 | gcloud access-approval requests list JSON 輸出 |
| 加密金鑰管理 (PCI DSS 3.5) | CMEK 金鑰建立、輪替、銷毀事件 | 在 Admin Activity 上過濾 cloudkms.googleapis.com |
| 變更管理 (SOX) | 生產資源上所有的 Insert / Update / Delete |
彙整 sink 到啟用 Bucket Lock 的 Cloud Storage |
自動化模式
建立一個排程的 Cloud Run 作業,每季第一天執行相關 BigQuery 查詢,並把結果寫成 signed-URL PDF 到一個獨立、同樣開啟多年 Bucket Lock 的 compliance-evidence GCS 儲存桶。稽核人員會得到該儲存桶的讀取權限 —— 他們自行拉取證據,徹底消除臨時「請把記錄寄給我」的電子郵件來回。
記錄轉送與儲存 (Log Router)
架構師必須根據使用情境決定記錄的流向:
- Cloud Logging (Log Bucket): 適用於快速搜尋和短期分析(預設保留 30 天)。
- BigQuery (Sink): 最適合複雜的 SQL 分析、安全性數位鑑識和儀表板。
- Cloud Storage (Sink): 長期冷儲存最便宜的選擇(例如:滿足 HIPAA 的 7 年保留要求)。
- Pub/Sub (Sink): 用於即時串流至第三方 SIEM 工具(如 Splunk 或 Chronicle)。
在 PCA 考試中,如果要求是「以最低成本長期保留」,答案是 Log Sink 到 Cloud Storage。如果要求是「對數百萬行資料進行安全性分析」,答案是 BigQuery。參考:https://cloud.google.com/logging/docs/audit
Access Transparency 與 Access Approval 總結
這些功能對於高度受監管的產業(銀行、政府)至關重要。
- Access Transparency: 提供 Google 工作人員在存取您的內容時(例如在處理支援工單期間)所執行操作的近乎即時記錄。
- Access Approval: 允許您要求在 Google 工作人員存取您的資料「之前」必須獲得您的明確批准。這是資料主權的最高級別。
保留與不可變性
- 不可變性 (Immutability): 稽核記錄一旦寫入,任何使用者(包括擁有者)都無法更改或刪除。
- 保留政策 (Retention Policies): 您可以在 Log Buckets 或 GCS 儲存桶上設定自定義保留期限,以滿足法規要求(例如 SEC 17a-4)。
安全性 vs. 透明度 vs. 批准
| 功能 | Audit Logs | Access Transparency | Access Approval |
|---|---|---|---|
| 記錄對象? | 您的使用者/服務帳戶。 | Google 員工。 | Google 員工。 |
| 動作 | 紀錄發生了什麼。 | 紀錄 Google 為何查看。 | 您控制存取權限。 |
| 使用情境 | 內部安全性/除錯。 | 合規性/供應商信任。 | 嚴格的資料主權。 |
常見問題 — 稽核記錄與透明度
Q1. 為什麼 Data Access logs 預設是停用的?
因為它們會產生龐大的資料量。對於高流量的資料庫,記錄每一次「讀取」操作可能會導致顯著的儲存成本,如果管理不當,還可能影響效能。
Q2. 我可以刪除稽核記錄來省錢嗎?
不行。Admin Activity logs 是不可變的,在保留期限內無法刪除。若要管理成本,請使用 Log Router 過濾掉不必要的 Data Access logs。
Q3. Admin Activity logs 會保留多久?
預設情況下,它們會免費保留 400 天。如果您需要更長的保留時間,可以將其匯出到 GCS 或 BigQuery。
Q4. Access Transparency 是否涵蓋所有 Google Cloud 服務?
涵蓋大多數主要服務(Compute、SQL、GKE、Storage),但您應查看官方文件以獲取最新的支援服務清單。
Q5. 如果我不回應 Access Approval 請求會發生什麼?
如果您未在指定的時間視窗內批准請求,Google 工作人員將被拒絕存取,且無法執行任務(例如,他們無法排除您底層硬體問題的故障)。
最後的架構師提示
在 PCA 考試中,請注意行為者的身份。如果行為者是「使用者」或「服務帳戶」,請尋找 Cloud Audit Logs。如果行為者是「Google 支援工程師」,請尋找 Access Transparency。此外,請記住,對於合規性稽核,您通常需要使用組織或資料夾層級的「Log Sink」將多個專案的記錄聚合到一個集中式記錄專案 (Centralized Logging Project) 中。