mcpField
S
secrets-management

secrets-management

github.com/rmyndharis安全1.9k41 次安装2 周前更新
代码仓库

关于 secrets-management

面向 CI/CD 与运行时环境的密钥管理实践指南,涵盖后端选择、最小权限、轮换和审计,并提供多种密钥存储与流水线示例。

主要功能

  1. 01密钥后端选择指南
  2. 02CI/CD 与运行时获取模式
  3. 03最小权限与审计日志
  4. 04轮换和密钥扫描实践

适用场景

  1. 01存储 API 密钥和数据库凭据
  2. 02在部署工作流中管理 TLS 证书
  3. 03规划定期或自动密钥轮换

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/rmyndharis/antigravity-skills --skill secrets-management

安装后在 Claude Code 中输入/secrets-management确认已加载。

详细介绍

密钥管理

使用 Vault、AWS Secrets Manager 和其他工具,在 CI/CD 流水线中安全地管理密钥。

目的

在 CI/CD 流水线中实施安全的密钥管理,避免在代码中硬编码敏感信息。

适用场景

  • 存储 API 密钥和凭据
  • 管理数据库密码
  • 处理 TLS 证书
  • 自动轮换密钥
  • 实施最小权限访问

不适用场景

  • 计划在源代码管理中硬编码密钥
  • 无法安全地访问密钥后端
  • 只需要无需共享的本地开发值

说明

  1. 确定密钥类型、负责人和轮换要求。
  2. 选择密钥后端和访问模型。
  3. 遵循最小权限原则,集成 CI/CD 或运行时密钥检索。
  4. 验证密钥轮换和审计日志记录。

安全

  • 切勿将密钥提交到源代码管理中。
  • 限制访问权限,并记录密钥使用情况以供审计。

密钥管理工具

HashiCorp Vault
  • 集中式密钥管理
  • 动态生成密钥
  • 密钥轮换
  • 审计日志记录
  • 精细化访问控制
AWS Secrets Manager
  • AWS 原生解决方案
  • 自动轮换
  • 与 RDS 集成
  • 支持 CloudFormation
Azure Key Vault
  • Azure 原生解决方案
  • 由 HSM 提供支持的密钥
  • 证书管理
  • RBAC 集成
Google Secret Manager
  • GCP 原生解决方案
  • 版本控制
  • IAM 集成

HashiCorp Vault 集成

设置 Vault
# Start Vault dev server
vault server -dev

# Set environment
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='root'

# Enable secrets engine
vault secrets enable -path=secret kv-v2

# Store secret
vault kv put secret/database/config username=admin password=secret
使用 Vault 的 GitHub Actions
name: Deploy with Vault Secrets

on: [push]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4

    - name: Import Secrets from Vault
      uses: hashicorp/vault-action@v2
      with:
        url: https://vault.example.com:8200
        token: ${{ secrets.VAULT_TOKEN }}
        secrets: |
          secret/data/database username | DB_USERNAME ;
          secret/data/database password | DB_PASSWORD ;
          secret/data/api key | API_KEY

    - name: Use secrets
      run: |
        echo "Connecting to database as $DB_USERNAME"
        # Use $DB_PASSWORD, $API_KEY
使用 Vault 的 GitLab CI
deploy:
  image: vault:latest
  before_script:
    - export VAULT_ADDR=https://vault.example.com:8200
    - export VAULT_TOKEN=$VAULT_TOKEN
    - apk add curl jq
  script:
    - |
      DB_PASSWORD=$(vault kv get -field=password secret/database/config)
      API_KEY=$(vault kv get -field=key secret/api/credentials)
      echo "Deploying with secrets..."
      # Use $DB_PASSWORD, $API_KEY

AWS Secrets Manager

存储密钥
aws secretsmanager create-secret \
  --name production/database/password \
  --secret-string "super-secret-password"
在 GitHub Actions 中检索
- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v4
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: us-west-2

- name: Get secret from AWS
  run: |
    SECRET=$(aws secretsmanager get-secret-value \
      --secret-id production/database/password \
      --query SecretString \
      --output text)
    echo "::add-mask::$SECRET"
    echo "DB_PASSWORD=$SECRET" >> $GITHUB_ENV

- name: Use secret
  run: |
    # Use $DB_PASSWORD
    ./deploy.sh
使用 AWS Secrets Manager 的 Terraform
data "aws_secretsmanager_secret_version" "db_password" {
  secret_id = "production/database/password"
}

resource "aws_db_instance" "main" {
  allocated_storage    = 100
  engine              = "postgres"
  instance_class      = "db.t3.large"
  username            = "admin"
  password            = jsondecode(data.aws_secretsmanager_secret_version.db_password.secret_string)["password"]
}

GitHub Secrets

组织/仓库密钥
- name: Use GitHub secret
  run: |
    echo "API Key: ${{ secrets.API_KEY }}"
    echo "Database URL: ${{ secrets.DATABASE_URL }}"
环境密钥
deploy:
  runs-on: ubuntu-latest
  environment: production
  steps:
  - name: Deploy
    run: |
      echo "Deploying with ${{ secrets.PROD_API_KEY }}"

GitLab CI/CD 变量

项目变量
deploy:
  script:
    - echo "Deploying with $API_KEY"
    - echo "Database: $DATABASE_URL"
受保护和屏蔽的变量
  • 受保护:仅在受保护的分支中可用
  • 屏蔽:在作业日志中隐藏
  • 文件类型:以文件形式存储

最佳实践

  1. 切勿将密钥提交到 Git
  2. 为不同环境使用不同的密钥
  3. 定期轮换密钥
  4. 实施最小权限访问
  5. 启用审计日志记录
  6. 使用密钥扫描工具(GitGuardian、TruffleHog)
  7. 在日志中屏蔽密钥
  8. 对静态存储的密钥进行加密
  9. 尽可能使用短期令牌
  10. 记录密钥要求

密钥轮换

使用 AWS 自动轮换
import boto3
import json

def lambda_handler(event, context):
    client = boto3.client('secretsmanager')

    # Get current secret
    response = client.get_secret_value(SecretId='my-secret')
    current_secret = json.loads(response['SecretString'])

    # Generate new password
    new_password = generate_strong_password()

    # Update database password
    update_database_password(new_password)

    # Update secret
    client.put_secret_value(
        SecretId='my-secret',
        SecretString=json.dumps({
            'username': current_secret['username'],
            'password': new_password
        })
    )

    return {'statusCode': 200}
手动轮换流程
  1. 生成新密钥
  2. 在密钥存储中更新密钥
  3. 更新应用程序以使用新密钥
  4. 验证功能
  5. 撤销旧密钥

External Secrets Operator

Kubernetes 集成
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: vault-backend
  namespace: production
spec:
  provider:
    vault:
      server: "https://vault.example.com:8200"
      path: "secret"
      version: "v2"
      auth:
        kubernetes:
          mountPath: "kubernetes"
          role: "production"

---
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: database-credentials
  namespace: production
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: vault-backend
    kind: SecretStore
  target:
    name: database-credentials
    creationPolicy: Owner
  data:
  - secretKey: username
    remoteRef:
      key: database/config
      property: username
  - secretKey: password
    remoteRef:
      key: database/config
      property: password

密钥扫描

Pre-commit Hook
#!/bin/bash
# .git/hooks/pre-commit

# Check for secrets with TruffleHog
docker run --rm -v "$(pwd):/repo" \
  trufflesecurity/trufflehog:latest \
  filesystem --directory=/repo

if [ $? -ne 0 ]; then
  echo "❌ Secret detected! Commit blocked."
  exit 1
fi
CI/CD 密钥扫描
secret-scan:
  stage: security
  image: trufflesecurity/trufflehog:latest
  script:
    - trufflehog filesystem .
  allow_failure: false

相关技能

  • github-actions-templates - 用于集成 GitHub Actions
  • gitlab-ci-patterns - 用于集成 GitLab CI
  • deployment-pipeline-design - 用于流水线架构

评论

支持 Markdown