mcpField
S
secrets-management

secrets-management

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

secrets-management について

CI/CD パイプラインで認証情報などの機密値を保護するチーム向けのガイドです。複数のツールを使った機密の保存、アクセス制御、ローテーション、スキャンを扱います。

主な機能

  1. 01Vault とクラウドのシークレットストア
  2. 02CI/CD でのシークレット取得パターン
  3. 03シークレットのローテーション手法
  4. 04最小権限のアクセス制御
  5. 05シークレットスキャンとログのマスキング

活用シーン

  1. 01デプロイパイプライン用の認証情報を保存
  2. 02データベースや API の認証情報をローテーション
  3. 03環境ごとにシークレットへのアクセスを制限
  4. 04リポジトリやパイプライン内のシークレットを検査

インストール

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

$npx skills add https://github.com/ormus-solutions/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 - パイプラインのアーキテクチャ

コメント