OpenStack Keystone详解
Keystone角色定位
Keystone是OpenStack云平台的身份认证核心组件,作为整个平台的”统一门卫”🔐。用户访问任何服务(Nova计算、Glance镜像、Cinder块存储等)都必须先通过Keystone认证。Keystone一旦宕机,所有服务都将瘫痪。
六大核心概念
| 概念 |
说明 |
关键约束 |
| User |
访问OpenStack的个人或服务账户 |
用户名在所属Domain内唯一 |
| Project |
资源(计算/存储/网络)的容器(V2时代称Tenant) |
项目名在所属Domain内唯一 |
| Role |
权限集合,决定User对Project资源的操作级别 |
全局唯一名称 |
| Domain |
顶层虚拟容器,包含Users/Groups/Projects |
Domain Name全局唯一 |
| Endpoint |
服务可访问的网络地址(URL) |
三类接口:Public / Internal / Admin |
| Token |
认证通过后签发的身份凭证字符串 |
有时效性(默认1h),可撤销 |
关键解读 📌:
- User权限通过”User + Project + Role”三元组定义,缺一不可
- Domain提供多租户隔离边界,不同部门可划分独立Domain
- 三类Endpoint:Public面向外部用户 / Internal服务间通信 / Admin管理员专用
认证流程详解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ┌─────────────────────────────────────────────┐ │ OpenStack 云平台 │ │ │ ┌───────┐ ① POST /v3/auth/tokens ┌──────────┐ ⑥ Token ┌─────────┐ │ │ ──────────────────────────────→ │ │ ←──验证请求──→ │ │ │ │ ② ← 返回 Unscoped Token │ Keystone │ │ Nova │ │ 用户 │ │ (认证) │ ⑦ ← 返回 │ (计算) │ │ │ ③ POST /v3/auth/tokens │ │ 用户信息 │ │ │ │ ─────────── (带 Scope) ────────→ │ │ ─────────────→ │ │ │ │ └──────────┘ └─────────┘ │ │ ④ ← 返回 Scoped Token + ┌─────────┐ │ │ Service Catalog + Roles │ Glance │ │ │ │ (镜像) │ │ │ ⑤ Nova API 调用 │ │ │ │ ──────── X-Auth-Token: <SCOPED_TOKEN> ─────────────────→ │ │ └───────┘ └─────────┘
|
标准V3认证流程(七步)
| 步骤 |
动作 |
说明 |
| ① |
用户提交凭证 |
POST /v3/auth/tokens — 携带 username + password 或 API Key |
| ② |
返回Unscoped Token |
仅证明身份,不含Service Catalog和Role,不可直接访问服务 |
| ③ |
请求Scoped Token |
指定Scope(project或domain),绑定到具体Project/Domain |
| ④ |
返回Scoped Token |
附带完整Service Catalog(所有服务地址)+ Roles(当前Project权限) |
| ⑤ |
访问目标服务 |
Scoped Token放入HTTP头 X-Auth-Token 请求Nova/Glance等服务 |
| ⑥ |
服务验证Token |
通过keystonemiddleware中间件向Keystone校验Token有效性 |
| ⑦ |
返回用户上下文 |
Keystone返回User ID、Project ID、Roles,服务据此执行策略鉴权 |
Token类型演进 🚀
| 类型 |
存储方式 |
验证方式 |
状态 |
| UUID |
持久化到数据库 |
每次查询数据库 |
❌ 已弃用 |
| Fernet |
不持久化 |
本地加密验证(需Keystone在线) |
✅ 生产默认 |
| PKI / PKIZ |
不持久化 |
本地证书签名验证 |
❌ 已弃用 |
| JWS |
不持久化 |
非对称签名验证 |
⚠️ 可选 |
Token作用域对比
| 作用域 |
含Service Catalog? |
含Roles? |
适用场景 |
| Unscoped |
❌ |
❌ |
仅证明身份,获取Scoped Token的前置步骤 |
| Project-scoped |
✅ |
✅ |
日常操作(最常用) |
| Domain-scoped |
部分 |
✅ |
Domain级别管理操作 |
Keystone内部架构
六大内部服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ┌─────────────────────────────────────────────────────────────┐ │ Keystone 服务架构 │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Identity │ │ Resource │ │Assigment │ │ Token │ │ │ │ Service │ │ Service │ │ Service │ │ Service │ │ │ │ (用户/组) │ │ (项目/域) │ │ (角色分配)│ │ (Token) │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ ┌──────────┐ ┌──────────┐ │ │ │ Catalog │ │ Policy │ │ │ │ Service │ │ Service │ │ │ │(端点注册)│ │(授权引擎)│ │ │ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────┘
|
| 内部服务 |
管理实体 |
职责 |
| Identity |
Users、Groups |
身份凭据验证(支持SQL / LDAP / AD / 联合认证) |
| Resource |
Projects、Domains |
资源容器管理 |
| Assignment |
Roles、Role Assignments |
角色CRUD及User-Project-Role映射 |
| Token |
Tokens |
Token签发、验证、撤销 |
| Catalog |
Services、Endpoints |
服务注册与端点发现 |
| Policy |
Policies、Rules |
基于规则的授权引擎 |
认证后端选项
| 后端 |
模式 |
适用场景 |
| SQL |
读写 |
默认,Keystone管理全部身份 |
| LDAP / AD |
只读(推荐) |
对接企业已有目录服务 |
| SAML 2.0 / OpenID Connect |
联合 |
与外部IdP(Okta、Azure AD、ADFS)集成 |
| Keystone-to-Keystone |
联合 |
多OpenStack云联邦信任 |
CLI操作速查 🛠️
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| openstack token issue
openstack catalog list
openstack user create --domain DEFAULT --password <PASSWORD> <USERNAME>
openstack user list
openstack user show <USER_ID>
openstack project create --domain DEFAULT <PROJECT>
openstack project list
openstack role add --user <USER> --project <PROJECT> <ROLE>
openstack role assignment list --names --user <USER>
openstack domain list
openstack domain create <DOMAIN>
openstack domain set --disable <DOMAIN>
openstack domain delete <DOMAIN>
openstack endpoint list
openstack endpoint create --region <REGION> <SERVICE> <TYPE> <URL>
|
生产安全配置 🔒
| 配置项 |
说明 |
KeystonePasswordRegex |
密码强度正则表达式 |
KeystonePasswordExpiresDays |
密码有效期天数 |
KeystoneLockoutFailureAttempts |
锁定前允许的失败认证次数 |
KeystoneDisableUserAccountDaysInactive |
不活跃自动禁用天数 |
KeystoneUniqueLastPasswordCount |
防止重用旧密码 |
KeystoneChangePasswordUponFirstUse |
首次登录强制改密 |
生产部署建议 ✅
- Fernet密钥至少每月轮换一次(
keystone-manage fernet_rotate— 重新生成 Fernet 密钥库,旧 Token 在缓存失效前仍可用)
- 部署多控制器节点 + 负载均衡实现Keystone高可用
- 禁用
admin_token(避免无需认证的管理入口)
- 监控日志:
/var/log/keystone/keystone.log
- 所有服务间通信建议使用Internal Endpoint,避免暴露Public API
一句话总结
Keystone是OpenStack的统一身份验证 + 服务发现中心,核心工作流为:凭据 → Token → Service Catalog → 服务访问。用户的Token就是云平台的”通行证”,服务间信任通过Keystone的Token校验来保障。🛡️