secret-protection について
開発時の認証情報漏えいを防ぐセキュリティスキルです。リポジトリのスキャン、コミット前チェック、CI/CD検査、実行時検出、シークレットのローテーションを扱います。
主な機能
- 01.envファイルとリポジトリのスキャン
- 02シークレットを含むコミットの阻止
- 03CI/CDでの変更検査
- 04実行時の漏えい検出とマスキング
- 05シークレットのローテーション方針
活用シーン
- 01新しいリポジトリへのシークレット検査導入
- 02既存リポジトリの認証情報監査
- 03CI/CDへのシークレット検査ゲート追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itallstartedwithaidea/ agent-skills --skill secret-protectionインストール後、Claude Code で/secret-protectionを入力して読み込まれたか確認します。
詳細
シークレット保護
googleadsagent.ai™ による Agent Skills™ の一部です
説明
シークレット保護は、.env のスキャン、コミット前フック、シークレットローテーションポリシー、実行時の検出を通じて、開発ライフサイクル全体での認証情報の漏えいを防ぎます。エージェントは、コード、設定、ログ、AI との会話履歴にシークレットを含めないゼロトレランスポリシーを適用し、バージョン管理、CI 成果物、本番環境のログに漏えいが及ぶ前に検出します。
ソースコード内のシークレットは、最新のアプリケーションにおけるセキュリティ侵害の最も一般的な原因です。API キーが一つコミットされただけでも、公開リポジトリにプッシュされてから数分以内に、クラウドアカウント全体が侵害されるおそれがあります。自動化されたボットは、公開された認証情報を求めて GitHub を常時スキャンしており、コミットから悪用までの平均時間は 15 分未満です。このスキルは、あらゆる段階でシークレットを検出することで、こうした事態を防ぎます。
保護は、コミット前(シークレットのリポジトリへの混入を防止)、CI/CD(コミット前のチェックをすり抜けたシークレットを検出)、実行時(ログ、エラーメッセージ、AI エージェントの出力に含まれるシークレットを検出して秘匿化)の 3 つの層で機能します。各層は独立しているため、1 つが機能しなくても、次の層が漏えいを検出します。スケジュールに基づいてシークレットのローテーションを適用することで、検出されなかった漏えいの影響範囲も限定できます。
使用する場面
- 適切なシークレット管理を設定して、新しいリポジトリを作成するとき
- 認証情報の漏えいを防ぐため、コミット前フックを追加するとき
- 既存のリポジトリを監査し、コミット済みのシークレットを確認するとき
- シークレットスキャンゲートを備えた CI/CD パイプラインを設定するとき
- シークレットローテーションポリシーを実装するとき
- エージェントの出力にシークレットが含まれるのを防ぐとき
仕組み
graph TD
A[Developer / Agent Writes Code] --> B[Ring 1: Pre-Commit Hook]
B --> C{Secrets Detected?}
C -->|Yes| D[Block Commit + Alert]
C -->|No| E[Allow Commit]
E --> F[Ring 2: CI/CD Scan]
F --> G{Secrets in Diff?}
G -->|Yes| H[Fail Pipeline + Alert]
G -->|No| I[Continue Pipeline]
I --> J[Ring 3: Runtime Detection]
J --> K[Redact Secrets in Logs]
J --> L[Redact Secrets in Agent Output]
K --> M[Production Safe]
L --> M
N[Rotation Schedule] --> O[Rotate Keys Monthly]
O --> P[Update Secrets Manager]
P --> Q[Deploy Updated References]
3 つの独立した層により、シークレットの漏えいが損害を引き起こすには、すべての層をすり抜ける必要があります。ローテーションスケジュールによって、検出されなかった漏えいの影響範囲が限定されます。
実装
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
- repo: local
hooks:
- id: dotenv-check
name: Check .env files not committed
entry: bash -c 'git diff --cached --name-only | grep -E "\.env($|\.)" && exit 1 || exit 0'
language: system
pass_filenames: false
import re
from dataclasses import dataclass
@dataclass
class SecretPattern:
name: str
pattern: str
severity: str
SECRET_PATTERNS = [
SecretPattern("AWS Access Key", r"AKIA[0-9A-Z]{16}", "CRITICAL"),
SecretPattern("AWS Secret Key", r"(?i)aws_secret_access_key\s*=\s*[A-Za-z0-9/+=]{40}", "CRITICAL"),
SecretPattern("GitHub Token", r"gh[ps]_[A-Za-z0-9_]{36,}", "CRITICAL"),
SecretPattern("Generic API Key", r"(?i)(api[_-]?key|apikey)\s*[:=]\s*['\"][A-Za-z0-9]{20,}['\"]", "HIGH"),
SecretPattern("Private Key", r"-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----", "CRITICAL"),
SecretPattern("Cloudflare Token", r"(?i)cloudflare.*(?:token|key)\s*[:=]\s*['\"][A-Za-z0-9_-]{40,}['\"]", "CRITICAL"),
SecretPattern("JWT Token", r"eyJ[A-Za-z0-9_-]{10,}\.eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}", "HIGH"),
SecretPattern("Database URL", r"(?:postgres|mysql|mongodb)://\w+:[^@\s]+@", "CRITICAL"),
]
class SecretScanner:
def __init__(self, patterns: list[SecretPattern] = SECRET_PATTERNS):
self.patterns = [(p, re.compile(p.pattern)) for p in patterns]
def scan_text(self, text: str, source: str = "unknown") -> list[dict]:
findings = []
for pattern, compiled in self.patterns:
for match in compiled.finditer(text):
findings.append({
"type": pattern.name,
"severity": pattern.severity,
"source": source,
"position": match.start(),
"preview": self._redact(match.group(), keep_chars=4),
})
return findings
def redact_output(self, text: str) -> str:
"""Redact any detected secrets from agent output."""
for pattern, compiled in self.patterns:
text = compiled.sub(f"[REDACTED:{pattern.name}]", text)
return text
@staticmethod
def _redact(secret: str, keep_chars: int = 4) -> str:
if len(secret) <= keep_chars * 2:
return "*" * len(secret)
return secret[:keep_chars] + "*" * (len(secret) - keep_chars * 2) + secret[-keep_chars:]
class SecretRotationPolicy:
ROTATION_SCHEDULES = {
"CRITICAL": 30,
"HIGH": 90,
"MEDIUM": 180,
}
def check_rotation_due(self, secret_metadata: dict) -> bool:
from datetime import datetime, timedelta
last_rotated = datetime.fromisoformat(secret_metadata["last_rotated"])
max_age = self.ROTATION_SCHEDULES[secret_metadata["severity"]]
return datetime.now() - last_rotated > timedelta(days=max_age)
ベストプラクティス
- 新しいリポジトリでは、最初にコミット前フックをインストールします
- シークレットの検出結果を決して無視せず、修正するか、誤検知であることを示します
- シークレットは専用のシークレットマネージャー(Wrangler secrets、Vault、AWS Secrets Manager)に保存します
- CRITICAL なシークレット(クラウド認証情報、API キー)は 30 日ごとにローテーションします
- すべてのログ出力、エラーメッセージ、エージェントとの会話履歴からシークレットを秘匿化します
- git の履歴(
gitleaks detect)を定期的にスキャンします。コミット後に削除したシークレットも履歴に残ります
プラットフォームの互換性
| プラットフォーム | サポート | 備考 |
|---|---|---|
| Cursor | Full | コミット前フック+スキャン |
| VS Code | Full | gitleaks 拡張機能 |
| Windsurf | Full | シークレット検出 |
| Claude Code | Full | コミット前の統合 |
| Cline | Full | セキュリティスキャン |
| aider | Full | コミット前フックのサポート |
関連スキル
- エージェントのセキュリティスキャン - 3 層スキャンパイプラインでのシークレット検出を含む、より広範なセキュリティ分析
- サンドボックスの強化 - ファイルシステムのスコープ設定と権限境界によって、エージェントのシークレットへのアクセスを制限する実行分離
- CodeQL と Semgrep - コード内のハードコードされた認証情報や安全でないシークレット処理パターンを検出する静的解析ルール
キーワード
secret-protection credential-leak pre-commit gitleaks secret-rotation redaction .env-scanning api-key-security
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License