

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 事件响应和取证
<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/)（例如 Deployment）遭到破坏，则属于该工作负载资源的所有 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)"'
```

上面的命令用于部署。您可以对其他工作负载资源（例如副本集、statefulsets 等）运行相同的命令。

### 使用服务账号名称识别违规的 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>

如果已为工作节点分配了允许 Pod 访问其他 AWS 资源的 IAM 角色，请将这些角色从实例中移除，以防止攻击造成进一步损害。同样，如果已为容器组分配了 IAM 角色，请评估您是否可以在不影响其他工作负载的情况下，从该角色安全删除 IAM 策略。

### 封锁工作节点
<a name="_cordon_the_worker_node"></a>

通过封锁受影响的工作节点，你就是在通知调度器避免将 pod 调度到受影响的节点上。这将允许您在不中断其他工作负载的情况下移除节点进行取证研究。

**注意**  
本指南不适用于 Fargate，其中每个 Fargate 吊舱都在自己的沙盒环境中运行。与其封锁，不如应用拒绝所有入口和出口流量的网络策略来封存受影响的 Fargate 吊舱。

### 在受影响的工作节点上启用终止保护
<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)节点免受缩容事件的影响。

**警告**  
您无法在竞价型实例上启用终止保护。

### 在违规行为 Pod/Node 上贴上标签，表明这是正在进行的调查的一部分
<a name="_label_the_offending_podnode_with_a_label_indicating_that_it_is_part_of_an_active_investigation"></a>

这将警告集群管理员，在调查完成 Pods/Nodes 之前不要篡改受影响的人。

### 捕获工作节点上的易失性工件
<a name="_capture_volatile_artifacts_on_the_worker_node"></a>
+  **捕获操作系统内存**。这将捕获 Docker 守护程序（或其他容器运行时）及其每个容器的子进程。[这可以使用 [Lim](https://github.com/504ensicsLabs/LiME) E 和 Volatility 等工具来实现，也可以通过更高级的工具来实现，例如基于这些工具构建[的 Amazon EC2 自动取证协调器](https://aws.amazon.com/solutions/implementations/automated-forensics-orchestrator-for-amazon-ec2/)。](https://www.volatilityfoundation.org/)
+  对@@ **正在运行的进程和打开的端口执行 netstat 树转储**。这将捕获每个容器的 docker 守护程序及其子进程。
+  在@@ **证据被更改之前，运行命令以保存容器级别的状态**。您可以使用容器运行时的功能来捕获有关当前正在运行的容器的信息。例如，使用 Containerd，您可以执行以下操作：
  +  `crictl ps`用于正在运行的进程。
  +  `crictl logs CONTAINER`用于守护程序级别保存的日志。

    使用 nerdctl CLI 代替（例如），使用 [cont](https://github.com/containerd/nerdctl) ainerd 也可以实现同样`docker`的效果。`nerdctl inspect`根据容器运行时的不同，还有一些其他命令可用。例如，Docker `docker diff` 必须查看容器文件系统的更改或`docker checkpoint`保存包括易失性内存 (RAM) 在内的所有容器状态。有关使用 contain [erd 或运行时的类似功能的讨论，请参阅这篇 Kubernetes 博客文章](https://kubernetes.io/blog/2022/12/05/forensic-container-checkpointing-alpha/)。 CRI-O 
+  **暂停容器以进行取证捕获**。
+  **快照实例的 EBS 卷**。

### 重新部署受感染的 Pod 或工作负载资源
<a name="_redeploy_compromised_pod_or_workload_resource"></a>

收集数据进行取证分析后，您可以重新部署受感染的 pod 或工作负载资源。

首先推出针对已被破坏的漏洞的修复程序，然后启动新的替换 pod。然后删除有漏洞的 pod。

如果易受攻击的 Pod 由更高级别的 Kubernetes 工作负载资源（例如 Deployment 或 DaemonSet）管理，则删除它们将安排新的 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 是一个渗透测试框架 CyberArk ，你可以用它](https://github.com/cyberark/kubesploit)来进行游戏日。与其他扫描集群漏洞的工具不同，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 由 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) 