3. SOPS 安装与配置:多平台安装方法、.sops.yaml 配置文件详解、密钥后端初始化
本章聚焦 SOPS(Secrets OPerationS)的落地实践。作为云原生配置管理中密钥加密的标准工具,SOPS 的安装、配置与后端初始化是后续密钥轮换策略的基础。我们将按平台覆盖安装方法,深入解析 .sops.yaml 配置结构,并完成主流密钥后端的初始化流程。
3.1 多平台安装方法
SOPS 提供二进制分发与包管理器两种安装路径。下表列出主流操作系统与容器环境的推荐安装方式:
| 平台 | 安装方式 | 命令 / 步骤 |
|---|---|---|
| macOS | Homebrew | brew install sops |
| Linux (amd64) | GitHub Release 二进制 | |
| Linux (arm64) | GitHub Release 二进制 | |
| Windows | Scoop / Chocolatey | scoop install sops 或 choco install sops |
| Docker | 官方镜像 | docker pull getsops/sops:latest |
| Go 环境 | go install | go install github.com/getsops/sops/v3/cmd/sops@latest |
验证安装: 执行
sops --version 确认版本。建议使用 v3.8.0 及以上版本以获得完整的 AWS KMS / GCP KMS / Azure Key Vault / age 支持。
3.2 .sops.yaml 配置文件详解
.sops.yaml 是 SOPS 的规则文件,通常放置在项目根目录或用户主目录。它定义了加密规则、密钥后端引用以及文件匹配模式。SOPS 在加密/解密时会自动查找该文件并应用规则。
3.2.1 核心配置结构
creation_rules:
# 规则 1:匹配所有 .yaml 文件,使用 age 密钥
- path_regex: .*\.yaml$
age: age1abc123...def456
# 规则 2:匹配 production 目录下的 .env 文件,使用 AWS KMS
- path_regex: production/.*\.env$
kms: arn:aws:kms:us-east-1:123456789012:key/abcd1234-...-efgh5678
# 规则 3:匹配所有 .json 文件,使用 GCP KMS
- path_regex: .*\.json$
gcp_kms: projects/my-project/locations/global/keyRings/my-ring/cryptoKeys/my-key
# 规则 4:匹配 secrets/ 目录下所有文件,使用多个密钥后端(分片)
- path_regex: secrets/.*
age: age1abc...def456
kms: arn:aws:kms:us-east-1:123456789012:key/abcd1234-...-efgh5678
hc_vault: true
vault_address: https://vault.example.com:8200
vault_path: secret/sops-key
3.2.2 配置字段说明
| 字段 | 必填 | 说明 |
|---|---|---|
path_regex |
是 | 正则表达式,匹配需要应用此规则的文件路径 |
age |
否 | age 公钥(X25519 格式),用于 age 加密后端 |
kms |
否 | AWS KMS 密钥 ARN,支持逗号分隔多个密钥 |
gcp_kms |
否 | GCP Cloud KMS 资源 ID |
azure_keyvault |
否 | Azure Key Vault 密钥 URL |
hc_vault |
否 | 布尔值,是否使用 HashiCorp Vault 传输密钥 |
pgp |
否 | PGP 指纹,用于 PGP 加密后端(已不推荐) |
key_groups |
否 | 高级配置,定义密钥分片组,实现多密钥阈值解密 |
配置优先级: SOPS 查找
.sops.yaml 的顺序为:当前工作目录 → 父目录递归 → ~/.sops.yaml。如果多个规则匹配同一文件,第一个匹配的规则 生效。建议将通用规则放在文件末尾,精确规则放在前面。
3.3 密钥后端初始化
SOPS 支持多种密钥后端。初始化阶段需要确保后端可用且 SOPS 有权限访问。以下为三种主流后端的初始化流程。
3.3.1 age 密钥对生成(推荐用于本地/CI)
age 是 SOPS 官方推荐的轻量级加密后端,无需云服务依赖。
# 1. 安装 age(如果未安装)
brew install age # macOS
apt install age # Debian/Ubuntu
# 2. 生成密钥对
age-keygen -o ~/.config/sops/age/keys.txt
# 3. 查看公钥(用于 .sops.yaml 配置)
cat ~/.config/sops/age/keys.txt | grep "# public key:"
生成的 keys.txt 包含私钥和公钥注释。私钥必须妥善保管,公钥填入 .sops.yaml 的 age 字段。
3.3.2 AWS KMS 初始化
使用 AWS KMS 需要预先创建 CMK(Customer Master Key)。
# 1. 创建 KMS 密钥(通过 AWS CLI)
aws kms create-key --description "SOPS encryption key" --key-usage ENCRYPT_DECRYPT
# 2. 记录返回的 KeyId(例如:1234abcd-12ab-34cd-56ef-1234567890ab)
# 3. 创建别名(可选)
aws kms create-alias --alias-name alias/sops-key --target-key-id 1234abcd-12ab-34cd-56ef-1234567890ab
# 4. 验证 SOPS 可以访问 KMS
sops --kms arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab \
--encrypt --in-memory test.yaml
IAM 权限要求: 执行 SOPS 加密/解密的实体需要具备
kms:Encrypt、kms:Decrypt、kms:GenerateDataKey 权限。建议使用最小权限策略。
3.3.3 HashiCorp Vault 传输密钥初始化
SOPS 可以将 Vault 作为密钥传输层,Vault 存储 SOPS 的数据加密密钥(DEK)。
# 1. 确保 Vault 已安装并运行
vault status
# 2. 启用 KV 引擎(v2)
vault secrets enable -path=secret kv-v2
# 3. 创建策略文件 sops-policy.hcl
cat <<EOF > sops-policy.hcl
path "secret/data/sops-key" {
capabilities = ["create", "read", "update"]
}
path "secret/metadata/sops-key" {
capabilities = ["read", "delete"]
}
EOF
# 4. 应用策略
vault policy write sops-policy sops-policy.hcl
# 5. 生成 并配置环境变量
vault create -policy=sops-policy
export VAULT_="s.xxxxxx"
export VAULT_ADDR="https://vault.example.com:8200"
配置完成后,在 .sops.yaml 中设置 hc_vault: true 并指定 vault_address 和 vault_path。
3.4 密钥后端选择对比
| 后端 | 适用场景 | 密钥管理复杂度 | 离线支持 | 审计能力 |
|---|---|---|---|---|
| age | 本地开发、CI/CD、单团队 | 低(文件级密钥) | 完全支持 | 无原生审计 |
| AWS KMS | AWS 原生环境、多账户 | 中(IAM + KMS 策略) | 不支持 | CloudTrail 审计 |
| GCP KMS | GCP 原生环境 | 中(IAM + KMS 策略) | 不支持 | Cloud Audit Logs |
| Azure Key Vault | Azure 原生环境 | 中(RBAC + 访问策略) | 不支持 | Azure Monitor |
| HashiCorp Vault | 混合云、多后端统一 | 高(策略 + /K8s Auth) | 部分支持(DR 副本) | 审计设备 |
3.5 初始化验证与测试
完成密钥后端初始化后,执行以下端到端验证:
# 1. 创建测试文件
echo "database_password: supersecret" > test-secret.yaml
# 2. 使用 .sops.yaml 规则加密(自动匹配后端)
sops --encrypt test-secret.yaml > test-secret.enc.yaml
# 3. 查看加密文件结构(确认 metadata 中包含密钥信息)
cat test-secret.enc.yaml
# 4. 解密验证
sops --decrypt test-secret.enc.yaml
加密后的 YAML 文件会包含 sops 元数据块,记录使用的密钥指纹、加密时间、文件后缀等信息。这是后续 OPA 审计策略的重要数据源。
生产建议: 将
.sops.yaml 纳入版本控制,但 永远不要 将 age 私钥文件(keys.txt)或云服务密钥的 Secret Key 提交到 Git。使用环境变量或密钥管理服务注入私钥。