CloudTrail 為何是 SCS-C02 的核心服務
翻開 SCS-C02 的考試指南,AWS CloudTrail 明確出現在 tasks 2.3、2.4 與 2.5,並隱含地支撐著 task 1.2(威脅偵測)、1.3(事件回應)、4.1 與 4.2(授權疑難排解),以及 6.1(多帳號治理)。換句話說,CloudTrail 是整份 SCS-C02 藍圖中橫跨範圍最廣的單一服務,出題委員對此心知肚明。考題裡幾乎所有「誰、在什麼時間、做了什麼、從哪裡來」的問題,都能收斂到 CloudTrail;而所有「我們完全找不到那次操作的日誌」的陷阱題,也幾乎都能收斂到某個被誤解的 CloudTrail 設定。
CloudTrail 記錄所有 AWS 帳號的 API 活動。只要目的地保護得當,CloudTrail 日誌就是不可竄改的;CloudTrail 日誌可透過 Athena 或 CloudTrail Lake 查詢;CloudTrail 日誌也可轉發給 EventBridge 以觸發即時回應。但 CloudTrail 同時也有一長串 SCS-C02 非常喜歡利用的「地雷」:data events 預設關閉、Insights 只監看 management events、單一區域 trail 會遺漏全域服務事件、Organization Trail 的行為和成員帳號的 trail 不同。這份深入解析會帶你走過每一個陷阱,並使用考試所預期的同一套心智模型。
讀完本篇,你應該能在三十秒內回答三道 SCS-C02 風格的題目:「為什麼 CloudTrail 沒有捕捉到這次 S3 GetObject?」、「為什麼 CloudTrail Insights 沒有標記這個異常?」,以及「為什麼資安帳號只看得到部分成員帳號的 CloudTrail 日誌?」每道題都有一個清晰、可重複套用的答案,根植於 CloudTrail 的實際運作方式。
Domain 2(日誌記錄與監控)佔 SCS-C02 的 18%,而 CloudTrail 是其中的主導服務。加上在 Domain 1、4、6 的間接出現,你會在整份考試中看到約三分之一的題目都與 CloudTrail 相關。 AWS Certified Security – Specialty Exam Guide
CloudTrail 概覽 — 它是什麼、不是什麼
CloudTrail 是 AWS 原生的 API 稽核日誌。每當一個 IAM 主體——人類使用者、聯合身份、EC2 角色、Lambda 執行角色,甚至是 AWS 內部服務——呼叫公開的 AWS API 時,CloudTrail 就會記錄該事件。CloudTrail 捕捉「誰、什麼、何時、何地、如何」:主體 ARN、動作名稱、資源 ARN、來源 IP、user-agent、時間戳記、請求參數、回應元素,以及呼叫失敗時的錯誤代碼。
CloudTrail 不是網路日誌。CloudTrail 看不到 TCP socket 上的資料平面流量;那是 VPC Flow Logs 的職責。CloudTrail 看不到 EC2 執行個體內部的應用程式日誌;那是 CloudWatch Logs 的職責。CloudTrail 本身不進行行為分析;CloudTrail Insights 負責其中一部分,GuardDuty 則消費 CloudTrail 的資料來完成其餘的工作。把這些邊界釐清,就能避免 SCS-C02 大多數的干擾選項。
CloudTrail 永遠記錄的三件事
CloudTrail 對每個捕捉到的事件,永遠記錄這三樣:發起呼叫的身份(userIdentity 區塊)、API 名稱(eventName)、以及服務(eventSource)。CloudTrail 幾乎一定也會記錄來源 IP、user-agent、AWS 區域,以及請求與回應的酬載。CloudTrail 不記錄 S3 物件的內容(CloudTrail 只看到 GetObject 發生了,從來看不到位元組本身),也不會預設記錄 Lambda 的函式引數,除非你主動啟用 data events。
CloudTrail 預設不記錄的三件事
預設情況下,CloudTrail 不記錄 S3 物件層級事件、Lambda 函式呼叫事件,以及 DynamoDB 項目層級事件。這三個類別就是 CloudTrail 的標準 data events,它們共有一個特點:必須明確啟用。這是 SCS-C02 最常見的陷阱,本篇後續還會再提三次。
CloudTrail 事件類型 — Management、Data 與 Insights
CloudTrail 將所有記錄整理成三種事件類型,每種的費用、預設狀態與可視範圍都不同。記住這三者的差異,是你準備 SCS-C02 時在 CloudTrail 上能花的效益最高的三十分鐘。
Management Events
Management events 是控制平面的 API 呼叫。建立 IAM 使用者、附加政策、啟動 EC2 執行個體、修改安全群組、設定 S3 儲存貯體政策、輪換 KMS 金鑰——全都是 management events。CloudTrail 在每個 AWS 帳號預設就會捕捉 management events,免費保留最近 90 天於 CloudTrail Event History,而 trail 首次將 management events 交付到 S3 也不收費。
Management events 分成兩個子類別,SCS-C02 偶爾會考到:Write management events(CreateUser、DeleteRole、PutBucketPolicy)以及 Read management events(ListBuckets、DescribeInstances、GetBucketAcl)。建立 CloudTrail trail 時,你可以選擇只記錄 Write、只記錄 Read,或兩者都記錄。預設是兩者都記錄。
Data Events
Data events 是針對高流量資源的資料平面 API 呼叫:S3 GetObject 與 PutObject、Lambda Invoke、DynamoDB GetItem 與 PutItem、EBS 直接 API、AppConfig 設定擷取、Step Functions 活動輪詢,以及不斷增加的其他項目。CloudTrail data events 預設關閉,每十萬筆事件交付收費約 0.10 美元,並且需要逐資源啟用——逐個 S3 儲存貯體、逐個 Lambda 函式,或逐個 DynamoDB 資料表——或在 trail 層級使用資源選擇器。
典型的 SCS-C02 題目描述一個存有敏感資料的 S3 儲存貯體、一個外洩物件的攻擊者,以及一個「查了 CloudTrail 卻什麼都沒找到」的資安團隊。正確答案幾乎一定是:該儲存貯體沒有在任何 CloudTrail trail 上啟用 S3 data events。預設開啟的 management events 不會捕捉 GetObject 呼叫。 CloudTrail data events
Insights Events
CloudTrail Insights events 是機器學習的異常偵測結果。Insights 以七天滾動視窗為基準,衡量帳號中 management API 呼叫的正常速率,當呼叫速率出現顯著偏差時就觸發 Insights event。典型範例:攻擊者取得金鑰後瘋狂執行 RunInstances——Insights 會將這波飆升與你的基準值比對並發出警示。
Insights 預設只作用於 Write management events;你也可以針對 API 錯誤率啟用 Insights。Insights 不分析 data events。 這是 SCS-C02 第二常考的 CloudTrail 事實,而且它與前一條組成了最惡毒的干擾題型:「我們開了 CloudTrail Insights,為什麼沒抓到 S3 資料外洩?」答案是:因為 Insights 不看 data events,而 S3 GetObject 是 data event。
- Management events:控制平面,預設開啟,首份免費,90 天 Event History,可選 Read 或 Write 或兩者
- Data events:資料平面(S3 / Lambda / DynamoDB 等),預設關閉,需付費,逐資源啟用
- Insights events:機器學習異常偵測,僅作用於 management Write events 及錯誤率——絕對不作用於 data events
若題目問到 S3 物件存取、Lambda 呼叫或 DynamoDB 項目存取,答案涉及 data events。若題目問到 API 呼叫速率突然飆升,答案涉及 Insights(但僅限 management)。 CloudTrail concepts
CloudTrail Trails 對比 Event History 對比 CloudTrail Lake
CloudTrail 透過三種不同的儲存方式提供資料,SCS-C02 會考你知不知道該在何時使用哪一種。
Event History — 永遠開啟、90 天、免費
每個 AWS 帳號都能在主控台免費查看 CloudTrail Event History,自動填入最近 90 天的 management events。Event History 很適合臨時查詢(「昨天是誰刪了那個角色?」),但超過 90 天就不保留、無法大量匯出、無法用 SQL 查詢、也無法跨帳號彙總。任何達到合規等級的需求,都需要 CloudTrail trail。
Trails — 持久交付到 S3(以及可選的 CloudWatch Logs)
CloudTrail trail 是一項設定,意思是「把這些 CloudTrail 事件持續交付到這個 S3 儲存貯體,選擇性地也交付到這個 CloudWatch Logs 群組,並選擇性地用這把 KMS 金鑰加密」。Trail 是讓你得到持久、長期保留的 CloudTrail 日誌的方式,可以在多年後交給稽核人員。
Trail 屬於單一區域或所有區域,可以是帳號層級的 trail 或 Organization Trail。你建立的每個 trail 可以捕捉 management events、data events、Insights events,或任意組合。透過 trail 傳送的 management events 第一份免費;後續的副本(同帳號中第二個 trail 捕捉相同事件)就會計費。
CloudTrail Lake — 可用 SQL 查詢的事件儲存
CloudTrail Lake 是一個受管、不可竄改的事件資料存放區,你用 SQL 進行查詢。CloudTrail Lake 可儲存事件長達七年,在 Organization 層級設定時支援跨多帳號的聯合查詢,也接受非 CloudTrail 的事件來源——Audit Manager 的佐證、AWS Config 設定項目,以及你透過 PutAuditEvents API 推送的任意自訂事件。
CloudTrail Lake 在許多使用情境中取代了舊有的「CloudTrail 到 S3、再到 Glue、再到 Athena」模式。CloudTrail Lake 每筆事件的費用比純粹的 trail-to-S3 交付更高,但你省去了建立 Athena schema、管理分區的功夫,並獲得開箱即用的 SQL 查詢能力。SCS-C02 的典型問法是「哪個方案在跨帳號即席資安查詢上需要最少的營運負擔?」——答案就是 CloudTrail Lake。
- 不可竄改的事件資料存放區 — 一旦寫入,在保留期限到期前事件無法被修改或刪除
- SQL 查詢 — 直接對存放區使用 Trino 風格的 SQL,無需 Glue 目錄,無需 Athena 工作群組
- 最長 7 年保留 — 每個資料存放區可個別設定,遠比 Event History 的 90 天長得多
- 多來源攝取 — CloudTrail、AWS Config、Audit Manager,以及透過
PutAuditEvents傳入的自訂事件 CloudTrail Lake user guide
單一區域對比多區域 Trail — 全域服務事件陷阱
今天在主控台建立 CloudTrail trail,預設勾選框寫著「套用 trail 到所有區域」——也就是多區域。你可以透過 API 或 CLI 覆蓋此設定建立單一區域 trail,但通常不該這麼做。
多區域 CloudTrail trail 從每個 AWS 區域捕捉事件,包括你尚未啟用的未來區域,只需一個 trail 定義。多區域 CloudTrail trail 也會捕捉全域服務事件——IAM、STS(不含區域性 STS 端點)、CloudFront、Route 53 控制平面、AWS Organizations、AWS Support,以及 AWS 帳號層級 API。全域服務事件一律在 us-east-1 發出,無論主體從哪裡呼叫;只有多區域 trail(或特別位於 us-east-1 並設定 IncludeGlobalServiceEvents 旗標的單一區域 trail)才會記錄這些事件。
SCS-C02 題型:「稽核人員在你的 CloudTrail 日誌中找不到任何 IAM CreateUser 事件,但你確認活動確實發生了。」該 trail 是單一區域,設定的區域不是 us-east-1,全域服務事件根本沒有被交付。修正方式:建立多區域 trail,或將 trail 移至 us-east-1 並設定 IncludeGlobalServiceEvents=true。
Receiving CloudTrail log files from multiple regions
還有一個值得記住的多區域細節:多區域 trail 在你帳號啟用某個區域的當下就立刻捕捉該區域的事件;單一區域 trail 不會自動延伸。對於 SCS-C02,只要題目中出現「未來可擴展」或「團隊啟用的任何區域」字眼,答案就涉及多區域 CloudTrail trail。
Organization Trail — 一個 Trail 統治全部
AWS Organizations 允許你從管理帳號(或 CloudTrail 的委任管理員帳號)建立 CloudTrail Organization Trail。Organization Trail 捕捉組織中每個成員帳號的事件,包括 trail 設定後才建立的帳號,並將它們交付到單一 S3 儲存貯體——通常位於專屬的 log-archive 資安帳號中。
Organization Trail 為何是預設推薦方案
Organization Trail 解決了一組個別帳號 trail 無法解決的四個現實問題:
第一,成員帳號無法在自己的帳號內關閉、修改或刪除 Organization Trail。只有管理帳號或委任的 CloudTrail 管理員才能做到。這阻止了遭入侵的成員帳號 IAM 主體停用日誌記錄。
第二,未來的成員帳號自動繼承 Organization Trail。透過 Control Tower 或 CreateAccount 配置新帳號時,無需記得手動加入日誌記錄。
第三,所有 CloudTrail 日誌都落在單一儲存貯體,並有統一的前綴結構(AWSLogs/<org-id>/<account-id>/CloudTrail/<region>/...),讓 Athena 或 CloudTrail Lake 的跨帳號分析變得輕而易舉。
第四,Organization Trail 在整個組織享有 management event 的「首份免費」定價,而不僅限於單一帳號。
只要題目中提到「AWS Organizations」、「多帳號」、「集中化」、「防竄改」或「未來帳號也必須涵蓋」,答案幾乎一定包含 Organization Trail 交付到專屬的 log-archive 帳號,而不是每個帳號各自的 trail。 Creating a trail for an organization
委任管理員模式
對於 SCS-C02,你應該知道 CloudTrail 透過 AWS Organizations 支援委任管理。管理帳號可以將某個成員帳號(通常是專屬的資安工具帳號)登記為委任的 CloudTrail 管理員。委任管理員接著可以代表整個組織建立、修改並管理 Organization Trail 及 CloudTrail Lake 事件資料存放區,而不需要授予該帳號一般性的管理帳號權限。這個模式與 AWS Security Reference Architecture (SRA) 將管理帳號與日常資安營運分離的建議直接對應。
跨帳號日誌交付 — 儲存貯體政策模式
當帳號 A 的 CloudTrail 將日誌交付到帳號 B 的儲存貯體時,帳號 B 的儲存貯體必須有一個允許 CloudTrail 服務主體寫入物件的政策。透過主控台建立 trail 時,AWS 會自動產生此政策,但你應該知道其結構,以應對 SCS-C02 的疑難排解題目。
儲存貯體政策必須允許 cloudtrail.amazonaws.com 對儲存貯體和前綴執行 s3:PutObject 與 s3:GetBucketAcl。政策必須包含一個 Condition 區塊,其中 aws:SourceArn 對應 trail ARN,aws:SourceAccount 對應擁有 trail 的帳號 ID。這個 Condition 區塊是混淆代理人的緩解措施——若沒有它,任何其他 AWS 帳號都可以誘使 CloudTrail 服務代為將他們的 CloudTrail 日誌寫入你的儲存貯體,既洩漏他們的日誌到你的儲存空間,也消耗你的費用預算。
在考試中,尋找政策中的這四個元素:(1) Service: cloudtrail.amazonaws.com 作為主體,(2) s3:PutObject 與 s3:GetBucketAcl 作為動作,(3) aws:SourceArn 對應 trail ARN,(4) aws:SourceAccount 對應擁有 trail 的帳號。若其中任何一項缺失或錯誤,日誌交付就會靜默失敗。
CloudTrail cross-account S3 bucket policy
對於 Organization Trail,儲存貯體政策還必須額外允許組織的 CloudTrail 服務連結角色,並引用 aws:SourceOrgID(或 aws:PrincipalOrgID)以進行更嚴格的範圍限制。AWS 同樣會透過主控台自動產生正確的政策;SCS-C02 最常見的失敗模式,是有人手動編輯政策並移除了 aws:SourceArn 條件,在不影響日誌交付的情況下悄悄破壞了混淆代理人防護——一個靜默的退化。
CloudTrail KMS 加密 — 靜態防禦
CloudTrail 日誌預設以 SSE-S3 在靜態加密。對於大多數 SCS-C02 「用客戶自管金鑰加密 CloudTrail」或「確保只有授權使用者能讀取 CloudTrail 日誌」的問題,答案是使用客戶自管金鑰(CMK)的 SSE-KMS。
在 CloudTrail trail 上啟用 KMS 加密需要三項政策編輯:
第一,KMS 金鑰政策必須允許 CloudTrail 服務主體(cloudtrail.amazonaws.com)呼叫 GenerateDataKey* 與 DescribeKey。若沒有這項權限,CloudTrail 就無法加密新的日誌檔案,且交付會靜默失敗。
第二,KMS 金鑰政策必須允許需要讀取 CloudTrail 日誌的 IAM 主體或角色呼叫 Decrypt。若沒有這項權限,你的資安分析師可以列出 S3 儲存貯體中的物件,但無法解密。
第三,目的地儲存貯體的 S3 儲存貯體政策必須允許 CloudTrail 寫入 KMS 加密的物件(通常透過 s3:x-amz-server-side-encryption 與 s3:x-amz-server-side-encryption-aws-kms-key-id 條件)。
SCS-C02 中關於「法規要求以客戶自管金鑰加密所有稽核日誌」或「資料保護長希望透過刪除金鑰來撤銷 CloudTrail 日誌存取」的問題,都指向在 CloudTrail 目的地儲存貯體上使用 SSE-KMS,並搭配你可控制政策的 KMS CMK。停用金鑰,CloudTrail 日誌就永久無法讀取。 Encrypting CloudTrail log files with AWS KMS managed keys
對於以 KMS 加密的多區域 CloudTrail trail,你使用單一 KMS 金鑰,金鑰政策中列出 CloudTrail 服務運作的每個區域。無需為每個區域配置個別金鑰;多區域金鑰對 CloudTrail 而言並非必要(CloudTrail 針對單一金鑰處理跨區域加密完全沒問題)。
日誌完整性驗證 — 竄改偵測
即使有 KMS 加密,擁有目的地儲存貯體寫入權限的攻擊者仍可刪除或替換 CloudTrail 日誌檔案。CloudTrail 的日誌完整性驗證功能透過寫入摘要檔案來防禦此類攻擊;摘要檔案是每小時交付的 CloudTrail 日誌檔案的密碼學簽署清單。
摘要檔案的鏈結方式
每小時,CloudTrail 都會在目的地儲存貯體中,與一般日誌檔案一起寫入一個摘要檔案。每個摘要檔案列出該小時內所有 CloudTrail 日誌檔案的 SHA-256 雜湊值,加上前一小時摘要檔案的雜湊值。這個鏈結意味著竄改任何單一小時的日誌,都會使其後所有摘要失效。摘要檔案由 AWS 使用非對稱金鑰簽署,即使攻擊者擁有儲存貯體的完整寫入權限,也無法在沒有 AWS 私鑰的情況下偽造有效的摘要。
實際驗證日誌
AWS CLI 內建 aws cloudtrail validate-logs --trail-arn <arn> --start-time <iso-8601>。該命令從最新的摘要開始往回走過整個摘要鏈,驗證每個摘要的 AWS 簽章,並驗證每個摘要中引用的每個日誌檔案仍然具有預期的 SHA-256 雜湊值。不吻合代表竄改、檔案遺失,或者——SCS-C02 最常見的情況——設定錯誤的 S3 生命週期政策讓日誌過期,而對應的摘要還在等著它們。
日誌完整性驗證是偵測性的控制。合規模式的 S3 Object Lock 是預防性的控制。SCS-C02 「防竄改偵測、防竄改覆蓋的 CloudTrail 日誌」最佳實務答案,是兩者並用:以摘要鏈驗證來偵測任何偏差,並以 Object Lock 防止刪除或覆蓋。Glacier Vault Lock 可對歸檔的 CloudTrail 日誌扮演類似的預防角色。 CloudTrail log file integrity validation
CloudTrail Insights — Management Events 的異常偵測
CloudTrail Insights 是 CloudTrail 內建的機器學習異常偵測器。在 trail 上啟用後,Insights 以每個區域、每個 API、每個帳號為單位,在七天滾動視窗內建立正常 management event 呼叫速率的基準,然後在觀察速率出現顯著偏差時,將 Insights event 寫入目的地。
Insights 監看的內容
兩種指標類型:API 呼叫速率(每分鐘 RunInstances、每分鐘 AssumeRole 等)以及 API 錯誤率(回傳錯誤的呼叫比例)。前者捕捉狂轟某個 API 的憑證填充式自動化攻擊;後者捕捉探測許多主體沒有權限的 API、產生錯誤率飆升的偵察掃描。
Insights 不監看的內容
Insights 永遠不分析 data events。Insights 不分析 Read management events 的呼叫速率異常(只分析 Write);但它確實分析 Read 與 Write 兩者的錯誤率。Insights 也無法原生跨帳號運作——每個 trail 有自己的基準值。若要對 data events 進行全組織範圍的異常偵測,你需要啟用 S3 Protection 或 Lambda Protection 功能的 Amazon GuardDuty。
SCS-C02 使用的題型:「攻擊者竊取了憑證,並在數週內悄悄外洩資料。」CloudTrail Insights 不會捕捉這種情況——API 速率沒有飆升,也沒有錯誤率飆升。正確的偵測方式是 GuardDuty UnauthorizedAccess:IAMUser/AnomalousBehavior 搭配 S3 data events 提供鑑識細節,而不是 Insights。
CloudTrail Insights events
CloudTrail 到 EventBridge — 即時回應
CloudTrail 與 Amazon EventBridge 整合,讓每個 CloudTrail 事件都成為一個可用規則比對的 EventBridge 事件。這是 SCS-C02 上每個「當 X 發生時自動修復」模式的基礎。
這個整合有幾個令人意外之處:
Management events 幾乎是即時出現在 EventBridge 中(通常在 API 呼叫後十五分鐘內)。Data events 只有在你對相關資源啟用了 CloudTrail data events,並且開啟了 data-event-to-EventBridge 功能後,才會出現在 EventBridge 中。Insights events 以 eventName 為 Insights 的 AWS API Call via CloudTrail 事件形式出現在 EventBridge 中。
常見的 CloudTrail EventBridge 規則模式包括:比對 eventSource: iam.amazonaws.com 與 eventName: CreateUser 以警示新 IAM 使用者建立;比對 errorCode: AccessDenied 以偵測拒絕存取風暴;比對 userIdentity.type: Root 以警示任何根帳號活動。每個規則可以以 Lambda 為目標進行修復、以 SNS 進行通報、以 Step Functions 執行協調化的應對手冊,或以 Security Hub 進行發現彙總。
CloudTrail 到 CloudWatch Logs — 即時串流與指標篩選器
CloudTrail trail 也可以在事件發生時,將事件同步交付到 CloudWatch Logs 日誌群組,作為 S3 目的地之外的額外選項。這是你用來在 CloudTrail 內容上建立 CloudWatch 指標篩選器與 CloudWatch 警示的方式。
以 CloudTrail-to-CloudWatch-Logs 為基礎的 SCS-C02 經典模式:
- 一個
{ $.eventName = ConsoleLogin && $.errorMessage = "Failed authentication" }指標篩選器,連接一個在五分鐘內三次失敗時發出通報的 CloudWatch 警示。 - 一個
{ $.userIdentity.type = Root }指標篩選器,連接一個在任何根帳號使用時觸發的警示。 - 一個
{ $.eventName = StopLogging || $.eventName = DeleteTrail || $.eventName = UpdateTrail }指標篩選器,偵測任何試圖停用 CloudTrail 的行為。
與 EventBridge 相比的取捨:CloudWatch Logs 的費用包含攝取加上保留儲存,指標篩選器在攝取後才對日誌行進行操作(比 EventBridge 稍慢),但指標篩選器提供與 CloudWatch 儀表板模型和歷史指標型報告整合的警示。EventBridge 提供更快、更低負擔的反應性自動化,但沒有歷史指標。
CloudTrail 與 Athena — 長尾鑑識
S3 中的 CloudTrail 日誌是 JSON 格式、gzip 壓縮、以區域和日期分區。將 Amazon Athena 指向儲存貯體,就能對多年的 CloudTrail 歷史進行 SQL 查詢。主控台甚至有一鍵「在 Athena 中為 CloudTrail 日誌建立資料表」精靈,可建構具備分區投影的正確 Glue 資料表。
CloudTrail-to-Athena 是 SCS-C02 問「哪個是跨多帳號查詢多年 CloudTrail 日誌最具成本效益的方式?」時的答案。CloudTrail Lake 是「最少營運負擔」為限定條件時的答案;當「最低成本」是限定條件時,Athena 勝出,尤其是你原本就已將日誌存在 S3 的情況下。Athena 只有查詢時才計費(按掃描的 TB 數),而 CloudTrail Lake 則是按攝取事件計費。
常見 SCS-C02 陷阱題型 — 快速掃描
以下是 SCS-C02 曾被觀察到的 CloudTrail 陷阱快速清單,每個濃縮成一段。
陷阱 1:Data events 預設關閉。「為什麼 CloudTrail 沒有捕捉到 S3 外洩?」因為 data events 預設關閉;團隊必須在 trail 上為每個儲存貯體或使用資源選擇器啟用 S3 data events。
陷阱 2:Insights 只監看 management events。「為什麼 Insights 沒有標記資料外洩異常?」因為 Insights 忽略 data events;資料平面異常偵測需使用 GuardDuty S3 Protection。
陷阱 3:非 us-east-1 的單一區域 trail 遺漏全域服務。「我的 IAM CreateUser 事件在哪裡?」在 us-east-1。修正:改用多區域 trail。
陷阱 4:未來區域不在單一區域 trail 的涵蓋範圍內。「為什麼新的 ap-southeast-4 區域的事件遺失了?」因為單一區域 trail 不會自動延伸;多區域 trail 會。
陷阱 5:成員帳號可以停用個別帳號的 trail,但無法停用 Organization Trail。「如何確保遭入侵的成員帳號無法停用日誌記錄?」使用從委任 CloudTrail 管理員帳號管理的 Organization Trail。
陷阱 6:跨帳號儲存貯體交付上的混淆代理人。「為什麼帳號 X 的 CloudTrail 日誌落在我們的儲存貯體裡?」因為儲存貯體政策缺少 aws:SourceArn 與 aws:SourceAccount 條件;若沒有這些條件,CloudTrail 的服務主體會過於寬鬆。
陷阱 7:KMS 金鑰刪除悄悄破壞 CloudTrail。「為什麼我們最近的 CloudTrail 日誌全部無法讀取?」因為目的地儲存貯體 SSE-KMS 使用的 KMS CMK 已被排程刪除。以該金鑰加密的 CloudTrail 日誌現在永久遺失。
陷阱 8:生命週期政策讓日誌過期,但摘要檔案還在等待它們。「為什麼 validate-logs 顯示『日誌檔案遺失』?」因為 S3 生命週期讓日誌檔案過期了,但摘要沒有一起設定。讓摘要和日誌檔案使用相同的保留期,或延長保留期。
陷阱 9:CloudTrail Lake 事件資料存放區有自己的保留設定。「為什麼 CloudTrail Lake 中找不到 90 天以前的事件?」因為事件資料存放區的保留期留在預設值。將保留期延長至最多七年。
陷阱 10:首份免費,第二份計費。「為什麼我們的 CloudTrail 費用翻倍了?」很可能是你有兩個 trail 在捕捉相同的 management events。只有第一份交付副本是免費的。
SCS-C02 的題目以表面變化重複使用這些模式。若你能在三十秒內辨識出底層機制,就能在考試中節省真實的時間。 CloudTrail troubleshooting
生產架構模式 — 參考配置
從 AWS Security Reference Architecture 與 Logging in AWS 白皮書 提煉出的 SCS-C02 等級 CloudTrail 廣泛推薦架構如下:
- AWS Organizations 已啟用,包含一個專屬的
log-archive帳號和一個專屬的security-tooling帳號,兩者皆在SecurityOU 下。 - CloudTrail 透過管理帳號在 Organization 層級啟用,
security-tooling帳號被登記為委任的 CloudTrail 管理員。 - 單一多區域 Organization Trail 捕捉所有 management events 以及選定的 data events(通常是標有
Sensitivity=High的儲存貯體和函式的 S3 和 Lambda)。 - Organization Trail 交付到
log-archive帳號中的 S3 儲存貯體,使用log-archive帳號的 CMK 進行 SSE-KMS 加密,以合規模式的 S3 Object Lock 保留一年,並啟用 S3 版本控制。 - 日誌完整性驗證已開啟;摘要檔案鏈結在同一個儲存貯體中。
- Trail 的第二份副本也流向
security-tooling中的 CloudWatch Logs 群組,用於根帳號登入、ConsoleLogin 失敗以及 CloudTrail 竄改嘗試的指標篩選器。 - CloudTrail Lake 在組織層級設定,用於聯合 SQL 查詢,事件資料存放區保留七年。
security-tooling中的 EventBridge 規則比對高嚴重性 CloudTrail 事件(根帳號使用、IAM CreateUser、安全群組全開變更),並轉發至 Lambda 應對手冊和 Security Hub。- 管理帳號中的 SCP
Denycloudtrail:StopLogging、cloudtrail:DeleteTrail、cloudtrail:UpdateTrail、cloudtrail:PutEventSelectors以及類似的 API,範圍涵蓋整個組織,即使是成員帳號管理員也不例外。
這個分層設計是任何「哪個架構在整個組織提供最完整、防竄改偵測、防竄改覆蓋的稽核日誌保證?」SCS-C02 問題的標準答案。
白話文解釋
CloudTrail 對許多人而言是個抽象的服務,所以這裡用三個截然不同的類比,讓 CloudTrail 的設計取捨變得直觀。
類比一:CloudTrail 是地檢署的案卷登記系統
想像一間地檢署。每當有偵查人員調閱卷宗、律師申請閱卷、承辦書記官歸檔文件,系統就在案卷登記簿上記一筆:誰操作、什麼時間、哪份案卷、是否成功。這就是 CloudTrail 的 management events——預設一直開著、控制平面的所有動作都記,第一份免費。
但是,案卷登記簿不會告訴你那位律師在閱覽室裡讀了哪幾頁內容、影印了哪一段供詞、從卷宗裡帶走了什麼資訊。要知道「頁面被讀了什麼」需要另一套閱覽室錄影系統——這對應的就是 CloudTrail 的 data events:S3 GetObject、Lambda Invoke、DynamoDB GetItem。Data events 預設關閉、要付錢、要逐個資源啟用。SCS-C02 最常用的陷阱,就是把 data events 講得像案卷登記簿一樣理所當然,然後問你為什麼沒記到——因為那本來就是閱覽室錄影系統的職責,案卷登記簿管不到。
CloudTrail Insights 則像地檢署裡那位盯著異常報表的督察:他每天看閱卷申請次數是否突然飆高、案卷調閱失敗率是否異常,一旦偏離基準就向主任檢察官示警。但他只看登記簿的數據;他從來不看閱覽室錄影。所以「為什麼 Insights 沒抓到資料外洩」的答案永遠是「Insights 不看 data events」。
類比二:CloudTrail Lake 像法院的電子卷證管理系統
CloudTrail 把日誌寫到 S3 像把紙本卷宗裝箱堆進倉庫;Athena 像委請助理進倉庫逐箱翻找;CloudTrail Lake 則是已全面電子化、可直接全文 SQL 搜尋的法院電子卷證系統。Event History 是法庭公告欄上貼的「最近三個月開庭一覽表」——不用特別申請就能看,但只列最近九十天。
選擇哪一個,取決於你要查多深、多舊、是否需要 SQL:查最近三個月的單筆事件,看 Event History 公告欄即可。需要查多年、跨帳號、要 SQL、不想自己建 schema,就用 CloudTrail Lake 電子系統。要省錢、自己會建 Athena schema、查詢頻率低,留在 S3 + Athena 翻舊卷宗。
類比三:Organization Trail 像健保署的全民就醫紀錄制度
每個 AWS 帳號像一家診所。普通的單帳號 trail 是診所自己留的病歷副本,院長(account admin)隨時可以自行銷毀。Organization Trail 是健保署的統一申報制度:所有診所的就醫紀錄都必須上傳到健保署中央資料庫(log-archive account),診所院長無權修改中央資料庫的記錄,甚至連「退出這套申報制度」都不行——只有健保署總部(management account)或委任的稽核單位(delegated admin)才能異動。
新診所一加入健保體系就自動適用這套申報制度,沒有漏網之魚。中央資料庫由健保署信任的極少數人控管,符合「集中管理、防止內部人員破壞、強制適用未來新成員」這三個 SCS-C02 反覆出題的安全治理核心需求。
Frequently Asked Questions
CloudTrail 為何顯示了 API 呼叫,卻看不到請求內部的資料?
CloudTrail 記錄請求參數(呼叫的中繼資料),但不記錄 S3 物件內容、DynamoDB data events 的項目屬性,或 Lambda 呼叫事件物件(這些只有在明確啟用後才作為 data events 記錄,即便如此 CloudTrail 捕捉的也是 API 中繼資料,而非完整酬載)。若需要物件位元組,你需要 S3 伺服器存取日誌或應用程式層級的日誌記錄。對於 SCS-C02,「CloudTrail 告訴你呼叫發生了,但不告訴你有哪些資料流動」是正確的心智模型。詳見 CloudTrail 記錄內容參考。
單一區域 trail 能捕捉跨區域 API 呼叫嗎?
單一區域 trail 只捕捉你指定區域的事件,外加(僅當 trail 位於 us-east-1 時)選擇性的全域服務事件。若帳號中的某個主體呼叫了你的單一區域 trail 未涵蓋區域的 API,該呼叫對那個 trail 而言是隱形的。多區域 trail 是安全的預設選擇。多區域 trail 文件有更深入的說明。
成員帳號在 Organization Trail 啟用期間退出 AWS Organization,會發生什麼?
CloudTrail 在該帳號退出組織的瞬間停止捕捉其事件。已交付到 log-archive 儲存貯體的歷史 CloudTrail 日誌仍然保留,但來自這個現在獨立帳號的新活動不再由(現已成為前任)Organization Trail 記錄。該獨立帳號需要自行建立個別帳號的 CloudTrail trail 以繼續日誌記錄。詳見更新 Organization Trail。
停止攝取後,CloudTrail Lake 事件資料存放區仍然計費儲存費用嗎?
是的。CloudTrail Lake 在寫入時按事件攝取計費,並額外按月計費保留儲存,直到設定的保留期到期為止。關閉攝取不會停止儲存費用;只有刪除事件資料存放區,或讓保留期自然到期,才能終止儲存費用。當前費率詳見 CloudTrail 定價。
我應該將 CloudTrail 送到 S3、CloudWatch Logs,還是兩者都送?
只要預算允許,幾乎一定兩者都送。S3 提供持久、低成本、長期保留的儲存,供 Athena 和 CloudTrail Lake 查詢。CloudWatch Logs 提供即時指標篩選器、警示,以及在較短時間範圍內的 Logs Insights 查詢。這種雙目的地模式正是 Logging in AWS 白皮書 的建議,也是 SCS-C02 在你看到同一道題中同時出現「即時警示」與「長期鑑識搜尋」時所期望的答案。
如何偵測有人試圖停用 CloudTrail 本身?
三個層次:(1) 在 Organization 根部設定 SCP,對所有人(除了極窄的緊急存取角色之外)Deny cloudtrail:StopLogging、cloudtrail:DeleteTrail 及相關 API;(2) 在 eventName = StopLogging || DeleteTrail || UpdateTrail 上設定 CloudWatch 指標篩選器,連接一個立即通報的警示;(3) 對相同模式設定 EventBridge 規則,觸發 Lambda 自動修復以重新啟用日誌記錄。SCS-C02 頻繁期待 SCP 加偵測的分層答案,而不是其中一個而已。詳見 CloudTrail 資安最佳實務。
CloudTrail 只記錄成功的 API 呼叫,還是失敗的也記錄?
兩者都記錄。失敗的呼叫會填入 errorCode 與 errorMessage 欄位。這對 SCS-C02 關於偵察偵測、IAM 拒絕呼叫和最小權限疑難排解的問題至關重要——errorCode = AccessDenied 是 CloudTrail 鑑識中訊號最高的欄位之一。CloudTrail 事件記錄參考列出了每個欄位。