23、Kubernetes 镜像安全与策略治理

Kubernetes 镜像安全与策略治理

1. 镜像安全

Pod 安全的另一个重要部分是确保 Pod 内的代码和应用程序的安全。保障应用程序代码的安全是一个复杂的话题,不过容器镜像安全的基础包括确保容器镜像仓库对已知的代码漏洞进行静态扫描。此外,还应该有一个用于运行时扫描的工具,该工具可以识别镜像开始运行后发现的漏洞,并查找潜在的恶意活动,如入侵。开源和商业公司都提供了许多扫描工具。

除了安全扫描,专注于最小化容器镜像的内容以去除不必要的依赖项,可以减少扫描时的干扰。最后,镜像安全也是投资持续交付的一个重要原因,这样在发现漏洞时可以快速修补和重新部署镜像。

镜像安全要点总结

  • 静态扫描:确保容器镜像仓库对已知代码漏洞进行静态扫描。
  • 运行时扫描:使用工具进行运行时扫描,识别新发现的漏洞和潜在恶意活动。
  • 最小化内容:减少容器镜像中的不必要依赖项。
  • 持续交付:便于快速修补和重新部署镜像。

2. 策略与治理的重要性

在 Kubernetes 集群中,资源数量会随着应用的发展从几个迅速增长到成百上千个,管理这些资源面临着巨大挑战。策略是一组关于如何配置 Kubernetes 资源的约束和条件,治理则提供了验证和执行组织策略的能力,确保所有部署到 Kubernetes 集群的资源遵循当前最佳实践、安全策略或公司规范。

常见策略示例

  • 所有容器必须仅来自特定的容器镜像仓库。
  • 所有 Pod 必须标有部门名称和联系信息。
  • 所有 Pod 必须同时设置 CPU 和内存资源限制。
  • 所有 Ingress 主机名在集群中必须唯一。
  • 某些服务不得在互联网上可用。
  • 容器不得监听特权端口。

3. 准入流程

要理解策略和治理如何确保资源在创建前符合要求,需要了解 API 请求通过 Kubernetes API 服务器的流程。准入控制器在 API 请求流经 API 服务器时进行操作,用于在资源保存到存储之前对其进行修改或验证。其中,变更准入控制器允许修改资源,而验证准入控制器则不允许。

这里主要关注动态可配置的准入 Webhook,集群管理员可以通过创建 MutatingWebhookConfiguration 或 ValidatingWebhookConfiguration 资源来配置一个端点,API 服务器可以将请求发送到该端点进行评估。准入 Webhook 将返回“允许”或“拒绝”指令,告知 API 服务器是否将资源保存到存储。

准入控制器类型

类型 描述
变更准入控制器 允许修改 API 请求资源
验证准入控制器 不允许修改 API 请求资源

准入流程 mermaid 流程图

graph LR
    A[API 请求] --> B[准入控制器]
    B --> C{变更准入控制器}
    C -- 允许修改 --> D[修改资源]
    C -- 不允许修改 --> E[验证资源]
    D --> F[保存到存储]
    E --> F

4. 使用 Gatekeeper 进行策略与治理

Kubernetes 项目本身没有提供实现策略和治理的控制器,但有开源解决方案,这里重点介绍 Gatekeeper。

4.1 Gatekeeper 简介

Gatekeeper 是一个 Kubernetes 原生的策略控制器,它根据定义的策略评估资源,并决定是否允许创建或修改 Kubernetes 资源。这些评估在 API 请求流经 Kubernetes API 服务器时在服务器端进行,这意味着每个集群都有一个单一的处理点。在服务器端处理策略评估意味着可以在现有 Kubernetes 集群上安装 Gatekeeper,而无需更改开发人员工具、工作流程或持续交付管道。

Gatekeeper 使用自定义资源定义(CRD)来定义一组特定于配置它的新 Kubernetes 资源,这使得集群管理员可以使用熟悉的工具(如 kubectl)来操作 Gatekeeper。此外,它还能为用户提供实时、有意义的反馈,说明资源被拒绝的原因以及如何解决问题。这些特定于 Gatekeeper 的自定义资源可以存储在源代码控制中,并使用 GitOps 工作流程进行管理。

4.2 安装 Gatekeeper

在开始配置策略之前,需要安装 Gatekeeper。Gatekeeper 组件作为 Pod 在 gatekeeper-system 命名空间中运行,并配置一个准入 Webhook 控制器。

安装步骤
  1. 使用 Helm 包管理器添加 Gatekeeper 仓库:
$ helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
  1. 安装 Gatekeeper:
$ helm install gatekeeper/gatekeeper --name-template=gatekeeper \
  --namespace gatekeeper-system --create-
  1. 确认 Gatekeeper 已启动并运行:
$ kubectl get pods -n gatekeeper-system
  1. 查看 Webhook 配置:
$ kubectl get validatingwebhookconfiguration -o yaml

4.3 配置策略

安装好 Gatekeeper 后,就可以开始配置策略了。下面通过一个示例来演示如何创建策略,以及开发人员在创建符合和不符合策略的资源时的体验。

示例:限制容器镜像来源
  1. 创建约束模板 :约束模板定义了策略的规则,通常由集群管理员完成。以下是一个示例约束模板 allowedrepos-constraint-template.yaml
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sallowedrepos
  annotations:
    description: Requires container images to begin with a repo string from a
      specified list.
spec:
  crd:
    spec:
      names:
        kind: K8sAllowedRepos
      validation:
        # Schema for the `parameters` field
        openAPIV3Schema:
          properties:
            repos:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8sallowedrepos
        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          satisfied := [good | repo = input.parameters.repos[_] ; good = starts...
          not any(satisfied)
          msg := sprintf("container <%v> has an invalid image repo <%v>, allowed...
        }
        violation[{"msg": msg}] {
          container := input.review.object.spec.initContainers[_]
          satisfied := [good | repo = input.parameters.repos[_] ; good = starts...
          not any(satisfied)
          msg := sprintf("container <%v> has an invalid image repo <%v>, allowed...)
        }

使用以下命令创建约束模板:

$ kubectl apply -f allowedrepos-constraint-template.yaml
  1. 创建约束资源 :约束资源将策略应用到具体的资源上。以下是一个示例约束 allowedrepos-constraint.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
  name: repo-is-kuar-demo
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "default"
  parameters:
    repos:
      - "gcr.io/kuar-demo/"

使用以下命令创建约束资源:

$ kubectl create -f allowedrepos-constraint.yaml
  1. 测试策略
    • 创建符合策略的 Pod :使用以下 compliant-pod.yaml 创建一个符合策略的 Pod:
apiVersion: v1
kind: Pod
metadata:
  name: kuard
spec:
  containers:
    - image: gcr.io/kuar-demo/kuard-amd64:blue
      name: kuard
      ports:
        - containerPort: 8080
          name: http
          protocol: TCP

使用以下命令创建 Pod:

$ kubectl apply -f compliant-pod.yaml
- **创建不符合策略的 Pod**:使用以下 `noncompliant-pod.yaml` 创建一个不符合策略的 Pod:
apiVersion: v1
kind: Pod
metadata:
  name: nginx-noncompliant
spec:
  containers:
    - name: nginx
      image: nginx

使用以下命令创建 Pod:

$ kubectl apply -f noncompliant-pod.yaml

此时会收到错误信息,提示容器镜像来源不符合策略要求。

4.4 理解约束模板

约束模板是 Gatekeeper 策略配置的重要组成部分。以 allowedrepos-constraint-template.yaml 为例,它定义了一个名为 K8sAllowedRepos 的约束类型,并包含一个用于配置允许的容器镜像仓库列表的参数。模板中的 Rego 策略代码用于评估容器和初始化容器的镜像仓库名称是否符合要求。如果策略被违反,将返回 msg 部分定义的错误信息。

4.5 创建约束

要实例化一个策略,需要创建一个约束,为模板提供所需的参数。约束的 enforcementAction 字段可以设置为 deny dryrun warn deny 表示拒绝不符合策略的资源; dryrun 用于测试策略,验证其影响; warn 则会向用户发送警告信息,但允许创建或更新资源。

4.6 审计

策略和治理不仅要对新资源实施策略,还需要确保现有资源仍然符合要求。Gatekeeper 的审计功能允许集群管理员获取集群中当前不符合策略的资源列表。

审计示例
  1. 更新约束的 enforcementAction dryrun
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
  name: repo-is-kuar-demo
spec:
  enforcementAction: dryrun
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "default"
  parameters:
    repos:
      - "gcr.io/kuar-demo/"

使用以下命令更新约束:

$ kubectl apply -f allowedrepos-constraint-dryrun.yaml
  1. 创建一个不符合策略的 Pod:
$ kubectl apply -f noncompliant-pod.yaml
  1. 审计不符合策略的资源:
$ kubectl get constraint repo-is-kuar-demo -o yaml

通过以上步骤,可以全面了解和实施 Kubernetes 集群中的镜像安全和策略治理,确保集群资源的安全和合规性。

5. 策略配置的深入分析

5.1 约束模板的参数配置

在约束模板中,参数配置是非常关键的部分。以 allowedrepos-constraint-template.yaml 为例, parameters 字段定义了一个数组 repos ,用于指定允许的容器镜像仓库列表。这个配置使得策略可以灵活地适应不同的需求。例如,如果需要允许多个镜像仓库,可以在 repos 数组中添加多个值。

spec:
  crd:
    spec:
      names:
        kind: K8sAllowedRepos
      validation:
        # Schema for the `parameters` field
        openAPIV3Schema:
          properties:
            repos:
              type: array
              items:
                type: string

5.2 约束的作用范围

约束的 match 字段定义了策略的作用范围。在 allowedrepos-constraint.yaml 中, match 字段指定了策略只对 default 命名空间中的 Pod 资源生效。可以根据实际需求调整作用范围,例如:
- 可以指定多个命名空间:

match:
  kinds:
    - apiGroups: [""]
      kinds: ["Pod"]
  namespaces:
    - "default"
    - "test"
  • 可以指定不同的 API 组和资源类型:
match:
  kinds:
    - apiGroups: ["apps"]
      kinds: ["Deployment"]
  namespaces:
    - "default"

5.3 不同 enforcementAction 的效果对比

enforcementAction 描述
deny 拒绝不符合策略的资源创建或更新
dryrun 不实际阻止资源创建或更新,但会记录不符合策略的情况,用于测试策略
warn 向用户发送警告信息,但允许创建或更新资源

不同 enforcementAction 效果 mermaid 流程图

graph LR
    A[创建资源请求] --> B{enforcementAction}
    B -- deny --> C[拒绝请求]
    B -- dryrun --> D[记录违规情况,允许请求]
    B -- warn --> E[发送警告,允许请求]

6. 实际应用中的注意事项

6.1 资源创建和更新的影响

约束仅在资源的 CREATE UPDATE 事件中生效。如果集群中已经存在大量运行的工作负载,Gatekeeper 不会重新评估这些资源,直到发生 CREATE UPDATE 事件。例如,创建一个只允许特定镜像仓库的策略后,已经运行的工作负载将继续运行。当对工作负载进行扩展时,如果新创建的 Pod 不符合策略,将被拒绝。

6.2 错误信息的查看

如果约束的作用范围是 Pod ,而创建的资源(如 ReplicaSets )会生成 Pod ,当 Pod 不符合策略时,错误信息不会直接返回给用户,而是返回给尝试创建 Pod 的控制器。要查看这些错误信息,需要查看相关资源的事件日志。

6.3 策略变更的处理

在实际应用中,策略可能会随着业务需求的变化而变更。在变更策略时,建议先将 enforcementAction 设置为 dryrun 进行审计,确认所有策略违规情况都已知后,再将 enforcementAction 设置为 deny ,以避免对现有业务造成不必要的影响。

策略变更处理步骤列表

  1. enforcementAction 设置为 dryrun
  2. 进行审计,查看不符合策略的资源列表。
  3. 对不符合策略的资源进行整改。
  4. 确认所有违规情况都已处理后,将 enforcementAction 设置为 deny

7. 总结

通过对 Kubernetes 镜像安全和策略治理的介绍,我们了解到镜像安全是保障 Pod 内代码和应用程序安全的重要基础,包括静态扫描、运行时扫描、最小化镜像内容和持续交付等方面。而策略和治理则通过 Gatekeeper 等工具,确保 Kubernetes 集群中的资源符合组织的策略和规范。

在实际应用中,我们可以通过创建约束模板和约束资源来配置策略,并根据不同的需求调整策略的作用范围和执行动作。同时,要注意资源创建和更新的影响、错误信息的查看以及策略变更的处理,以确保集群资源的安全和合规性。

关键知识点总结列表

  1. 镜像安全的基础措施。
  2. 策略和治理的概念及重要性。
  3. 准入流程和准入控制器的类型。
  4. Gatekeeper 的安装、配置和使用。
  5. 约束模板和约束的创建及作用。
  6. 不同 enforcementAction 的效果和应用场景。
  7. 实际应用中的注意事项和策略变更处理方法。

通过以上内容的学习和实践,可以更好地管理和保护 Kubernetes 集群,提高集群的安全性和可靠性。

(Mathcad+Simulink仿真)基于扩展描述函数法的LLC谐振变换器小信号分析设计内容概要:本文围绕“基于扩展描述函数法的LLC谐振变换器小信号分析设计”展开,结合MathcadSimulink仿真工具,系统研究LLC谐振变换器的小信号建模方法。重点利用扩展描述函数法(Extended Describing Function Method, EDF)对LLC变换器在非线性工作条件下的动态特性进行线性化近似,建立适用于频域分析的小信号模型,并通过Simulink仿真验证模型准确性。文中详细阐述了建模理论推导过程,包括谐振腔参数计算、开关网络等效处理、工作模态分析及频响特性提取,最后通过仿真对比验证了该方法在稳定性分析控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink和Mathcad工具,从事开关电源、DC-DC变换器或新能源变换系统研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握LLC谐振变换器的小信号建模难点解决方案;②学习扩展描述函数法在非线性系统线性化中的应用;③实现高频LLC变换器的环路补偿稳定性设计;④结合Mathcad进行公式推导参数计算,利用Simulink完成动态仿真验证。; 阅读建议:建议读者结合Mathcad中的数学推导Simulink仿真模型同步学习,重点关注EDF法的假设条件适用范围,动手复现建模步骤和频域分析过程,以深入理解LLC变换器的小信号行为及其在实际控制系统设计中的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值