mcpField
S
secrets-management

secrets-management

github.com/wshobsonセキュリティ41.9k13.3k 回インストール2 週間前に更新
リポジトリ

secrets-management について

CI/CD パイプラインでシークレットを安全に扱うための実践ガイドです。Vault、AWS Secrets Manager、Azure Key Vault、Google Secret Manager、GitHub、GitLabでの保存、アクセス、ローテーション、スキャンを扱います。

主な機能

  1. 01Vaultとクラウドのシークレットストア
  2. 02CI/CDへのシークレット注入パターン
  3. 03シークレットローテーションの指針
  4. 04最小権限と監査の実践
  5. 05コミット前とCIでのシークレットスキャン

活用シーン

  1. 01APIキーのソースコードへの混入防止
  2. 02環境ごとのデータベース認証情報の管理
  3. 03デプロイ用シークレットのローテーション
  4. 04リポジトリやパイプライン内の漏えいシークレットの検出

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/wshobson/agents --skill secrets-management

インストール後、Claude Code で/secrets-managementを入力して読み込まれたか確認します。

詳細

シークレット管理

Vault、AWS Secrets Manager、その他のツールを使用した CI/CD パイプライン向けの安全なシークレット管理プラクティス。

目的

機密情報をハードコードすることなく、CI/CD パイプラインで安全なシークレット管理を実装します。

使用する場面

  • API キーと認証情報を保存する
  • データベースのパスワードを管理する
  • TLS 証明書を扱う
  • シークレットを自動的にローテーションする
  • 最小権限アクセスを実装する

シークレット管理ツール

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:1.17
  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
  env:
    API_KEY: ${{ secrets.API_KEY }}
    DATABASE_URL: ${{ secrets.DATABASE_URL }}
  run: |
    # Secrets are injected as env vars — never print them to logs
    ./deploy.sh
環境のシークレット
deploy:
  runs-on: ubuntu-latest
  environment: production
  steps:
    - name: Deploy
      env:
        PROD_API_KEY: ${{ secrets.PROD_API_KEY }}
      run: |
        # Secret injected as env var — never print to logs
        ./deploy.sh

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 フック
#!/bin/bash
# .git/hooks/pre-commit

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

if [ $? -ne 0 ]; then
  echo "❌ Secret detected! Commit blocked."
  exit 1
fi
CI/CD シークレットスキャン
secret-scan:
  stage: security
  image: trufflesecurity/trufflehog:3.88
  script:
    - trufflehog filesystem .
  allow_failure: false

関連スキル

  • github-actions-templates - GitHub Actions 統合用
  • gitlab-ci-patterns - GitLab CI 統合用
  • deployment-pipeline-design - パイプラインアーキテクチャ用

コメント