OpenStack Keystone详解

发表于
更新于
3 3.4~4.3 分钟 1512

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管理员专用

认证流程详解

                  ┌─────────────────────────────────────────────┐
                  │               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  │                                 │
│  │(端点注册)│  │(授权引擎)│                                 │
│  └──────────┘  └──────────┘                                 │
└─────────────────────────────────────────────────────────────┘
内部服务 管理实体 职责
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操作速查 🛠️

# 🔹 认证测试
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 校验来保障。🛡️


0
上一篇 OpenStack Heat(编排)详解
下一篇 OpenStack Ceilometer(监控计量)详解