mcpField
S
secrets-management

secrets-management

github.com/hermeticormusセキュリティ12376 回インストール4 週間前に更新
リポジトリ

secrets-management について

CI/CD で認証情報をハードコードせずに保存、取得、ローテーションするためのガイドです。Vault やクラウドのシークレット管理、パイプライン設定、アクセス制御、シークレットスキャンを扱います。

主な機能

  1. 01Vault とクラウドシークレット管理の解説
  2. 02CI/CD でのシークレット取得例
  3. 03シークレットローテーションの実践
  4. 04最小権限アクセスの指針
  5. 05シークレットスキャンのパターン

活用シーン

  1. 01デプロイパイプラインへの認証情報の提供
  2. 02データベースパスワードと API キーの管理
  3. 03アプリが使うシークレットのローテーション
  4. 04リポジトリや CI ジョブ内のシークレット検出

インストール

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

$npx skills add https://github.com/hermeticormus/libreuiux-claude-code --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: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

参考資料: references/vault-setup.md を参照してください。

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

Organization/Repository のシークレット
- name: Use GitHub secret
  run: |
    echo "API Key: ${{ secrets.API_KEY }}"
    echo "Database URL: ${{ secrets.DATABASE_URL }}"
Environment のシークレット
deploy:
  runs-on: ubuntu-latest
  environment: production
  steps:
  - name: Deploy
    run: |
      echo "Deploying with ${{ secrets.PROD_API_KEY }}"

参考資料: references/github-secrets.md を参照してください。

GitLab CI/CD 変数

プロジェクト変数
deploy:
  script:
    - echo "Deploying with $API_KEY"
    - echo "Database: $DATABASE_URL"
保護された変数とマスクされた変数
  • Protected:保護されたブランチでのみ使用できます
  • Masked:ジョブログで非表示になります
  • File type:ファイルとして保存されます

ベストプラクティス

  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: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

参考ファイル

  • references/vault-setup.md - HashiCorp Vault の設定
  • references/github-secrets.md - GitHub Secrets のベストプラクティス

関連スキル

  • github-actions-templates - GitHub Actions との連携
  • gitlab-ci-patterns - GitLab CI との連携
  • deployment-pipeline-design - パイプラインのアーキテクチャ

コメント