密钥管理#
本文档描述 Cloud Native MCP Server 的密钥管理功能。
服务器包含密钥管理模块,用于安全地存储和管理敏感凭据。
- 安全存储: 带过期支持的内存存储
- 密钥轮换: API 密钥和 bearer token 的自动轮换
- 密钥生成: 内置生成器,用于复杂的 API 密钥和 JWT 类型的 token
- 环境变量: 支持从环境变量加载密钥
- 密钥类型: API 密钥、bearer token、basic auth 凭据
密钥类型#
API Key#
用于简单认证场景:
1
| apiKey: "Abc123!@#Xyz789!@#Abc123!@#"
|
要求:
- 最小 16 字符
- 包含至少 3 种字符类型(大写、小写、数字、特殊字符)
Bearer Token#
用于 JWT 认证:
1
| bearerToken: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
要求:
- 最小 32 字符
- 符合 JWT 标准(header.payload.signature)
Basic Auth#
用于传统认证:
1
2
| username: "admin"
password: "secure-password"
|
要求:
使用密钥管理器#
创建密钥管理器#
1
2
3
4
| import "github.com/mahmut-Abi/cloud-native-mcp-server/internal/secrets"
// 创建新的密钥管理器
manager := secrets.NewInMemoryManager()
|
存储密钥#
1
2
3
4
5
6
7
| secret := &secrets.Secret{
Type: secrets.SecretTypeAPIKey,
Name: "my-api-key",
Value: "Abc123!@#Xyz789!@#",
}
err := manager.Store(secret)
|
检索密钥#
1
2
3
4
5
6
| retrieved, err := manager.Retrieve(secret.ID)
if err != nil {
// 处理错误
}
fmt.Printf("Secret value: %s\n", retrieved.Value)
|
轮换密钥#
1
2
3
4
5
6
| rotated, err := manager.Rotate(secret.ID)
if err != nil {
// 处理错误
}
fmt.Printf("New secret value: %s\n", rotated.Value)
|
生成新的 API 密钥#
1
2
3
4
5
6
| newKey, err := manager.GenerateAPIKey("my-new-key")
if err != nil {
// 处理错误
}
fmt.Printf("Generated API key: %s\n", newKey.Value)
|
生成新的 Bearer Token#
1
2
3
4
5
6
| newToken, err := manager.GenerateBearerToken("my-new-token")
if err != nil {
// 处理错误
}
fmt.Printf("Generated bearer token: %s\n", newToken.Value)
|
密钥过期#
密钥可以有过期时间:
1
2
3
4
5
6
7
8
| secret := &secrets.Secret{
Type: secrets.SecretTypeAPIKey,
Name: "temporary-key",
Value: "Abc123!@#Xyz789!@#",
ExpiresAt: time.Now().Add(24 * time.Hour), // 24 小时后过期
}
err := manager.Store(secret)
|
过期的密钥会自动从列表中排除,无法检索。
密钥轮换策略#
定期轮换密钥是安全最佳实践:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| auth:
enabled: true
mode: "apikey"
apiKey: "${MCP_AUTH_API_KEY}"
secrets:
# 自动轮换间隔(小时)
rotation_interval: 168 # 7 天
# 密钥过期时间(天)
max_age: 30
# 保留过期密钥(用于审计)
keep_expired: true
|
轮换流程#
1. 生成新密钥
- manager.GenerateAPIKey()
2. 验证新密钥
- 检查复杂度要求
- 验证唯一性
3. 更新配置
- 替换旧密钥
- 保存到安全存储
4. 测试新密钥
- 验证新密钥有效
- 确认服务正常
5. 删除旧密钥
- 保留过期密钥用于审计
- 或完全删除
环境变量支持#
从环境变量加载#
1
2
3
4
5
| auth:
apiKey: "${MCP_AUTH_API_KEY}"
bearerToken: "${MCP_AUTH_BEARER_TOKEN}"
username: "${MCP_AUTH_USERNAME}"
password: "${MCP_AUTH_PASSWORD}"
|
设置环境变量#
1
2
3
4
5
6
7
8
9
| # API Key
export MCP_AUTH_API_KEY="Abc123!@#Xyz789!@#"
# Bearer Token
export MCP_AUTH_BEARER_TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
# Basic Auth
export MCP_AUTH_USERNAME="admin"
export MCP_AUTH_PASSWORD="secure-password"
|
Kubernetes Secrets#
创建 Secret#
1
2
3
4
5
| kubectl create secret generic mcp-auth \
--from-literal=api-key='Abc123!@#Xyz789!@#' \
--from-literal=bearer-token='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
--from-literal=username='admin' \
--from-literal=password='secure-password'
|
在部署中使用#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| env:
- name: MCP_AUTH_API_KEY
valueFrom:
secretKeyRef:
name: mcp-auth
key: api-key
- name: MCP_AUTH_BEARER_TOKEN
valueFrom:
secretKeyRef:
name: mcp-auth
key: bearer-token
- name: MCP_AUTH_USERNAME
valueFrom:
secretKeyRef:
name: mcp-auth
key: username
- name: MCP_AUTH_PASSWORD
valueFrom:
secretKeyRef:
name: mcp-auth
key: password
|
安全最佳实践#
1. 使用强密钥#
- API Key 最少 16 字符
- Bearer Token 使用 JWT 标准
- 密码包含大小写字母、数字和特殊字符
2. 定期轮换#
1
2
3
| secrets:
rotation_interval: 168 # 7 天
max_age: 30
|
3. 使用环境变量#
1
2
| auth:
apiKey: "${MCP_AUTH_API_KEY}"
|
4. 永远不要提交到版本控制#
1
2
3
4
5
| # .gitignore
config.yaml
.env
*.key
*.pem
|
5. 限制访问权限#
1
2
3
| # 设置文件权限
chmod 600 config.yaml
chmod 600 .env
|
6. 使用加密存储#
对于生产环境,考虑使用:
- HashiCorp Vault
- AWS Secrets Manager
- Azure Key Vault
- Google Secret Manager
相关文档#