openstack项目【day23】:keystone组件基础
本节内容
- 一 什么是keystone
- 二 为何要有keystone
- 三 keystone的功能
- 四 keystone概念详解
- 五 keystone内包含的组件
- 六 keystone与openstack其他服务的关系
- 七 keystone与其他组件协同工作流程
- 八 keystone工作流程详解
一 什么是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对服务的机器开放。
我们使用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管理,下图是各部分关系
第三部分
- 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.
注意:user2,user3,user4的关系同user1一样,也可以属于一个或者多个group,此处为了图示简洁,省去了它们的连线
五 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其他服务的关系
七 keystone与其他组件协同工作流程
keystone是用户与云平台交互的第一个服务,一旦认证通过,用户就会使用自己的身份来访问其他的opnestack服务,同样,被访问的openstack服务会去跟keystone再次确认用户(不能只能用户的片面之词)并且通过keystone可以发现其他服务(catalog的原因),keystone的还可以整合其他的用户管理系统,比如LDAP
八 keystone工作流程详解
(1) User从Keystone获取令牌以及服务列表;
(2) User访问服务时,亮出自己的令牌。
(3)相关的服务向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项目【day23】:keystone组件基础的更多相关文章
- openstack项目【day23】:keystone组件HTTP协议
阅读目录 一 为何要学习HTTP协议 二 用户上网过程 三 HTTP协议 part1 http协议概述 part2 请求协议 part3 响应协议 四 抓包分析HTTP协议 一 为何要学习HTTP协议 ...
- openstack项目【day23】:openstack组件介绍
本节内容 openstack介绍 openstack项目(服务名是项目名的别名) openstack运行流程 openstack各组件详解 一:openstack介绍 open ...
- 二、OpenStack—keystone组件介绍与安装
一.Keystone介绍 keystone 是OpenStack的组件之一,用于为OpenStack家族中的其它组件成员提供统一的认证服务,包括身份验证.令牌的发放和校验.服务列表.用户权限的定义等等 ...
- OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 3.安装配置OpenStack认证服务(keystone)
节点配置信息说明: 控制节点:controller: IP:192.168.164.128 hostname&hosts:likeadmin 计算加点:Nova: IP:192.168.164 ...
- 4 云计算系列之Openstack简介与keystone安装
preface KVM 是openstack虚拟化的基础, 再介绍了kvm虚拟化技术之后,我们介绍下openstack和如何搭建. Openstack组件 openstack架构图如下所示 那么我们就 ...
- 华为云计算IE面试笔记-FusionSphere Openstack有哪些关键组件,各组件主要功能是什么?三种存储接入组件的差异有哪些?
1. Nova:在OpenStack环境中提供计算服务,负责计算实例(VM,云主机)生命周期的管理,包括生成.调度和回收.Nova不负责计算实例的告警上报(FC管). 2. Cinder:为计算实例提 ...
- 大陆地区OpenStack项目Core现状(截至2016年1月28日,转载自陈沙克日志)
陈沙克 经常有朋友问,大陆地区大概有多少位OpenStack项目的Core.这个问题,现在其实不太好回答,如果需要准确统计的话.下面仅仅是一个大概估计,有遗漏的,希望朋友指出,我来补全. 文档修改历史 ...
- OpenStack项目列表
这个也是必须要熟悉的哟. ~~~~~~~~~~ OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Apache许可证授权,并且是一个自由软件和开放源代码项目.OpenStac ...
- keystone组件
引: 什么是keystone 为何要有keystone keystone的功能 keystone概念详解 keystone与openstack其他组件关系 k ...
随机推荐
- Linux 下 C# Mono P/Invoke .so 动态链接库。
linux 的动态链接库 libgw.so 的函数 如下: struct lbt_chan { uint32_t freq_hz; uint16_t scan_time_us; }; struct l ...
- SQLServer之修改PRIMARY KEY
使用SSMS数据库管理工具修改PRIMARY KEY 1.连接数据库,选择数据表->右键点击->选择设计(或者展开键,选择要修改的键,右键点击,选择修改,后面步骤相同). 2.选择要修改的 ...
- 从开始到头皮炸裂的python第5天
头皮炸裂的一天从学到一个新的数据类型开始,这个数据类型的新成员叫做字典,基本的格式为data={键:值,键:值},info.keys()表示所有的键,info.values()表示所有的值,info. ...
- Jetson TX2(2)ubutu1604--安装opencv3.4.0
1安装OpenCV3.4.0+contrib 1 在终端中敲入以下两句sudo rm /var/cache/apt/archives/locksudo rm /var/lib/dpkg/lock su ...
- python3 闭包函数
'''闭包函数:内部函数引用外部函数变量(非全局变量)'''def func(y): x = 1 def func1(): print(x, y) return func1 f = func(2)pr ...
- redis 初步认识一(下载安装redis)
1.下载redis https://github.com/MicrosoftArchive/redis/releases 2.开启redis服务 3.使用redis 4.redis可视化工具 一 开 ...
- 调用Runtime.getruntime 下的exec方法时,有",<,|时该怎么办?
今天写一个用到编译的程序,遇到了问题. 在调用runtime.exec("javac HelloWorld.java");运行完美,也就是有生成.class. 而到了runtime ...
- 这段代码,c 1秒,java 9秒,c# 14秒,而python。。。
哎,不得不说最近见得键盘侠客太多了,做程序员没两天总是喜欢上嘴唇触天,下嘴唇碰地的吹. 自己分明都没用过几门语言,就对各门语言评头论足说三道四,这么语言多好那门语言有多烂. 可能是随着时间也变得没那么 ...
- JS 优化条件语句的5个技巧
前言 在使用 JavaScript 的时候,有时我们会处理大量条件语句,这里有5个技巧帮助我们编写更简洁的条件语句. 一.对多个条件使用 Array.includes 例子: function con ...
- Android技术框架——Dagger2
Dagger2 是一个Android依赖注入框架.没错依赖注入,学习过spring的同学看到这词,应该是挺熟悉的.当然既然是Android的课题,我们就来聊聊Dagger2 ,android开发当前非 ...