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 URL重写rewrite机制原理及使用实例
Apr 01 Servers
利用Nginx代理如何解决前端跨域问题详析
Apr 02 Servers
nginx配置虚拟主机的详细步骤
Jul 21 Servers
Nginx实现会话保持的两种方式
Mar 18 Servers
使用Docker容器部署rocketmq单机的全过程
Apr 03 Servers
idea下配置tomcat避坑详解
Apr 12 Servers
tomcat正常启动但网页却无法访问的几种解决方法
May 06 Servers
Nginx限流和黑名单配置
May 20 Servers
apache ftpserver搭建ftp服务器
May 20 Servers
git stash(储藏)的用法总结
Jun 25 Servers
Zabbix对Kafka topic积压数据监控的解决方案
Jul 07 Servers
windows server2016安装oracle 11g的图文教程
Jul 15 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
收音机的保养
2021/03/01 无线电
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
PHP连接及操作PostgreSQL数据库的方法详解
2019/01/30 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
jQuery Validate插件ajax方式验证输入值的实例
2017/12/21 jQuery
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
Vue3 响应式侦听与计算的实现
2020/11/11 Javascript
如何在VUE中使用vue-awesome-swiper
2021/01/04 Vue.js
Python实现学生成绩管理系统
2020/04/05 Python
python 显示数组全部元素的方法
2018/04/19 Python
Django model序列化为json的方法示例
2018/10/16 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
高中的自我鉴定
2013/12/16 职场文书
展览会邀请函
2015/02/02 职场文书
英文产品推荐信
2015/03/27 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL