目录
Keystone身份认证服务
一.Keystone简介
Keystone(OpenStack Identity Service)是 OpenStack 框架中负责管理身份验证、服务规则和服务令牌功能的模块。用户访问资源需要验证用户的身份与权限,服务执行操作也需要进行权限检测,这些都需要通过 Keystone 来处理。Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。
二.Keystone主要功能
- 身份认证(Authentication) :令牌的发放和校验
- 用户授权(Authorization):授予用户在一个服务中所拥有权限
- 用户管理(Account):管理用户账户
- 服务目录(Service Catalog) :提供可用服务的API端点
三.Keystone管理对象概念
1.user
User即用户,指的是使用openstack service的用户,可以是人,服务,系统,就是说只要是访问openstack service 的对象都可以称为User
2.Credentials
是用于确认用户身份的凭证。可以是:用户名和密码、用户名跟API Kye(秘钥)、一个keystone分配的身份的token、用户第一次确认身份的方法、用户已经确认身份后的方法 (token是有时间限制的)
3.Authentication
用户身份验证的过程。keystone服务通过检查用户的Credentials来确定用户的身份
第一次验证身份是使用用户名与密码或者用户名与API Key的形式。当用户的Credentials被验证后,keystone会给用户分配一个Authentication token 供该用户的后续请求操作(返回的token中就包含User的Role列表)
4.Token
是一串数字字符串,当用户访问资源时需要使用的东西,在keystone中主要是引入令牌机制来保护用户对资源的访问,同时引入PKI、PKIZ、fernet、UUID其中一个随机加密产生一串数字,对令牌加以保护
token并不是长久有效的,是有时效性的,在有效的时间内可以访问资源。
5.Role
本身是一堆ACL集合,主要用于权限的划分。
可以给User指定Role,是user获得role对应的操作权限。
系统默认使用管理Role的角色 管理员用户:admin 普通用户:member(老版本) user(新版本)
user验证的时候必须带有Project。老版本叫(Tenant)
6.Project(Tenant)
Project(Tenant)是一个人或服务所拥有的资源集合。不同的Project之间资源是隔离的,资源可以设置配额
Project(Tenant)中可以有多个User,每一个User会根据权限的划分来使用Project(Tenant)中的资源
User在使用Project(Tenant)的资源前,必须要与这个Project关联,并且制定User在Project下的Role,一个assignment(关联) 即:Project-User-Role
8.Service
即服务,如Nova,Glace,等各个组件
9.Endpoint
用来通过访问和定位某个openstack service的地址,通常是一个URL不同的region有不同的Endpoint(region使 用与跨地域的云服务,比如像阿里云有华北,华东等等,)
任何服务都访问openstack service中的资源时,都要访问keystone
Endpoint分为三类:
- admin url —>管理员用户使用 Port:35357
- internal url —>openstack内部组件间互相通信 Port:5000 (组件之间通信基于Restful api)
- public url —> 其他用户访问地址 Port:5000
五.Keystone工作流程
- User从Keystone获取令牌以及服务列表,User访问服务时,亮出自己的令牌,相关的服务向Keystone求证令牌的合法性。
- 用户alice登录keystone系统(password或者token的方式),获取一个临时的token和catalog服务目录(v3版本登录时,如果没有指定scope,project或者domain,获取的临时token没有任何权限,不能查询project或者catalog)。
- alice通过临时token获取自己的所有的project列表。
- alice选定一个project,然后指定project重新登录,获取一个正式的token,同时获得服务列表的endpoint,用户选定一个endpoint,在HTTP消息头中携带token,然后发送请求(如果用户知道project name或者project id可以直接第3步登录)。
- 消息到达endpoint之后,由服务端(nova)的keystone中间件(pipeline中的filter:authtoken)向keystone发送一个验证token的请求。(token类型:uuid需要在keystone验证token,pki类型的token本身是包含用户详细信息的加密串,可以在服务端完成验证)
- keystone验证token成功之后,将token对应用户的详细信息,例如:role,username,userid等,返回给服务端(nova)。
- 服务端(nova)完成请求,例如:创建虚拟机。
- 服务端返回请求结果给alice。