

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 事件回應和鑑識
<a name="incident-response-and-forensics"></a>

您能夠快速回應事件，有助於將違規所造成的損害降至最低。擁有可警告您可疑行為的可靠提醒系統，是良好事件回應計畫的第一步。當事件發生時，您必須快速決定是否銷毀和取代受影響的容器，或隔離和檢查容器。如果您選擇隔離容器做為鑑識調查和根本原因分析的一部分，則應遵循下列一組活動：

## 範例事件回應計劃
<a name="_sample_incident_response_plan"></a>

### 識別違規的 Pod 和工作者節點
<a name="_identify_the_offending_pod_and_worker_node"></a>

您的第一個動作應該是隔離損壞。首先識別違規發生的位置，並將該 Pod 及其節點與基礎設施的其他部分隔離。

### 使用工作負載名稱識別違規的 Pod 和工作者節點
<a name="_identify_the_offending_pods_and_worker_nodes_using_workload_name"></a>

如果您知道違規 Pod 的名稱和命名空間，您可以識別執行 Pod 的工作者節點，如下所示：

```
kubectl get pods <name> --namespace <namespace> -o=jsonpath='{.spec.nodeName}{"\n"}'
```

如果部署等[工作負載資源](https://kubernetes.io/docs/concepts/workloads/controllers/)遭到入侵，則屬於工作負載資源的所有 Pod 都可能遭到入侵。使用下列命令列出工作負載資源的所有 Pod 及其執行的節點：

```
selector=$(kubectl get deployments <name> \
 --namespace <namespace> -o json | jq -j \
'.spec.selector.matchLabels | to_entries | .[] | "\(.key)=\(.value)"')

kubectl get pods --namespace <namespace> --selector=$selector \
-o json | jq -r '.items[] | "\(.metadata.name) \(.spec.nodeName)"'
```

上述命令適用於 部署。您可以針對複本、狀態集等其他工作負載資源執行相同的命令。

### 使用服務帳戶名稱識別違規的 Pod 和工作者節點
<a name="_identify_the_offending_pods_and_worker_nodes_using_service_account_name"></a>

在某些情況下，您可能會發現服務帳戶遭到入侵。使用已識別服務帳戶的 Pod 可能會遭到入侵。您可以使用服務帳戶及其執行的節點，使用以下命令來識別所有 Pod：

```
kubectl get pods -o json --namespace <namespace> | \
    jq -r '.items[] |
    select(.spec.serviceAccount == "<service account name>") |
    "\(.metadata.name) \(.spec.nodeName)"'
```

### 識別具有易受攻擊或遭入侵映像的 Pod 和工作者節點
<a name="_identify_pods_with_vulnerable_or_compromised_images_and_worker_nodes"></a>

在某些情況下，您可能會發現叢集上 Pod 中使用的容器映像是惡意或洩露的。如果發現容器映像包含惡意軟體，則容器映像是惡意或洩露的，是已知的不良映像，或具有已被利用的 CVE。您應該考慮所有使用容器映像的 Pod 都遭到入侵。您可以使用正在執行的映像和節點，使用以下命令來識別 Pod：

```
IMAGE=<Name of the malicious/compromised image>

kubectl get pods -o json --all-namespaces | \
    jq -r --arg image "$IMAGE" '.items[] |
    select(.spec.containers[] | .image == $image) |
    "\(.metadata.name) \(.metadata.namespace) \(.spec.nodeName)"'
```

### 透過建立網路政策來隔離 Pod，該政策會拒絕所有傳入和傳出至 Pod 的流量
<a name="_isolate_the_pod_by_creating_a_network_policy_that_denies_all_ingress_and_egress_traffic_to_the_pod"></a>

拒絕所有流量規則可透過切斷與 Pod 的所有連線，協助停止已進行中的攻擊。下列網路政策將套用至標籤為 的 Pod`app=web`。

```
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
spec:
  podSelector:
    matchLabels:
      app: web
  policyTypes:
  - Ingress
  - Egress
```

**重要**  
如果攻擊者已取得基礎主機的存取權，則網路政策可能證明無效。如果您懷疑 已發生，您可以使用 [AWS 安全群組](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)將遭入侵的主機與其他主機隔離。變更主機的安全群組時，請注意，這會影響在該主機上執行的所有容器。

### 視需要撤銷指派給 Pod 或工作者節點的臨時安全登入資料
<a name="_revoke_temporary_security_credentials_assigned_to_the_pod_or_worker_node_if_necessary"></a>

如果工作者節點已指派 IAM 角色，允許 Pod 存取其他 AWS 資源，請從執行個體中移除這些角色，以防止進一步受到攻擊。同樣地，如果已為 Pod 指派 IAM 角色，請評估您是否可以安全地從該角色中移除 IAM 政策，而不會影響其他工作負載。

### 繫結工作者節點
<a name="_cordon_the_worker_node"></a>

透過隔離受影響的工作者節點，您可以通知排程器，以避免將 Pod 排程到受影響的節點。這可讓您移除鑑識研究的節點，而不會中斷其他工作負載。

**注意**  
此指引不適用於 Fargate，其中每個 Fargate Pod 都在自己的沙盒環境中執行。套用拒絕所有輸入和輸出流量的網路政策，取代封鎖，以封鎖受影響的 Fargate Pod。

### 在受影響的工作者節點上啟用終止保護
<a name="_enable_termination_protection_on_impacted_worker_node"></a>

攻擊者可能會嘗試透過終止受影響的節點來清除其行為錯誤。啟用[終止保護](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#Using_ChangingDisableAPITermination)可以防止這種情況發生。[執行個體縮減保護](https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-termination.html#instance-protection)會保護節點免於縮減事件。

**警告**  
您無法在 Spot 執行個體上啟用終止保護。

### 使用標籤標記違規的 Pod/Node，指出它是主動調查的一部分
<a name="_label_the_offending_podnode_with_a_label_indicating_that_it_is_part_of_an_active_investigation"></a>

這將作為警告，讓叢集管理員在調查完成之前不要竄改受影響的 Pod/節點。

### 擷取工作者節點上的揮發性成品
<a name="_capture_volatile_artifacts_on_the_worker_node"></a>
+  **擷取作業系統記憶體**。這將擷取每個容器的 Docker 協助程式 （或其他容器執行時間） 及其子程序。這可以使用 [LiME](https://github.com/504ensicsLabs/LiME) 和 [Volatility](https://www.volatilityfoundation.org/) 等工具，或透過在上面建置的 [Amazon EC2 專用 Automated Forensics Orchestrator](https://aws.amazon.com/solutions/implementations/automated-forensics-orchestrator-for-amazon-ec2/) 等高階工具來完成。
+  **執行執行中程序和開放連接埠的 netstat 樹傾印**。這將擷取每個容器的 docker 協助程式及其子程序。
+  **在修改證據之前，執行命令來儲存容器層級狀態**。您可以使用容器執行時間的功能來擷取目前執行中容器的相關資訊。例如，使用 Containerd，您可以執行下列動作：
  +  `crictl ps` 適用於執行中的程序。
  +  `crictl logs CONTAINER` 適用於常駐程式層級的保留日誌。

    使用 [nerdctl](https://github.com/containerd/nerdctl) CLI 取代 `docker`（例如 `nerdctl inspect`) 以容器化 來達成相同的目標。根據容器執行時間，某些額外的命令可用。例如，Docker `docker diff` 必須查看容器檔案系統的變更，或儲存所有容器狀態`docker checkpoint`，包括揮發性記憶體 (RAM)。如需與容器化或 CRI-O 執行時間類似功能的討論，請參閱[此 Kubernetes 部落格文章](https://kubernetes.io/blog/2022/12/05/forensic-container-checkpointing-alpha/)。
+  **暫停容器以進行鑑識擷取**。
+  **快照執行個體的 EBS 磁碟區**。

### 重新部署遭入侵的 Pod 或工作負載資源
<a name="_redeploy_compromised_pod_or_workload_resource"></a>

收集資料進行鑑識分析之後，您就可以重新部署遭入侵的 Pod 或工作負載資源。

首先針對遭到入侵的漏洞推出修正，並啟動新的替換 Pod。然後刪除易受攻擊的 Pod。

如果易受攻擊的 Pod 是由更高層級的 Kubernetes 工作負載資源 （例如部署或 DaemonSet) 管理，則刪除它們會排程新的 Pod。因此，易受攻擊的 Pod 將再次啟動。在這種情況下，您應該在修正漏洞之後部署新的替換工作負載資源。然後，您應該刪除易受攻擊的工作負載。

## 建議
<a name="_recommendations"></a>

### 檢閱 AWS 安全事件回應白皮書
<a name="_review_the_aws_security_incident_response_whitepaper"></a>

雖然本節提供簡短的概觀，以及一些處理可疑安全漏洞的建議，但白皮書 [AWS 安全事件回應](https://docs.aws.amazon.com/whitepapers/latest/aws-security-incident-response-guide/welcome.html)會詳細介紹主題。

### 練習安全遊戲日
<a name="_practice_security_game_days"></a>

將您的安全從業人員分成 2 個團隊：紅色和藍色。紅隊將專注於探測不同系統是否有漏洞，而藍隊將負責防禦漏洞。如果您沒有足夠的安全從業人員來建立不同的團隊，請考慮雇用了解 Kubernetes 漏洞的外部實體。

 [Kubesploit](https://github.com/cyberark/kubesploit) 是 CyberArk 的滲透測試架構，可用來執行遊戲日。與其他掃描叢集是否有漏洞的工具不同，kubesploit 模擬真實世界的攻擊。這讓您的藍隊有機會練習其對攻擊的回應，並衡量其有效性。

### 針對您的叢集執行滲透測試
<a name="_run_penetration_tests_against_your_cluster"></a>

定期攻擊您自己的叢集可協助您發現漏洞和設定錯誤。開始使用之前，請先遵循[滲透測試準則](https://aws.amazon.com/security/penetration-testing/)，再對您的叢集進行測試。

## 工具和資源
<a name="_tools_and_resources"></a>
+  [kube-hunter](https://github.com/aquasecurity/kube-hunter)，適用於 Kubernetes 的滲透測試工具。
+  [Gremlin](https://www.gremlin.com/product/#kubernetes) 是一種混沌的工程工具組，可用來模擬針對應用程式和基礎設施的攻擊。
+  [攻擊和防禦 Kubernetes 安裝](https://github.com/kubernetes/sig-security/blob/main/sig-security-external-audit/security-audit-2019/findings/AtredisPartners_Attacking_Kubernetes-v1.0.pdf) 
+  [kubesploit](https://www.cyberark.com/resources/threat-research-blog/kubesploit-a-new-offensive-tool-for-testing-containerized-environments) 
+  [NeuVector by SUSE](https://www.suse.com/neuvector/) 開放原始碼、零信任容器安全平台，提供漏洞和風險報告以及安全事件通知
+  [進階持久性威脅](https://www.youtube.com/watch?v=CH7S5rE3j8w) 
+  [Kubernetes 實務攻擊與防禦](https://www.youtube.com/watch?v=LtCx3zZpOfs) 
+  [利用 RBAC 許可入侵 Kubernetes 叢集](https://www.youtube.com/watch?v=1LMo0CftVC4) 