可操作容器扫描

  • starboard 指令废弃于极狐GitLab 15.4。starboard 指令计划移除于极狐GitLab 16.0。

支持的架构

在极狐GitLab 16.10.0 及以后办呢、极狐GitLab 代理 Helm Chart 1.25.0 及以后版本中,此功能支持 linux/arm64linux/amd64。而早期版本仅支持 linux/amd64

启用可操作容器扫描

您可以使用可操作容器扫描来扫描集群中的容器镜像是否存在安全漏洞。在极狐GitLab 16.9 及以后版本的代理中,使用封装了 Trivy 的镜像来扫描镜像漏洞。而在 16.9 之前,禁用 Trivy 来扫描。

可操作容器扫描可以通过使用 agent config 或项目的扫描执行策略来配置。

note如果配置了 agent configscan execution policies,优先使用 scan execution policy 的配置。

通过代理配置启用

要通过代理配置扫描 Kubernetes 集群中的所有镜像,使用包含 CRON 表达式cadence 字段将 container_scanning 配置块添加到您的代理配置中,该表达式决定运行扫描的时间。

container_scanning:
  cadence: '0 0 * * *' # Daily at 00:00 (Kubernetes cluster time)

cadence 字段是必需的。极狐GitLab 支持 cadence 字段的以下类型的 CRON 语法:

  • 每日在指定时间每小时执行一次的 cadence,例如:0 18 * * *
  • 每周在指定日期和指定时间执行一次的 cadence,例如:0 13 * * 0
note如果受我们在实现中使用的 cron 支持,CRON 语法的其他元素可能会在 cadence 字段中有效。然而,极狐GitLab 并不正式测试或支持。
note使用 Kubernetes-agent pod 的系统时间在 UTC 中评估 CRON 表达式。

默认情况下,可操作容器扫描尝试扫描所有命名空间中的工作负载是否存在漏洞。您可以使用 namespaces 字段设置 vulnerability_report 块,该字段可用于限制扫描哪些命名空间。例如,如果您只想扫描 defaultkube-system 命名空间,则可以使用以下配置:

container_scanning:
  cadence: '0 0 * * *'
  vulnerability_report:
    namespaces:
      - default
      - kube-system

对于每一个目标命名空间,下面展示的所有工作负载资源中的镜像都会被扫描:

  • Pod
  • ReplicaSet
  • ReplicationController
  • StatefulSet
  • DaemonSet
  • CronJob
  • Job

通过扫描执行策略启用

要通过扫描执行策略扫描 Kubernetes 集群中的所有镜像,我们可以使用扫描执行策略编辑器创建新的计划规则。

noteKubernetes 代理必须在集群中运行才能扫描运行的容器镜像。
note可操作容器扫描和极狐GitLab 流水线是独立的。它通常是由 Kubernetes 代理来管理的,而且会在扫描执行策略配置的计划时间初始化一个新的扫描。代理会在您的集群中创建一个专门的作业来执行扫描并向极狐GitLab 报告漏洞结果。

以下是在 Kubernetes 代理所附加的集群内启用可操作的容器扫描的策略示例:

- name: Enforce Container Scanning in cluster connected through my-gitlab-agent for default and kube-system namespaces
  enabled: true
  rules:
  - type: schedule
    cadence: '0 10 * * *'
    agents:
      <agent-name>:
        namespaces:
        - 'default'
        - 'kube-system'
  actions:
  - scan: container_scanning

调度规则的关键是:

  • cadence(必需):运行扫描时的 CRON 表达式
  • agents:<agent-name>(必需):用于扫描的代理名称。
  • agents:<agent-name>:namespaces(可选):要扫描的 Kubernetes 命名空间。如果省略,则扫描所有命名空间。
note如果受我们在实现中使用的 cron 支持,CRON 语法的其他元素可能会在 cadence 字段中有效。然而,极狐GitLab 并不正式测试或支持。
note使用 Kubernetes-agent pod 的系统时间在 UTC 中计算 CRON 表达式。

您可以在扫描执行策略文档中查看完整架构。

多集群配置的 OCS 漏洞解决方案

要想确保使用 OCS 进行漏洞追踪的精确性,您应该创建一个单独的极狐GitLab 项目,而且为每一个项目启用 OCS。如果您有多个集群,请确保每个集群都使用一个项目。

OCS 通过将当前扫描发现的漏洞与之前检测到的漏洞进行对比,自动解决集群中已不存在的漏洞问题。对于极狐GitLab项目,若先前扫描记录的漏洞在当前扫描中未再出现,系统会将其标记为已解决。

如果在相同的项目中配置了多个集群,那么一个集群中的 OCS 扫描会解决另一个集群中已不存在的漏洞,从而导致错误的漏洞报告。

配置扫描器资源要求

默认情况下,扫描器 pod 的默认资源要求为:

requests:
  cpu: 100m
  memory: 100Mi
limits:
  cpu: 500m
  memory: 500Mi

您可以使用 resource_requirements 字段进行自定义。

container_scanning:
  resource_requirements:
    requests:
      cpu: 200m
      memory: 200Mi
    limits:
      cpu: 700m
      memory: 700Mi
note资源要求只能使用代理配置来设置。如果您通过 scan execution policies 启用了 Operational Container Scanning,则需要在代理配置文件中定义资源要求。

为 Trivy k8s 封装器自定义仓库

在扫描期间,OCS 使用 Trivy K8s 封装器仓库 来部署 pods,该仓库将由 Trivy Kubernete 生成的漏洞报告发送到 OCS。

如果您集群的防火墙限制了您对于 Trivy k8s 封装器仓库的访问,您可以配置从自定义仓库拉取镜像。需要确保自定义的仓库能够在镜像 Trivy k8s 封装器仓库的时保持兼容性。

container_scanning:
  trivy_k8s_wrapper_image:
    repository: "your-custom-registry/your-image-path"

查看集群漏洞

在极狐GitLab中查看漏洞信息:

  1. 在左侧边栏中,选择 搜索或转到 并找到包含代理配置文件的项目。
  2. 选择 操作 > Kubernetes 集群
  3. 选择 代理 选项卡。
  4. 选择一个代理查看集群漏洞。

Cluster agent security tab UI

您也可以在可操作漏洞中查看到该信息。

note您必须至少具有开发者角色。

扫描私有镜像

  • 引入于极狐 GitLab 16.4。

要扫描私有镜像,扫描器使用镜像拉取 secret(直接引用和来自服务账户)来拉取镜像。

限制

在极狐GitLab 16.9 及以后版本中:OCS

  • 能够处理的 Trivy 报告上限为 100MB。而之前版本的限制为 10MB。
  • 当极狐GitLab 运行在 fips 模式下时,此功能是 禁用的

故障排查

Error running Trivy scan. Container terminated reason: OOMKilled

如果扫描所需的资源不足或被扫描的镜像过大,则 OCS 会出现 OOM 错误。要解决此问题,按照配置资源需求来增加可用的内存数量。