# Writech ICT 服务平台规划设计及实施方案

## 一、概述

### 1.1 目标

基于公司现有 IT 服务资源（详见 [IT服务资源](../IT资源/IT服务资源.md)），构建面向 **2E（企业员工）、2B（合作伙伴）、2C（最终消费者）** 三类用户的统一 ICT 服务平台，实现：

- 企业员工全线上办公
- 全部基础系统与业务系统统一登录，采用**免密码秘钥认证**
- 视频之外的全部业务上 SSL 安全保障
- 应用服务器可按需弹性扩缩
- 核心数据安全自主可控

### 1.2 基础设施概况

| 服务器 | 云平台 | 服务区 | IP | 绑定域名 | 定位 |
|--------|--------|--------|-----|---------|------|
| 腾讯云应用服务器 | 腾讯云 | 广州 | 106.55.191.177 | writech.cn | 大陆数据服务，面向国内用户 |
| 阿里云应用服务器 | 阿里云 | 新加坡 | 47.84.109.13 | writech.ai | 品牌站点与海外服务 |
| 私有云应用服务器 | 私有云 | 企业 | 118.141.37.23 | — | 数据源站、用户账户信息源 |

### 1.3 核心架构原则

- **私有云不直面终端用户**：私有云仅对应用服务器提供数据支撑（数据库、文件存储、身份源），不直接面向 2B / 2C / 2E 用户
- **公有云承载互联网服务**：员工在线工作系统、AI 客服、商城、客户支持等全部运行在腾讯云/阿里云应用服务器上
- **弹性扩缩**：应用服务器及其上应用可按需增减，平台架构须适应服务器动态变化

---

## 二、文档与资料管理体系

### 2.1 Git 仓库统一管理

企业全部文档资料均基于 Git 仓库管理和存放，涵盖以下类别：

| 类别 | 说明 | 典型仓库示例 |
|------|------|------------|
| 原始资料 | 产品需求、技术方案、会议纪要 | docs、project-plan |
| 证件资料 | 企业证照、商标、专利、软著 | certificates、IP-doc |
| 媒体宣传资料 | 品牌素材、产品图片、宣传视频脚本 | web-doc、media-assets |
| 软件源代码 | 产品代码、固件代码、SDK 代码 | 各产品独立仓库 |
| 软件开发工具 | 构建脚本、CI/CD 配置、开发环境配置 | devtools、ci-config |

### 2.2 Git 服务部署

```
┌─────────────────────────────────────────────────┐
│               Git 服务 (Gitea)                   │
│          运行于：互联网应用服务器                    │
│                                                   │
│  · SSH (22/tcp)    — 代码推拉（SSH 秘钥认证）       │
│  · HTTPS (443/tcp) — Web UI（SSO 秘钥登录）        │
│  · 仓库数据存储     — 私有云 NFS/Samba 挂载         │
└─────────────────────────────────────────────────┘
```

- **Git 服务**（推荐 Gitea 轻量自托管）运行在互联网应用服务器上，面向员工提供服务
- **仓库数据**实际存储于私有云大容量存储，通过内网挂载
- 所有 Git 操作均通过 **SSH 秘钥认证**，无密码

---

## 三、统一登录与秘钥认证体系

### 3.1 设计目标

所有企业基础系统与业务应用必须实现**统一登录**，且全部采用**免密码秘钥登录**，杜绝密码泄露风险。在手机/移动场景下，支持**微信扫码登录**作为秘钥认证的等价替代——微信扫码本质上仍是秘钥认证，手机端微信持有用户凭证（OpenID），相当于手机即秘钥载体。

需纳入统一登录的系统清单：

| 分类 | 系统 | 认证方式 |
|------|------|---------|
| 基础设施 | Git (Gitea) | SSH 秘钥 + Web SSO |
| 基础设施 | Samba 文件共享 | Kerberos + 秘钥 |
| 基础设施 | 数据库应用 | 客户端证书 |
| 通信协作 | 腾讯企业邮箱 | SAML SSO 对接 |
| 开发工具 | 编译管理 (Jenkins/Drone) | Web SSO |
| 开发工具 | 项目管理 (Redmine/Plane) | Web SSO |
| 开发工具 | 测试管理 | Web SSO |
| 业务系统 | 技术论坛 | Web SSO |
| 业务系统 | 客户支持系统 | Web SSO |
| 业务系统 | 商城系统 | Web SSO |
| 业务系统 | AI 在线客服 | Web SSO |

### 3.2 认证架构

```plantuml
@startuml
skinparam componentStyle rectangle
title 统一认证架构

node "私有云 (身份源)" as PCloud {
  database "OpenLDAP\n用户目录" as LDAP
  database "SSH 公钥库" as SSHKeys
}

node "互联网应用服务器" as AppServer {
  component "Keycloak\nSSO 认证中心" as KC
  component "Nginx\n反向代理" as Nginx
  component "Git / CI / 项目管理\n论坛 / 商城 / 客服" as Apps
}

cloud "微信开放平台" as WX

actor "员工 / 合作伙伴 / 消费者" as User

User -down-> Nginx : HTTPS 访问
Nginx -down-> KC : 认证请求
KC -down-> LDAP : 用户验证
KC -right-> Apps : OIDC Token
KC -left-> WX : 微信扫码认证\n(Social IdP)
User -down-> Apps : SSH 秘钥访问 (Git)
Apps -down-> SSHKeys : 公钥校验
@enduml
```

### 3.3 技术方案

#### 身份目录：OpenLDAP

- 部署于**私有云**，作为全局唯一的用户身份源
- 存储员工基本信息、组织架构、角色权限
- 存储每个用户的 SSH 公钥（`sshPublicKey` 属性）
- 所有系统通过 LDAP 协议查询用户信息

#### SSO 认证中心：Keycloak

- 部署于**互联网应用服务器**，面向所有用户提供认证服务
- 对接 OpenLDAP 作为用户联邦（User Federation）
- 支持 OIDC / SAML 协议，所有 Web 应用通过标准协议接入
- **免密码登录实现**：Keycloak 配置 WebAuthn（硬件安全秘钥/系统指纹）作为首选认证方式，禁用密码登录
- **微信扫码登录**：Keycloak 配置微信开放平台作为 Social Identity Provider，支持扫码登录作为秘钥认证的移动端替代

#### 免密码秘钥登录的三种场景

| 场景 | 方式 | 秘钥载体 | 说明 |
|------|------|---------|------|
| **SSH 类服务**（Git 推拉、服务器运维） | SSH 秘钥对（Ed25519） | 电脑本地 `~/.ssh/` | 用户本地生成秘钥对，公钥注册到 LDAP，私钥留在本地 |
| **Web 类服务 — 电脑端** | WebAuthn 硬件秘钥 / 系统生物识别 | 硬件秘钥 / 电脑 | 用户注册硬件秘钥（如 YubiKey）或系统指纹/面容到 Keycloak |
| **Web 类服务 — 移动端** | 微信扫码登录 | 手机微信 | 手机扫描 Keycloak 登录页二维码，微信 OpenID 映射到 LDAP 用户 |

> **设计要点**：三种方式本质均为秘钥认证——SSH 秘钥存于电脑、WebAuthn 秘钥存于硬件/系统、微信凭证存于手机。三者绑定到同一 LDAP 身份，互为替代，用户按使用场景选择最便捷的方式。

#### 微信扫码登录与秘钥认证的绑定关系

微信扫码登录并非独立的认证体系，而是秘钥认证在移动场景下的延伸：

```
┌──────────────────────────────────────────────────────┐
│                  同一 LDAP 身份                        │
│           (zhangsan@writech.cn / DN)                   │
│                                                        │
│   ┌─────────────┐  ┌─────────────┐  ┌─────────────┐  │
│   │  SSH 秘钥    │  │  WebAuthn   │  │  微信扫码    │  │
│   │  Ed25519    │  │  FIDO2 秘钥  │  │  OpenID 绑定 │  │
│   │             │  │             │  │             │  │
│   │ 载体：电脑   │  │ 载体：硬件   │  │ 载体：手机   │  │
│   │ 场景：CLI   │  │ 场景：PC浏览器│  │ 场景：移动端  │  │
│   └─────────────┘  └─────────────┘  └─────────────┘  │
│                                                        │
│   三种秘钥绑定在同一身份上，禁用 LDAP 账户后全部失效       │
└──────────────────────────────────────────────────────┘
```

**技术实现**：

1. **Keycloak 配置微信 Social IdP**：在 Keycloak 管理后台添加「微信开放平台」作为 Identity Provider，配置 AppID 和 AppSecret
2. **OpenID 绑定**：员工首次使用时，先通过 WebAuthn 登录 Keycloak，在账户设置中「关联社交账号 → 微信」，扫码完成绑定。此后微信 OpenID 与 Keycloak 用户（即 LDAP 身份）建立 1:1 映射
3. **登录流程**：Keycloak 登录页显示「微信扫码登录」按钮 → 用户手机微信扫码 → 微信返回 OpenID → Keycloak 查找绑定的 LDAP 用户 → 校验 LDAP 账户状态（未禁用）→ 签发 OIDC Token → 登录成功
4. **安全保障**：LDAP 账户一旦禁用，即使微信 OpenID 绑定仍存在，Keycloak 在 Token 签发前会验证 LDAP 状态，登录请求将被拒绝

#### 腾讯企业邮箱对接

- 企业邮箱域名：`@writech.cn`
- 通过 Keycloak SAML IdP 对接腾讯企业邮箱的 SSO 登录
- 员工在 Keycloak 完成秘钥认证后，自动获得企业邮箱访问权

---

## 四、SSL 安全策略

### 4.1 覆盖范围

| 服务类型 | SSL 策略 | 说明 |
|---------|---------|------|
| Web 应用（全部） | **强制 HTTPS** | 包括 Git Web UI、SSO、论坛、商城、客服等 |
| API 接口（全部） | **强制 HTTPS** | 所有 RESTful / WebSocket / MQTT-over-WSS |
| SSH 服务 | SSH 协议自带加密 | Git 推拉、服务器运维 |
| 邮件服务 | TLS 加密 | 腾讯企业邮箱原生支持 |
| 视频流服务 | **豁免** | 实时视频流对延迟敏感，按需采用 SRTP 或不加密 |

### 4.2 证书方案：ZeroSSL + acme.sh 自动续期

全部服务器的 SSL 证书统一采用 **ZeroSSL 免费通配符证书**，由 writech.hk 服务器集中管理：

- **签发工具**：acme.sh + ZeroSSL ACME 接口
- **证书类型**：DV 通配符（`*.writech.cn`、`*.yink.ai`、`*.writech.ai`、`*.writech.hk`）
- **DNS 验证**：.ai / .hk 域名通过阿里云 DNS API（dns_ali），.cn 域名通过腾讯云 DNSPod API（dns_dp）
- **自动续期**：cron 每日检查，到期前 30 天自动续期
- **自动分发**：续期后通过 SCP 推送至全部应用服务器，自动 reload Nginx

### 4.3 新增应用服务器的证书部署

当按需新增应用服务器时，证书部署流程：

1. 在 writech.hk 的分发脚本（`deploy_certs.sh`）中添加新服务器地址
2. 配置 writech.hk 到新服务器的 SSH 免密登录（`ssh-copy-id`）
3. 手动触发一次分发或等待下次 cron 自动续期时同步
4. 新服务器 Nginx 配置引用标准证书路径（`/etc/ssl/certs/`、`/etc/ssl/private/`）

---

## 五、业务应用系统规划

### 5.1 系统部署总览

全部业务应用运行于**互联网应用服务器**（腾讯云 / 阿里云），私有云仅提供数据后端支撑：

| 系统 | 用户群体 | 部署位置 | 说明 |
|------|---------|---------|------|
| Git 代码托管 (Gitea) | 2E | 互联网应用服务器 | 企业文档与代码管理 |
| SSO 认证中心 (Keycloak) | 2E / 2B / 2C | 互联网应用服务器 | 全局统一登录 |
| 编译管理 (CI/CD) | 2E | 互联网应用服务器 | 自动构建、自动部署 |
| 项目管理 | 2E | 互联网应用服务器 | 任务跟踪、迭代管理 |
| 测试管理 | 2E | 互联网应用服务器 | 测试用例、缺陷跟踪 |
| 技术论坛 | 2E / 2B | 互联网应用服务器 | 技术交流、知识沉淀 |
| Samba 文件共享 | 2E | 互联网应用服务器 | 公共文件共享（VPN 接入） |
| 企业邮箱 | 2E | 腾讯企业邮箱 (SaaS) | @writech.cn 统一邮箱 |
| AI 在线客服 | 2B / 2C | 互联网应用服务器 | 基于 AI 基础能力的智能客服 |
| 客户支持系统 | 2B / 2C | 互联网应用服务器 | 工单、FAQ、文档中心 |
| 商城系统 | 2C | 互联网应用服务器 | 产品展示、在线购买 |

### 5.2 AI 在线客服

- 部署于互联网应用服务器，直接面向 2B / 2C 用户
- 基于云平台 AI 算力 API（腾讯云/阿里云 NLP、大模型接口）构建
- 功能：智能问答、产品咨询、售后引导、工单自动分派
- 知识库数据存储于私有云，AI 服务通过内网调取

### 5.3 员工在线工作系统

员工全线上办公，核心工具链均运行在互联网应用服务器上：

```
员工日常工作流
  ├─ Git     — 文档编写、代码开发、版本管理
  ├─ CI/CD   — 代码编译、自动测试、自动部署
  ├─ 项目管理 — 任务分派、进度跟踪、迭代规划
  ├─ 测试管理 — 用例编写、测试执行、缺陷跟踪
  ├─ 论坛    — 技术讨论、方案评审、知识分享
  ├─ 邮箱    — 对外沟通、商务协作
  └─ Samba   — 共享大文件（设计稿、固件包等）
```

---

## 六、弹性扩缩策略

### 6.1 应用服务器动态管理

应用服务器及其上部署的应用会按需增减，平台设计须适应此动态变化：

#### 新增服务器流程

1. **资源开通**：在腾讯云/阿里云开通新云服务器实例
2. **基础配置**：安装 Nginx、Docker 等基础环境
3. **接入认证**：配置 Keycloak OIDC 客户端，接入统一登录
4. **证书部署**：在 writech.hk 分发脚本中添加新服务器，同步 SSL 证书
5. **DNS 解析**：按需添加子域名解析记录
6. **应用部署**：部署业务应用容器
7. **Nginx 反代**：配置反向代理和 SSL 终止
8. **注册到 LDAP**：如有新服务角色，在 LDAP 中添加对应服务条目

#### 缩减服务器流程

1. **业务迁移**：将应用和数据迁移至其他服务器
2. **DNS 摘除**：删除或更新相关 DNS 记录
3. **证书脚本清理**：从 `deploy_certs.sh` 中移除该服务器
4. **Keycloak 清理**：删除对应 OIDC 客户端配置
5. **资源释放**：销毁云服务器实例

### 6.2 配置即代码

所有服务器配置、部署脚本、Nginx 配置均纳入 Git 仓库管理，确保：

- 新服务器可通过脚本快速初始化
- 配置变更有版本记录，可回溯可审计
- 服务器增减时只需修改配置文件并执行部署脚本

---

## 七、账户生命周期管理

### 7.1 员工入职 — 开通账户

```plantuml
@startuml
skinparam componentStyle rectangle
title 员工入职账户开通流程

start
:IT管理员在 OpenLDAP 创建用户账户;
note right: 填写姓名、邮箱、部门、角色
:分配 @writech.cn 企业邮箱;
note right: 腾讯企业邮箱后台创建

:员工在个人电脑生成 SSH 秘钥对;
note right
  ssh-keygen -t ed25519 -C "name@writech.cn"
  生成 ~/.ssh/id_ed25519 (私钥)
  和 ~/.ssh/id_ed25519.pub (公钥)
end note

:员工将公钥提交给 IT 管理员;
note right: 通过企业邮箱发送或内部系统上传

:IT管理员将公钥注册到 LDAP;
note right: 写入用户的 sshPublicKey 属性

:员工注册 WebAuthn 硬件秘钥/生物识别;
note right
  登录 Keycloak 自助注册页面
  插入 YubiKey 或使用系统指纹/面容
  完成 WebAuthn 绑定
end note

:员工绑定微信扫码登录;
note right
  在 Keycloak 账户设置中
  选择 "关联社交账号 - 微信"
  手机微信扫码完成 OpenID 绑定
  此后可用微信扫码替代 WebAuthn 登录
end note

:账户开通完成;
note right
  可访问：Git、CI/CD、项目管理、
  测试管理、论坛、邮箱、Samba
  认证方式：SSH秘钥 / WebAuthn / 微信扫码
end note
stop
@enduml
```

### 7.2 SSH 秘钥管理规范

#### 秘钥生成要求

| 项目 | 要求 |
|------|------|
| 算法 | Ed25519（推荐）或 RSA 4096 |
| 口令保护 | 私钥**必须**设置本地口令（passphrase） |
| 存储位置 | 私钥仅存于员工本人电脑 `~/.ssh/` 目录 |
| 备份 | 私钥禁止上传到云盘或共享目录；建议加密备份到个人 U 盘 |

#### 公钥注册流程

1. 员工本地执行 `ssh-keygen -t ed25519 -C "name@writech.cn"` 生成秘钥对
2. 将 `~/.ssh/id_ed25519.pub` 内容通过安全渠道提交给 IT 管理员
3. IT 管理员通过 LDAP 管理工具将公钥写入该用户条目
4. 写入后，员工即可通过 SSH 秘钥访问 Git、服务器等全部 SSH 类服务
5. 员工登录 Keycloak 自助页面，注册 WebAuthn 设备用于 Web 类服务
6. 员工在 Keycloak 账户设置中关联微信账号（扫码绑定 OpenID），作为移动端登录的替代方式

### 7.3 员工电脑更换 — 秘钥迁移

#### 推荐方案：生成新秘钥

1. 在新电脑上**重新生成**新的 SSH 秘钥对
2. 将新公钥提交给 IT 管理员
3. IT 管理员在 LDAP 中**追加**新公钥（保留旧公钥，过渡期并存）
4. 员工在新电脑验证全部系统可正常访问
5. IT 管理员**删除**旧公钥
6. 在 Keycloak 中注册新电脑的 WebAuthn 设备

> **注意**：微信扫码登录绑定与电脑无关（绑定在手机微信上），更换电脑不影响微信扫码登录。

#### 紧急方案：迁移旧秘钥

若需立即使用且来不及走流程：

1. 通过加密 U 盘将旧电脑 `~/.ssh/` 目录中的私钥文件拷贝到新电脑
2. 确认拷贝后，**立即安全擦除** U 盘中的秘钥文件
3. 在新电脑验证连接正常
4. **建议后续仍重新生成秘钥**并替换，降低私钥泄露风险

### 7.4 员工离职 — 权限回收

离职权限回收必须在**员工最后工作日当天完成**，流程如下：

```plantuml
@startuml
skinparam componentStyle rectangle
title 员工离职权限回收流程

start
:HR 通知 IT 管理员离职日期;

:IT管理员禁用 LDAP 账户;
note right
  禁用后即时生效：
  · SSH 秘钥认证失败（公钥已不可用）
  · Web SSO 登录失败（LDAP 拒绝验证）
  · 全部系统同步失效
end note

:删除 Keycloak 中该用户的 WebAuthn 设备
及微信 OpenID 绑定;

:在腾讯企业邮箱后台停用邮箱;
note right: 邮箱数据保留 90 天备查后删除

:回收企业设备（如有 YubiKey）;

:从 LDAP 中删除用户公钥;

if (该员工有服务器 root/sudo 权限?) then (是)
  :检查并轮换相关服务器的 deploy key;
  :审计该员工最近操作日志;
endif

:归档离职员工资料;
:权限回收完成;
stop
@enduml
```

#### 关键要点

- **LDAP 禁用即全局失效**：由于所有系统的认证源都是 LDAP，禁用 LDAP 账户后，该员工立即无法访问任何系统，无需逐个系统处理
- **企业邮箱独立处理**：腾讯企业邮箱为 SaaS 服务，需在腾讯后台单独停用
- **秘钥残留无害**：即使离职员工仍持有私钥，由于公钥已从 LDAP 删除，私钥无法通过任何系统验证
- **微信绑定同步失效**：LDAP 账户禁用后，Keycloak 在微信扫码回调时会校验 LDAP 状态，拒绝签发 Token，无需单独解绑微信（但建议清理绑定记录）
- **特权账户审计**：对拥有 root/sudo 权限的离职员工，需额外审计操作记录并轮换相关 deploy key

---

## 八、系统部署拓扑

```plantuml
@startuml
skinparam componentStyle rectangle
title ICT 服务平台部署拓扑

node "阿里云 [新加坡]\nwritech.ai · 47.84.109.13" as ACloud {
  component "Nginx + SSL" as ANginx
  component "品牌官网" as Web
  component "海外业务服务" as Overseas
}

cloud "互联网用户" as Users {
  actor "2E 企业员工" as E
  actor "2B 合作伙伴" as B
  actor "2C 最终消费者" as C
}

node "腾讯云 [广州]\nwritech.cn · 106.55.191.177" as TCloud {
  component "Nginx + SSL" as TNginx
  component "Keycloak SSO" as SSO

  package "员工工作系统" {
    component "Git (Gitea)" as Git
    component "CI/CD" as CICD
    component "项目管理" as PM
  }

  package "对外业务系统" {
    component "AI 在线客服" as AICust
    component "商城 / 客户支持" as Biz
  }
}

node "私有云 [数据后端]\n118.141.37.23" as PCloud {
  database "OpenLDAP\n身份目录" as LDAP
  database "SSH 公钥库" as Keys
  database "核心数据库" as DB
  storage "Git 仓库存储\nSamba 文件存储" as Store
}

node "writech.hk · 证书管理中心" as HK {
  component "acme.sh + ZeroSSL" as ACME
}

' == 用户 → 阿里云（向上） ==
C -up-> ACloud : HTTPS
E -up-> ACloud

' == 用户 → 腾讯云（向下） ==
E -down-> TCloud : SSH / WebAuthn / 微信扫码
B -down-> TCloud : WebAuthn / 微信扫码 / API
C -down-> TCloud : WebAuthn / 微信扫码

' == 应用 → 数据后端 ==
SSO -down-> LDAP : 用户认证
Git -down-> Keys : 公钥校验
Git -down-> Store : 仓库数据
CICD -down-> Store
AICust -down-> DB : 知识库
Biz -down-> DB : 业务数据

' == 证书分发（虚线） ==
ACME ..> TNginx : 证书分发
ACME ..> ANginx : 证书分发
@enduml
```

---

## 九、实施路线图

| 阶段 | 任务 | 预计周期 |
|------|------|---------|
| **第一阶段：基础设施** | 私有云部署 OpenLDAP，建立用户目录 | 第 1 周 |
| **第一阶段** | 互联网服务器部署 Keycloak，对接 LDAP | 第 1-2 周 |
| **第一阶段** | SSL 证书全覆盖（ZeroSSL + acme.sh 已就绪） | 第 1 周 |
| **第一阶段** | 部署 Git (Gitea)，配置 SSH 秘钥认证 + SSO | 第 2 周 |
| **第二阶段：核心系统** | 部署 CI/CD、项目管理、测试管理，接入 SSO | 第 3-4 周 |
| **第二阶段** | 部署 Samba 文件共享，对接 LDAP 认证 | 第 3 周 |
| **第二阶段** | 腾讯企业邮箱 SAML SSO 对接 | 第 3 周 |
| **第二阶段** | 制定并发布员工秘钥管理规范 | 第 3 周 |
| **第三阶段：业务系统** | 部署技术论坛、客户支持系统，接入 SSO | 第 5-6 周 |
| **第三阶段** | 部署商城系统，接入 SSO | 第 5-6 周 |
| **第三阶段** | 部署 AI 在线客服，对接云平台 AI API | 第 6-8 周 |
| **第四阶段：运营优化** | 弹性扩缩自动化脚本开发 | 按需 |
| **第四阶段** | 全系统安全审计与渗透测试 | 按需 |
