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. 01APIキーやデータベース認証情報の保管
  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 Variables

プロジェクト変数
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

シークレットスキャン

コミット前フック
#!/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 - パイプラインのアーキテクチャ向け

コメント