3. SOPS 安装与配置:多平台安装方法、.sops.yaml 配置文件详解、密钥后端初始化

本章聚焦 SOPS(Secrets OPerationS)的落地实践。作为云原生配置管理中密钥加密的标准工具,SOPS 的安装、配置与后端初始化是后续密钥轮换策略的基础。我们将按平台覆盖安装方法,深入解析 .sops.yaml 配置结构,并完成主流密钥后端的初始化流程。

3.1 多平台安装方法

SOPS 提供二进制分发与包管理器两种安装路径。下表列出主流操作系统与容器环境的推荐安装方式:

平台 安装方式 命令 / 步骤
macOS Homebrew brew install sops
Linux (amd64) GitHub Release 二进制
curl -LO https://github.com/getsops/sops/releases/latest/download/sops-linux-amd64
chmod +x sops-linux-amd64
sudo mv sops-linux-amd64 /usr/local/bin/sops
Linux (arm64) GitHub Release 二进制
curl -LO https://github.com/getsops/sops/releases/latest/download/sops-linux-arm64
chmod +x sops-linux-arm64
sudo mv sops-linux-arm64 /usr/local/bin/sops
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。使用环境变量或密钥管理服务注入私钥。
SOPS 配置与密钥后端初始化流程 1. 多平台安装 2. 编写 .sops.yaml 3. 选择密钥后端 4. 后端初始化 age 本地密钥对 AWS KMS CMK 创建 GCP KMS 密钥环 + 密钥 HashiCorp Vault KV 引擎 + 策略 初始化步骤:生成密钥 / 创建 CMK / 配置 Vault 策略 / 设置环境变量 验证:sops --encrypt test.yaml → sops --decrypt test.enc.yaml 输出:加密文件(含 sops metadata)+ 可用的密钥后端