Files
Hugo/4a-system-design/resource-centers.md
T

533 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 应用资源管理中心 + 系统资源管理中心(含堡垒集群)
> 本文件涵盖2个中心的设计,考虑到它们共享权限模型和SSO机制,合并在同一份文档中。
---
## 第一部分:应用资源管理中心
## 1. 总体定位
应用资源管理中心负责企业内**业务应用的单点登录接入和权限管理**。核心职责:
- 提供统一SSO网关,对接各类业务系统(B/S架构为主)
- 管理应用注册、元数据、接入配置
- 提供权限模型和授权规则引擎
- 参考亚信安全接口规范(IAM/SSO相关)
---
## 2. SSO网关设计
### 2.1 支持的协议
| 协议 | 成熟度 | 适用场景 | 优先级 |
|------|--------|---------|--------|
| OAuth2.0 + OIDC | 高 | 现代应用(RESTful API) | P0 |
| SAML 2.0 | 高 | 传统企业应用、ERP系统 | P0 |
| CAS | 中 | 部分遗留Java应用 | P1 |
| 自定义Token透传 | 低 | 老系统改造过渡 | P2 |
### 2.2 SSO流程(OIDC Authorization Code)
```
┌──────┐ ┌──────────┐ ┌──────────────┐ ┌──────────┐
│ 用户 │ │ 业务应用 │ │ 认证身份中心 │ │SSO网关 │
│ │ │ (Client) │ │ (Auth Server) │ │ │
└──┬───┘ └─────┬────┘ └──────┬───────┘ └─────┬────┘
│ │ │ │
│ 访问应用 │ │ │
│───────────────>│ │ │
│ │ 未登录,跳转SSO │ │
│<───────────────│ │ │
│ 302重定向 │ │ │
│──────────────────────────────────>│ │
│ │ │ SSO网关代收 │
│ │ │ 认证请求,返回 │
│ 登录页 │ │ 授权码 │
│<──────────────────────────────────│ │
│ │ │ │
│ 提交凭证 │ │ │
│──────────────────────────────────>│ │
│ │ │ 验证通过 │
│ │ │ 返回授权码 │
│<──────────────────────────────────│ │
│ │ │ │
│ 携带授权码回调 │ │ │
│──────────────────────────────────────────────> │
│ │ │ SSO网关 │
│ │ │ 校验+与身份中心 │
│ │ │ 交换AccessToken │
│ │ <───────────────────────────────────│
│ │ │ │
│ 登录成功 │ │ │
│<───────────────│ │ │
```
### 2.3 应用注册模型
```sql
CREATE TABLE T_APP (
app_id BIGINT PRIMARY KEY AUTO_INCREMENT,
app_name VARCHAR(128) NOT NULL COMMENT '应用名称',
app_key VARCHAR(64) NOT NULL UNIQUE COMMENT '应用唯一标识',
app_secret VARCHAR(256) NOT NULL COMMENT '应用密钥(加密存储)',
app_type TINYINT NOT NULL DEFAULT 1 COMMENT '应用类型:1-B/S 2-C/S 3-API 4-移动端',
-- SSO配置
sso_protocol VARCHAR(16) NOT NULL DEFAULT 'oidc' COMMENT 'SSO协议:oidc/saml/cas',
callback_urls JSON NOT NULL COMMENT '允许的回调URL列表',
logout_url VARCHAR(512) COMMENT '登出回调URL',
token_endpoint_auth_method VARCHAR(32) DEFAULT 'client_secret_basic',
-- 应用访问控制
access_level TINYINT NOT NULL DEFAULT 1 COMMENT '访问等级:1-普通 2-敏感 3-高敏感',
require_mfa TINYINT NOT NULL DEFAULT 0 COMMENT '是否需要MFA',
allowed_ips JSON COMMENT 'IP白名单',
allowed_domains JSON COMMENT '域名白名单',
-- 权限模型
permission_mode VARCHAR(16) DEFAULT 'rbac' COMMENT '权限模式:rbac/abac/hybrid',
-- 状态
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0-停用 1-启用',
-- 审计
created_by VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted TINYINT NOT NULL DEFAULT 0,
INDEX idx_app_key (app_key),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='应用注册表';
```
---
## 3. 权限模型(参考亚信接口规范)
### 3.1 RBAC + ABAC 混合模型
```
┌──────────┐
│ 用户 │
│ (User) │
└────┬─────┘
│
┌─────────┼─────────┐
│ │ │
┌─────▼──┐ ┌────▼───┐ ┌────▼───┐
│ 组织(Org)│ │ 角色 │ │ 属性 │
│ (ABAC) │ │ (Role) │ │(Attr) │
└────┬───┘ └────┬───┘ └────┬───┘
│ │ │
│ ┌─────▼──────┐ │
│ │ 权限集 │ │
└────┤ (Permission)├──┘
│ +策略规则 │
└─────┬──────┘
│
┌─────▼──────┐
│ 资源实例 │
│ (Resource) │
└────────────┘
```
**权限判定引擎流程**:
```
输入: 用户U, 应用A, 操作OP, 资源R, 上下文C
1. 检查U是否在A的应用白名单中(组织级) → 否→拒绝
2. 获取U在A中的角色列表 → 获取角色对应的权限集
3. 检查权限集是否包含 (OP, R) → 是→允许
4. ABAC规则评估:检查上下文C(时间/IP/设备/MFA等级)
→ ABAC规则不满足 → 降级/拒绝
5. 返回判定结果
```
### 3.2 核心权限表结构
```sql
-- 角色表
CREATE TABLE T_ROLE (
role_id BIGINT PRIMARY KEY AUTO_INCREMENT,
app_id BIGINT NOT NULL COMMENT '所属应用',
role_name VARCHAR(64) NOT NULL COMMENT '角色名',
role_code VARCHAR(64) NOT NULL COMMENT '角色编码(应用内唯一)',
description VARCHAR(256),
is_system TINYINT NOT NULL DEFAULT 0 COMMENT '系统预置角色',
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_app_role (app_id, role_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
-- 权限资源表
CREATE TABLE T_PERMISSION (
perm_id BIGINT PRIMARY KEY AUTO_INCREMENT,
app_id BIGINT NOT NULL COMMENT '所属应用',
resource VARCHAR(128) NOT NULL COMMENT '资源标识: menu:/user/list',
action VARCHAR(32) NOT NULL COMMENT '操作: read/write/delete/admin',
description VARCHAR(256),
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_app_resource_action (app_id, resource, action)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限资源表';
-- 角色-权限关联
CREATE TABLE T_ROLE_PERMISSION (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
role_id BIGINT NOT NULL,
perm_id BIGINT NOT NULL,
effect TINYINT NOT NULL DEFAULT 1 COMMENT '1-允许 0-拒绝',
UNIQUE KEY uk_role_perm (role_id, perm_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色权限关联表';
-- 用户-应用角色分配
CREATE TABLE T_USER_APP_ROLE (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
account_id BIGINT NOT NULL COMMENT '用户账号ID',
app_id BIGINT NOT NULL COMMENT '应用ID',
role_id BIGINT NOT NULL COMMENT '角色ID',
grant_type VARCHAR(16) DEFAULT 'direct' COMMENT 'direct-直接分配 org-继承',
start_date DATETIME,
end_date DATETIME COMMENT '有效期',
granted_by VARCHAR(64),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_account_app_role (account_id, app_id, role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户应用角色分配表';
-- ABAC策略规则表
CREATE TABLE T_ABAC_POLICY (
policy_id BIGINT PRIMARY KEY AUTO_INCREMENT,
app_id BIGINT NOT NULL,
policy_name VARCHAR(128) NOT NULL,
policy_type VARCHAR(16) NOT NULL COMMENT 'allow/deny',
subject_attr JSON COMMENT '主体属性条件',
resource_attr JSON COMMENT '资源属性条件',
action_cond JSON COMMENT '操作条件',
context_cond JSON COMMENT '上下文条件(时间/IP/设备等)',
priority INT NOT NULL DEFAULT 0 COMMENT '优先级(数字越大越优先)',
status TINYINT NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ABAC策略规则表';
```
### 3.3 与应用系统的权限接口规范
参考亚信安全接口规范,提供以下核心接口供业务系统对接:
```yaml
授权查询接口:
GET /api/v1/authorization/check
参数:
- app_key: 应用标识
- uid: 用户ID
- resource: 资源路径
- action: 操作
- context: 上下文(可选JSON)
返回: { allowed: true/false, reason: "xxx" }
用户角色列表:
GET /api/v1/apps/{app_key}/users/{uid}/roles
返回: [{role_id, role_code, role_name, grant_type, valid_until}]
用户权限列表:
GET /api/v1/apps/{app_key}/users/{uid}/permissions
返回: [{resource, action, effect}]
权限批量校验:
POST /api/v1/authorization/batch-check
请求体: [{app_key, uid, resource, action, context}, ...]
返回: [{allowed, reason}, ...]
权限同步通知(服务端推送):
POST /webhook/app/{app_key}/permission-sync
请求体: {event_type: "role_assign"|"role_revoke"|"perm_change",
uid, changed_roles, timestamp}
```
---
## 4. 授权流程
```
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ 资源申请者 │ │ 审批人 │ │ 权限中心 │ │ 业务应用 │
└─────┬──────┘ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘
│ │ │ │
│ 提交权限申请 │ │ │
│────────────────>│ │ │
│ │ │ │
│ 审批通过/拒绝 │ │
│ │────────────────>│ │
│ │ │ 分配角色 │
│ │ │────────────────>│
│ │ │ (授权生效通知) │
│ 申请结果通知 │ │ │
│<───────────────────────────────────────────────────│
│ │ │ │
│ 使用授权 │ │ │
│───────────────────────────────────────────────────>│
│ │ │ 鉴权校验 │
│<───────────────────────────────────────────────────│
```
**授权模式**支持:
1. **手动分配**:管理员为指定用户分配角色
2. **申请审批**:用户提交申请 → 上级/安全管理员审批 → 自动生效
3. **组织继承**:自动继承所属组织的默认角色集
4. **临时授权**:设定生效时间窗口,到期自动回收
---
## 第二部分:系统资源管理中心(含堡垒集群)
## 5. 总体定位
系统资源管理中心负责**服务器、网络设备、数据库等基础设施资源的权限管理**,包含堡垒机集群集成。核心职责:
- 管理系统资源的访问权限(SSH/RDP/数据库连接)
- 提供堡垒机单点登录和会话录制
- 参考泰岳管理模型(反推库结构和接口)
- 管理登录凭证、密钥、授权策略
---
## 6. 参考泰岳管理模型 - 反推策略
### 6.1 泰岳系统资源管理模型推断
基于现网泰岳版4A的运维经验和操作界面观察,反推其数据模型:
```sql
-- 推断的泰岳资产表结构
-- T_ASSET
-- asset_id BIGINT PK
-- asset_name VARCHAR(128) 资产名称
-- asset_ip VARCHAR(64) 管理IP
-- asset_type TINYINT 资产类型:1-Linux 2-Windows 3-网络设备 4-数据库
-- asset_group VARCHAR(128) 所属资产组
-- protocol VARCHAR(16) 管理协议:ssh/rdp/telnet
-- port INT 端口
-- account_auto TINYINT 1-纳管账号 0-手动密码
-- auth_mode TINYINT 1-密码 2-密钥 3-双因子
-- status TINYINT
-- 推断的泰岳授权表
-- T_ASSET_AUTH
-- auth_id BIGINT PK
-- asset_id BIGINT FK -> T_ASSET
-- account_id BIGINT FK (泰岳内部账号)
-- system_account VARCHAR(64) 目标系统账号(root/oracle/...)
-- access_level TINYINT 权限等级:1-普通 2-运维 3-管理员
-- start_time DATETIME 授权开始
-- end_time DATETIME 授权结束
-- approver VARCHAR(64)
```
**反推方法论**:
```
┌──────────────────────────────────────────────────────────────────┐
│ 反推方法 │
│ │
│ 1. 界面观察法 │
│ - 录屏泰岳操作界面,记录所有字段名和排列顺序 │
│ - 观察搜索/筛选条件字段(通常映射到DB索引字段) │
│ - 导出功能里的列名(CSV/xls导出列名常等于DB列名) │
│ │
│ 2. API嗅探法 │
│ - 浏览器开发者工具抓取泰岳管理的API请求/响应JSON │
│ - 关注字段名映射(下划线命名 vs 驼峰命名规律) │
│ - 分页参数(limit/offset习惯暗示底层DB) │
│ │
│ 3. 日志分析法 │
│ - 查看泰岳版的操作日志/审计日志字段定义 │
│ - 从报错信息中提取表名和字段名(典型:Constraint violation) │
│ │
│ 4. 行为验证法 │
│ - 设置特定值 → 观察界面呈现 → 推断字段类型/约束 │
│ - 创建/修改/删除操作 → 推断关联关系和约束条件 │
└──────────────────────────────────────────────────────────────────┘
```
### 6.2 自研系统资源模型
```sql
-- 资产主表
CREATE TABLE T_SYSTEM_ASSET (
asset_id BIGINT PRIMARY KEY AUTO_INCREMENT,
asset_name VARCHAR(128) NOT NULL COMMENT '资产名称',
asset_ip VARCHAR(64) NOT NULL COMMENT '管理IP',
asset_type TINYINT NOT NULL COMMENT '1-Linux 2-Windows 3-网络设备 4-数据库 5-中间件',
asset_group_id BIGINT COMMENT '所属资产组',
-- 连接信息
protocol VARCHAR(16) NOT NULL DEFAULT 'ssh' COMMENT '管理协议:ssh/rdp/telnet/mysql/oracle',
port INT NOT NULL DEFAULT 22,
-- 凭据管理
credential_mode TINYINT NOT NULL DEFAULT 1 COMMENT '1-纳管密码 2-纳管密钥 3-手动输入 4-动态令牌',
-- 纳管账号(系统层面的账号,非4A用户账号)
managed_account VARCHAR(64) COMMENT '纳管系统账号(root/oracle等)',
managed_password_enc VARCHAR(512) COMMENT '纳管密码(AES-256加密)',
managed_key_enc TEXT COMMENT '纳管私钥(AES-256加密)',
-- 访问控制
access_level TINYINT NOT NULL DEFAULT 2 COMMENT '访问等级:1-低 2-中 3-高',
allowed_users JSON COMMENT '允许操作的白名单用户列表',
-- 堡垒机集成
bastion_enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否通过堡垒机接入',
-- 状态
status TINYINT NOT NULL DEFAULT 1 COMMENT '0-停用 1-启用 2-维护',
-- 元数据
department VARCHAR(128) COMMENT '所属部门',
location VARCHAR(128) COMMENT '物理位置',
vendor VARCHAR(64) COMMENT '厂商',
model VARCHAR(64) COMMENT '型号',
os_version VARCHAR(64) COMMENT '操作系统版本',
remark TEXT,
-- 审计
created_by VARCHAR(64),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted TINYINT NOT NULL DEFAULT 0,
INDEX idx_asset_ip (asset_ip),
INDEX idx_asset_type (asset_type),
INDEX idx_group (asset_group_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统资产表';
-- 资产授权表
CREATE TABLE T_ASSET_AUTHORIZATION (
auth_id BIGINT PRIMARY KEY AUTO_INCREMENT,
asset_id BIGINT NOT NULL,
account_id BIGINT NOT NULL COMMENT '4A用户ID',
-- 目标系统身份
target_username VARCHAR(64) NOT NULL COMMENT '目标系统账号(root/appuser)',
-- 授权信息
access_level TINYINT NOT NULL DEFAULT 1 COMMENT '1-只读查看 2-普通操作 3-管理员操作',
-- 时间窗口
grant_type VARCHAR(16) NOT NULL DEFAULT 'permanent' COMMENT 'permanent-永久 temporary-临时',
valid_from DATETIME NOT NULL,
valid_until DATETIME,
-- 审批信息
approval_status TINYINT NOT NULL DEFAULT 0 COMMENT '0-待审批 1-已批准 2-已拒绝 3-已回收',
approver_id BIGINT,
approved_at DATETIME,
-- 行为约束
command_filter TEXT COMMENT '允许执行的命令白名单(正则)',
file_transfer TINYINT NOT NULL DEFAULT 0 COMMENT '0-禁止 1-允许上传 2-允许下载 3-双向',
-- 审计
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
revoked_at DATETIME,
revoked_by BIGINT,
INDEX idx_asset (asset_id),
INDEX idx_account (account_id),
INDEX idx_valid (valid_from, valid_until),
INDEX idx_status (approval_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资产授权表';
-- 资产组表
CREATE TABLE T_ASSET_GROUP (
group_id BIGINT PRIMARY KEY AUTO_INCREMENT,
group_name VARCHAR(128) NOT NULL,
parent_id BIGINT,
org_code VARCHAR(64) COMMENT '所属组织',
description VARCHAR(256),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资产组表';
-- 账号密码自动轮换配置
CREATE TABLE T_CREDENTIAL_ROTATION (
rotation_id BIGINT PRIMARY KEY AUTO_INCREMENT,
asset_id BIGINT NOT NULL,
target_account VARCHAR(64) NOT NULL COMMENT '目标系统账号',
rotation_schedule VARCHAR(32) NOT NULL DEFAULT '30d' COMMENT '轮换周期:7d/14d/30d/90d',
password_rule JSON COMMENT '密码生成规则',
last_rotation DATETIME,
next_rotation DATETIME,
auto_execute TINYINT NOT NULL DEFAULT 1 COMMENT '是否自动执行',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_asset_account (asset_id, target_account)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='密码轮换配置表';
```
---
## 7. 堡垒集群集成方案
### 7.1 架构选择
采用**代理模式**(非网关代理,而是独立部署堡垒机节点转发流量):
```
┌──────────────┐
│ 4A管控平台 │
│ (认证+授权) │
└──────┬───────┘
│ API
┌──────────────┼──────────────┐
│ │ │
┌────────▼───┐ ┌──────▼──────┐ ┌────▼────────┐
│ 堡垒节点1 │ │ 堡垒节点2 │ │ 堡垒节点3 │
│ (区域A) │ │ (区域B) │ │ (区域C) │
│ ┌────────┐ │ │ ┌────────┐ │ │ ┌────────┐ │
│ │SSH/RDP │ │ │ │SSH/RDP │ │ │ │SSH/RDP │ │
│ │代理 │ │ │ │代理 │ │ │ │代理 │ │
│ └────────┘ │ │ └────────┘ │ │ └────────┘ │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
│ (网络隔离,策略控制) │
│ │ │
┌──────▼──────┐ ┌─────▼───────┐ ┌────▼──────┐
│ 目标服务器1 │ │ 目标服务器2 │ │ 目标服务器3 │
│ 10.0.1.10 │ │ 10.0.2.20 │ │ 10.0.3.30 │
└─────────────┘ └─────────────┘ └───────────┘
```
### 7.2 堡垒机核心功能
| 功能 | 说明 | 实现方案 |
|------|------|---------|
| **SSO登录** | 用户从4A平台认证后直接跳转堡垒机,无需再次认证 | JWT令牌 → 堡垒节点验证 → 建立会话 |
| **会话录制** | 记录所有操作步骤(键盘输入 + 屏幕输出) | ttyrec/cast 格式录制,定期归档至对象存储 |
| **命令审计** | 记录执行命令,匹配高危命令规则 | 实时监控bash/windows shell日志 |
| **文件传输审计** | 追踪SCP/SFTP传输的文件名、大小、路径 | 代理层拦截审计 |
| **命令拦截** | 高危命令(rm -rf /, shutdown等)实时阻断 | 自定义shell profile + 命令过滤器 |
| **会话同步** | 多人同时监控同一会话 | WebSocket实时同步 |
| **事后回放** | 回放录制的会话 | 基于录制文件+时间轴播放器 |
### 7.3 堡垒节点技术选型
| 组件 | 推荐 | 备选 |
|------|------|------|
| 代理核心 | Apache Guacamole(已支持SSH/RDP/VNC) | teleport/ssh-proxy 自研 |
| 会话录制 | asciinema (ttyrec格式) | script + scriptreplay |
| 命令拦截 | 自定义shell profile (bash_prompt wrapper) | pam_exec模块钩子 |
| 文件传输审计 | SFTP proxy (在openssh中集成ForceCommand) | rssh/scponly |
| 会话存储 | 本地文件 → 定时上传至MinIO | Ceph RGW |
| 会话回放 | asciinema player 前端组件 | 自研播放器组件 |
### 7.4 堡垒机SSO流程
```
1. 用户从4A平台认证 → 获取JWT (payload含allowed_assets)
2. 用户选择目标资产 → 4A平台验证授权
3. 4A平台生成一次性堡垒令牌(有效期60秒,含用户+资产+目标账号)
4. 用户浏览器跳转至堡垒节点URL(带令牌)
5. 堡垒节点验证令牌 → 获取目标账号的真实密码/密钥(加密传输)
6. 堡垒节点建立SSH/RDP连接目标资产
7. 代理层开始录制和审计
8. 会话结束后录制上传至对象存储
```
---
## 8. 与泰岳版比对关注点
| 项 | 自研方案 | 泰岳方案(推测) | 验证方法 |
|----|---------|-----------------|---------|
| 资产模型 | 通用资产表+扩展属性 | 可能按类型分多表 | 创建各类型资产对比信息完整度 |
| 授权粒度 | 命令级黑白名单+时间窗口+文件传输控制 | 类似 | 设置复杂授权策略对比生效情况 |
| 堡垒节点 | 基于开源组件(Guacamole) | 自研代理 | 并发连接数对比 |
| 密码轮换 | 定时间隔+自动执行 | 类似 | 轮换成功率+时间对比 |
| 会话录制 | asciinema格式 | 未知格式 | 存储空间占用+回放体验对比 |
| 命令拦截 | shell profile级 | 代理级更底层 | 高危命令漏报率对比 |