name: policy-opa description: > 使用 Open Policy Agent (OPA) 进行策略即代码的强制执行与合规性验证。 适用场景:(1) 在基础设施和应用中强制执行安全与合规策略,(2) 验证 Kubernetes 准入控制策略,(3) 为合规框架(SOC2、PCI-DSS、GDPR、HIPAA)实施策略即代码,(4) 测试和评估 OPA Rego 策略,(5) 将策略检查集成到 CI/CD 流水线中,(6) 根据组织安全标准审计配置漂移,(7) 实施最小权限访问控制。 version: 0.1.0 maintainer: SirAppSec category: compliance tags: [opa, policy-as-code, compliance, rego, kubernetes, admission-control, soc2, gdpr, pci-dss, hipaa] frameworks: [SOC2, PCI-DSS, GDPR, HIPAA, NIST, ISO27001] dependencies: tools: [opa, docker, kubectl] packages: [jq, yq] references:
- https://www.openpolicyagent.org/docs/latest/
- https://www.openpolicyagent.org/docs/latest/policy-language/
- https://www.conftest.dev/
使用 Open Policy Agent 的策略即代码
概述
此技能支持使用 Open Policy Agent (OPA) 进行策略即代码的强制执行,用于合规性验证、安全策略执行和配置审计。OPA 提供了一个统一的框架,用于跨云原生环境、Kubernetes、CI/CD 流水线和基础设施即代码进行策略评估。
使用 OPA 将安全要求、合规控制和组织标准编写成可执行的 Rego 策略。自动验证配置、防止错误配置并保持持续合规。
快速开始
安装 OPA
# macOS
brew install opa
# Linux
curl -L -o opa https://openpolicyagent.org/downloads/latest/opa_linux_amd64
chmod +x opa
# 验证安装
opa version
基础策略评估
# 根据输入数据评估策略
opa eval --data policy.rego --input input.json 'data.example.allow'
# 使用单元测试测试策略
opa test policy.rego policy_test.rego --verbose
# 运行 OPA 服务器进行实时策略评估
opa run --server --addr localhost:8181
核心工作流
步骤 1:定义策略需求
识别需要强制执行的合规要求和安全控制:
- 合规框架(SOC2、PCI-DSS、GDPR、HIPAA、NIST)
- Kubernetes 安全策略(Pod 安全、RBAC、网络策略)
- 基础设施即代码策略(Terraform、CloudFormation)
- 应用安全策略(API 授权、数据访问)
- 组织安全标准
步骤 2:编写 OPA Rego 策略
使用 Rego 语言创建策略文件。使用 assets/ 目录中的模板获取常见模式:
示例:Kubernetes Pod 安全策略
package kubernetes.admission
import future.keywords.contains
import future.keywords.if
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
container.securityContext.privileged == true
msg := sprintf("不允许特权容器:%v", [container.name])
}
deny[msg] {
input.request.kind.kind == "Pod"
container := input.request.object.spec.containers[_]
not container.securityContext.runAsNonRoot
msg := sprintf("容器必须以非 root 用户运行:%v", [container.name])
}
示例:合规控制验证(SOC2)
package compliance.soc2
import future.keywords.if
# CC6.1:逻辑和物理访问控制
deny[msg] {
input.kind == "Deployment"
not input.spec.template.metadata.labels["data-classification"]
msg := "SOC2 CC6.1:所有部署必须具有数据分类标签"
}
# CC6.6:传输中加密
deny[msg] {
input.kind == "Service"
input.spec.type == "LoadBalancer"
not input.metadata.annotations["service.beta.kubernetes.io/aws-load-balancer-ssl-cert"]
msg := "SOC2 CC6.6:负载均衡器服务必须使用 SSL/TLS 加密"
}
步骤 3:使用单元测试测试策略
为策略验证编写全面的测试:
package kubernetes.admission_test
import data.kubernetes.admission
test_deny_privileged_container {
input := {
"request": {
"kind": {"kind": "Pod"},
"object": {
"spec": {
"containers": [{
"name": "nginx",
"securityContext": {"privileged": true}
}]
}
}
}
}
count(admission.deny) > 0
}
test_allow_unprivileged_container {
input := {
"request": {
"kind": {"kind": "Pod"},
"object": {
"spec": {
"containers": [{
"name": "nginx",
"securityContext": {"privileged": false, "runAsNonRoot": true}
}]
}
}
}
}
count(admission.deny) == 0
}
运行测试:
opa test . --verbose
步骤 4:根据配置评估策略
使用捆绑的评估脚本进行策略验证:
# 评估单个文件
./scripts/evaluate_policy.py --policy policies/ --input config.yaml
# 评估配置目录
./scripts/evaluate_policy.py --policy policies/ --input configs/ --recursive
# 以 JSON 格式输出结果,便于 CI/CD 集成
./scripts/evaluate_policy.py --policy policies/ --input config.yaml --format json
或直接使用 OPA:
# 使用格式化输出进行评估
opa eval --data policies/ --input config.yaml --format pretty 'data.compliance.violations'
# 为复杂策略进行捆绑评估
opa eval --bundle policies.tar.gz --input config.yaml 'data'
步骤 5:与 CI/CD 流水线集成
将策略验证添加到您的 CI/CD 工作流中:
GitHub Actions 示例:
- name: 验证策略
uses: open-policy-agent/setup-opa@v2
with:
version: latest
- name: 运行策略测试
run: opa test policies/ --verbose
- name: 评估配置
run: |
opa eval --data policies/ --input deployments/ \
--format pretty 'data.compliance.violations' > violations.json
if [ $(jq 'length' violations.json) -gt 0 ]; then
echo "检测到策略违规!"
cat violations.json
exit 1
fi
GitLab CI 示例:
policy-validation:
image: openpolicyagent/opa:latest
script:
- opa test policies/ --verbose
- opa eval --data policies/ --input configs/ --format pretty 'data.compliance.violations'
artifacts:
reports:
junit: test-results.xml
步骤 6:部署为 Kubernetes 准入控制器
使用 OPA Gatekeeper 在集群级别强制执行策略:
# 安装 OPA Gatekeeper
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/master/deploy/gatekeeper.yaml
# 应用约束模板
kubectl apply -f assets/k8s-constraint-template.yaml
# 应用约束
kubectl apply -f assets/k8s-constraint.yaml
# 测试准入控制
kubectl apply -f test-pod.yaml # 如果违反策略,应该被拒绝
步骤 7:监控策略合规性
使用捆绑的报告脚本生成合规报告:
# 生成合规报告
./scripts/generate_report.py --policy policies/ --audit-logs audit.json --output compliance-report.html
# 导出违规信息用于 SIEM 集成
./scripts/generate_report.py --policy policies/ --audit-logs audit.json --format json --output violations.json
安全考虑
- 策略版本控制:将策略存储在版本控制中,并带有变更跟踪和审批工作流
- 最小权限:为策略评估授予最小权限 - OPA 应仅具有对配置的只读访问权限
- 敏感数据:避免在策略中嵌入密钥 - 使用外部数据源或加密配置
- 审计日志:记录所有策略评估、违规和异常,以便合规审计
- 策略测试:为所有策略规则保持全面的测试覆盖率(>80%)
- 职责分离:策略作者与策略执行者分离;策略变更需要同行评审
- 合规映射:将策略映射到特定的合规控制(SOC2 CC6.1、PCI-DSS 8.2.1),以便审计追溯
捆绑资源
脚本 (scripts/)
evaluate_policy.py- 根据配置文件评估 OPA 策略,并输出格式化结果generate_report.py- 根据策略评估结果生成合规报告test_policies.sh- 运行 OPA 策略单元测试并生成覆盖率报告
参考资料 (references/)
rego-patterns.md- 用于安全和合规策略的常见 Rego 模式compliance-frameworks.md- 映射到 SOC2、PCI-DSS、GDPR、HIPAA 控制的策略模板kubernetes-security.md- Kubernetes 安全策略和准入控制模式iac-policies.md- 用于 Terraform、CloudFormation 的基础设施即代码策略验证
资产 (assets/)
k8s-pod-security.rego- Kubernetes Pod 安全策略模板k8s-constraint-template.yaml- OPA Gatekeeper 约束模板k8s-constraint.yaml- Gatekeeper 约束配置示例soc2-compliance.rego- 作为 OPA 策略的 SOC2 合规控制pci-dss-compliance.rego- 作为 OPA 策略的 PCI-DSS 要求gdpr-compliance.rego- GDPR 数据保护策略terraform-security.rego- Terraform 安全最佳实践策略ci-cd-pipeline.yaml- CI/CD 集成示例(GitHub Actions、GitLab CI)
常见模式
模式 1:Kubernetes 准入控制
在 Pod 创建时强制执行安全策略:
package kubernetes.admission
deny[msg] {
input.request.kind.kind == "Pod"
not input.request.object.spec.securityContext.runAsNonRoot
msg := "Pod 必须以非 root 用户运行"
}
模式 2:基础设施即代码验证
在应用前验证 Terraform 配置:
package terraform.security
deny[msg] {
resource := input.resource_changes[_]
resource.type == "aws_s3_bucket"
not resource.change.after.server_side_encryption_configuration
msg := sprintf("S3 存储桶 %v 必须启用加密", [resource.name])
}
模式 3:合规框架映射
将策略映射到特定的合规控制:
package compliance.soc2
# SOC2 CC6.1:逻辑和物理访问控制
cc6_1_violations[msg] {
input.kind == "RoleBinding"
input.roleRef.name == "cluster-admin"
msg := sprintf("SOC2 CC6.1 违规:%v 的 cluster-admin 绑定", [input.metadata.name])
}
模式 4:数据分类强制执行
根据分类强制执行数据处理策略:
package data.classification
deny[msg] {
input.metadata.labels["data-classification"] == "restricted"
input.spec.template.spec.volumes[_].hostPath
msg := "受限数据不能使用 hostPath 卷"
}
模式 5:API 授权策略
实现基于属性的访问控制(ABAC):
package api.authz
import future.keywords.if
allow if {
input.method == "GET"
input.path[0] == "public"
}
allow if {
input.method == "GET"
input.user.role == "admin"
}
allow if {
input.method == "POST"
input.user.role == "editor"
input.resource.owner == input.user.id
}
集成点
- CI/CD 流水线:GitHub Actions、GitLab CI、Jenkins、CircleCI - 在部署前验证策略
- Kubernetes:OPA Gatekeeper 准入控制器,用于运行时策略强制执行
- Terraform/IaC:使用
conftest或 OPA CLI 进行部署前验证 - API 网关:Kong、Envoy、NGINX - 使用 OPA 策略授权请求
- 监控/SIEM:将策略违规导出到 Splunk、ELK、Datadog 进行安全监控
- 合规工具:与合规平台集成,用于控制验证和审计跟踪
故障排除
问题:策略评估返回意外结果
解决方案:
- 启用跟踪模式:
opa eval --data policy.rego --input input.json --explain full 'data.example.allow' - 验证输入数据结构是否符合策略预期
- 检查策略规则或变量名称中的拼写错误
- 使用
opa fmt格式化策略并捕获语法错误
问题:Kubernetes 准入控制未阻止违规
解决方案:
- 验证 Gatekeeper 是否正在运行:
kubectl get pods -n gatekeeper-system - 检查约束状态:
kubectl get constraints - 查看审计日志:
kubectl logs -n gatekeeper-system -l control-plane=controller-manager - 确保约束模板正确定义并符合策略预期
问题:策略测试失败
解决方案:
- 使用详细输出运行测试:
opa test . --verbose - 检查测试输入数据是否符合预期格式
- 验证策略包名称在策略文件和测试文件之间是否匹配
- 在 Rego 中使用
print()语句进行调试
问题:大型策略集导致性能下降
解决方案:
- 使用策略捆绑包:
opa build policies/ -o bundle.tar.gz - 为复杂策略启用部分评估
- 优化策略规则以降低计算复杂度
- 使用
input.key模式为数据建立索引以实现更快查找 - 考虑将大型策略集拆分为单独的评估域