本文目录导读:

“关基安全策略即代码”通常指的是将关键信息基础设施(关基) 的安全合规要求、基线配置、访问控制、审计规则等,通过代码(如YAML、HCL、Rego、Python等)进行声明式定义和自动化执行。
核心思路是:将“安全策略”从人工编写的手册、Word文档,转变为可测试、可审计、可自动化执行的代码。
这通常涉及三个领域:基础设施即代码(IaC)的合规扫描、策略引擎(如OPA)、以及CI/CD门禁。
以下是撰写“关基安全策略即代码”的通用方法、示例(以阿里云/腾讯云环境和Kubernetes集群为例)及核心注意事项。
文件结构设计
建议采用模块化、分层设计,类似于IaC的架构。
security-policies-as-code/
├── README.md
├── policies/
│ ├── kubernetes/ # 容器/K8s安全策略(OPA/Kyverno)
│ │ ├── pod_security.rego
│ │ └── network_policy.yaml
│ ├── cloud/ # 云平台合规策略(Terraform Sentinel / AWS Config / 阿里云合规)
│ │ ├── alicloud_oss_encryption.rego
│ │ └── vpc_flow_log.rego
│ └── host/ # 主机基线策略(如CIS Benchmark转代码)
├── config/ # 调用的参数,如IP白名单、合规等级
├── tests/ # 策略单元测试
│ ├── policy_test.rego
│ └── __tests__/
└── pipelines/ # 集成到CI/CD的脚本
└── security-gate.sh
具体代码示例:使用OPA(Open Policy Agent)生成关基合规策略
OPA是目前实现“策略即代码”最主流的引擎,配合Rego语言。
场景:云存储(OSS/S3)必须开启服务端加密(关基保护要求)
文件:policies/cloud/alicloud_oss_encryption.rego
package security.alicloud.oss
# 规则:所有OSS Bucket必须启用AES256或KMS加密
default allow := false
violation[msg] {
bucket := input.buckets[_]
not bucket.server_side_encryption
msg = sprintf("关基违规:Bucket %s 未启用服务端加密", [bucket.name])
}
violation[msg] {
bucket := input.buckets[_]
encryption := bucket.server_side_encryption
encryption.algorithm == "AES256"
true
} # 不报错,是合规的
# 仅允许 AES256 或 KMS,不允许多层加密(如SSE-C)
allow {
bucket := input.buckets[_]
encryption := bucket.server_side_encryption
encryption.algorithm in ["AES256", "KMS"]
}
测试文件:tests/policy_test.rego
package security.alicloud.oss
test_bucket_with_encryption {
# 模拟输入
input := {"buckets": [{"name": "my-oss", "server_side_encryption": {"algorithm": "AES256"}}]}
# 断言:不应该有违规
count(violation) == 0
}
test_bucket_without_encryption {
input := {"buckets": [{"name": "insecure-bucket"}]}
count(violation) > 0
}
场景:Kubernetes Pod 不得以特权模式运行(关基容器安全要求)
文件:policies/kubernetes/pod_security.rego
package security.k8s.pod
# 关基规则:拒绝所有 privileged: true 的容器
deny[msg] {
container := input.request.object.spec.containers[_]
container.securityContext.privileged == true
msg = sprintf("违规:容器 '%s' 配置了特权模式,违反关基安全策略", [container.name])
}
# 额外规则:禁止挂载主机的Docker Socket
deny[msg] {
volume := input.request.object.spec.volumes[_]
volume.hostPath.path == "/var/run/docker.sock"
msg = "违规:尝试挂载Docker Socket,违反主机隔离策略"
}
场景:网络隔离(规则即代码)- 使用Terraform的Sentinel
文件:policies/cloud/vpc_network_restriction.sentinel
import "tfplan/v2" as tfplan
# 关基要求:所有EIP不得0.0.0.0/0白名单
main = rule {
all tfplan.resource_changes as _, rc {
rc.mode == "managed" and rc.type == "alicloud_security_group_rule" implies {
rc.change.after.policy != "accept" and rc.change.after.cidr_ip != "0.0.0.0/0"
}
}
}
# 如果违反则抛出错误
violation_message = "关基违规:安全组规则不能允许全网访问(0.0.0.0/0)"
集成到CI/CD流程(关键环节)
关基策略代码的生命力在于自动强制,通常放在代码仓库的 .github/workflows/ 或 pipeline.yml 中。
示例:GitHub Action 配合 OPA
name: 关基合规扫描
on: [push, pull_request]
jobs:
opa-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 运行OPA策略检查
uses: open-policy-agent/conftest-action@v1
with:
# 指定策略文件目录
policy: policies/kubernetes/
# 指定要检测的基础设施代码文件
input: deploy/production/k8s_deployment.yaml
# 当违规数量>0时,阻断Pipeline
fail-on-violation: true
- name: 云资源IaC合规扫描(如Terraform Plan结果)
run: |
terraform plan -out tfplan.binary
terraform show -json tfplan.binary > tfplan.json
opa eval --format pretty --data policies/cloud/ --input tfplan.json "data.security.alicloud.oss.violation"
关基特有的代码注意事项
- 等级保护(等保2.0/3.0)映射:代码注释里要写明对应《关基保护要求》的章节号。
# 对应《GB/T 39204-2020 关基保护要求》 5.3.2.a) 应实现访问控制
- 最小权限原则:关基策略里应拒绝一切未显式允许的权限(默认拒绝)。
- 审计日志不能禁用:
# 确保OBS/OSS有访问日志 violation[msg] { not input.bucket.logging.enabled } - 多区域/多账号一致性:策略里要包含
地域限制,比如只允许在cn-beijing或cn-zhangjiakou(境内合规)。 - 依赖外部数据:关基策略可能需要查询威胁情报库,可以使用 OPA 的
data.http接口或外部数据绑定。
推荐工具组合
| 功能 | 产品/工具 | 代码语言 |
|---|---|---|
| 策略引擎 | OPA (Conftest / Gatekeeper) | Rego |
| IaC扫描 | Checkov / tfsec / Terrascan | Python / HCL |
| 云原生安全 | Kyverno (K8s) | YAML(类似策略代码) |
| 配置管理 | Ansible + CIS Benchmarks | YAML / Python |
| 云平台原生 | AWS Config / Azure Policy / 阿里云配置审计 | JSON (声明式) |
怎么写?
- 第一步:把《关基保护要求》文档里的“应……”(如应加密、应最小权限、应边界防护)翻译成 if-then 逻辑。
- 第二步:用 Rego 或 HCL 把这组逻辑写成一个无状态的函数(输入云资源配置,输出违规列表)。
- 第三步:把这个
.rego文件放在 CI/CD 的 Pre-Merge 检查中,阻断 配置违规。 - 第四步:定期(如每天)扫描已部署环境的快照,确保当前状态与代码一致(Drift Detection)。