Skip to content

Commit 262fc10

Browse files
committed
feat(ch2): 2.5 \u8eab\u4efd\u5b9e\u4f53\u7ae0\u8282\u6587\u6863 + 5 \u6b65\u5b9e\u9a8c
1 parent 47ab21d commit 262fc10

15 files changed

Lines changed: 1183 additions & 27 deletions

File tree

docs/.vitepress/config.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ export default defineConfig({
3333
{ text: '2.1 "Dev" 开发模式的适用边界与安全风险预警', link: '/ch2-dev-mode' },
3434
{ text: '2.2 封印与解封(Seal/Unseal)机制的密码学底层原理', link: '/ch2-seal-unseal' },
3535
{ text: '2.3 租约(Lease)、无感续期与强制撤销的生命周期管理', link: '/ch2-lease' },
36-
{ text: '2.4 认证(Authentication)与令牌(Tokens)树状层级关系本质', link: '/ch2-auth-tokens' }
36+
{ text: '2.4 认证(Authentication)与令牌(Tokens)树状层级关系本质', link: '/ch2-auth-tokens' },
37+
{ text: '2.5 身份实体(Identity Entity):打通多维度认证源的元数据中心', link: '/ch2-identity-entity' }
3738
]
3839
}
3940
],

docs/ch2-identity-entity.md

Lines changed: 409 additions & 0 deletions
Large diffs are not rendered by default.

plan.md

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ Vault 推出的 **机密同步(Secret Sync)** 功能,提出了一种开源
236236

237237
**5\. 最终成果:全新交互式动手课程目录大纲**
238238

239-
基于上述严谨、深度且穷尽的底层分析与教学法重构,为您交付如下剔除一切过时陈旧信息、深度融合现代架构机制、且全面覆盖现阶段(1.17+ 至 1.20+ 路线图)社区开源版最佳实践的全新知识体系架构。(根据任务指令,第 6 章“机密引擎”下层细节保持占位留空,供您后续自由选定填充)。
239+
基于上述严谨、深度且穷尽的底层分析与教学法重构,为您交付如下剔除一切过时陈旧信息、深度融合现代架构机制、且全面覆盖现阶段(1.17+ 至 1.20+ 路线图)社区开源版最佳实践的全新知识体系架构。考虑到学习者的兴趣曲线,将“机密引擎”章节前置至基础 CLI 之后,让读者在掌握命令行后能立刻动手存取真实业务机密;底层架构与身份治理章节则后移至上层应用搭建之前。(根据任务指令,机密引擎章节下层细节保持占位留空,供您后续自由选定填充)。
240240

241241
# **《HashiCorp Vault 现代实战与零信任架构进阶指南》课程大纲**
242242

@@ -274,36 +274,36 @@ Vault 推出的 **机密同步(Secret Sync)** 功能,提出了一种开源
274274
* 3.5 **【核心新增】** 轻量级代理服务指令:vault proxy 的配置文件解析与进程调试
275275
* 3.6 集群底层运维手术刀:operator (init, unseal, rekey, rotate, raft) 指令簇全解
276276

277-
## **第 4 章:集群配置文件调优与高可用自动化运维**
278-
279-
* 4.1 配置文件架构纵览与现代 HCL 语法规范
280-
* 4.2 网络监听器(Listener)与最高级别 TLS 协议族强化配置
281-
* 4.3 自动化云端解封(Auto-Seal)机制对接(AWS KMS, Azure Key Vault, Transit 代理)
282-
* 4.4 **【全面更新】** 现代存储引擎的绝对基石:Integrated Storage (Raft) 协议深度剖析
283-
* 4.5 **【核心新增】** 彻底解放人工干预:配置 Raft 自动驾驶仪(Autopilot)
284-
* 4.5.1 服务器观察稳定期(Server Stabilization Time)防抖动设置
285-
* 4.5.2 死节点无痛自动清理(Dead Server Cleanup)与 Quorum 阈值维护
286-
* 4.6 分布式服务注册与发现(K8s 原生发现机制与 Consul 集成模式)
287-
* 4.7 核心指标遥测(Telemetry)暴露与可视化 UI 界面底层配置
288-
289-
## **第 5 章:面向现代系统的联邦身份验证与治理**
290-
291-
* 5.1 Token 身份验证(作为一切验证基础的核心基座)
292-
* 5.2 面向微服务与机器架构的认证:强化版 AppRole 实战
293-
* 5.3 面向人员体系的认证:Userpass 与云原生 GitHub 鉴权接入
294-
* 5.4 企业组织架构目录集成:现代安全标准下的 LDAP 配置实践
295-
* 5.5 **【核心新增】** 原生内核级防暴力破解:User Lockout 防御基线与参数调优实战
296-
* 5.6 **【核心新增】** 无密钥云身份联邦:配置 JWT/OIDC 实现跨域 WIF 动态授权访问
297-
* 5.7 **【核心新增】** 角色反转,Vault 作为单点登录枢纽:激活内置 OIDC Provider 身份代理服务
298-
299-
## **第 6 章:核心机密引擎管理体系 (Secret Engines)**
277+
## **第 4 章:核心机密引擎管理体系 (Secret Engines)**
300278

301279
*(讲师留空:此章节结构框架依据后续实际业务技术栈选型与应用场景进行针对性填充)*
302280

303-
* 6.1 Key/Value (KV v2) 引擎:带有版本历史控制的现代静态机密存储框架
281+
* 4.1 Key/Value (KV v2) 引擎:带有版本历史控制的现代静态机密存储框架
304282
* ... (待选定特定机密引擎内容,例如 Database 等)...
305283
* ... (待选定特定机密引擎内容,例如 SSH 等)...
306284

285+
## **第 5 章:集群配置文件调优与高可用自动化运维**
286+
287+
* 5.1 配置文件架构纵览与现代 HCL 语法规范
288+
* 5.2 网络监听器(Listener)与最高级别 TLS 协议族强化配置
289+
* 5.3 自动化云端解封(Auto-Seal)机制对接(AWS KMS, Azure Key Vault, Transit 代理)
290+
* 5.4 **【全面更新】** 现代存储引擎的绝对基石:Integrated Storage (Raft) 协议深度剖析
291+
* 5.5 **【核心新增】** 彻底解放人工干预:配置 Raft 自动驾驶仪(Autopilot)
292+
* 5.5.1 服务器观察稳定期(Server Stabilization Time)防抖动设置
293+
* 5.5.2 死节点无痛自动清理(Dead Server Cleanup)与 Quorum 阈值维护
294+
* 5.6 分布式服务注册与发现(K8s 原生发现机制与 Consul 集成模式)
295+
* 5.7 核心指标遥测(Telemetry)暴露与可视化 UI 界面底层配置
296+
297+
## **第 6 章:面向现代系统的联邦身份验证与治理**
298+
299+
* 6.1 Token 身份验证(作为一切验证基础的核心基座)
300+
* 6.2 面向微服务与机器架构的认证:强化版 AppRole 实战
301+
* 6.3 面向人员体系的认证:Userpass 与云原生 GitHub 鉴权接入
302+
* 6.4 企业组织架构目录集成:现代安全标准下的 LDAP 配置实践
303+
* 6.5 **【核心新增】** 原生内核级防暴力破解:User Lockout 防御基线与参数调优实战
304+
* 6.6 **【核心新增】** 无密钥云身份联邦:配置 JWT/OIDC 实现跨域 WIF 动态授权访问
305+
* 6.7 **【核心新增】** 角色反转,Vault 作为单点登录枢纽:激活内置 OIDC Provider 身份代理服务
306+
307307
## **第 7 章:应用自动化接入与现代 Kubernetes 云原生集成生态 【架构重大重构】**
308308

309309
* 7.1 技术演进背景:消除应用层代码中的“机密感知 SDK”集成负担
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#!/bin/bash
2+
# ─────────────────────────────────────────────────────────
3+
# setup-common.sh — shared setup functions for Killercoda scenarios
4+
#
5+
# This file is the SINGLE SOURCE OF TRUTH for common setup logic.
6+
# It is copied into each scenario's assets/ directory by:
7+
# npm run sync-setup (or automatically via prebuild)
8+
#
9+
# Usage in background.sh:
10+
# source /root/setup-common.sh
11+
# install_vault
12+
# finish_setup
13+
# ─────────────────────────────────────────────────────────
14+
15+
VAULT_VERSION="${VAULT_VERSION:-1.19.2}"
16+
17+
install_vault() {
18+
if ! command -v unzip > /dev/null 2>&1; then
19+
apt-get update -qq && apt-get install -y -qq unzip > /dev/null 2>&1
20+
fi
21+
22+
curl --connect-timeout 10 --max-time 120 -fsSL \
23+
"https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip" \
24+
-o /tmp/vault.zip \
25+
&& unzip -o -q /tmp/vault.zip -d /usr/local/bin/ \
26+
&& chmod +x /usr/local/bin/vault \
27+
&& rm -f /tmp/vault.zip
28+
29+
vault version || echo "WARNING: vault install failed"
30+
}
31+
32+
start_vault_dev() {
33+
# Start Vault in dev mode (in-memory, no TLS, root token = root)
34+
export VAULT_ADDR='http://127.0.0.1:8200'
35+
export VAULT_TOKEN='root'
36+
37+
# Persist env for ALL future shells (Killercoda's editor terminal is a
38+
# separate shell that does not inherit from background.sh, and may not
39+
# source ~/.bashrc — /etc/profile.d/*.sh is loaded by every login shell).
40+
cat > /etc/profile.d/vault.sh <<'EOF'
41+
export VAULT_ADDR='http://127.0.0.1:8200'
42+
export VAULT_TOKEN='root'
43+
EOF
44+
chmod +x /etc/profile.d/vault.sh
45+
# Also append to /root/.bashrc so non-login interactive shells pick it up.
46+
grep -q "VAULT_ADDR=" /root/.bashrc 2>/dev/null || \
47+
cat /etc/profile.d/vault.sh >> /root/.bashrc
48+
49+
vault server -dev -dev-root-token-id=root \
50+
-dev-listen-address=0.0.0.0:8200 \
51+
> /var/log/vault-dev.log 2>&1 &
52+
53+
echo "Waiting for Vault dev server to be ready..."
54+
for i in $(seq 1 30); do
55+
if vault status > /dev/null 2>&1; then
56+
echo "Vault is ready."
57+
return 0
58+
fi
59+
sleep 1
60+
done
61+
echo "WARNING: Vault did not become healthy within 30 seconds"
62+
cat /var/log/vault-dev.log
63+
}
64+
65+
start_postgres() {
66+
# Start a Postgres container for dynamic-secret demos.
67+
# Image: postgres:16. Superuser: root / rootpassword. Listens on 5432.
68+
if ! command -v docker > /dev/null 2>&1; then
69+
echo "WARNING: docker not available, cannot start postgres"
70+
return 1
71+
fi
72+
73+
docker rm -f learn-postgres > /dev/null 2>&1 || true
74+
docker run -d \
75+
--name learn-postgres \
76+
-e POSTGRES_USER=root \
77+
-e POSTGRES_PASSWORD=rootpassword \
78+
-p 5432:5432 \
79+
--rm \
80+
postgres:16 > /dev/null
81+
82+
echo "Waiting for Postgres to be ready..."
83+
for i in $(seq 1 60); do
84+
if docker exec learn-postgres pg_isready -U root > /dev/null 2>&1; then
85+
echo "Postgres is ready."
86+
# Create the read-only role that dynamic users will inherit from.
87+
docker exec -i learn-postgres psql -U root -c \
88+
"CREATE ROLE \"ro\" NOINHERIT;" > /dev/null 2>&1 || true
89+
docker exec -i learn-postgres psql -U root -c \
90+
"GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"ro\";" > /dev/null 2>&1 || true
91+
return 0
92+
fi
93+
sleep 1
94+
done
95+
echo "WARNING: Postgres did not become healthy within 60 seconds"
96+
docker logs learn-postgres || true
97+
}
98+
99+
finish_setup() {
100+
touch /tmp/.setup-done
101+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# 恭喜完成实验!🎉
2+
3+
你已经亲手验证了 Vault Identity 文档里五个最关键的设计点:
4+
5+
| 主题 | 一句话总结 |
6+
| --- | --- |
7+
| 隐式 Entity 与 Alias | 任何非 token 的 auth method 一登录就自动建好 entity + alias,无需主动管理 |
8+
| Mount accessor 决定唯一性 | (alias_name, mount_accessor) 才是 alias 的唯一键;同名 alias 在不同 mount 上 Vault 视为不同人 |
9+
| 手工合并 alias | 把多条 alias 改挂到同一个命名 Entity 下,之后任何 mount 登录都共享同一 `entity_id` |
10+
| Entity policy 请求时叠加 | 加权 / 减权立即生效、不需要重登;但 entity policy **只能加**、不能压住 token 自带 policy |
11+
| Group 与子组继承 | policy 沿 entity → group → 父 group 的链路自动传递,最终生效集合是所有层级的并集 |
12+
13+
## 下一步
14+
15+
- **2.6 策略(Policies)**:本节实验里反复出现的 HCL policy 文档,
16+
下一节会系统讲清 path / capabilities / templated policy / 优先级
17+
- **5.x User Lockout / OIDC / WIF**:本节里 alice 是用最简单的
18+
userpass 登的——后续身份治理章节会演示如何把 entity 与外部 IdP
19+
(LDAP / OIDC / WIF)的真实身份系统对接
20+
- **8.x 审计**:本节强调 entity_id 让审计能按真实身份聚合,对应
21+
审计章节会演示在审计日志里看到 entity_id 字段的样子
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
{
2+
"title": "Entity / Alias / Group 的归并与策略叠加",
3+
"description": "把 Vault Identity 文档里五个关键设计跑一遍:隐式 entity、按 mount 唯一性、手工合并 alias、entity policy 请求时叠加、group 子组继承",
4+
"details": {
5+
"intro": {
6+
"text": "init/init.md",
7+
"background": "init/background.sh",
8+
"foreground": "init/foreground.sh"
9+
},
10+
"steps": [
11+
{
12+
"title": "隐式 Entity 与 Alias",
13+
"text": "step1/text.md"
14+
},
15+
{
16+
"title": "不同 mount 不会自动合并",
17+
"text": "step2/text.md"
18+
},
19+
{
20+
"title": "手工合并:把多个 alias 挂到同一 Entity",
21+
"text": "step3/text.md"
22+
},
23+
{
24+
"title": "Entity policy 请求时叠加",
25+
"text": "step4/text.md"
26+
},
27+
{
28+
"title": "Identity Group 与子组继承",
29+
"text": "step5/text.md"
30+
}
31+
],
32+
"finish": {
33+
"text": "finish/finish.md"
34+
},
35+
"assets": {
36+
"host01": [
37+
{"file": "setup-common.sh", "target": "/root", "chmod": "+x"}
38+
]
39+
}
40+
},
41+
"backend": {
42+
"imageid": "ubuntu"
43+
},
44+
"interface": {
45+
"layout": "editor-terminal"
46+
}
47+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/bin/bash
2+
# Background setup — runs before the user sees the terminal.
3+
4+
source /root/setup-common.sh
5+
6+
install_vault
7+
start_vault_dev
8+
9+
if ! command -v jq > /dev/null 2>&1; then
10+
apt-get update -qq && apt-get install -y -qq jq > /dev/null 2>&1
11+
fi
12+
13+
finish_setup
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/bin/bash
2+
# Foreground setup — waits for background to complete, then greets the user.
3+
4+
echo "等待环境初始化..."
5+
while [ ! -f /tmp/.setup-done ]; do
6+
sleep 1
7+
done
8+
9+
export VAULT_ADDR='http://127.0.0.1:8200'
10+
export VAULT_TOKEN='root'
11+
12+
echo ""
13+
echo "✅ 环境已就绪:Vault dev 服务器(root token = root)"
14+
echo ""
15+
vault status
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Entity / Alias / Group 的归并与策略叠加
2+
3+
阅读 [2.5 章节文档](../ch2-identity-entity) 之后,本实验把 Identity
4+
文档里五个关键设计点亲手验证一遍:
5+
6+
- 任何非 token 的 auth method 登录都会**自动**生成 entity + alias
7+
- 同一种 auth method 在两个不同 mount 上的 alias **不会**自动合并
8+
- 手工合并后,多种登录方式得到的 token 共享同一个 `entity_id`
9+
- Entity policy 在请求时动态求值——挂上立刻生效、摘掉立刻失能,**不需要重登**
10+
- Identity Group 让策略沿组关系(含子组)传递
11+
12+
后台脚本会启动 Vault dev 模式(root token = `root`),并安装 `jq`
13+
方便后续 JSON 解析。
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# 第一步:隐式 Entity 与 Alias
2+
3+
文档 §3 的核心论断:
4+
5+
> When a client authenticates via any credential backend (except the
6+
> Token backend), Vault creates a new entity. It attaches a new alias
7+
> to it if a corresponding entity does not already exist.
8+
9+
我们用 userpass 让 alice 登一次,看看 Vault 在背后默默建了什么。
10+
11+
## 1.1 启用 userpass、创建用户、登录
12+
13+
```bash
14+
vault auth enable userpass
15+
16+
vault write auth/userpass/users/alice \
17+
password=s3cr3t \
18+
token_policies=default
19+
20+
vault login -format=json -method=userpass username=alice password=s3cr3t \
21+
> /root/alice-login.json
22+
```
23+
24+
抓出 token 上的 `entity_id`
25+
26+
```bash
27+
ENT_ID=$(jq -r .auth.entity_id /root/alice-login.json)
28+
echo "alice 这次登录拿到的 token 上 entity_id = $ENT_ID"
29+
```
30+
31+
注意——alice 还**完全没碰过 identity 子系统**,但 `entity_id` 已经
32+
有了。这就是文档说的"非 token auth method 一登录就隐式建 entity"。
33+
34+
## 1.2 看看 Vault 自动建出来的 Entity
35+
36+
```bash
37+
vault read identity/entity/id/$ENT_ID
38+
```
39+
40+
注意几个关键字段:
41+
42+
- `aliases` 数组里有一条,`name = alice``mount_type = userpass`
43+
- `policies` 是空的——Vault 不会替你猜该挂什么 policy,需要管理员显式挂
44+
- `metadata``<nil>`——同样需要管理员或外部 IdP 同步系统填
45+
46+
## 1.3 看看自动建出来的 Alias
47+
48+
把 alias_id 拿出来:
49+
50+
```bash
51+
ALIAS_ID=$(vault read -format=json identity/entity/id/$ENT_ID \
52+
| jq -r '.data.aliases[0].id')
53+
54+
vault read identity/entity-alias/id/$ALIAS_ID
55+
```
56+
57+
注意 `mount_accessor` 字段——这就是文档 §2.1 说的"alias 唯一键的另一半":
58+
59+
```bash
60+
USERPASS_ACC=$(vault auth list -format=json | jq -r '."userpass/".accessor')
61+
echo "userpass mount 的 accessor = $USERPASS_ACC"
62+
echo "alias 上记录的 mount_accessor = $(vault read -format=json identity/entity-alias/id/$ALIAS_ID | jq -r .data.mount_accessor)"
63+
```
64+
65+
两者必须一致——这正是 Vault 内部把"哪个 mount 上的 alice"区分开的方式。
66+
67+
## 1.4 列出整个 Identity Store
68+
69+
```bash
70+
echo "所有 entity:"
71+
vault list identity/entity/id
72+
73+
echo ""
74+
echo "所有 alias:"
75+
vault list identity/entity-alias/id
76+
```
77+
78+
各 1 条——alice 的隐式 entity 和它的 userpass alias。
79+
80+
**这一步的核心结论**:你不需要主动管理 Entity,只要有人登录过 Vault
81+
**自动**有了它的"持久身份记录"。Entity 只是一个 ID + 一组 alias 的
82+
集合,**它本身完全不能鉴权**——鉴权依旧靠 2.4 章节里的 token。Identity
83+
做的是"在 token 之外另开一条持久身份的副线"。

0 commit comments

Comments
 (0)