secrets-management について
CI/CDや実行環境でのシークレット管理を設計するためのスキルです。バックエンドの選定、最小権限、ローテーション、監査を扱い、複数の保管先やパイプラインの例を示します。
主な機能
- 01シークレットバックエンドの選定指針
- 02CI/CDと実行環境での取得パターン
- 03最小権限と監査ログ
- 04ローテーションとシークレットスキャン
活用シーン
- 01APIキーやデータベース認証情報の保管
- 02デプロイワークフローでのTLS証明書管理
- 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 証明書を扱う
- シークレットを自動的にローテーションする
- 最小権限アクセスを実装する
このスキルを使用しない場面
- ソース管理にシークレットをハードコードする予定がある
- シークレットバックエンドへのアクセスを保護できない
- 共有せずにローカル開発用の値だけが必要である
手順
- シークレットの種類、所有者、ローテーション要件を特定します。
- シークレットバックエンドとアクセスモデルを選択します。
- 最小権限で CI/CD または実行時の取得を統合します。
- ローテーションと監査ログを検証します。
セキュリティ
- シークレットをソース管理にコミットしないでください。
- アクセスを制限し、監査のためにシークレットの使用状況を記録してください。
シークレット管理ツール
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"
保護された変数とマスクされた変数
- 保護:保護されたブランチでのみ利用可能です
- マスク:ジョブログで非表示になります
- ファイル形式:ファイルとして保存されます
ベストプラクティス
- Git にシークレットをコミットしない
- 環境ごとに異なるシークレットを使用する
- シークレットを定期的にローテーションする
- 最小権限アクセスを実装する
- 監査ログを有効にする
- シークレットスキャンを使用する(GitGuardian、TruffleHog)
- ログ内のシークレットをマスクする
- 保存時にシークレットを暗号化する
- 可能な場合は有効期間の短いトークンを使用する
- シークレットの要件を文書化する
シークレットのローテーション
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}
手動ローテーションの手順
- 新しいシークレットを生成します
- シークレットストア内のシークレットを更新します
- 新しいシークレットを使用するようにアプリケーションを更新します
- 機能を検証します
- 古いシークレットを無効化します
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- パイプラインのアーキテクチャ向け
コメント
Markdown 対応