secrets-env-manager について
secrets-env-manager は、CI/CD ワークフローでシークレットと環境変数を管理するスキルです。設定の検証と漏えいリスクの低減に向け、マスキング、漏えいスキャン、環境分離、文書テンプレートを扱います。
主な機能
- 01必須の環境変数とシークレットの検証
- 02GitHub Actions での機密値のマスキング
- 03リポジトリ内のシークレット漏えいスキャン
- 04環境ごとのシークレット分離
- 05.env.example と変数ドキュメントのテンプレート
活用シーン
- 01デプロイ前の必須シークレット確認
- 02ワークフローログへの機密値出力の防止
- 03コミット内のハードコードされたシークレットの検出
- 04開発・ステージング・本番環境の変数整理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ patricio0312rev/ skills --skill secrets-env-managerインストール後、Claude Code で/secrets-env-managerを入力して読み込まれたか確認します。
詳細
シークレットと環境変数の管理
CI/CD でのシークレットの安全な取り扱いと、環境変数の検証を行います。
環境変数の検証
validate-env:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate required environment variables
run: |
REQUIRED_VARS=(
"DATABASE_URL"
"API_KEY"
"AWS_REGION"
"STRIPE_SECRET_KEY"
)
MISSING=()
for var in "${REQUIRED_VARS[@]}"; do
if [ -z "${!var}" ]; then
MISSING+=("$var")
fi
done
if [ ${#MISSING[@]} -ne 0 ]; then
echo "❌ Missing required environment variables:"
printf '%s\n' "${MISSING[@]}"
exit 1
fi
echo "✅ All required environment variables are set"
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
AWS_REGION: ${{ secrets.AWS_REGION }}
STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }}
シークレットのマスキング
- name: Mask sensitive values
run: |
# Automatically masked in GitHub Actions
echo "::add-mask::${{ secrets.API_KEY }}"
echo "::add-mask::${{ secrets.DATABASE_PASSWORD }}"
# Safe to use in commands
curl -H "Authorization: Bearer ${{ secrets.API_KEY }}" https://api.example.com
漏えいの防止
- name: Check for leaked secrets
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: ${{ github.event.repository.default_branch }}
head: HEAD
- name: Detect hardcoded secrets
uses: reviewdog/action-detect-secrets@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-review
環境ごとのシークレット
deploy:
runs-on: ubuntu-latest
environment:
name: ${{ github.event.inputs.environment }}
steps:
- name: Deploy
run: |
# Environment-specific secrets are automatically scoped
echo "Deploying to ${{ github.event.inputs.environment }}"
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
API_KEY: ${{ secrets.API_KEY }}
シークレット検証スクリプト
// scripts/validate-env.ts
import * as fs from "fs";
interface EnvConfig {
required: string[];
optional: string[];
}
const config: EnvConfig = {
required: ["DATABASE_URL", "JWT_SECRET", "STRIPE_SECRET_KEY"],
optional: ["SENTRY_DSN", "LOG_LEVEL"],
};
function validateEnv(): boolean {
const missing: string[] = [];
config.required.forEach((key) => {
if (!process.env[key]) {
missing.push(key);
}
});
if (missing.length > 0) {
console.error("❌ Missing required environment variables:");
missing.forEach((key) => console.error(` - ${key}`));
return false;
}
console.log("✅ All required environment variables are set");
return true;
}
if (!validateEnv()) {
process.exit(1);
}
.env.example テンプレート
# .env.example - Check into git
# Copy to .env and fill in values
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
# Authentication
JWT_SECRET=your-secret-here
JWT_EXPIRY=24h
# External APIs
STRIPE_SECRET_KEY=sk_test_...
SENDGRID_API_KEY=SG....
# AWS
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=us-east-1
# Optional
SENTRY_DSN=https://...
LOG_LEVEL=info
ドキュメントのテンプレート
# Environment Variables
## Required Variables
### DATABASE_URL
**Description:** PostgreSQL connection string
**Format:** `postgresql://user:password@host:5432/database`
**Example:** `postgresql://app:secret@localhost:5432/myapp`
**Where to get:** Create database on Heroku/RDS
### STRIPE_SECRET_KEY
**Description:** Stripe API secret key
**Format:** `sk_test_...` or `sk_live_...`
**Example:** `sk_test_51abc123...`
**Where to get:** Stripe Dashboard → Developers → API Keys
**⚠️ Never commit to git**
## Optional Variables
### LOG_LEVEL
**Description:** Logging verbosity
**Format:** `error | warn | info | debug`
**Default:** `info`
フェイルファスト検証
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate secrets exist
run: |
if [ -z "${{ secrets.DATABASE_URL }}" ]; then
echo "::error::DATABASE_URL secret not set"
exit 1
fi
if [ -z "${{ secrets.API_KEY }}" ]; then
echo "::error::API_KEY secret not set"
exit 1
fi
deploy:
needs: validate
runs-on: ubuntu-latest
steps:
- name: Deploy
run: echo "Deploying..."
ベストプラクティス
- シークレットをログに記録しない:機密情報は常にマスキングします
- 早期に検証する:デプロイ前にシークレットを確認します
- GitHub Secrets を使用する:ワークフローにハードコードしないでください
- 環境を分離する:開発/ステージング/本番環境のシークレットを分けます
- 定期的にローテーションする:シークレットを定期的に更新します
- 最小権限の原則:権限を必要最小限にします
- 明確にドキュメント化する:各シークレットの取得先を記載します
- 漏えいをスキャンする:自動検出を行います
出力チェックリスト
- 必須の環境変数を検証済み
- シークレットのマスキングを設定済み
- 漏えい検出を有効化済み
- .env.example テンプレートを用意済み
- 環境変数をドキュメント化済み
- フェイルファスト検証を実施済み
- 環境ごとのシークレットを設定済み
- ローテーションポリシーをドキュメント化済み
コメント
Markdown 対応