# 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,包含所有敏感信息** ```yaml # 示例: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 个服务共用或分组) ```yaml 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 个服务) ```yaml 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 个服务) ```yaml 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 个服务) ```yaml 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: ```bash # 脚本位置 d:\coding-area\devops\helm\generate-secrets.ps1 # 执行脚本 powershell -ExecutionPolicy Bypass -File generate-secrets.ps1 ``` ### 4.2 第二步:应用到 Kubernetes ```bash # 应用所有 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: ```yaml # 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 访问控制 ```yaml # 创建 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 加密存储 ```bash # 启用 etcd 加密(需要在 kube-apiserver 配置中) --encryption-provider-config=/etc/kubernetes/encryption.yaml ``` ### 5.3 定期审计 ```bash # 审计 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