自动扫描工作负载以查找已知漏洞


本页面介绍了如何自动扫描正在运行的工作负载中的容器操作系统 (OS) 和语言包以查找已知漏洞,以及如何获取切实可行的缓解策略(如果有)。工作负载漏洞扫描是安全状况信息中心的一部分,后者是一组功能,可提供针对性的信息和建议以提高 Google Kubernetes Engine (GKE) 集群和工作负载的安全性。

如需了解详情,请参阅关于工作负载漏洞扫描

价格

如需了解价格信息,请参阅 GKE 安全状况信息中心价格

须知事项

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。

要求

  • 如需获得使用工作负载漏洞扫描所需的权限,请让您的管理员向您授予 Google Cloud 项目的 Security Posture Viewer (roles/containersecurity.viewer) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

    此预定义角色包含使用工作负载漏洞扫描所需的权限。如需查看所需的确切权限,请展开所需权限部分:

    所需权限

    使用工作负载漏洞扫描需要以下权限:

    • resourcemanager.projects.get
    • resourcemanager.projects.list
    • containersecurity.locations.list
    • containersecurity.locations.get
    • containersecurity.clusterSummaries.list
    • containersecurity.findings.list

    您也可以使用自定义角色或其他预定义角色来获取这些权限。

  • Advanced Vulnerability Insights 需要使用 GKE 1.27 版或更高版本。

工作负载漏洞扫描层

您可以在层级中启用漏洞扫描,每个层级都将添加扫描功能,如下所示。如果您使用 Google Kubernetes Engine (GKE) Enterprise 版本管理集群舰队,则还可以配置应用于所有成员集群的舰队级漏洞扫描设置。如需了解相关说明,请参阅在舰队级层配置 GKE 安全状况信息中心功能

层级 已启用的功能 GKE 版本要求
标准
standard
容器操作系统漏洞扫描
  • GKE Enterprise 版本:在运行 1.27 版及更高版本的所有新集群中默认处于启用状态
  • GKE Standard 版本:在运行 1.27 版及更高版本的所有新 Autopilot 模式集群中默认处于启用状态。在所有新 Standard 模式集群中默认处于停用状态。
Advanced Vulnerability Insights
enterprise
  • 容器操作系统漏洞扫描
  • 语言包漏洞扫描
  • GKE Enterprise 版本:在运行 1.27 版及更高版本的所有新集群中默认处于启用状态
  • GKE Standard 版本:在所有新集群中默认处于停用状态。

如需详细了解每种功能,请参阅工作负载漏洞扫描简介

启用容器操作系统漏洞扫描

在运行 1.27 版及更高版本的新 Autopilot 集群中,容器操作系统漏洞扫描功能默认处于启用状态。本部分介绍如何在新现有 Standard 集群和运行 1.27 版之前版本的 Autopilot 集群中启用此功能。

在新集群上启用容器操作系统扫描

gcloud

使用 gcloud CLI 创建新的 GKE 集群:

gcloud container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --workload-vulnerability-scanning=standard

替换以下内容:

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine
  2. 点击 创建
  3. GKE Standard 部分中,点击配置
  4. 在导航窗格中,点击安全性
  5. 安全性部分中,选中漏洞扫描复选框。
  6. 选择基本选项。
  7. 为集群配置其他选项,并在准备就绪后点击创建

在现有集群上启用容器操作系统扫描

gcloud

更新集群:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --workload-vulnerability-scanning=standard

替换以下内容:

控制台

  1. 进入 Google Cloud 控制台中的安全状况页面。

    进入“安全状况”
  2. 点击设置标签。
  3. 已启用漏洞扫描的集群部分中,点击选择集群
  4. 选中要添加的集群对应的复选框。
  5. 选择操作下拉菜单中,选择设置为基本
  6. 点击应用

启用 Advanced Vulnerability Insights

Advanced Vulnerability Insights 可持续扫描正在运行的应用的以下漏洞类型:

  • 容器操作系统漏洞
  • 语言包漏洞

启用 Advanced Vulnerability Insights 时,容器操作系统漏洞扫描功能会自动启用,无法单独停用。

要求

在新集群上启用 Advanced Vulnerability Insights

gcloud

使用 gcloud CLI 创建新的 GKE 集群:

gcloud container clusters create-auto CLUSTER_NAME \
    --location=LOCATION \
    --workload-vulnerability-scanning=enterprise

替换以下内容:

控制台

  1. 转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。

    转到 Google Kubernetes Engine
  2. 点击 创建
  3. GKE Autopilot 部分中,点击配置
  4. 在导航窗格中,点击高级设置。如果您要创建 Standard 集群,请改为点击安全
  5. 安全性部分中,选中漏洞扫描复选框。
  6. 选择高级选项。
  7. 为集群配置其他选项,并在准备就绪后点击创建

在现有集群上启用 Advanced Vulnerability Insights

gcloud

更新集群:

gcloud container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --workload-vulnerability-scanning=enterprise

替换以下内容:

控制台

  1. 进入 Google Cloud 控制台中的安全状况页面。

    进入“安全状况”
  2. 点击设置标签。
  3. 已启用漏洞扫描的集群部分中,点击选择集群
  4. 选中要添加的集群对应的复选框。
  5. 选择操作下拉菜单中,选择设置为高级
  6. 点击应用

部署测试工作负载

以下示例清单包含用于演示的已知漏洞。在实践中,如果您知道一个应用存在漏洞,那么您可能不应该运行该应用。

  1. 将以下清单保存为 os-vuln-sample.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: frontend
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: guestbook
          tier: frontend
      template:
        metadata:
          labels:
            app: guestbook
            tier: frontend
        spec:
          containers:
          - name: php-redis
            image: us-docker.pkg.dev/google-samples/containers/gke/gb-frontend@sha256:dc8de8e0d569d2f828b187528c9317bd6b605c273ac5a282aebe471f630420fc
            env:
            - name: GET_HOSTS_FROM
              value: "dns"
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
            ports:
            - containerPort: 80
    
  2. 查看以下清单,其中包含已知的 Maven 漏洞:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: maven-vulns
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mavenvulns
      template:
        metadata:
          labels:
            app: mavenvulns
        spec:
          containers:
          - name: maven-vulns-app
            image: us-docker.pkg.dev/google-samples/containers/gke/security/maven-vulns
            # This app listens on port 8080 for web traffic by default.
            ports:
            - containerPort: 8080
            env:
              - name: PORT
                value: "8080"
            resources:
              requests:
                memory: "1Gi"
                cpu: "500m"
                ephemeral-storage: "1Gi"
              limits:
                memory: "1Gi"
                cpu: "500m"
                ephemeral-storage: "1Gi"
  3. (可选)获取集群的凭据:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --region=COMPUTE_REGION
    
  4. 将应用部署到您的集群:

    kubectl apply -f os-vuln-sample.yaml
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/kubernetes-engine-samples/main/security/language-vulns/maven/deployment.yaml
    

如需测试其他漏洞,请尝试在预演环境中部署旧版映像,例如 nginx

查看结果并执行操作

初始扫描至少需要 15 分钟才能返回结果,具体取决于扫描的工作负载数量。GKE 会在安全状况信息中心上显示结果,并自动将条目添加到 Logging。

查看结果

如需大致了解项目的集群和工作负载中发现的问题,请执行以下操作:

  1. 进入 Google Cloud 控制台中的安全状况页面。

    进入“安全状况”

  2. 点击问题标签页。

  3. 过滤条件问题窗格的问题类型部分中,选中漏洞复选框。

查看问题详情和建议

如需查看特定漏洞的详细信息,请点击包含相关问题的行。

漏洞问题窗格会显示以下信息:

  • 说明:关于问题的说明,包括 CVE 编号(如果适用)和漏洞及其潜在影响的详细说明。
  • 建议执行的操作:可用于解决漏洞的操作,例如已修复的软件包版本以及应用修复的位置。

查看日志以了解发现的问题

GKE 会针对每个发现的问题向 Logging 中的 _Default 日志存储桶添加条目。这些日志仅保留特定时间。有关详情,请参阅日志保留期限

  1. 在 Google Cloud 控制台中,转到 Logs Explorer 页面。

    前往 Logs Explorer
  2. 查询字段中,指定以下查询:

    resource.type="k8s_cluster"
    jsonPayload.@type="type.googleapis.com/cloud.kubernetes.security.containersecurity_logging.Finding"
    jsonPayload.type="FINDING_TYPE_VULNERABILITY"
  3. 点击运行查询

如需在 GKE 向 Logging 添加新发现时收到通知,请为此查询设置基于日志的提醒。如需了解详情,请参阅配置基于日志的提醒

清理

  1. 删除您部署的示例工作负载:

    kubectl delete deployment frontend
    
  2. (可选)删除您使用的集群:

    gcloud container clusters delete CLUSTER_NAME \
        --region=COMPUTE_REGION
    

停用工作负载漏洞扫描

您可以使用 gcloud CLI 或 Google Cloud 控制台停用工作负载漏洞扫描。

gcloud

运行以下命令:

gcloud container clusters update CLUSTER_NAME \
    --region=LOCATION \
    --workload-vulnerability-scanning=disabled

替换以下内容:

控制台

  1. 进入 Google Cloud 控制台中的安全状况页面。

    进入“安全状况”
  2. 点击设置标签。
  3. 已启用漏洞扫描的集群部分中,点击选择集群
  4. 选中要移除的集群对应的复选框。
  5. 选择操作下拉菜单中,选择设为已停用
  6. 点击应用

后续步骤