2. 环境准备:Kubernetes集群搭建、Gatekeeper安装与配置、OPA约束框架初始化
本章是实战课程的基石。在搭建安全基线门禁之前,必须完成三件事:一个可操作的Kubernetes集群、一个运行中的Gatekeeper实例、以及一套初始化的OPA约束框架。这三层环境缺一不可,任何一层缺失都会导致后续的变更门禁策略无法生效。
2.1 环境全景:三层架构关系
下图展示了本课程实验环境的完整技术栈。从底层集群到上层策略引擎,再到安全基线水位,每一层都依赖下一层提供的基础能力。
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 约束框架核心概念
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 验证约束框架初始化
创建完成后,通过以下步骤验证约束是否生效:
- 检查约束状态:
kubectl get constraints,确认状态为Active - 测试违规创建:尝试创建一个特权容器 Pod,观察是否被拒绝
- 查看审计结果:
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 策略中字段路径不匹配。