一、Keystone介绍
Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证、服务规则和服务令牌的功能, 它实现了OpenStack的Identity API。Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。
Keystone主要功能:
-
管理用户及其权限;
-
维护OpenStack Services的Endpoint;
-
Authentication(认证)和Authorization(授权)。
二、Keystone主要组件
1、Server
提供一个RESTful的接口,接收用户的请求并对其进行认证以及授权。
2、Drivers
这个已经默认集成到Server中了,主要从后端存储获取用户的身份信息,比如从数据库或者LDAP中获取。
3、Modules
中间件模块运行在会用到Keystone服务的其他的OpenStack的组件的空间中,这些模块拦截服务请求,提取用户凭据,并将它们发送到Server进行授权。使用Python WEB接口来整合中间件模块和OpenStack其他组件的通信,比如这些模块可以运行在镜像服务的空间中,也可以运行在计算服务的空间中。
三、Keystone的重要概念
1、User(用户)
User指代任何使用OpenStack的实体,可以是真正的用户,其他系统或者服务。当User请求访问OpenStack时,Keystone会对其进行验证。
Horizon在Identity->Users管理User,除了admin和demo,OpenStack也为nova、cinder、glance、neutron服务创建了相应的User,admin也可以管理这些User。
2、Group(组)
组是表示用户集合的容器。
3、Credentials(证书)
Credentials是User用来证明自己身份的信息,可以是:
-
用户名/密码
-
Token
-
API Key
-
其他高级方式
4、Authentication(认证)
Authentication是Keystone验证User身份的过程。
User访问OpenStack时向Keystone提交用户名和密码形式的Credentials,Keystone验证通过后会给User签发一个Token作为后续访问的Credential。
5、Token(令牌)
用户从Keystone那里获取的令牌,用于访问其他服务和资源的凭证,每个令牌都有一个访问范围,允许访问OpenStack范围内的服务资源。
6、Project(项目)
Project 用于将 OpenStack 的资源(计算、存储和网络)进行分组和隔离。
根据OpenStack服务的对象不同,Project可以是一个客户(公有云,也叫租户)、部门或者项目组(私有云)。
这里请注意:
-
资源的所有权是属于Project的,而不是User。
-
在OpenStack的界面和文档中,Tenant/Project/Account 这几个术语是通用的,但长期看会倾向使用Project。
-
每个User(包括 admin)必须挂在Project里才能访问该Project的资源。 一个User可以属于多个 Project。
-
admin相当于root用户,具有最高权限。
Horizon在Identity->Projects中管理 Project,可以在project中调整用户。
7、Service(服务)
OpenStack的Service包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。
每个Service都会提供若干个Endpoint,User通过Endpoint访问资源和执行操作。
8、Endpoint(访问端点)
Endpoint是一个网络上可访问的地址,通常是一个URL,Service通过Endpoint 暴露自己的API,Keystone负责管理和维护每个Service的Endpoint。
9、Role(角色)
个性化的用户可以执行一组特定的操作,角色包括一组权利和特权,如果用户担当某一角色,就可以继承角色的权利和特权。
在Keystone服务中,发放的令牌(Token)决定了用户的角色,包括一系列的权限,用户调用的服务诠释了用户的角色具体操作权利,即哪些操作可以,哪些操作不可以。
Horizon 的菜单为 Identity->Project->Manage Members,可以为用户分配一个或多个role。
10、Domain
域是项目、用户和组的高级容器,每个都由一个域拥有。每个域定义一个名称空间,其中API可见名称属性存在。Keystone图提供了一个默认域名,称为“Default”。
11、举个例子:
User | 住宾馆的人 |
Credentials | 开启房间的钥匙 |
Authentication | 宾馆为了拒绝不必要的人进出宾馆,专门设置的机制,只有拥有钥匙的人才能进出 |
Token | 也是一种钥匙,有点特别 |
Project | 宾馆 |
Service | 宾馆可以提供的服务类别,比如,饮食类,娱乐类 |
Endpoint | 具体的一种服务,比如吃烧烤,打羽毛球 |
Role | VIP 等级,VIP越高,享有越高的权限 |
四、管理介绍
1、用户管理
用户身份管理有以下三个主要概念:
-
用户
-
项目
-
角色
这里的用户代表一个真实的人类用户,并有一些列相关信息,如用户名、密码、电子邮件等。
一个用户可以在一个项目中担任多种角色,不同的角色有不同的权限,细化用户角色的权限,也是一门值得探讨的学问。
在/etc/[SERVICE_CODENAME]/policy.json中,控制用户可以对指定服务进行哪些操作。例如,/etc/nova/policy.json中,指定计算服务的访问策略;在/etc/glance/policy.json中,指定镜像服务 的访问策略;在/etc/keystone/policy.json中,指定身份服务的访问策略等。
在Noav、Glance、Keystone的默认policy.json中,访问策略默认只有admin角色,所有不需要admin操作的访问,将由项目中的任何用户、任何角色来完成。
2、服务管理
服务管理有两个主要概念:
-
服务
-
访问端点
五、Keystone在OpenStack中的访问流程
1) 用户携带证书或密码进行Keystone认证。
2) Keystone认证通过后返回Token,此Token带有角色限制。
3) 通过Token向Keystone获取服务访问目录。
4) Keystone返回服务访问目录。
5) 携带Token进行虚拟机创建,将指令传递给nova-api。
6) Nova向Keystone验证Token。
7) Nova携带Token访问Glance,这里也需要Keystone验证Token。
8) Glance返回镜像。
9) Nova携带Token,向Neutron请求虚拟机网卡VIF设置参数。
10) Neutron向Keystone验证Token。
11) Nova携带Token验证VIF是否可以访问。
12) Neutron返回成功的信息给Nova。
13) Nova返回创建成功的信息给用户。
14) 虚拟机创建成功。
六、Keystone的身份验证流程案例
-
用户Alice通过自己的户名和密码向keystone申请token,keystone认证用户名和密码后,返回临时token;
-
Alice通过临时token发送keystone查询他所拥有的租户,keystone验证临时token成功后,返回Alice的所有租户列表;
-
Alice选择一个租户,通过用户名和密码申请正式token,keystone认证用户名、密码、tenant后,返回正式token;
-
Alice通过正式token发送创建server的请求,keystone验证正式token(包括该token是否有效,是否有权限创建虚拟机等)成功后,然后再把请求下发到nova,最终创建虚拟机。
附录:一些解释
Fernet Tokens是K版本的更新内容,区别于UUID tokens只能持久化存入数据库,Fernet tokens完全不需要持久化。部署人员可以通过设置keystone.conf中的[token] provider = keystone来启用Fernet token。
Fernet Tokens需要symmetric encryption keys(对称加密密钥),这些keys可以使用keystone-manage fernet_setup建立, 并且使用keystone-manage fernet_rotate周期性地轮换。这些keys必须被在一个multi-node(或者multi-region)部署中的所有Keystone nodes共享,这样就能使一个node生成的tokens可以立即被其他节点验证。