[ PROMPT_NODE_24662 ]
security
[ SKILL_DOCUMENTATION ]
# DevSecOps 与安全最佳实践
## 安全原则
### 纵深防御 (Defense in Depth)
- **多层安全控制**
- 网络安全、应用安全、数据安全
- 无单点故障
### 最小权限 (Least Privilege)
- **仅授予必要的最小权限**
- 定期访问审查
- 时间限制的特权访问
### 零信任 (Zero Trust)
- **从不信任,始终验证**
- 无论来源如何,验证每个请求
- 微分段与严格的访问控制
## 密钥管理
### ❌ 严禁做法
yaml
# 严禁硬编码密钥!
apiVersion: v1
kind: Pod
metadata:
name: bad-example
spec:
containers:
- name: app
env:
- name: DATABASE_PASSWORD
value: "SuperSecret123!" # 🚨 严禁这样做
- name: API_KEY
value: "sk-abc123def456" # 🚨 严禁这样做
### ✅ 使用 External Secrets Operator
yaml
# 使用 AWS Secrets Manager 的外部密钥
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: app-secrets
namespace: production
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets-manager
kind: SecretStore
target:
name: app-secrets
creationPolicy: Owner
data:
- secretKey: database-password
remoteRef:
key: prod/myapp/database-password
- secretKey: api-key
remoteRef:
key: prod/myapp/api-key
### ✅ 使用 Sealed Secrets
bash
# 安装 kubeseal
brew install kubeseal
# 创建密封密钥
kubectl create secret generic myapp-secrets
--from-literal=db-password='secret123'
--dry-run=client -o yaml |
kubeseal -o yaml > sealed-secret.yaml
# 应用密封密钥 (可安全提交至 Git)
kubectl apply -f sealed-secret.yaml
### 使用 IRSA 的 AWS Secrets Manager
yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: myapp
namespace: production
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/myapp-secrets-role
---
# 应用使用 AWS SDK 获取密钥
# 代码或配置中无凭据!
## 容器安全
### 安全的 Dockerfile
dockerfile
# 使用特定版本标签,而非 'latest'
FROM node:20.10.0-alpine3.19 AS builder
# 以非 root 用户运行
RUN addgroup -g 1000 nodejs &&
adduser -u 1000 -G nodejs -s /bin/sh -D nodejs
WORKDIR /app
# 复制并安装依赖
COPY --chown=nodejs:nodejs package*.json ./
RUN npm ci --only=production &&
npm cache clean --force
# 复制应用代码
COPY --chown=nodejs:nodejs . .
# 构建应用
RUN npm run build
# 生产环境 s