2. 环境准备:Kubernetes集群搭建、Gatekeeper安装与配置、OPA约束框架初始化

本章是实战课程的基石。在搭建安全基线门禁之前,必须完成三件事:一个可操作的Kubernetes集群、一个运行中的Gatekeeper实例、以及一套初始化的OPA约束框架。这三层环境缺一不可,任何一层缺失都会导致后续的变更门禁策略无法生效。

2.1 环境全景:三层架构关系

下图展示了本课程实验环境的完整技术栈。从底层集群到上层策略引擎,再到安全基线水位,每一层都依赖下一层提供的基础能力。

环境准备三层架构 Kubernetes 集群 控制平面 + 工作节点 | 1.28+ 版本 | 启用 Admission Webhook 承载所有策略执行与工作负载运行 Gatekeeper 策略引擎 Helm 部署 | v3.14+ | 启用 Mutation 与 Validation 作为 Admission Webhook 拦截并评估所有资源变更 OPA 约束框架初始化 ConstraintTemplate + Constraint + 安全基线水位定义 编写 Rego 策略,绑定到安全基线水位评分

2.2 Kubernetes集群搭建

本课程推荐使用 kubeadm 或 Kind 搭建本地实验集群。生产环境可使用托管集群(EKS/AKS/GKE),但本地集群更适合策略调试与回滚测试。

2.2.1 集群版本与组件要求

组件 推荐版本 说明
Kubernetes v1.28+ 需启用 ValidatingAdmissionWebhook 与 MutatingAdmissionWebhook
etcd v3.5+ 集群状态存储,Gatekeeper 不直接依赖
CoreDNS v1.10+ 集群 DNS 解析,Gatekeeper Webhook 需要
容器运行时 containerd 1.7+ 支持 OCI 标准即可

2.2.2 使用 Kind 快速搭建(推荐实验环境)

# 创建 Kind 集群配置文件
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
- role: worker
EOF

# 创建集群
kind create cluster --config kind-config.yaml --name gatekeeper-lab

# 验证集群状态
kubectl cluster-info --context kind-gatekeeper-lab
kubectl get nodes
实验提示:Kind 集群默认不启用所有 Webhook 配置。如果遇到 Gatekeeper 无法注册 Webhook,请检查集群的 API Server 参数是否包含 --enable-admission-plugins=ValidatingAdmissionWebhook,MutatingAdmissionWebhook。

2.3 Gatekeeper安装与配置

Gatekeeper 是 OPA 的 Kubernetes 原生实现,以 Admission Webhook 形式运行。安装方式推荐使用 Helm Chart,便于版本管理与参数配置。

2.3.1 使用 Helm 安装 Gatekeeper

# 添加 Gatekeeper Helm 仓库
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update

# 安装 Gatekeeper(启用 Mutation 支持)
helm install gatekeeper/gatekeeper \
  --name-template gatekeeper \
  --namespace gatekeeper-system \
  --create-namespace \
  --set webhook.enableMutation=true \
  --set replicas=2 \
  --set auditInterval=60 \
  --set constraintViolationsLimit=100

# 验证安装
kubectl get pods -n gatekeeper-system
kubectl get validatingwebhookconfigurations
kubectl get mutatingwebhookconfigurations

2.3.2 Gatekeeper 核心组件说明

组件 功能 运行方式
gatekeeper-controller-manager 策略评估引擎,处理 Admission Review 请求 Deployment,建议 2+ 副本
gatekeeper-audit 周期性审计已有资源,生成违规报告 Deployment,单副本即可
gatekeeper-webhook 注册 ValidatingWebhookConfiguration 与 MutatingWebhookConfiguration Service + Webhook 配置
生产注意事项:Gatekeeper 的 Webhook 会拦截所有匹配的资源变更请求。如果 Gatekeeper 自身 Pod 无法启动,会导致整个集群的资源变更被阻塞。建议在安装时配置 --set webhook.failurePolicy=Ignore 作为临时兜底,待策略稳定后再改为 Fail。

2.4 OPA约束框架初始化

约束框架是 Gatekeeper 的策略定义体系,包含三个核心概念:ConstraintTemplate(约束模板)、Constraint(约束实例)、Rego 策略。初始化阶段需要创建基础的模板与约束,为后续安全基线水位绑定做准备。

2.4.1 约束框架核心概念

OPA 约束框架三层模型 ConstraintTemplate 定义 Rego 策略骨架 CRD 级别资源 Constraint 实例化模板并绑定参数 作用于特定命名空间/资源 安全基线水位 定义策略阈值与评分 驱动门禁决策 初始化阶段需要完成的工作 1. 创建至少一个 ConstraintTemplate(如禁止特权容器) 2. 创建对应的 Constraint 实例,绑定到目标命名空间 3. 验证约束生效:尝试创建违规资源并观察拒绝结果

2.4.2 创建第一个 ConstraintTemplate

以下模板用于禁止特权容器,这是安全基线的最低要求之一。

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8spspprivilegedcontainer
spec:
  crd:
    spec:
      names:
        kind: K8sPSPPrivilegedContainer
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8spspprivilegedcontainer

        violation[{"msg": msg}] {
          container := input.review.object.spec.containers[_]
          container.securityContext.privileged == true
          msg := sprintf("容器 %v 设置了特权模式,违反安全基线", [container.name])
        }

        violation[{"msg": msg}] {
          container := input.review.object.spec.initContainers[_]
          container.securityContext.privileged == true
          msg := sprintf("Init容器 %v 设置了特权模式,违反安全基线", [container.name])
        }

2.4.3 创建对应的 Constraint 实例

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: block-privileged-containers
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces:
      - "production"
      - "staging"
  parameters: {}

2.4.4 验证约束框架初始化

创建完成后,通过以下步骤验证约束是否生效:

  1. 检查约束状态:kubectl get constraints,确认状态为 Active
  2. 测试违规创建:尝试创建一个特权容器 Pod,观察是否被拒绝
  3. 查看审计结果:kubectl get constrainttemplates 查看审计状态
# 测试特权容器创建(应被拒绝)
kubectl run privileged-pod --image=nginx --privileged -n production

# 预期输出:
# Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request:
# 容器 privileged-pod 设置了特权模式,违反安全基线

# 查看约束状态
kubectl get constraint K8sPSPPrivilegedContainer block-privileged-containers -o yaml | grep -A5 status
初始化完成标志:当 Gatekeeper 成功拒绝违规资源创建,并且 kubectl get constraints 显示所有约束为 Active 状态时,OPA 约束框架初始化完成。此时环境已准备好接入安全基线水位评分系统。

2.5 环境验证清单

在进入下一章之前,请逐项确认以下环境状态:

检查项 验证命令 预期结果
集群节点就绪 kubectl get nodes 所有节点状态为 Ready
Gatekeeper Pod 运行 kubectl get pods -n gatekeeper-system controller-manager 与 audit Pod 均为 Running
Webhook 注册 kubectl get validatingwebhookconfigurations gatekeeper-validating-webhook 存在
ConstraintTemplate 创建 kubectl get constrainttemplates k8spspprivilegedcontainer 存在且状态为 Active
Constraint 实例生效 kubectl get constraints block-privileged-containers 存在且无错误
策略拒绝测试 创建特权容器 Pod 被 Gatekeeper 拒绝,返回 Forbidden
排障建议:如果 Gatekeeper 未按预期拒绝请求,请检查 kubectl logs -n gatekeeper-system deployment/gatekeeper-controller-manager 查看 Webhook 日志。常见问题包括:Webhook 证书未正确签发、ConstraintTemplate 语法错误、Rego 策略中字段路径不匹配。