Amazon EKS 集群的运行时覆盖率和故障排除 - Amazon GuardDuty
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon EKS 集群的运行时覆盖率和故障排除

启用运行时监控并手动或通过自动代理配置安装适用于 EKS 的 GuardDuty 安全代理(附加组件)后,即可开始评估 EKS 集群的覆盖率。

查看覆盖率统计数据

与您自己的账户或成员账户关联的 EKS 集群的覆盖率统计数据,指的是正常 EKS 集群占选定 Amazon Web Services 区域 环境中所有 EKS 集群的百分比。下式将其表示为:

(正常集群/所有集群)*100

选择一种访问方法来查看您账户的覆盖率统计数据。

Console
  • 登录 Amazon Web Services 管理控制台,打开 GuardDuty 控制台:https://console.aws.amazon.com/guardduty/

  • 在导航窗格中,选择运行时监控

  • 选择 EKS 集群运行时覆盖范围选项卡。

  • EKS 集群运行时覆盖范围选项卡下,您可以查看按集群列表表中可用的覆盖状态汇总的覆盖率统计数据。

    • 您可以按以下列筛选集群列表表:

      • 集群名称

      • 账户 ID

      • 代理管理类型

      • 覆盖状态

      • 插件版本

  • 如果您的任何 EKS 集群的覆盖状态不正常,则问题列可能包含有关不正常状态原因的其他信息。

API/CLI
  • 使用您自己的有效检测器 ID、区域和服务端点运行 ListCoverage API。您可以使用此 API 对集群列表进行筛选和排序。

    • 您可以使用以下 CriterionKey 选项之一更改示例 filter-criteria

      • ACCOUNT_ID

      • CLUSTER_NAME

      • RESOURCE_TYPE

      • COVERAGE_STATUS

      • ADDON_VERSION

      • MANAGEMENT_TYPE

    • 您可以使用以下选项更改 sort-criteria 中的示例 AttributeName

      • ACCOUNT_ID

      • CLUSTER_NAME

      • COVERAGE_STATUS

      • ISSUE

      • ADDON_VERSION

      • UPDATED_AT

    • 您可以更改最大结果(最多 50 个)。

    • 要查找您账户和当前区域的 detectorId,请查看 https://console.aws.amazon.com/guardduty/ 控制台中的设置页面,或者运行 ListDetectors API。

    aws guardduty --region us-east-1 list-coverage --detector-id 12abc34d567e8fa901bc2d34e56789f0 --sort-criteria '{"AttributeName": "EKS_CLUSTER_NAME", "OrderBy": "DESC"}' --filter-criteria '{"FilterCriterion":[{"CriterionKey":"ACCOUNT_ID", "FilterCondition":{"EqualsValue":"111122223333"}}] }' --max-results 5
  • 运行 GetCoverageStatistics API,以检索基于 statisticsType 的覆盖范围汇总统计数据。

    • 您可以使用以下选项之一更改示例 statisticsType

      • COUNT_BY_COVERAGE_STATUS:表示按覆盖状态汇总的 EKS 集群的覆盖率统计数据。

      • COUNT_BY_RESOURCE_TYPE:根据列表中的 Amazon 资源类型汇总的覆盖率统计数据。

      • 您可以在命令中更改示例 filter-criteria。您可以对 CriterionKey 使用以下选项:

        • ACCOUNT_ID

        • CLUSTER_NAME

        • RESOURCE_TYPE

        • COVERAGE_STATUS

        • ADDON_VERSION

        • MANAGEMENT_TYPE

    • 要查找您账户和当前区域的 detectorId,请查看 https://console.aws.amazon.com/guardduty/ 控制台中的设置页面,或者运行 ListDetectors API。

    aws guardduty --region us-east-1 get-coverage-statistics --detector-id 12abc34d567e8fa901bc2d34e56789f0 --statistics-type COUNT_BY_COVERAGE_STATUS --filter-criteria '{"FilterCriterion":[{"CriterionKey":"ACCOUNT_ID", "FilterCondition":{"EqualsValue":"123456789012"}}] }'

如果您的 EKS 集群的覆盖状态为不正常,请参阅 对 Amazon EKS 运行时覆盖率问题故障排除

通过 EventBridge 通知接收覆盖率状态更改

您账户中 EKS 集群的覆盖状态可能显示为不正常。要检测覆盖状态何时变为不正常,我们建议您定期监控覆盖状态,并在状态变为不正常时进行问题排查。或者,您可以创建一个 Amazon EventBridge 规则,当覆盖状态从 Unhealthy 变为 Healthy,或变为其他状态时通知您。默认情况下,GuardDuty 会在您账户的 EventBridge 总线中发布此信息。

示例通知架构

在 EventBridge 规则中,您可以使用预定义的示例事件和事件模式来接收覆盖状态通知。有关创建 EventBridge 规则的更多信息,请参阅《Amazon EventBridge 用户指南》中的创建规则

此外,您还可以使用以下示例通知架构来创建自定义事件模式。确保替换账户的值。要在 Amazon EKS 集群的覆盖率状态从 Healthy 变为 Unhealthy 时接收通知,则 detail-type 应为 GuardDuty Runtime Protection Unhealthy。要在覆盖状态从 Unhealthy 变为 Healthy 时收到通知,请将 detail-type 的值替换为 GuardDuty Runtime Protection Healthy

{ "version": "0", "id": "event ID", "detail-type": "GuardDuty Runtime Protection Unhealthy", "source": "aws.guardduty", "account": "Amazon Web Services 账户 ID", "time": "event timestamp (string)", "region": "Amazon Web Services 区域", "resources": [ ], "detail": { "schemaVersion": "1.0", "resourceAccountId": "string", "currentStatus": "string", "previousStatus": "string", "resourceDetails": { "resourceType": "EKS", "eksClusterDetails": { "clusterName": "string", "availableNodes": "string", "desiredNodes": "string", "addonVersion": "string" } }, "issue": "string", "lastUpdatedAt": "timestamp" } }

对 Amazon EKS 运行时覆盖率问题故障排除

如果 EKS 集群的覆盖状态为 Unhealthy,您可以在 GuardDuty 控制台的问题列下或使用 CoverageResource 数据类型查看相应的错误。

在使用包含或排除标签有选择地监控 EKS 集群时,标签可能需要一些时间才能同步。这可能会影响关联 EKS 集群的覆盖状态。您可以再次尝试删除并添加相应的标签(包含或排除)。有关更多信息,请参阅《Amazon EKS 用户指南》中的标记 Amazon EKS 资源

覆盖问题的结构是 Issue type:Extra information。通常,问题会有一个可选的额外信息,其中可能包括特定的客户端异常或有关问题的描述。根据额外信息,下表提供了对 EKS 集群的覆盖问题进行故障排除的建议步骤。

问题类型(前缀)

额外信息

建议的问题排查步骤

附加组件创建失败

插件 aws-guardduty-agent 与集群 ClusterName 的当前集群版本不兼容。不支持指定的插件。

确保您使用的是支持部署 aws-guardduty-agent EKS 插件的 Kubernetes 版本之一。有关更多信息,请参阅 GuardDuty 安全代理支持的 Kubernetes 版本。有关更新 Kubernetes 版本的信息,请参阅更新 Amazon EKS 集群 Kubernetes 版本

附加组件创建失败

附加组件更新失败

附加组件状态不正常

EKS 插件问题:AddonIssueCode:AddonIssueMessage

有关特定附加组件问题代码的推荐步骤的信息,请参阅Troubleshooting steps for Addon creation/updatation error with Addon issue code

有关在此问题中可能遇到的附加组件问题代码的列表,请参阅 AddonIssue

VPC 端点创建失败

共享 VPC vpcId 不支持创建 VPC 端点

运行时监控现在支持在组织内使用共享 VPC。确保您的账户满足所有先决条件。有关更多信息,请参阅 使用共享 VPC 的先决条件

仅在将自动代理配置与共享 VPC 结合使用时

共享 VPC vpcId 的所有者账户 ID 111122223333 未启用运行时监控、自动代理配置或运行时监控与自动代理配置。

共享 VPC 所有者账户必须至少为一种资源类型 [Amazon EKS 或 Amazon ECS(Amazon Fargate)] 启用运行时监控和自动代理配置。有关更多信息,请参阅 GuardDuty 运行时监控特有的先决条件

启用私有 DNS 需要将 vpcIdenableDnsSupportenableDnsHostnames VPC 属性设置为 true(服务:Ec2,状态代码:400,请求 ID:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111)。

确保以下 VPC 属性设置为 trueenableDnsSupportenableDnsHostnames。有关更多信息,请参阅 VPC 中的 DNS 属性

如果您在 https://console.aws.amazon.com/vpc/ 上使用 Amazon VPC 控制台创建 Amazon VPC,确保选择启用 DNS 主机名启用 DNS 解析。有关更多信息,请参阅 VPC 配置选项

VPC 端点删除失败

账户 ID 111122223333、共享 VPC vpcId、所有者账户 ID 555555555555 不允许删除共享 VPC 端点。

可能的步骤:
  • 禁用共享 VPC 参与者账户的运行时监控状态不会影响共享 VPC 端点策略和所有者账户中存在的安全组。

    要删除共享 VPC 端点和安全组,您必须在共享 VPC 所有者账户中禁用运行时监控或自动代理配置状态。

  • 共享 VPC 参与者账户无法删除共享 VPC 端点和共享 VPC 所有者账户中托管的安全组。

本地 EKS 集群

本地 Outpost 集群不支持 EKS 插件。

不可操作。

有关更多信息,请参阅 Amazon EKS on Amazon outposts

未授予 EKS 运行时监控启用权限

(可能会也可能不会显示额外信息)

  1. 如果有关于此问题的额外信息,请解决根本原因并执行下一步。

  2. 切换 EKS 运行时监控以将其关闭,然后再次开启。确保同时部署 GuardDuty 代理,无论是通过 GuardDuty 自动部署还是手动部署。

EKS 运行时监控启用资源正在预置

(可能会也可能不会显示额外信息)

不可操作。

启用 EKS 运行时监控后,覆盖状态可能会保持 Unhealthy,直到资源预置步骤完成。定期监控和更新覆盖状态。

其他(任何其他问题)

由于授权失败而导致的错误

切换 EKS 运行时监控以将其关闭,然后再次开启。确保同时部署 GuardDuty 代理,无论是通过 GuardDuty 自动部署还是手动部署。

带有附加组件问题代码的附加组件创建/更新错误的故障排除步骤

附加组件创建或更新错误

故障排除步骤

EKS 附加组件问题 – InsufficientNumberOfReplicas:该附加组件运行不正常,因为没有所需数量的副本。

  • 借助问题消息,您可以确定并解决根本原因。您可以首先描述您的集群。例如,使用 kubectl describe pods 来确定容器组(pod)故障的根本原因。

    解决根本原因后,请重试该步骤(创建或更新附加组件)。

  • 如果问题仍然存在,请验证 Amazon EKS 集群的 VPC 端点配置是否正确。有关更多信息,请参阅 验证 VPC 端点配置

EKS 附加组件问题 – InsufficientNumberOfReplicas:该附加组件运行不正常,因为一个或多容器组(pod)未调度,0/x 个节点可用:x Insufficient cpu. preemption: not eligible due to preemptionPolicy=Never

要解决此问题,您可以执行下列操作之一:

注意

此消息会显示 o/x,因为 GuardDuty 仅报告第一个发现的错误。GuardDuty Daemonset 中运行的容器组(pod)的实际数量可能大于 0。

EKS 附加组件问题 – InsufficientNumberOfReplicas:该附加组件运行不正常,因为一个或多容器组(pod)未调度,0/x 个节点可用:x Too many pods. preemption: not eligible due to preemptionPolicy=Never

EKS 附加组件问题 – InsufficientNumberOfReplicas:该附加组件运行不正常,因为一个或多容器组(pod)未调度,0/x 个节点可用:1 Insufficient memory. preemption: not eligible due to preemptionPolicy=Never

EKS 附加组件问题 – InsufficientNumberOfReplicas:该附加组件运行不正常,因为一个或多个 pod 有等候容器 CrashLoopBackOff: Completed

您可以查看与容器组(pod)关联的日志并确定问题所在。有关如何执行此操作的信息,请参阅 Kubernetes 文档中的 Debug Running Pods

请遵循以下核对清单来排查此附加组件问题:

  • 验证是否已启用运行时监控。

  • 验证是否满足 Amazon EKS 集群支持的先决条件,例如经过验证的操作系统发行版和受支持的 Kubernetes 版本。

  • 如果您手动管理安全代理,请确认您为所有 VPC 创建了 VPC 端点。启用 GuardDuty 自动配置时,您仍应验证 VPC 端点是否已创建。例如,在自动配置中使用共享 VPC 时。

    要验证这一点,请参阅验证 VPC 端点配置

  • 确认 GuardDuty 安全代理能够解析 GuardDuty VPC 端点私有 DNS。要了解端点,请参阅管理 Guarduty 安全代理中的端点的私有 DNS 名称

    为此,您可以使用 Windows 或 Mac 上的任一 nslookup 工具,或 Linux 上的 dig 工具。使用 nslookup 时,可以在将区域 us-west-2 替换为您的区域后使用以下命令:

    nslookup guardduty-data.us-west-2.amazonaws.com
  • 确认您的 GuardDuty VPC 端点策略或服务控制策略未影响 guardduty:SendSecurityTelemetry 操作。

EKS 附加组件问题 – InsufficientNumberOfReplicas:该附加组件运行不正常,因为一个或多个 pod 有等候容器 CrashLoopBackOff: Error

您可以查看与容器组(pod)关联的日志并确定问题所在。有关如何执行此操作的信息,请参阅 Kubernetes 文档中的 Debug Running Pods

确定问题后,请使用以下核对清单对此进行故障排除:

  • 验证是否已启用运行时监控。

  • 验证是否满足 Amazon EKS 集群支持的先决条件,例如经过验证的操作系统发行版和受支持的 Kubernetes 版本。

  • GuardDuty 安全代理能够解析 GuardDuty VPC 端点私有 DNS。要了解端点,请参阅管理 Guarduty 安全代理中的端点的私有 DNS 名称

EKS 附加组件问题 – AdmissionRequestDenied:准入 Webhook "validate.kyverno.svc-fail" 拒绝了请求:违反资源的策略 DaemonSet/amazon-guardduty/aws-guardduty-agent:restrict-image-registries:autogen-validate-registries:...

  1. Amazon EKS 集群或安全管理员必须检查阻止附加组件更新的安全策略。

  2. 您必须禁用控制器 (webhook) 或让控制器接受来自 Amazon EKS 的请求。

EKS 附加组件问题 – ConfigurationConflict:尝试应用时发现冲突。由于解决冲突模式的原因,不会继续。Conflicts: DaemonSet.apps aws-guardduty-agent - .spec.template.spec.containers[name="aws-guardduty-agent"].image

创建或更新附加组件时,请提供 OVERWRITE 解决冲突标志。这可能会覆盖在 Kubernetes 中使用 Kubernetes API 直接对相关资源所做的任何更改。

您可以先从集群中移除 Amazon EKS 附加组件,然后重新安装。

EKS 附加组件问题 – AccessDenied: priorityclasses.scheduling.k8s.io "aws-guardduty-agent.priorityclass" is forbidden: User "eks:addon-manager" cannot patch resource "priorityclasses" in API group "scheduling.k8s.io" at the cluster scope

您必须手动将缺失的权限添加到 eks:addon-cluster-admin ClusterRoleBinding 中。将以下 yaml 添加到 eks:addon-cluster-admin 中:

--- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: eks:addon-cluster-admin subjects: - kind: User name: eks:addon-manager apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-admin apiGroup: rbac.authorization.k8s.io ---

您现在可以使用以下命令将此 yaml 应用到 Amazon EKS 集群中:

kubectl apply -f eks-addon-cluster-admin.yaml

AddonUpdationFailed:EKSAddonIssue - AccessDenied: namespaces\"amazon-guardduty\"isforbidden:User\"eks:addon-manager\"cannotpatchresource\"namespaces\"inAPIgroup\"\"inthenamespace\"amazon-guardduty\"

EKS 附加组件问题 – AccessDenied: admission webhook "validation.gatekeeper.sh" denied the request: [all-namespace-must-have-label-owner] All namespaces must have an `owner` label

您必须禁用控制器或让控制器接受来自 Amazon EKS 集群的请求。

创建或更新附加组件之前,您还可以创建 GuardDuty 命名空间并将其标记为 owner

EKS 附加组件问题 – AccessDenied: admission webhook "validation.gatekeeper.sh" denied the request: [all-namespace-must-have-label-owner] All namespaces must have an `owner` label

您必须禁用控制器或让控制器接受来自 Amazon EKS 集群的请求。

创建或更新附加组件之前,您还可以创建 GuardDuty 命名空间并将其标记为 owner

EKS 附加组件问题 – AccessDenied: admission webhook "validation.gatekeeper.sh" denied the request: [allowed-container-registries] container <aws-guardduty-agent> has an invalid image registry

将 GuardDuty 的映像注册表添加到准入控制器中的 allowed-container-registries。有关更多信息,请参阅 托管 GuardDuty 代理的 Amazon ECR 存储库中的 EKS v1.8.1-eks-build.2 的 ECR 存储库