OpenStack Keystone详解

Keystone角色定位

Keystone是OpenStack云平台的身份认证核心组件,作为整个平台的"统一门卫"🔐。用户访问任何服务(Nova计算、Glance镜像、Cinder块存储等)都必须先通过Keystone认证。Keystone一旦宕机,所有服务都将瘫痪。


六大核心概念

概念说明关键约束
User访问OpenStack的个人或服务账户用户名在所属Domain内唯一
Project资源(计算/存储/网络)的容器(V2时代称Tenant)项目名在所属Domain内唯一
Role权限集合,决定User对Project资源的操作级别全局唯一名称
Domain顶层虚拟容器,包含Users/Groups/ProjectsDomain Name全局唯一
Endpoint服务可访问的网络地址(URL)三类接口:Public / Internal / Admin
Token认证通过后签发的身份凭证字符串有时效性(默认1h),可撤销

关键解读 📌:

  • User权限通过"User + Project + Role"三元组定义,缺一不可
  • Domain提供多租户隔离边界,不同部门可划分独立Domain
  • 三类Endpoint:Public面向外部用户 / Internal服务间通信 / Admin管理员专用

认证流程详解

                  ┌─────────────────────────────────────────────┐
                  │               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 + passwordAPI Key
返回Unscoped Token仅证明身份,不含Service Catalog和Role,不可直接访问服务
请求Scoped Token指定Scope(projectdomain),绑定到具体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内部架构

六大内部服务

┌─────────────────────────────────────────────────────────────┐
│                      Keystone 服务架构                       │
│                                                             │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐   │
│  │ Identity │  │ Resource │  │Assigment │  │  Token   │   │
│  │ Service  │  │ Service  │  │ Service  │  │ Service  │   │
│  │ (用户/组) │  │ (项目/域) │  │ (角色分配)│  │ (Token)  │   │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘   │
│                                                             │
│  ┌──────────┐  ┌──────────┐                                 │
│  │ Catalog  │  │  Policy  │                                 │
│  │ Service  │  │ Service  │                                 │
│  │(端点注册)│  │(授权引擎)│                                 │
│  └──────────┘  └──────────┘                                 │
└─────────────────────────────────────────────────────────────┘
内部服务管理实体职责
IdentityUsers、Groups身份凭据验证(支持SQL / LDAP / AD / 联合认证)
ResourceProjects、Domains资源容器管理
AssignmentRoles、Role Assignments角色CRUD及User-Project-Role映射
TokenTokensToken签发、验证、撤销
CatalogServices、Endpoints服务注册与端点发现
PolicyPolicies、Rules基于规则的授权引擎

认证后端选项

后端模式适用场景
SQL读写默认,Keystone管理全部身份
LDAP / AD只读(推荐)对接企业已有目录服务
SAML 2.0 / OpenID Connect联合与外部IdP(Okta、Azure AD、ADFS)集成
Keystone-to-Keystone联合多OpenStack云联邦信任

CLI操作速查 🛠️

# 🔹 认证测试
openstack token issue
#                      └─ 请求并签发一个新的 Scoped Token,验证当前认证凭据是否有效

# 🔹 服务发现
openstack catalog list
#                      └─ 列出所有已注册服务的 Endpoint(Public / Internal / Admin)

# 🔹 用户管理
openstack user create --domain DEFAULT --password <PASSWORD> <USERNAME>
#                      ├─ --domain 指定用户所属的域(若不指定则使用 default 域)
#                      ├─ --password 设置用户登录密码
#                      └─ <USERNAME> 用户名,在所属域内唯一
openstack user list
#                      └─ 列出当前域下所有用户(可加 --domain 指定目标域)
openstack user show <USER_ID>
#                      └─ 查看指定用户的完整信息(含 ID、Domain、启用状态等)

# 🔹 项目管理
openstack project create --domain DEFAULT <PROJECT>
#                      ├─ --domain 指定项目所属的域
#                      └─ <PROJECT> 项目名称,在所属域内唯一
openstack project list
#                      └─ 列出所有项目及其所属域

# 🔹 角色分配(核心:User + Project + Role)
openstack role add --user <USER> --project <PROJECT> <ROLE>
#                      ├─ --user 指定目标用户
#                      ├─ --project 指定目标项目
#                      └─ <ROLE> 要分配的角色名(如 admin、member、reader)
openstack role assignment list --names --user <USER>
#                      ├─ --names 以名称而非 ID 形式显示(更易读)
#                      └─ --user 筛选指定用户的角色分配列表

# 🔹 域管理
openstack domain list
#                      └─ 列出所有域及其启用/禁用状态
openstack domain create <DOMAIN>
#                      └─ 创建一个新域(Domain Name 全局唯一)
openstack domain set --disable <DOMAIN>
#                      ├─ --disable 将域设为禁用状态(删除域的前置条件)
#                      └─ 域被禁用后,其下的 User 和 Project 也将无法使用
openstack domain delete <DOMAIN>
#                      └─ 删除指定域(必须先禁用)

# 🔹 端点管理
openstack endpoint list
#                      └─ 列出所有服务的 Endpoint(含服务类型、区域、URL)
openstack endpoint create --region <REGION> <SERVICE> <TYPE> <URL>
#                      ├─ --region 指定区域(如 RegionOne)
#                      ├─ <SERVICE>  服务名称(如 nova、glance)
#                      ├─ <TYPE>     端点类型(public / internal / admin)
#                      └─ <URL>      端点访问地址(如 https://controller:8774/v2.1)

生产安全配置 🔒

配置项说明
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校验来保障。🛡️

🔗 相关文档

OpenStack Keystone认证服务概念 | OpenStack Nova计算服务详解 | OpenStack Swift对象存储详解 | OpenStack Neutron网络服务详解 | INI 文件格式概述