Amazon SCS-C02: 容器與無伺服器安全 — 學習指南

屬於 AWS Security Specialty SCS-C02 — 學習指南. 使用經過驗證的解答練習: Amazon 考試中心, 或參加限時模擬考試: ExamRoll.io.

使用 ECS Exec 進行執行期檢查,無需 SSH

ECS Exec 提供一個進入執行中容器(包含 Fargate 任務)的互動式 shell,無需暴露 SSH、堡壘主機或公用 IP。它透過 AWS 注入到任務側邊車執行環境中的 SSM agent 來運作。因為沒有 SSH 精靈、沒有金鑰資料、也沒有需要保護的傳入網路路徑,所以維運開銷極小,且每個會話都可透過 CloudTrail 進行稽核,並可(選擇性地)記錄到 S3 或 CloudWatch Logs。

必須同時滿足三個要求,ECS Exec 才能運作:

一個典型的檢查流程如下:

aws ecs update-service --cluster prod --service api \
  --enable-execute-command --force-new-deployment

aws ecs execute-command --cluster prod \
  --task 5f8c...c2 --container api \
  --interactive --command "/bin/sh"

工程師可以從該 shell 將日誌複製到 S3、觸發記憶體傾印(heap dump),或讀取 /proc 進行鑑識。另一種方法——試圖透過 SSH 連接到容器,或重新啟動任務以啟用除錯代理——在 Fargate 上要嘛會失敗,要嘛會銷毀您試圖收集的證據。

在 EC2 上阻擋容器存取 IMDS

一個常見的誤解是,EC2 執行個體上的 IMDSv2 躍點限制(hop-limit)設定可以保護該執行個體上的容器。事實並非如此,至少在預設的 bridge 或 host 網路模式下不行:容器共享主機的網路命名空間或 NAT 橋接,因此可以連到 169.254.169.254 並取得執行個體設定檔的憑證,而這些憑證的權限通常遠高於任務角色。這完全違背了最小權限原則。

當無法遷移到 Fargate 時,解決方法有兩部分:

echo 'ECS_AWSVPC_BLOCK_IMDS=true' >> /etc/ecs/ecs.config
systemctl restart ecs

將此方法與一個最小權限的執行個體設定檔(基本上只包含 ECS agent 所需的權限:AmazonEC2ContainerServiceforEC2Role)以及為應用程式權限設定的個別任務 IAM 角色結合使用。將執行個體的 IMDS 躍點限制設為 1 並要求使用 IMDSv2 是一種有用的深度防禦措施,但不能作為替代方案——因為請求源自於主機,bridge 模式的容器仍然可以在躍點 1 到達 IMDS。

GuardDuty 執行期監控、EKS 保護與控制平面日誌

GuardDuty 提供分層的容器偵測功能:

除非 EKS 控制平面的稽核日誌確實被傳送到 CloudWatch Logs,否則 EKS Protection 毫無用處。在叢集上至少啟用 auditauthenticator 這兩種日誌類型:

aws eks update-cluster-config --name prod \
  --logging '{"clusterLogging":[{"types":["api","audit","authenticator","controllerManager","scheduler"],"enabled":true}]}'

若沒有這些日誌,GuardDuty 就沒有資料平面可以檢查 EKS Protection 的發現項目——這是一個常見的陷阱,因為維運人員啟用了 GuardDuty 功能,卻關閉了叢集的日誌組態,然後納悶為什麼都沒出現 Kubernetes 相關的發現項目。

使用 ECR 增強型掃描進行映像檔掃描

ECR 增強型掃描由 Amazon Inspector 提供支援,可持續掃描容器映像檔中的作業系統與語言套件(Python、Node、Java、Go、Ruby)的 CVEs。基本掃描是在推送時進行的一次性掃描,且只涵蓋作業系統套件;增強型掃描則是持續性的,並包含應用程式相依套件,而這正是大多數現代漏洞所在之處。

當這兩項服務都啟用時,發現項目會自動流向 Security Hub,提供一個單一管理平台來檢視合規性,並讓您能撰寫 EventBridge 規則來使不合規的 CI/CD 建置失敗。一個典型的強制執行模式:

實務問題:使用案例情境

情境: NovaTech 公司在混合運算環境中執行面向客戶的微服務:包含數個建於 EC2 上的 ECS 叢集、一個用於資料處理的 EKS 叢集,以及用於事件處理的無伺服器 Lambda。映像檔儲存在 ECR,維運團隊使用 SSM 進行主機存取,而已啟用的 GuardDuty/CloudWatch 對於容器和控制平面元件的可視性卻不一致。

挑戰: 一個生產環境的容器出現可疑的對外連線,且一位工程師發現某個 Pod 能夠存取 EC2 執行個體中繼資料服務,這有憑證外洩的風險;映像檔的漏洞和不足的控制平面日誌,可能隱藏了問題的根本原因。

建議方法:

  1. 為任務啟用 ECS Exec,並要求使用 AWS Systems Manager Session Manager 進行主機和容器執行期的檢測 (ECS Exec + SSM),從而移除對 SSH 的需求,並確保所有會話活動都記錄到 CloudTrail 和 CloudWatch Logs。
  2. 在 EC2 執行個體上強制使用 IMDSv2 (執行個體中繼資料服務設定為 HttpTokens=required, hop limit=1),並應用主機層級的網路規則,從容器的網路命名空間中阻擋 169.254.169.254,使容器無法查詢執行個體中繼資料。
  3. 為容器和 Lambda 開啟 Amazon GuardDuty 執行期監控與惡意軟體防護,並將發現的結果轉發到 Security Hub 和 EventBridge,以執行自動化的圍堵劇本。
  4. 透過將控制平面日誌 (audit, authenticator, controllerManager, scheduler) 傳送到 CloudWatch Logs 來強化 EKS,採用 IAM Roles for Service Accounts (IRSA),並強制實施准入控制 (Pod Security 或 OPA Gatekeeper) 以限制高風險的權能。
  5. 啟用 Amazon ECR 增強型映像檔掃描 (Inspector/ECR 掃描) 並設定推送時掃描,同時將掃描結果整合到 CI 流程中,透過 EventBridge + Lambda 來阻擋或隔離有問題的映像檔以強制執行。
  6. 集中化遙測資料:將 CloudTrail、GuardDuty 的發現、EKS 控制平面日誌以及 ECR 掃描結果傳送到一個集中的 S3/Lambda/Security Hub 管線,並將資料提供給 AWS Config 規則以達成持續合規。

理由: 此一系列步驟移除了基於 SSH 的存取方式、防止中繼資料憑證被竊、提供執行期偵測與自動化應對、強制實施映像檔的健康管理,並提供了控制平面的可視性——這與 AWS 的最小權限、縱深防禦及集中式可觀測性等最佳實踐相符。

# CodeBuild buildspec fragment
post_build:
  commands:
    - aws ecr describe-image-scan-findings \
        --repository-name api --image-id imageTag=$TAG \
        --query 'imageScanFindings.findingSeverityCounts' > findings.json
      CRIT=$(jq '.CRITICAL // 0' findings.json)
      if [ "$CRIT" -gt 0 ]; then echo "Critical CVEs present"; exit 1; fi

將掃描整合到管線中,才能使其從儀表板上的演練,轉變為真正的管控措施。

Lambda:授權方、機密與執行角色

Lambda 函數層級的安全性有三個經常被混淆的面向:

import boto3, os, json
_ssm = boto3.client("ssm")
_cached = None

def get_db_password():
    global _cached
    if _cached is None:
        r = _ssm.get_parameter(Name=os.environ["DB_PWD_PARAM"], WithDecryption=True)
        _cached = r["Parameter"]["Value"]
    return _cached

執行角色需要對該 CMK 擁有 ssm:GetParameterkms:Decrypt 權限。將機密快取在模組範疇內,這樣暖啟動的叫用就能避免 API 呼叫;對於更高吞吐量的函數,可使用 Secrets Manager Lambda extension 來進行具備自動輪替感知能力的快取。

ECR 加密與儲存庫保護

Amazon ECR 預設使用 AES-256 搭配 AWS 自管金鑰來加密所有靜態映像檔,但受監管的工作負載通常要求使用客戶自管的 KMS 金鑰,以便金鑰輪替、金鑰政策和 CloudTrail 的可稽核性都由客戶掌控。KMS 加密只能在儲存庫建立時進行設定;一個現有的 ECR 儲存庫事後無法從 AES-256 切換到 KMS。因此,遷移時需要建立一個新的、經 KMS 加密的儲存庫,複製或重新推送映像檔,更新下游的取用者,然後刪除舊的儲存庫。從一個經 KMS 加密的儲存庫拉取映像檔的跨帳戶取用者,除了需要 ECR 的讀取權限外,還必須被授予對該 CMK 的 kms:Decrypt 權限,否則即使儲存庫政策允許該主體,拉取操作也會因 KMS 存取錯誤而失敗。

{
  "encryptionConfiguration": {
    "encryptionType": "KMS",
    "kmsKey": "arn:aws:kms:us-east-1:111122223333:key/abcd-...-ef01"
  },
  "imageScanningConfiguration": { "scanOnPush": true },
  "imageTagMutability": "IMMUTABLE"
}

不可變標籤可以防止標籤劫持攻擊,這種攻擊會在掃描後,將一個已驗證的 v1.2.3 標籤悄悄地用惡意映像檔覆寫。

映像檔掃描:基本、增強與 Inspector

ECR 提供兩種掃描模式。基本掃描使用開源的 Clair CVE 資料庫,只在推送 (或手動觸發) 時執行,並在 ECR 主控台中回報結果。這項功能是免費的,但它不會執行持續重新掃描,也無法同時涵蓋作業系統 (OS) 和程式語言套件,並且沒有與 Security Hub 的原生整合。增強掃描由 Amazon Inspector 提供支援,涵蓋作業系統套件和應用程式語言套件 (Python、Java、Node.js、Go、Ruby、.NET)。Inspector 會根據最新的漏洞情報持續監控已推送的映像檔,因此即使某個 CVE 在映像檔推送一週後才被揭露,仍然會產生一個發現項目,而無需重新建置。

增強掃描是在登錄檔層級 (每個 Region) 啟用,並透過每個儲存庫的包含篩選條件 (inclusion filters),使用如 prod-*team-a/* 的萬用字元模式來設定。對於「掃描大部分儲存庫,但排除沙箱/實驗性儲存庫」這種常見需求,這是正確的控制方法——您應該定義正向的篩選條件來列出應掃描的對象,而不是對個別儲存庫設定反向的排除規則。

aws ecr put-registry-scanning-configuration \
  --scan-type ENHANCED \
  --rules '[{
    "scanFrequency": "CONTINUOUS_SCAN",
    "repositoryFilters":[{"filter":"prod-*","filterType":"WILDCARD"}]
  },{
    "scanFrequency": "SCAN_ON_PUSH",
    "repositoryFilters":[{"filter":"dev-*","filterType":"WILDCARD"}]
  }]'

Inspector 整合與 Security Hub 彙總

必須在需要掃描的每個帳戶和 Region 中啟用 Amazon Inspector。在 AWS Organizations 的設定中,安全工具帳戶會被指定為 Inspector 的委派管理員,這使其能夠啟用掃描、為新成員帳戶設定自動註冊,並檢視彙總的發現項目。忘記委派——或忘記切換自動註冊——是一種很細微的故障模式:新加入組織的帳戶會默默地將容器推送到 ECR,而這些容器從未被掃描,這在沒有任何錯誤訊息的情況下,破壞了掃描覆蓋率的保證。

當這兩項服務都啟用,且 Security Hub 的 Inspector 整合功能開啟時,Inspector 的發現項目會自動流入 AWS Security Hub。接著,Security Hub 會將發現項目標準化為 AWS 安全發現項目格式 (ASFF),並將其與 GuardDuty、Macie 和 Config 的發現項目相互關聯,再結合委派的 Security Hub 管理員以及跨 Region 彙總功能,呈現出一個單一管理平台 (single pane of glass)。針對 Security Hub 發現項目的 EventBridge 規則可以將關鍵的 CVE 路由到 Lambda 以自動建立工單、用 quarantine=true 標籤標記有問題的映像檔,或透過 pipeline 閘門來阻擋部署。

集中式掃描與跨帳戶 CI/CD

對於多帳戶容器工作負載,建議的模式是以一個強化的中央登錄檔帳戶為核心:

跨帳戶讀取存取需要兩個層級的權限:一個在消費者帳戶中的 IAM 政策,授予 ecr:GetDownloadUrlForLayerecr:BatchGetImageecr:GetAuthorizationToken 權限;以及一個在中央帳戶 ECR repo 上的儲存庫政策 (repository policy),允許特定的消費者帳戶或角色存取。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "AllowProdPull",
    "Effect": "Allow",
    "Principal": {"AWS":"arn:aws:iam::444455556666:role/EcsTaskExecutionRole"},
    "Action": ["ecr:BatchGetImage","ecr:GetDownloadUrlForLayer"]
  }]
}

由於 ECR 儲存庫政策是基於資源的,存取權限由身分政策和資源政策的交集決定——省略任何一個層級都會導致 AccessDeniedException。當涉及 KMS 時,KMS 金鑰政策也必須授予跨帳戶主體 kms:Decrypt 的權限。

EKS 控制平面日誌記錄與可觀測性

對於 EKS,其託管的控制平面無法直接存取,因此與安全相關的 Kubernetes 事件只有在明確啟用控制平面日誌記錄時才會被揭露。有五種日誌類型可用:apiauditauthenticatorcontrollerManagerscheduleraudit 日誌是價值最高的安全產物——它記錄了對叢集發出的每一次 API 呼叫,並透過 IAM authenticator 解析出呼叫者身分——而 authenticator 日誌則記錄了 IAM 到 Kubernetes RBAC 的映射決策。所有類型的日誌都會串流到 CloudWatch Logs/aws/eks/<cluster>/cluster 日誌群組中,從那裡可以訂閱到 Kinesis Data Firehose、轉發到 S3 或傳送到 SIEM。

aws eks update-cluster-config --name prod-cluster \
  --logging '{"clusterLogging":[{"types":["api","audit","authenticator",
  "controllerManager","scheduler"],"enabled":true}]}'

使用 GuardDuty EKS Protection (節點上的執行期威脅偵測) 來補充控制平面日誌,並使用 IRSA (IAM Roles for Service Accounts) 而非節點執行個體描述檔,這樣稽核日誌就能將 AWS API 活動歸因於特定的 pod。

常見陷阱

只依賴推送時掃描 (scan-on-push): 基本的推送時掃描只能抓到推送當下已知的漏洞,但對於那些已經存在於 registry 中的映像檔,事後才揭露的 CVEs 就無能為力了。像 PCI DSS 和 FedRAMP 這類的稽核框架要求持續性的漏洞評估,這強制規定要使用 CONTINUOUS_SCAN 頻率的增強型掃描,並搭配 Security Hub 進行彙總。單次推送的快照式掃描無法滿足這項控制要求。

當要求靜態加密時,卻忽略在 ECR 上使用 KMS: 預設的 AES-256 加密的確是貨真價實的加密,但對於那些要求客戶自管金鑰 (customer-managed keys)、金鑰輪替紀錄,以及針對每個 principal 留下 kms:Decrypt 稽核軌跡的合規性制度而言,使用 AWS 自有金鑰是無法滿足的。由於每個 repository 的加密類型是不可變的,這個問題必須在建立時就解決——想著「我們之後再開啟」是不可能的,除非重建整個 repo。

忘記設定 Inspector 委派管理員或自動註冊: 如果沒有為 Inspector 設定委派管理員,每個帳號的擁有者都必須各自獨立地啟用掃描並轉發結果,這在操作上是不可行的,而且會產生覆蓋率的缺口。如果沒有為新成員帳號啟用自動啟用 (auto-enable for new member accounts),那麼每個透過 Control Tower 或 Organizations 建立的新帳號,其 Inspector 預設都是停用的。如此一來,即使中央帳號的 Security Hub 顯示沒有任何發現,這些帳號裡的 ECR 映像檔也都是未經掃描的——這是一種無聲的偽陰性 (false-negative),而不是一個明顯的錯誤。

實務問題:使用案例情境

情境: Meridian Financial 公司在一個多帳號的 AWS 環境中營運,其生產環境的 EKS 叢集、ECS 服務,以及多個 ECR registry 分散在 prod、dev 和一個專用的安全帳號中。他們的工程團隊透過 CI/CD pipeline 將容器映像檔推送到 ECR,並部署到 EKS/ECS,而安全團隊則維護一個中央帳號,用於監控與合規。

挑戰: 最近一次的部署,交付了一個帶有高嚴重性漏洞的容器,但在進入生產環境前並未被偵測到。調查人員發現 EKS control plane 的日誌有限,且掃描結果分散在各個帳號中,導致修復速度緩慢。

建議方法:

  1. 啟用 ECR repository 層級的保護:強制執行映像檔標籤不可變性 (image tag immutability)、套用 repository 政策以限制特定 IAM role 的推送/拉取權限,並使用專屬的 AWS KMS 客戶自管金鑰 (CMK) 對 repository 進行靜態加密。
  2. 開啟推送時映像檔掃描 (基本),並啟用 Amazon Inspector 對 ECR 的增強型映像檔掃描以產出漏洞發現;將 Inspector 與 AWS Security Hub 整合,以便跨帳號集中彙總嚴重性等級。
  3. 實作集中式跨帳號掃描:設定 ECR 複寫,或授予安全帳號中的 CodeBuild/CodePipeline role 跨帳號的拉取權限,讓安全帳號能使用 Inspector 及任何額外的 SCA/DAST 工具掃描每一個映像檔,並將產出的成品儲存在一個使用安全帳號 CMK 加密的集中式 S3 bucket 中。
  4. 強制執行 CI/CD 閘門:在 pipeline 中增加一個掃描階段 (可使用 CodeBuild/CodePipeline 或帶有 STS assume-role 的 GitHub Actions),該階段會查詢 Inspector/Security Hub 的發現,並自動阻擋或要求審批帶有高/嚴重等級發現的映像檔。
  5. 提升 EKS 的可觀測性:將 EKS control plane 的日誌 (API、Audit、Authenticator、ControllerManager、Scheduler) 啟用並傳送到一個集中式日誌帳號的 CloudWatch Logs 中,為 EKS API 事件啟用 CloudTrail,並使用 Container Insights 和 GuardDuty 進行執行階段監控。

基本原理: 此方法應用了深度防禦 (defense-in-depth) 的概念:加密並保護 registry、使用 Inspector 自動化增強型掃描、在 Security Hub 中集中化發現以達成一致的政策執行、在 CI/CD 中設置部署閘門,以及啟用 EKS control plane 日誌以利快速偵測與鑑識,這一切都符合 AWS 的最低權限 (least-privilege) 和集中式監控的最佳實務。


漏洞、修補與主機安全 · 所有領域 · 事件應變與鑑識

練習這些題目 → · 在 ExamRoll.io 上限時練習 →

Pass the whole exam — not just this question

You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.

通過考試 →

瀏覽 Amazon →

Related guides

一站式存取

一份訂閱。所有考試。

每個方案都可無限存取答案搜尋、練習測驗、AI 解釋和完整的資源庫 — 支援 20 多種語言。

每月
24.87
Just €0.83/day
包含所有內容:
  • 無限答案搜尋
  • 無限練習測驗
  • AI 驅動的解釋
  • 完整資源庫
  • 20 多種語言
  • 每週內容更新
  • 獎勵與推薦
  • 優先支援
開始免費試用

無需信用卡*

最佳價值
12 個月
179.87
Just €0.49/daySave 40%
包含所有內容:
  • 無限答案搜尋
  • 無限練習測驗
  • AI 驅動的解釋
  • 完整資源庫
  • 20 多種語言
  • 每週內容更新
  • 獎勵與推薦
  • 優先支援
開始免費試用

無需信用卡*

✓ 包含免費方案 · ✓ 隨時取消 · ✓ 所有方案解鎖完整產品