密钥管理
Mattakushi4322026-10-26查看 1433复制 1156
何时激活:密钥、API 密钥、环境变量、Vault、AWS Secrets Manager、.env、密钥轮换、凭证
📘如何使用这个技能
- 1复制技能内容·点击上方「Copy SKILL.md」复制全部内容,或 Download 下载到本地
- 2打开你的 AI 客户端·支持 Claude Code、Trae、Cursor、ChatGPT、DeepSeek、Kimi 等任意 AI 助手
- 3粘贴为系统提示/知识文件·Claude Code:放入 .claude/skills/ 目录;普通对话:作为首条消息发送并说「请严格按这份技能文档执行」
- 4直接提出你的需求·AI 会按技能定义的工作流、格式和约束来处理,无需再解释背景
💡 提示:技能生效后,每次对话只需一句需求,AI 会按 SKILL.md 的流程执行。
SKILL.md4672 chars
---
name: secrets-management
description: "When to activate: secrets, API keys, environment variables, Vault, AWS Secrets Manager, .env, secret rotation, credentials"
origin: zakr
metadata:
namespace: zakr/devtools-pack
version: 1.0.0
category: security
language: security
platforms: [claude-code, codex, gemini-cli, cursor, aider, windsurf]
---
# Secrets Management Patterns
## Environment Variables Best Practices
```bash
# .env — local dev only, NEVER commit
DATABASE_URL=postgresql://user:pass@localhost/mydb
JWT_SECRET=change-me-in-production
# .env.example — commit this (no real values)
DATABASE_URL=postgresql://user:password@localhost/dbname
JWT_SECRET=generate-with-openssl-rand-hex-32
# .gitignore
.env
.env.local
.env.*.local
*.pem
*_rsa
*_dsa
secrets/
```
```python
# Validate required secrets at startup — fail fast
import os
REQUIRED_SECRETS = ["DATABASE_URL", "JWT_SECRET", "REDIS_URL", "STRIPE_KEY"]
def validate_secrets():
missing = [s for s in REQUIRED_SECRETS if not os.environ.get(s)]
if missing:
raise RuntimeError(f"Missing required secrets: {', '.join(missing)}")
validate_secrets() # called at module load
```
## HashiCorp Vault
```python
import hvac
client = hvac.Client(url="https://vault.internal:8200")
# AppRole authentication (for services)
client.auth.approle.login(
role_id=os.environ["VAULT_ROLE_ID"],
secret_id=os.environ["VAULT_SECRET_ID"]
)
# Read secret
secret = client.secrets.kv.v2.read_secret_version(
path="myapp/database",
mount_point="secret"
)
db_password = secret['data']['data']['password']
# Dynamic secrets — Vault generates short-lived DB credentials
db_creds = client.secrets.database.generate_credentials(name="myapp-role")
# db_creds['data']['username'], db_creds['data']['password']
# Automatically revoked after TTL (e.g., 1 hour)
# Token renewal
client.auth.token.renew_self()
```
## AWS Secrets Manager
```python
import boto3, json
from functools import lru_cache
secrets_client = boto3.client('secretsmanager', region_name='us-east-1')
@lru_cache(maxsize=None)
def get_secret(secret_name: str) -> dict:
response = secrets_client.get_secret_value(SecretId=secret_name)
return json.loads(response['SecretString'])
# Usage
db_config = get_secret("prod/myapp/database")
db_url = f"postgresql://{db_config['username']}:{db_config['password']}@{db_config['host']}/{db_config['dbname']}"
# Rotation — Lambda function triggered automatically
def rotate_secret(event, context):
step = event['Step']
secret_id = event['SecretId']
token = event['ClientRequestToken']
if step == 'createSecret':
# Generate new credentials
new_password = secrets.token_urlsafe(32)
secrets_client.put_secret_value(
SecretId=secret_id,
ClientRequestToken=token,
SecretString=json.dumps({**current, 'password': new_password}),
VersionStages=['AWSPENDING']
)
elif step == 'testSecret':
# Test AWSPENDING version
pass
elif step == 'finishSecret':
secrets_client.update_secret_version_stage(...)
```
## Docker / Kubernetes Secrets
```yaml
# Kubernetes Secret
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
stringData:
database-url: postgresql://...
jwt-secret: changeme
# Use in Pod
envFrom:
- secretRef:
name: app-secrets
# External Secrets Operator (sync from Vault/AWS SM)
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: app-secrets
spec:
refreshInterval: 1h
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: app-secrets
data:
- secretKey: database-url
remoteRef:
key: secret/myapp/database
property: url
```
## Secret Scanning
```bash
# Pre-commit hook with gitleaks
gitleaks protect --staged
# .gitleaks.toml to customize patterns
# truffleHog — scan git history
trufflehog git file://. --since-commit HEAD --only-verified
# GitHub secret scanning — enable in repository settings
# detect-secrets baseline
detect-secrets scan > .secrets.baseline
detect-secrets audit .secrets.baseline
# Pre-commit config
# - repo: https://github.com/Yelp/detect-secrets
# hooks:
# - id: detect-secrets
# args: ['--baseline', '.secrets.baseline']
```
## Rotation Checklist
- [ ] All secrets have defined rotation schedule
- [ ] Zero-downtime rotation: deploy new secret → update service → revoke old
- [ ] Rotation tested in staging before production
- [ ] Alerts on secret access from unexpected IPs/services
- [ ] Audit log enabled for all secret reads
- [ ] Emergency rotation procedure documented