Skip to content

Commit e266e3c

Browse files
committed
chore: bump version to 1.1.0; update docs for release
- Cargo.toml: 1.0.1 -> 1.1.0 - README.md: add 1.1.0 security features to feature list; link RELEASE_1_1.md - docs/RELEASE_1_1.md: new release notes for v1.1.0 - docs/PRODUCTION_DEPLOYMENT.md: add DB_POOL_SIZE, mark Redis as mandatory in production - docs/KEY_ROTATION.md: update version reference to 1.1.0 - docs/RELEASE_1_0.md: mark 1.x items completed in 1.1.0
1 parent 988e21c commit e266e3c

7 files changed

Lines changed: 134 additions & 11 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "keylo"
3-
version = "1.0.1"
3+
version = "1.1.0"
44
edition = "2021"
55

66
[[bin]]

README.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Keylo v1.0.1
1+
# Keylo v1.1.0
22

33
**Keylo** 是一个轻量、可扩展的 **统一认证与授权服务**(Auth Service),为你的多服务系统提供统一的 JWT 签发、Session 管理和 OAuth 支持。
44

@@ -15,6 +15,12 @@
1515
* ✅ PostgreSQL 自动迁移,Redis 可选增强限流、锁定和 OAuth state
1616
* ✅ 使用 Axum 0.8 + Tokio 的模块化 Rust 服务架构
1717
* ✅ Docker / GHCR 镜像发布支持
18+
* ✅ 客户端密钥 bcrypt 哈希存储,杜绝明文泄露风险
19+
* ✅ 生产环境强制 Redis 限流,禁止降级为内存模式
20+
* ✅ 密码复杂度策略(大写、小写、数字、特殊字符)
21+
* ✅ OAuth state 原子消费(GETDEL),消除 TOCTOU 竞态
22+
* ✅ 服务 Token audience 严格校验
23+
* ✅ 数据库连接池大小可通过 `DB_POOL_SIZE` 环境变量配置
1824

1925
---
2026

@@ -105,9 +111,10 @@ cargo tarpaulin --out Html
105111

106112
### 生产部署与发布说明
107113

108-
Keylo 1.0 的生产部署要求、发布能力边界和密钥轮换建议见以下文档:
114+
Keylo 的生产部署要求、发布能力边界和密钥轮换建议见以下文档:
109115

110116
* [docs/PRODUCTION_DEPLOYMENT.md](docs/PRODUCTION_DEPLOYMENT.md)
117+
* [docs/RELEASE_1_1.md](docs/RELEASE_1_1.md)
111118
* [docs/RELEASE_1_0.md](docs/RELEASE_1_0.md)
112119
* [docs/KEY_ROTATION.md](docs/KEY_ROTATION.md)
113120

docs/KEY_ROTATION.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Keylo 1.0 密钥轮换建议
1+
# Keylo 1.1.0 密钥轮换建议
22

3-
Keylo 1.0 已支持通过 `JWT_KEY_ID` 和 JWKS 暴露当前验签公钥,但 1.0 版本的密钥轮换策略仍建议以人工控制的方式执行
3+
Keylo 1.1.0 已支持通过 `JWT_KEY_ID` 和 JWKS 暴露当前验签公钥,但当前版本的密钥轮换策略仍建议以人工控制的方式执行
44

55
## 轮换目标
66

docs/PRODUCTION_DEPLOYMENT.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
# Keylo 1.0 生产部署指南
1+
# Keylo 1.1.0 生产部署指南
22

3-
本文档定义 Keylo 1.0 在生产环境中的最小部署要求、配置要求和上线前检查项。
3+
本文档定义 Keylo 1.1.0 在生产环境中的最小部署要求、配置要求和上线前检查项。
44

55
## 目标
66

7-
Keylo 在生产环境中承担统一认证中心职责,因此部署目标不是能启动,而是:
7+
Keylo 在生产环境中承担统一认证中心职责,因此部署目标不是"能启动",而是:
88

99
- 使用显式提供的 RSA 密钥对签发 JWT
1010
- 通过 JWKS 暴露公开验签密钥
1111
- 提供用户与服务 Token 内省能力
1212
- 使用 PostgreSQL 持久化认证状态
13-
- 可选接入 Redis 支持分布式限流、登录锁定和 OAuth state 管理
13+
- **(1.1.0 起生产环境强制)** 接入 Redis 支持分布式限流、登录锁定和 OAuth state 管理
1414

1515
## 必要配置
1616

@@ -23,6 +23,7 @@ JWT_KEY_ID=keylo-rs256-1
2323
JWT_PRIVATE_KEY_PATH=/app/keys/private.pem
2424
JWT_PUBLIC_KEY_PATH=/app/keys/public.pem
2525
DATABASE_URL=postgres://keylo_user:keylo_password@postgres:5432/keylo
26+
DB_POOL_SIZE=20
2627
ADMIN_CLIENT_ID=cli-admin-root
2728
ADMIN_CLIENT_SECRET=replace-with-strong-admin-secret
2829
REDIS_URL=redis://redis:6379
@@ -33,8 +34,10 @@ RUST_LOG=keylo=info,axum=info
3334

3435
- 生产环境禁止使用内置开发密钥。
3536
- 生产环境要求显式提供管理客户端。
36-
- 生产环境要求显式提供 Redis。
37+
- **1.1.0 起生产环境 Redis 为强制依赖**:若 Redis 不可用,限流中间件将拒绝请求,服务不会降级为内存限流。
38+
- `DB_POOL_SIZE` 控制数据库连接池大小,生产环境建议根据并发量设置(默认 5)。
3739
- 如果数据库初始化失败,服务会直接失败启动,不再回退到内存模式。
40+
- 客户端密钥(`client_secret`)存储为 bcrypt 哈希;从 1.0.x 升级时需重置所有客户端密钥。
3841

3942
## RSA 密钥要求
4043

docs/RELEASE_1_0.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ Keylo 1.0 明确不再推荐共享 JWT 签名密钥模式,而是以以下方
6363

6464
以下内容不阻塞 1.0 发布,但属于 1.x 后续增强:
6565

66+
- 客户端密钥 bcrypt 哈希存储 → **已在 1.1.0 完成**
67+
- 生产环境强制 Redis 限流 → **已在 1.1.0 完成**
68+
- 密码复杂度策略 → **已在 1.1.0 完成**
69+
- OAuth state 原子消费(GETDEL)→ **已在 1.1.0 完成**
70+
- 服务 Token audience 严格校验 → **已在 1.1.0 完成**
71+
- 数据库连接池可配置 → **已在 1.1.0 完成**
6672
- 多把 RSA 密钥并行发布
6773
- 自动密钥轮换流程
6874
- 更细粒度的健康检查与 readiness 探针

docs/RELEASE_1_1.md

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
# Keylo 1.1.0 发布说明
2+
3+
发布日期:2026年4月
4+
5+
## 版本定位
6+
7+
Keylo 1.1.0 是 1.0 正式发布后的第一个安全增强版本,重点方向是**生产安全加固****配置灵活性提升****代码健壮性改善**。本版本不引入破坏性 API 变更,可直接平滑升级。
8+
9+
---
10+
11+
## 主要改进
12+
13+
### 🔐 安全加固
14+
15+
#### 客户端密钥 bcrypt 哈希存储
16+
客户端密钥(`client_secret`)不再以明文形式存储于数据库,改为 bcrypt 哈希。即使数据库泄露,攻击者也无法直接获取有效密钥。
17+
18+
**升级注意**:现有客户端需重置密钥,新密钥将以哈希形式存储。
19+
20+
#### 生产环境强制 Redis 限流
21+
`ENVIRONMENT=production` 时,若 Redis 不可用,限流中间件将拒绝请求,而不再降级为内存模式。这防止了 Redis 故障时限流保护静默失效的风险。
22+
23+
#### 密码复杂度策略
24+
注册和修改密码接口现在强制要求密码同时包含:
25+
- 至少一个大写字母
26+
- 至少一个小写字母
27+
- 至少一个数字
28+
- 至少一个特殊字符(如 `!@#$%^&*`
29+
30+
#### OAuth state 原子消费(GETDEL)
31+
OAuth 回调中的 state 验证改为原子 `GETDEL` 操作,消除了读取和删除之间的 TOCTOU 竞态条件,防止 state 被重放利用。
32+
33+
#### 服务 Token audience 严格校验
34+
服务 Token 的 `aud` 字段现在在 JWT 层强制验证,不再仅依赖业务层检查,确保服务 Token 不会被跨服务滥用。
35+
36+
#### OAuth 提供商 URL 强制 HTTPS
37+
注册 OAuth 提供商时,`authorization_url``token_url` 等端点 URL 必须使用 HTTPS scheme,拒绝 HTTP 配置。
38+
39+
#### X-Forwarded-For / X-Real-IP 校验
40+
`X-Forwarded-For``X-Real-IP` 请求头中的 IP 地址进行合法性验证,防止伪造 IP 绕过限流。
41+
42+
#### CORS 严格来源策略
43+
添加 CORS 中间件,按配置的白名单策略控制跨域请求,默认拒绝未授权来源。
44+
45+
#### auth_introspect IP 级限流
46+
`/v1/auth/introspect` 端点新增基于 IP 的独立限流,防止批量枚举 Token 有效性。
47+
48+
---
49+
50+
### ⚙️ 配置增强
51+
52+
#### 数据库连接池大小可配置
53+
新增 `DB_POOL_SIZE` 环境变量,允许按部署规模调整数据库连接池大小。
54+
55+
```env
56+
DB_POOL_SIZE=20
57+
```
58+
59+
默认值:`5`(开发环境);生产环境建议根据负载调整。
60+
61+
---
62+
63+
### 🛡️ 代码健壮性
64+
65+
#### 消除 `panic!` 调用
66+
`main.rs``state.rs` 中遗留的 `panic!` 调用替换为正确的错误传播(`?``Result`),避免服务在异常情况下直接崩溃。
67+
68+
#### 第三方导入批次大小限制
69+
`/v1/admin/users/migrations/import` 接口新增批次大小上限校验,防止超大批次请求造成服务压力。
70+
71+
---
72+
73+
## 新增环境变量
74+
75+
| 变量 | 说明 | 默认值 |
76+
|------|------|------|
77+
| `DB_POOL_SIZE` | 数据库连接池大小 | `5` |
78+
79+
---
80+
81+
## 升级指南
82+
83+
### 从 1.0.x 升级
84+
85+
1. **更新服务镜像**`v1.1.0`
86+
2. **重置客户端密钥**:由于密钥存储格式从明文改为 bcrypt 哈希,需通过管理接口重新设置所有客户端的 `client_secret`,或在数据库中使用 bcrypt 哈希值手动更新。
87+
3. **确认 Redis 可用性**:生产环境若之前 Redis 偶尔不可用而服务仍正常运行,1.1.0 起将返回错误。确保 Redis 在生产环境中稳定运行。
88+
4. **可选**:按需配置 `DB_POOL_SIZE`
89+
5. 重启服务,数据库迁移将自动执行。
90+
91+
---
92+
93+
## 兼容性说明
94+
95+
- API 接口无破坏性变更,客户端无需修改调用方式。
96+
- 密码复杂度新规则仅在注册和修改密码时触发,**不影响现有用户登录**
97+
- `DB_POOL_SIZE` 为可选配置,不设置时行为与 1.0.x 一致。
98+
99+
---
100+
101+
## 1.1.0 已知限制(延续自 1.0)
102+
103+
以下内容不阻塞 1.1.0 发布,计划在后续版本中完善:
104+
105+
- 不支持多把 RSA 密钥并行发布(双 key 平滑过渡)
106+
- 不支持自动密钥轮换流程
107+
- JWKS 缓存刷新依赖下游系统主动拉取

0 commit comments

Comments
 (0)