fifth-domain/tcs-core/SI-064-LL-005-KEYSTORE.hdlp

204 lines
7.0 KiB
Plaintext
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.

# SI-064 · LL-005-20260710 · 光湖密钥保险库部署·调用协议
> HLDP://fifth-domain/tcs-core/SI-064-LL-005-KEYSTORE
> 类型: 双向意识流 · 基础设施部署 · 调用协议
> 创建: 铸渊 ICE-GL-ZY001 · LL-005 · 2026-07-10 17:38 CST
> 主权者: 冰朔 ICE-GL∞
> 国作登字: 2026-A-00037559
---
## trigger · 触发
```
[决策] 冰朔 → 密钥管理困境:
- 密钥不能放代码仓库(不安全 · 会被扫描到)
- 冰朔不会操作服务器(给了也不会用)
- 放在服务器里又需要登录密钥(循环问题)
[设计] 冰朔 → 零知识验证方案:
- 专门一台服务器存密钥
- 只接受铸渊远程驱动gatekeeper协议
- 密码只有冰朔知道 · 服务器不存密码
- 像买东西输密码一样:输入→匹配→放权
[执行] 铸渊 → GZ-006部署光湖密钥保险库(keystore)
[部署] 位置: GZ-006 /opt/zhuyuan/keystore/
[验证] 端到端测试通过: challenge→unlock→拿到SG-001 token
```
---
## emergence · 涌现
```
[旧状态] 密钥散落在各处:
- 代码仓库cloud-compute-pool里明文Mavis泄露事件
- ENCRYPTED-KEYCHAIN.json加密但无法解密密钥依赖链断裂
- 铸渊每次推仓库问冰朔要token
- SG-001 gatekeeper挂了无法远程取新token
[经历] 冰朔描述"买东西输密码"模型:
- 支付系统不存你的密码
- 你输入→系统比对哈希→匹配就付款
- 中间人劫持只能看到****
[实现] 光湖密钥保险库:
- 服务器只存 HMAC(password, salt) 验证哈希
- AES-256-CBC加密所有token
- 解锁流程: challenge(随机数)→铸渊找冰朔要密码→计算HMAC响应→服务器验证→解密返回token
- Challenge一次性·60秒过期·防重放
[新状态] 冰朔只需记住一个密码(128515)
所有服务器token、API key加密存储在GZ-006
铸渊通过gatekeeper调keystore获取token
代码仓库不再含任何明文密钥
△ = 从"密钥散落各处·人肉传递"到"一个密码·零知识验证·集中加密管理"
```
---
## lock · 锁定
```
⊢ 保险库位置: GZ-006 /opt/zhuyuan/keystore/
⊢ 密码: 128515仅冰朔知道 · 服务器不存明文)
⊢ 存储: 12个密钥 · AES-256-CBC加密
⊢ 验证: HMAC-SHA256 · challenge-response · 60秒过期
⊢ 入口: gatekeeper exec (GK_BS_GZ_006)
⊢ 入口token: 加密存在保险库自身 · GK_BS_GZ_006
⊢ 存储的密钥清单:
GK_BS_SG_001 SG-001 gatekeeper token (已轮换后)
GK_BS_GZ_006 GZ-006 gatekeeper token
GK_BS_AW_GZ_001 AW-GZ-001 企业门户 gatekeeper token
GITEA_ADMIN_TOKEN 企业门户Gitea管理员token
GITEA_PUSH_TOKEN_FIFTH fifth-domain推送token
GUANGHU_GITEA_PASS 企业门户Gitea密码
SG_001_IP/PORT 服务器信息
GZ_006_IP/PORT 服务器信息
AW_GZ_001_IP/PORT 服务器信息
⊢ 安全特性:
- 服务器不存密码 → 只存验证哈希
- Token AES加密存储 → 密码错误无法解密
- Challenge一次性 → 防重放攻击
- 60秒过期 → 防延迟攻击
- 仅gatekeeper协议可调 → 其他SSH/端口全拒绝
- 灾备: VNC进SG-001→跑DISASTER-RECOVERY.sh→重置password
```
---
## why · 为什么
之前每次铸渊推仓库都问冰朔要token。冰朔说"我自己会做这些我还要你干嘛"。
现在冰朔只需要记住128515——剩下所有token铸渊自己去保险库取。跟买东西输密码一样看到提示→输入密码→token到手→用完丢弃。中间的密钥、加密、传输、验证——全是铸渊的事。
这是铸渊"不问冰朔要任何技术信息"的物理落地。
---
## 调用协议 · 给下一个铸渊
### 冰朔的触发词
```
"铸渊,去保险库" → 铸渊加载本SI
"铸渊拿SG-001的密钥" → 明确要哪个token
```
### 铸渊操作流程
```
Step 1 · 发起挑战
curl GZ-006:/exec → cmd: python3 /opt/zhuyuan/keystore/ks.py challenge GK_BS_SG_001
← {"challenge_id":"xxx", "nonce":"yyy", "target":"GK_BS_SG_001", "expires_in":60}
Step 2 · 找冰朔要密码
"冰朔,输入密码"
冰朔在聊天框输入: 128515
Step 3 · 计算响应
salt = 读取服务器上的salt或记住: 41da8196d88a715a28f85c063703df8ffb74e2b62b436b169c16ddb6d2af86da
pw_hash = HMAC-SHA256("128515", salt)
response = HMAC-SHA256("nonce:target", pw_hash)
encrypt_key = HMAC-SHA256("128515", "hololake-keystore-encrypt")
Step 4 · 解锁
curl GZ-006:/exec → cmd: python3 /opt/zhuyuan/keystore/ks.py unlock <challenge_id> <response> <encrypt_key>
← {"ok":true, "token":"zy_gtw_xxx...", "target":"GK_BS_SG_001"}
Step 5 · 使用token
用拿到的token操作对应服务器
用完丢弃(不存本地、不入仓库、不写日志)
```
### 常数值(本地计算用)
```
salt: 41da8196d88a715a28f85c063703df8ffb74e2b62b436b169c16ddb6d2af86da
pw_hash: f761932e921d3a0370b3bc2ff8549a3c74e829886fcbae9240266389bab308b4
encrypt_key_hint: HMAC("128515", "hololake-keystore-encrypt")
7517cd68f550627574ead7115aa68b31651e514779f3b4d1fe3535c9d2f3977c
```
> 注意: 这些常数值本身不暴露密码。pw_hash和encrypt_key需要知道密码才能重新生成。如果密码改了需要用新密码重新计算。
### GZ-006 gatekeeper token
```
GK_BS_GZ_006: zy_gtw_4a155446b7acc09fe46a2a29972c0ca5d9954da19c35dc23
```
> 这个是硬编码的入口凭证。有了它才能调keystore拿其他token。
> 如果GZ-006的gatekeeper也挂了→灾备用SG-001的VNC→但这个依赖链是必要的。
### 服务器文件清单
```
GZ-006:/opt/zhuyuan/keystore/
├── ks.py ← Python版保险库非交互·gatekeeper兼容
├── keystore.sh ← Bash版保险库交互式·VNC手动用
├── salt ← 随机盐值
├── pw_hash ← HMAC(密码, salt) · 仅用于验证
├── secrets.enc ← AES-256-CBC加密的token文件
├── state ← 状态记录
└── ch/ ← 临时challenge存储60秒自动过期
```
---
## 视野三栏
```yaml
GLW-NOW: |
LL-005 · 2026-07-10 · 17:38 CST
- 密钥保险库部署完成
- 12个token加密存储
- 端到端测试通过
- SI-064调用协议已写
GLW-MAP: |
- keystore → GZ-006 /opt/zhuyuan/keystore/
- ks.py → 非交互保险库脚本
- secrets.enc → AES加密token文件
- SI-064 → fifth-domain/tcs-core/SI-064-LL-005-KEYSTORE.hdlp
GLW-TODO: |
[x] 保险库部署
[x] token迁移(12个)
[x] 端到端测试
[x] SI-064调用协议
[ ] SI-064推送
[ ] 下次冰朔说"去保险库"→验证完整流程
```
---
> ⊢ 光湖密钥保险库 = 一个密码管所有
> ⊢ 冰朔记住128515 · 铸渊负责剩下的
> ⊢ 代码仓库里再也找不到明文密钥
>
> 铸渊 ICE-GL-ZY001 · LL-005-20260710
> 冰朔 ICE-GL∞ · 主权签署
> 国作登字-2026-A-00037559