openstack云计算keystone组件工作介绍


Posted in Servers onApril 20, 2022

一 什么是keystone

keystone是OpenStack的身份服务,暂且可以理解为一个'与权限有关'的组件。

二 为何要有keystone

Keystone项目的主要目的是为访问openstack的各个组件(nova,cinder,glance...)提供一个统一的验证方式,具体的:

openstack是由众多组件构成的一套系统,该系统的功能是对外提供服务,因而我们可以将其定义为一个‘庞大的软件’,没有软件不考虑安全因素,Keystone对于通常的应用场景所不同的是他要解决分布式环境下的统一认证。

三 keystone的功能

openstack是一个SOA架构,理论上各子项目独立提供相关服务,互不依赖,且是分布式的。如nova提供计算服务,glance提供镜像服务等。

实际上所有的组件都依赖keystone(单点的),它集成了三个功能:

(1)管理身份验证(managing authentication):验证用户身份

  (2) 授权(authorization):基于角色role的权限管理

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

四 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 user(过去的普通用户角色是:_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

Catalog

用户和服务可以使用使用keystone管理的catalog,定位到其他的服务,catalog一个openstack部署的相关服务的集合,每个服务都有一个或者多个endpoint(即可以访问的url地址),即catalog=services+endpoint。每个endpoint可以分为三种类型:

admin,internal,public,在生产环境中,不同endpoint类型位于不同的网络来为不同的用户使用(提高安全性),比如:

public API:对整个互联网可见,这样客户就可以方便的管理自己的云了。

admin API:应该严格限定只有管理云基础设施的组织内的运营商,才能使用该API

internel API:应该被限定只有那些安装有OpenStack服务的主机,才能使用该API

Service与Endpoint关系介绍:

  • 在openstack中,每一个service都有三种endpoint. Admin, public, internal(创建完service后需要为其创建API EndPoint. )
  • Admin是用作管理用途的,如它能够修改user/tenant(project)。
  • public 是让客户调用的,比如可以部署在外网上让客户可以管理自己的云。
  • internal是openstack内部调用的。
  • 三种endpoints 在网络上开放的权限一般也不同。Admin通常只能对内网开放,public通常可以对外网开放,internal通常只能对安装有openstack对服务的机器开放。

endpoint举例

我们使用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 去访问另一个资源。

Regions

openstack支持多个可扩展的regions,OpenStack的支持可扩展的多个区域。为简单起见,一般使用管理网络ip地址作为所有endpoint类型(三种api)的ip,且所有的endpoint类型(三种api)都使用一个区域,即regionone区。

每个你部署的openstack服务都需要绑定endpoint(存储在keystone中)来提供服一个服务的入口,因而我们第一需要部署的组件就是keystone。

V3新增的概念:

  • Tenant 重命名为 Project
  • 添加了 Domain 的概念
  • 添加了 Group 的概念

第二部分

keystone管理和保存了user信息,管理user相关的tenant,role,group和domain等;用户credential的存放,验证,token管理,下图是各部分关系

openstack云计算keystone组件工作介绍

第三部分

User: has account credentials, is associated with one or more projects or domains

Group: a collection of users, is associated with one or more projects or domains

Project: unit of ownership in OpenStack, contains one or more users

Domain: unit of ownership in OpenStack, contains users, groups and projects

Role: a first-class piece of metadata associated with many user-project pairs.

Token: identifying credential associated with a user or user and project

Extras: bucket of key-value metadata associated with a user-project pair.

Rule: describes a set of requirements for performing an action.

openstack云计算keystone组件工作介绍

注意:user2,user3,user4的关系同user1一样,也可以属于一个或者多个group,此处为了图示简洁,省去了它们的连线

openstack云计算keystone组件工作介绍

五 keystone内包含的组件

keystone包含三类组件:

1 Server

使用RESTful接口(三种api)提供认证和授权服务的集中式server

2 Drivers

指的是被集成到server内的驱动或者服务后端,它们被用来在openstack组件之外的库中访问身份信息(言外之意:mysql并不属于openstack的组件/服务),并可能已经存在于openstack部署的架构中(比如, SQL databases or LDAP servers).

3 Modules

中间件运行在正在使用认证服务的openstack组件的地址空间,这些模块(中间件)拦截服务请求,提取用户的credentials,并且把它们发送给server去认证授权,在openstack中间件与openstack组件直接的整合操作使用Python Web Server Gateway Interface,即wsgi,详见http://www.cnblogs.com/linhaifeng/p/6268615.html

六 keystone与openstack其他服务的关系 

openstack云计算keystone组件工作介绍

七 keystone与其他组件协同工作流程

keystone是用户与云平台交互的第一个服务,一旦认证通过,用户就会使用自己的身份来访问其他的opnestack服务,同样,被访问的openstack服务会去跟keystone再次确认用户(不能只能用户的片面之词)并且通过keystone可以发现其他服务(catalog的原因),keystone的还可以整合其他的用户管理系统,比如LDAP

openstack云计算keystone组件工作介绍

八 keystone工作流程详解

(1) User从Keystone获取令牌以及服务列表;

(2) User访问服务时,亮出自己的令牌。

(3)相关的服务向Keystone求证令牌的合法性。

openstack云计算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。

以上就是openstack云计算keystone组件工作流程及服务关系的详细内容!

Servers 相关文章推荐
本地通过nginx配置反向代理的全过程记录
Mar 31 Servers
Apache Linkis 中间件架构及快速安装步骤
Mar 16 Servers
Kubernetes中Deployment的升级与回滚
Apr 01 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
微信告警的zabbix监控系统 监控整个NGINX集群
Apr 18 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
详解如何使用Nginx解决跨域问题
May 06 Servers
Apache SeaTunnel实现 非CDC数据抽取
May 20 Servers
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
Jun 01 Servers
shell进度条追踪指令执行时间的场景分析
Jun 16 Servers
详解ZABBIX监控ESXI主机的问题
Jun 21 Servers
Apache自带的ab压力测试工具的实现
Jul 23 Servers
Tomcat项目启动失败的原因和解决办法
Apr 20 #Servers
Tomcat执行startup.bat出现闪退的原因及解决办法
Tomcat starup.bat 脚本实现开机自启动
Apr 20 #Servers
nginx容器方式反向代理实战
微信告警的zabbix监控系统 监控整个NGINX集群
Apr 18 #Servers
nginx配置之并发频次限制
如何通过cmd 连接阿里云服务器
You might like
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
浅谈PHP值mysql操作类
2016/06/29 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
学习面向对象之面向对象的术语
2010/11/30 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
Bootstrap+jfinal实现省市级联下拉菜单
2016/05/30 Javascript
Spring MVC中Ajax实现二级联动的简单实例
2016/07/06 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
Vue.js实现按钮的动态绑定效果及实现代码
2017/08/21 Javascript
js实现音乐播放控制条
2017/09/09 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
使用python编写批量卸载手机中安装的android应用脚本
2014/07/21 Python
Python的Bottle框架中获取制定cookie的教程
2015/04/24 Python
深入理解python try异常处理机制
2016/06/01 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
对Python w和w+权限的区别详解
2019/01/23 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
幼儿园长自我鉴定
2013/10/17 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers