1.什么是keystone

keystone是 OpenStack Identity Service 的项目名称,是一个负责身份管理与授权的组件。
主要功能:实现用户的身份认证,基于角色的权限管理,及openstack其他组件的访问地址和安全策略管理

2.为什么要有keystone

OpenStack是一个庞大的组合,各个组件之间的通讯免不了会有安全风险,keystone就是各个组件之间通讯的安全保障

3.keystone的功能

OpenStack的各个组件理论上是互相独立存在,互不依赖的,但为了安全考虑,所有组件都依赖于keystone

openstack keystone源码 openstack的keystone_openstack

keystone的两个功能:

(1)用户管理:验证用户身份的合法性。

(2)服务目录管理:提供服务目录(ServiceCatalog:包括service和endpoint)服务,类似于UDDI服务的概念,用户(无论是Dashboard, APIClient)都需要访问Keystone获取服务列表,以及每个服务的地址(Openstack中称为Endpoint)

4.keystone概念详解

User:使用Openstack组件的客户端可以是人、服务、系统,任何的客户端来访问openstack组件,都需要有一个用户名。


Credentials:是用于确认用户身份的凭证,说白了就是‘信物’,具体可以是:


用户名和密码


用户名和API key


一个 Keystone 分配的身份token


Authentication:


是验证用户身份的过程。Keystone 服务通过检查用户的 Credential 来确定用户的身份。


最开始,使用用户名/密码或者用户名/API key作为credential。当用户的credential被验证后,Kestone 会给用户分配一个 authentication token 供该用户后续的请求使用。 


Keystone中通过Policy(访问规则)来做到基于用户角色(Role)的访问控制。

Token:
是一个数字字符串,访问资源时需要"亮出"你的令牌。在keystone中主要是引入令牌机制来保护用户对于资源的访问,同时引入PKI(公钥基础实施)对令牌加以保护。
Token包含了在指定范围和有效时间内可以被访问的资源。EG. 在Nova中一个tenant可以是一些虚拟机,在Swift和Glance中一个tenant可以是一些镜像存储,在Network中一个tenant可以是一些网络资源。

Role:
本质就是一堆ACL的集合,用于划分权限
可以通过给User指定Role,使User获得Role对应的操作权限。
Keystone返回给User的Token包含了Role列表,被访问的Services会判断访问它的User和User提供的Token中所包含的Role,及每个role访问资源或者进行操作的权限。
系统默认使用管理Role admin和成员Role _member_ 。
user验证时必须带有Project(Tenant)

Policy:
对于Keystone service来说,Policy就是一个JSON文件,默认是/etc/keystone/policy.json。通过配置这个文件,Keystone实现了对User基于Role的权限管理。
OpenStack对User的验证除了OpenStack的身份验证以外,还需要鉴别User对某个Service是否有访问权限。Policy机制就是用来控制User对Project(Tenant)中资源的操作权限。


Project(Tenant):


是一个人、或服务所拥有的资源集合。不同的Project之间资源是隔离的,资源可以设置配额。


在一个Project(Tenant)中可以包含多个User,每一个User都会根据权限的划分来使用Project(Tenant)中的资源。比如通过Nova创建虚拟机时要指定到某个Project中,在

Cinder创建卷也要指定到某个Project中。


User访问Project的资源前,必须要与该Project关联,并且指定User在Project下的Role,一个assignment(关联)即:Project-User-Role


Service:即Openstack中运行的各个组件服务。

Endpoint:
是一个可以通过网络来访问和定位某个Openstack service的地址,通常是一个URL
不同的region有不同的endpoint(我们可以通过endpoint的region属性去定义多个region)。
当Nova需要访问Glance服务去获取image 时,Nova通过访问Keystone拿到Glance的endpoint,然后通过访问该endpoint去获取Glance服务。
Endpoint 分为三类:
admin url –> 给admin用户使用,Port:35357
internal url –> OpenStack内部服务使用来跟别的服务通信,Port:5000
public url –> 其它用户可以访问的地址,Port:5000


Service与Endpoint关系介绍:


在openstack中,每一个service都有三种endpoint. Admin, public, internal(创建完service后需要为其创建API EndPoint. )


Admin是用作管理用途的,如它能够修改user/tenant(project)。


public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。


internal是openstack内部调用的。


三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放,internal通常只能对安装有openstack对服务的机器开放。


我们使用keystone为服务5d533c68-d234-11e6-a0d7-0088653ea1ec定制endpoint:

$ keystone endpoint-create \
--region RegionOne \
--service-id=5d533c68-d234-11e6-a0d7-0088653ea1ec \
--publicurl='https://public-ip:8776/v1/%(tenant_id)s' \
--internalurl='https://management-ip:8776/v1/%(tenant_id)s' \
--adminurl='https://management-ip:8776/v1/%(tenant_id)s'
然后你可以配置 OpenStack service 使用另一个 service 的 endpoint 的 internalurl 去访问另一个资源。

endpoint举例



了解了上述的那些keystone中一些名词的基本概念后,画张图来说明一下keystone的内部工作流程

  

  比如说,某公司年会组织跟团去旅游(公司相当于一个group,公司的员工相当于User)。到了晚上要住店,首先要先到前台登记(前台就相当于Keystone),对前台(keystone)来说,你要住店要拿出你的证明(对keystone来说就是要证明你是你)。

  怎么办?拿出身份证,这里的身份证就相当于(Credentials中的用户名和密码),前台(keystone)会进行验证你的身份信息(Authentication),验证成功后,前台(Keystone)会给你一个房卡(Credentials中的Token),并且有不同的房卡(比如:普通卡,会员卡,白金卡等),不同的卡有不同的权限(Role),并且拿到房卡后,前台(keystone)会给你一个导航图(Endpoint)让你找到你的房间。并且一个酒店不光会有住宿服务,可能还有别的服务(service),像餐饮,娱乐,按摩等等,比如说要去吃饭,不知道路线怎么走,看一下导航图(endpoint)就知道了,到餐饮部门(service)会有三个路线(Endpoint)可以走。为什么会有三个,领导层通道 --> 走后门(admin),内部员工通道 -->(internal),客人通道  -->(public)。知道如何去,也有了权限(Token/Role)到了餐饮部门,当你点餐的时候,会让你刷上你的会员卡(这个步骤就是service像keystone确认你有没有权限),验证成功后,你就可以点餐吃饭


openstack keystone源码 openstack的keystone_云计算_02


官方介绍:
1.User:has account credentials, is associated with one or more projects or domains
user是账户凭证,是与一个或多个项目或相关的域

2.Group: a collection of users, is associated with one or more projects or domains
group就是用户的一个集合,与一个或多个项目或相关的域

3.Project(Tenant): unit of ownership in OpenStack, contains one or more users
project(tenant)是一个单位,指在openstatck中可用的资源,它包含一个或多个用户

4.Domain:unit of ownership in OpenStack, contains users, groups and projects
domain是一个单位,它包含用户、组和项目

5.Role:a first-class piece of metadata associated with many user-project pairs
role一个用户与project相关联的元素据

6.Token:identifying credential associated with a user or user and project
Token鉴定凭证关联到用户或者用户和项目

7.Extras:bucket of key-value metadata associated with a user-project pair
extras关于用户-项目的关系,还可以设置一些其他的属性

8.Rule:describes a set of requirements for performing an action
rule描述了一组要求 执行一个动作

5.keystone和其他组件之间的关系

不多废话,直接上图

openstack keystone源码 openstack的keystone_云计算_03

6.创建VM的简单工作流程

openstack keystone源码 openstack的keystone_API_04

7.Keystone工作流程官方详解

openstack keystone源码 openstack的keystone_API_05

       1.用户/API 想创建一个实例,首先会将自己的credentials发给keystone。认证成功后,keystone会颁给用户/API一个临时的令牌(Token) 和一个访问服务的Endpoint。 PS:Token没有永久的

    2.用户/API 把临时Token提交给keystone,keystone并返回一个Tenant(Project)

到用户/API  PS:第一个Token是来验证用户/API是否有权限与keystone通信,第二个Token是来验证用户/API是否有权限访问我 keystone的其它服务。用户/API 拿着token和Endpoint找到可访问服务

    4.服务向keystone进行认证,Token是否合法,它允许访问使用该服务(判断用户/API中role权限)?

    5.keystone向服务提供额外的信息。用户/API是允许方法服务,这个Token匹配请求,这个Token是用户/API的

    6.服务执行用户/API发起的请求,创建实例

    7.服务会将状态报告给用户/API。最后返回结果,实例已经创建