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配置proxy_pass中url末尾带/与不带/的区别详解
Mar 31 Servers
Nginx设置HTTPS的方法步骤 443证书配置方法
Mar 21 Servers
深入解析Apache Hudi内核文件标记机制
Mar 31 Servers
阿里云 Windows server 2019 配置FTP
Apr 28 Servers
Nginx的gzip相关介绍
May 11 Servers
Windows server 2022创建创建林、域树、子域的步骤
Jun 25 Servers
Python安装及建立虚拟环境的完整步骤
Jun 25 Servers
Docker部署Mysql8的实现步骤
Jul 07 Servers
Nginx报错104:Connection reset by peer问题的解决及分析
Jul 23 Servers
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
Aug 14 Servers
windows server2012 R2下安装PaddleOCR服务的的详细步骤
Sep 23 Servers
ubuntu端向日葵键盘输入卡顿问题及解决
Dec 24 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
php 更新数据库中断的解决方法
2009/06/05 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
javascript打印大全(打印页面设置/打印预览代码)
2013/03/29 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
jQuery的deferred对象详解
2014/11/12 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
2017/05/03 Javascript
微信小程序 功能函数小结(手机号验证*、密码验证*、获取验证码*)
2017/12/08 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
微信小程序实现联动选择器
2019/02/15 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
pandas分区间,算频率的实例
2019/07/04 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
sealed修饰符是干什么的
2012/10/23 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
结婚典礼证婚词
2014/01/11 职场文书
大学四年个人自我小结
2014/03/05 职场文书
小学数学课题方案
2014/06/15 职场文书
中学生思想品德评语
2014/12/31 职场文书
如何书写邀请函?
2019/06/24 职场文书
Java 将PPT幻灯片转为HTML文件的实现思路
2021/06/11 Java/Android