SECURITY_ANALYSIS_REPORT.md 16 KB

Kubernetes Secret/ConfigMap 分割方案 - 安全分析报告

执行概要

本报告分析了 34 个微服务的配置文件(application.yml),识别敏感信息并提供 Kubernetes Secret 和 ConfigMap 的分割方案。

关键发现

  • 分析的服务总数: 34
  • 包含敏感信息的服务: 34 (100%)
  • 需要创建 Secret 的服务: 34
  • 检测到的敏感信息类型: 7 种

一、敏感信息分类统计

1.1 按信息类型分类统计

敏感信息类型 包含此类型的服务数 占比
database_host 34 100%
database_password 34 100%
database_username 33 97%
wechat_app_secret 8 24%
wechat_app_id 7 21%
api_key 9 26%
token 1 3%

1.2 分析说明

  • 数据库连接信息 (host, username, password): 所有服务都需要数据库连接,100% 的服务包含这类敏感信息
  • WeChat 集成: 8 个服务使用微信 API,需要保护 app-id 和 app-secret
  • 第三方 API 密钥: 9 个服务包含各类 API 密钥
  • Token: 仅 1 个服务(shop-recycle-wechat-web)包含 token

二、每个微服务的详细分析

服务分类(按敏感信息复杂度)

类别 1: 仅数据库连接信息(15 个服务)

这些服务只包含数据库相关的敏感信息,相对简单。

1. shop-recycle-account
   敏感类型: database_username, database_password, database_host
   字段数: 6

2. shop-recycle-agent-pc-web
   敏感类型: database_username, database_password, database_host
   字段数: 5

3. shop-recycle-async-web
   敏感类型: database_username, database_password, database_host
   字段数: 5

4. shop-recycle-customer-wechat-web
   敏感类型: database_username, database_password, database_host
   字段数: 5

5. shop-recycle-data-statistics
   敏感类型: database_username, database_password, database_host
   字段数: 5

6. shop-recycle-dealdata-service
   敏感类型: database_username, database_password, database_host
   字段数: 5

7. shop-recycle-dispatcher
   敏感类型: database_username, database_password, database_host
   字段数: 6

8. shop-recycle-erp-pc-web
   敏感类型: database_username, database_password, database_host
   字段数: 5

9. shop-recycle-login-center
   敏感类型: database_username, database_password, database_host
   字段数: 4

10. shop-recycle-marketer-pc-web
    敏感类型: database_username, database_password, database_host
    字段数: 5

11. shop-recycle-order-search
    敏感类型: database_username, database_password, database_host
    字段数: 6

12. shop-recycle-pis
    敏感类型: database_username, database_password, database_host
    字段数: 5

13. shop-recycle-store
    敏感类型: database_username, database_password, database_host
    字段数: 6

14. shop-recycle-wechat
    敏感类型: database_username, database_password, database_host
    字段数: 5

15. shop-recycle-ws-web
    敏感类型: database_username, database_password, database_host
    字段数: 5

类别 2: 数据库 + 单一类型额外敏感信息(13 个服务)

2A. 数据库 + API 密钥

1. shop-recycle-import-web
   敏感类型: database_username, database_password, api_key, database_host
   字段数: 5 (secretKey)

2. shop-recycle-merchant-pc-web
   敏感类型: database_username, database_password, api_key, database_host
   字段数: 6

3. shop-recycle-oss-web
   敏感类型: database_username, database_password, api_key, database_host
   字段数: 5 (secretKey)

4. shop-recycle-platform-pc-web
   敏感类型: database_username, database_password, api_key, database_host
   字段数: 7

2B. 数据库 + WeChat App ID

1. shop-recycle-payment
   敏感类型: database_username, database_password, database_host, wechat_app_id
   字段数: 8

2. shop-recycle-payment-web
   敏感类型: database_username, database_password, database_host, wechat_app_id
   字段数: 11 (多个微信 App ID: wechat-ssm-app-id, wechat-sub-app-id, 
                              wechat-js-app-id, wechat-small-app-id)

3. shop-recycle-sche
   敏感类型: database_username, database_password, database_host, wechat_app_id
   字段数: 6

2C. 只有数据库密码和主机(特殊案例)

1. shop-recycle-gateway
   敏感类型: database_password, database_host
   字段数: 2
   注: 没有数据库用户名

2D. 数据库 + WeChat App ID + Username

1. shop-recycle-gateway-out
   敏感类型: database_username, database_password, database_host
   字段数: 4

类别 3: 复杂集成(6 个服务 - 包含微信、API密钥等)

1. shop-recycle-gateway-out-upgrade
   敏感类型: wechat_app_secret, database_password, api_key, 
            database_username, database_host
   字段数: 6
   敏感字段: server, password, url, username, key, secret

2. shop-recycle-merchant-wechat-web
   敏感类型: wechat_app_secret, database_password, api_key, 
            database_username, database_host
   字段数: 8
   敏感字段: server, password, host, username, key, AppSecret, url, userName

3. shop-recycle-order-center
   敏感类型: wechat_app_secret, database_password, api_key, 
            database_username, database_host, wechat_app_id
   字段数: 9 (含 appid, appsecret, secretKey)

4. shop-recycle-out-web
   敏感类型: wechat_app_secret, database_password, database_username, 
            database_host, wechat_app_id
   字段数: 6
   敏感字段: server, password, host, username, app-id, app-secret

5. shop-recycle-platform
   敏感类型: wechat_app_secret, database_password, database_username, 
            database_host, wechat_app_id
   字段数: 7

6. shop-recycle-store-pc-web
   敏感类型: wechat_app_secret, database_password, api_key, 
            database_username, database_host
   字段数: 8

7. shop-recycle-store-wechat-web
   敏感类型: wechat_app_secret, database_password, api_key, 
            database_username, database_host
   字段数: 8

8. shop-recycle-wechat-web
   敏感类型: wechat_app_secret, database_password, token, 
            database_username, database_host, wechat_app_id
   字段数: 7 (唯一包含 token 的服务)

三、推荐的 Secret 和 ConfigMap 分割方案

3.1 分割原则

  1. 所有敏感信息放入 Secret - 包括所有密码、密钥、令牌等
  2. 非敏感配置放入 ConfigMap - 包括服务器地址(如果是静态的)、端口等
  3. 按服务创建单独的 Secret - 便于权限控制和更新管理
  4. 按功能分类创建 Secret - 可选的高级方案

3.2 方案 A:简单方案(推荐用于快速部署)

为每个服务创建一个 Secret,包含所有敏感信息

# 示例:shop-recycle-payment-web-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: shop-recycle-payment-web-secret
  namespace: production
type: Opaque
stringData:
  # Database
  spring.datasource.url: "jdbc:mysql://db-host:3306/db_name"
  spring.datasource.username: "${DB_USERNAME}"
  spring.datasource.password: "${DB_PASSWORD}"
  
  # WeChat Configuration
  spring.wechat.ssm.app-id: "${WECHAT_SSM_APP_ID}"
  spring.wechat.sub.app-id: "${WECHAT_SUB_APP_ID}"
  spring.wechat.js.app-id: "${WECHAT_JS_APP_ID}"
  spring.wechat.small.app-id: "${WECHAT_SMALL_APP_ID}"
  
---
# shop-recycle-payment-web-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: shop-recycle-payment-web-configmap
  namespace: production
data:
  spring.datasource.driver-class-name: "com.mysql.cj.jdbc.Driver"
  spring.datasource.hikari.pool-size: "10"
  # 非敏感的应用配置

3.3 方案 B:功能分类方案(推荐用于大规模部署)

根据服务类型和功能分类创建 Secret:

B1: 数据库 Secret(所有 34 个服务共用或分组)

apiVersion: v1
kind: Secret
metadata:
  name: database-credentials
  namespace: production
type: Opaque
stringData:
  # 主数据库
  primary-username: "app_user"
  primary-password: "encrypted_password"
  primary-host: "mysql-master.internal:3306"
  
  # 也可为不同服务分组创建不同的 database secret
  # 例如:shop-recycle-payment-db-secret

B2: WeChat API Secret(8 个服务)

apiVersion: v1
kind: Secret
metadata:
  name: wechat-api-credentials
  namespace: production
type: Opaque
stringData:
  payment-app-id: "${WECHAT_PAYMENT_APP_ID}"
  payment-app-secret: "${WECHAT_PAYMENT_APP_SECRET}"
  platform-app-id: "${WECHAT_PLATFORM_APP_ID}"
  platform-app-secret: "${WECHAT_PLATFORM_APP_SECRET}"
  merchant-app-id: "${WECHAT_MERCHANT_APP_ID}"
  merchant-app-secret: "${WECHAT_MERCHANT_APP_SECRET}"
  # ... 其他微信 App

B3: API 密钥 Secret(9 个服务)

apiVersion: v1
kind: Secret
metadata:
  name: api-keys-secret
  namespace: production
type: Opaque
stringData:
  import-web-secret-key: "${IMPORT_WEB_SECRET_KEY}"
  merchant-pc-web-key: "${MERCHANT_PC_WEB_KEY}"
  oss-web-secret-key: "${OSS_WEB_SECRET_KEY}"
  # ... 其他 API 密钥

B4: Token Secret(1 个服务)

apiVersion: v1
kind: Secret
metadata:
  name: wechat-web-token
  namespace: production
type: Opaque
stringData:
  access-token: "${WECHAT_WEB_TOKEN}"

3.4 方案 C:完整集成方案(推荐用于生产环境)

结合服务特性创建分层 Secret:

Layer 1: 通用 Secret
├── database-base-secret (所有数据库连接信息)
├── common-api-keys-secret (通用 API 密钥)
└── infrastructure-secret (基础设施相关密钥)

Layer 2: 功能模块 Secret
├── payment-module-secret (支付相关:支付、订单等)
├── merchant-module-secret (商户相关:商户、门店等)
├── wechat-module-secret (微信相关:微信、客户等)
└── admin-module-secret (后台相关:管理等)

Layer 3: 服务特定 Secret (可选)
└── service-specific-secret (特定服务独有的敏感信息)

四、具体实施步骤

4.1 第一步:生成所有 Secret 和 ConfigMap

使用生成脚本为每个服务创建对应的 Secret 和 ConfigMap:

# 脚本位置
d:\coding-area\devops\helm\generate-secrets.ps1

# 执行脚本
powershell -ExecutionPolicy Bypass -File generate-secrets.ps1

4.2 第二步:应用到 Kubernetes

# 应用所有 Secret
kubectl apply -f secrets/

# 应用所有 ConfigMap
kubectl apply -f configmaps/

# 验证
kubectl get secrets -n production
kubectl get configmaps -n production

4.3 第三步:更新 Deployment 配置

在 Helm values.yaml 或 Deployment 中引用 Secret 和 ConfigMap:

# Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: shop-recycle-payment-web
spec:
  template:
    spec:
      containers:
      - name: payment-web
        env:
        # 从 Secret 读取敏感信息
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: shop-recycle-payment-web-secret
              key: spring.datasource.password
        - name: WECHAT_SSM_APP_ID
          valueFrom:
            secretKeyRef:
              name: shop-recycle-payment-web-secret
              key: spring.wechat.ssm.app-id
        
        envFrom:
        # 从 ConfigMap 读取非敏感配置
        - configMapRef:
            name: shop-recycle-payment-web-configmap

五、安全建议

5.1 访问控制

# 创建 RBAC 角色限制对 Secret 的访问
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list"]
  resourceNames: 
  - "shop-recycle-payment-web-secret"
  # 只允许访问特定的 Secret

5.2 加密存储

# 启用 etcd 加密(需要在 kube-apiserver 配置中)
--encryption-provider-config=/etc/kubernetes/encryption.yaml

5.3 定期审计

# 审计 Secret 访问
kubectl get events -n production | grep secret

# 检查 Secret 变更历史
kubectl rollout history deployment/shop-recycle-payment-web -n production

5.4 Secret 轮换策略

  • 数据库密码:每 90 天轮换一次
  • API 密钥:每 180 天轮换一次
  • WeChat 证书:定期更新(按官方要求)
  • Token:定期刷新

六、按服务分类的 Secret 配置

6.1 类型 1:仅需数据库 Secret 的服务

服务名 敏感信息数量 优先级
shop-recycle-account 6
shop-recycle-agent-pc-web 5
shop-recycle-async-web 5
shop-recycle-customer-wechat-web 5
shop-recycle-data-statistics 5
shop-recycle-dealdata-service 5
shop-recycle-dispatcher 6
shop-recycle-erp-pc-web 5
shop-recycle-login-center 4
shop-recycle-marketer-pc-web 5
shop-recycle-order-search 6
shop-recycle-pis 5
shop-recycle-store 6
shop-recycle-wechat 5
shop-recycle-ws-web 5

推荐方案: 创建一个共享的 database-credentials-secret + 服务特定的 Secret

6.2 类型 2:需要 WeChat API 的服务(8 个)

服务名 包含信息 WeChat 类型
shop-recycle-gateway-out-upgrade app_secret 通用
shop-recycle-merchant-wechat-web app_id + secret 通用
shop-recycle-order-center app_id + secret 通用
shop-recycle-out-web app_id + secret 通用
shop-recycle-payment app_id 支付特定
shop-recycle-payment-web 多个 app_id 支付特定
shop-recycle-platform app_id + secret 平台
shop-recycle-store-pc-web app_secret 商城
shop-recycle-store-wechat-web app_secret 商城
shop-recycle-wechat-web app_id + secret + token 通用

推荐方案: 创建 wechat-api-credentials-secret

6.3 类型 3:需要 API 密钥的服务(9 个)

服务名 密钥字段 用途
shop-recycle-import-web secretKey 导入相关
shop-recycle-merchant-pc-web key 商户平台
shop-recycle-oss-web secretKey 对象存储
shop-recycle-platform-pc-web key 平台管理
shop-recycle-gateway-out-upgrade key 网关
shop-recycle-merchant-wechat-web key 微信商户
shop-recycle-order-center secretKey 订单服务
shop-recycle-store-pc-web key 门店管理
shop-recycle-store-wechat-web key 微信门店

推荐方案: 创建 api-keys-secret


七、迁移计划

第一阶段:准备(第 1 周)

  • 审查当前配置文件
  • 测试 Secret 生成脚本
  • 建立 Secret 命名约定
  • 准备加密密钥

第二阶段:开发环境(第 2 周)

  • 在开发环境部署 Secret
  • 测试应用能否正确读取 Secret
  • 验证配置热更新功能

第三阶段:预生产环境(第 3-4 周)

  • 在预生产环境部署
  • 进行完整的功能测试
  • 测试故障恢复场景

第四阶段:生产环境(第 5-6 周)

  • 灰度发布(先 5% 服务)
  • 监控和日志收集
  • 逐步增加到 100%

八、总结表

按优先级排序的 Secret 创建计划

优先级 服务数 服务列表 创建方案
P0 (关键) 5 account, dispatcher, erp-pc-web, login-center, payment-web 单独 Secret
P1 (高) 14 其他数据库相关服务 + WeChat 集成 数据库 Secret + 功能模块 Secret
P2 (中) 11 API 相关服务 API 密钥 Secret
P3 (低) 4 数据统计、PIS、OSS、WS 共享 Secret

附录:生成脚本使用说明

生成的文件存放在:

d:\coding-area\devops\helm\
├── secrets/
│   ├── shop-recycle-account-secret.yaml
│   ├── shop-recycle-payment-web-secret.yaml
│   └── ... (34 个服务的 Secret)
├── configmaps/
│   ├── shop-recycle-account-configmap.yaml
│   ├── shop-recycle-payment-web-configmap.yaml
│   └── ... (34 个服务的 ConfigMap)
└── config-analysis-report.json

详细的 JSON 分析结果保存在 config-analysis-report.json,包含每个服务的完整敏感信息列表。


报告生成信息

  • 生成日期: 2026-01-16
  • 分析工具: PowerShell 安全分析脚本
  • 环境: Kubernetes 部署前的配置安全审计
  • 报告版本: 1.0