OpenStack 学习笔记 (一)
这一系列笔记已经记录很长一段时间了,种种原因没有贴出来,现在陆陆续续的贴出来。可能由于自己理解的
错误和疏忽,导致存在错误,欢迎大家指正,交流。
所有的源码分析都是基于OpenStack Folsom版本。
参考文档:http://hi.baidu.com/chenshake/item/184767c22c1231ba0d0a7bc7
这篇博客的前半部分基本上参照ibm(链接如上)的内容。
在理解OpenStack 授权机制之前,先明白其中的一些基本概念:
- User: 所谓的User代表着一些人或者能够通过keystone获取访问的something。User通过自身的证书例如username & password 或者 api keys来访问服务。
- Tenant:Tenant代表nova中的一个project,就是能够聚合一些服务中的一些资源。例如,一个tenant能够有一些nova中的虚拟机,glance中的一些images,quantum中的一些networks,users默认的绑定到某个tenant中。
- Role:代表一组用户能够一定程度的访问资源。例如能够访问nova中的vms,glance中的images。Users能够被添加到所有的tenants中或者某个tenant。用户就获取了对相应tenant中对应角色获取的访问资源的权限。
- service: 某类型的服务,例如nova, quantum, glance等等都是服务
- endpoint: 访问服务的入口点,一个http路径。例如:catalog.RegionOne.image.internalURL = http://10.10.102.14:9292,可以通过此URL访问image服务
接下来,分析用户在访问一个服务的过程中,keystone都做了哪些工作,整个过程描述如下:
1. 获取token
首先,需要确认你将访问那个tenant,必须使用keystone来获取一个unscoped token(意味着这个token没有和特定的tenant绑定),这个unscoped token能够用来深入查询keystone service,确定你能访问哪些tenants。获取一个unscoped token,使用典型的REST API,在request的body中不指定tenantName。例如:

经过成功的验证,返回的response大致如下,其中的token id就是获取到的unscoped token(访问路径:/access/token/id),token id 将被在下一次的请求中作为X-Auth-Token的值,用来标识身份。

2. 获取tenants
接下来的一步是,使用unscoped token来获取能访问的tenants,其中租期已经由你分配的角色决定了,对于每个tenant,都有一个确定的角色。所有在service endpoint上执行的操作都需要一个scoped token。获取能访问的tenants,使用 GET /tenants keystone API,其中将unscoped token写入X-Auth-Token。例如:

返回的响应如下:

这是一个tenants数组,包含了能够访问的tenants。
3. 获取scoped tokens
获取了能够访问的tenants之后,决定访问某个tenants,就开始需要获取一个scoped token,这个scoped token与某个特定的tenant绑定,能够提供这个tenant的metadata和在tenant中的角色。获取scoped token需要使用POST /tokens keystone API,像第一步一样,这有两种形式的API。
1. 使用第一步中一样的request body,传递user id 和 credentials,还指定tenantName

2. 使用包含unscoped token和tenant name的request body,这样无需再post credentials。

在返回的response中,包含一个scoped token和相关的metadata。



更重要的是,其中包含了一组service endpoints。这些endpoints 确定了获取的token能够访问的服务,Keystone service manage都是基于service/endpoing catalog的.通过这些endpoings,决定访问其中的service。
关于keystone 管理的endpoint/service catalog:
l Keystone管理了一些的service,这些service在keyston的service catalog中定义了,定义方式大致是,type,name,description
l 在service catalog中,endpoint包含了region中一些基本的URL。
l 每个endpoint与一个service关联。
l Endpoint url都是base urls,作为api方位的前缀。

4. 获取scoped tokens
现在已经获取了scoped tokens,并且知道了endpoint API的url,下一步就是调用这些service endpoint。在这一步,使用keystone来确证token的有效性。存在两种类型的token,一种基于UUID的,一种基于PKI(Public Key Infrastructure)。
l UUID Keystone 将维护一个token的UUID到他们的metadata和有效性的索引,token id没有携带嵌入的metadata,则endpoint service将调用keystone的service,应用这个token id的有效性,keystone将会返回这个token所相关联的metadata,包括角色,tenancy(租期),能够用在处理api请求的内部使用,endpoint service会为每个api request去调用keystone服务验证有效性。
l PKI PKI使得endpoint service不需要每次api request都进行调用keystone验证token的有效性。PKI使用public/private certificate pair,基于X.509 技术。Keystone 拥有Public private certificate。任何人都能通过REST API获取到public certificate,private certificate只能keystone拥有。当使用PKI,第一次使用endpoint service时,endpoint service将请求keystone的public certificate,并且保存起来。使用PKI模式,keystone将会创建json格式的对象,包含token的metadata,使用private certificate来加密token,再使用MD5来为加密的token创建指纹,这样的token将作为第三步中token ID返回,这样token ID包含了metadata而不仅是一个UUID字符串。Endpoint service将会确认签名,使用public certificate解密token。这样,token包含所有的metadata了,endpoint service不需要再去找keystone获取这些信息。
能够在keystone.conf配置文件中配置token_format.
5. 验证role metadata
Endpoint service 使用token的metadata来验证用户能够访问请求的服务。这一般都涉及到Role Base Access Control(RBAC)。基于服务的policy.json文件,使用rule engine来决定用户的token包含适当的角色访问。
6. service API request
到此,user就能够去通过api访问有权限访问的资源。
有了上面基本知识,下面结合具体的代码粗略的描述上面的流程。
从最开始的shell命令行开始,譬如,nova list命令,但在使用命令之前,我们需要配置一下环境变量:

将这些参数配置正确,便能够正确的执行nova list命令了。从nova 命令启动之后,python-novaclient 的main函数首先获取一个base parser,用来解析命令行,在获取这个base parser的过程中,就会添加参数,例如os-username等等,并且设置其默认值为,从环境变量中读取出来的值。例如下面的os-username

接着,从命令行参数中去获取os_username,os_password,os_tenant_name,os_auth_url,endpoint_type等等和授权相关的参数,有些参数如endpoint_type为空,则获取默认的,若os_username,os_password,os_auth_url都为空,则命令报错。
如果endpoint_type是空的,则读取默认的值publicURL,前面介绍过service endpoint type的类型,有三类,publicURL,adminURL,internalURL。若service_type为空,则读取默认的值compute或者通过命令具体执行的命令是属于什么类型的service来确定。(在定义一个命令行将调用的函数时,可以为它添加装饰器,指定所属的service)

譬如通过命令 nova volume-list,就会获知service_type为volume,而不是默认的compute。
然后,从auth_url指定的服务中获取授权,程序运行到这儿之后,就到了前面介绍的第一步了,获取tokens,并且在body中指定了tenantName。
在返回的body中,就已经获取了所有的service catalog,根据service_type,endpoint_type则可以生成management_url.http://10.10.102.31:8774/v2/eacac8f7935348c7a6aa3ea6fe54e18c,此url则是访问nova compute服务的base url。然后在此url基础上,加上命令的具体参数,就访问此URL的服务--nova compute。
nova compute接受到此请求之后,会验证次请求,然后完成请求。
OpenStack 学习笔记 (一)的更多相关文章
- openstack学习笔记一 虚拟机启动过程代码跟踪
openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...
- OpenStack学习笔记(一)----安装虚拟化工具
下面的命令运行在操作系统Ubuntu 14.04上. 在开源软件里面,主要是采用KVM和Xen.尽管OpenStack对KVM和Xen都支持,但是OpenStack对KVM的支持明显要比Xen做得好, ...
- OpenStack 学习笔记 (三)
个人网站:臭蛋www.choudan.net 一直苦于不知道如何加入到开源社区参与开发,感受开源社区分布式协作开发和巨神们coding的魅力,特意在网上查了资料,直接指导的很少,还得的靠官网上的文档. ...
- openstack学习笔记(一)-openstack的基础知识
一.OpenStack的基础知识 openstack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache2.0许可证(兼容GPLv3以及DFSG)授权的自由软件和 ...
- OpenStack学习参考
预备知识 Python 调试手段.日志:pdb 开源框架 Django 面向对象:类.继承.多态 编码规范 搭建环境 安装docker,下载openstack镜像,关于docker参考 使用fuel来 ...
- eventlet学习笔记
eventlet学习笔记 标签(空格分隔): python eventlet eventlet是一个用来处理和网络相关的python库函数,且可以通过协程(coroutines)实现并发.在event ...
- Puppet学习笔记(CentOS6.3+Puppet3.01)
Puppet学习笔记(CentOS6.3+Puppet3.01) 技术 Add comments Oct262012 下了决心,好好学习puppet,周末专门去参加一个puppet的培训,难得朋友那 ...
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
- Qt学习笔记(2)-利用StackWidget实现选项卡式页面
学习笔记第二篇,利用Qt实现选项卡式的页面,效果如图1.1-图1.3所示.程序实现的功能是通过点击状态栏实现不同页面的切换,实际上Qt中自带有Tab选项卡式的控件,本文利用StackWidge实现类似 ...
随机推荐
- Web安全之CSRF攻击的防御措施
Web安全之CSRF攻击的防御措施 CSRF是什么? Cross Site Request Forgery,中文是:跨站点请求伪造. CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击 ...
- Mac休眠之后唤醒时无法使用鼠标
Mac休眠之后唤醒时,无法使用鼠标键盘,无法输入密码登录,只能重启. 尝试升级系统,问题依旧,最后在Google的帮助下,问题解决. 解决办法:系统偏好设置->节能->取消硬盘休眠 参考: ...
- WCF系列教程之WCF客户端调用服务
1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...
- LeetCode-13. Roman to Integer(罗马数字转阿拉伯数字)
1.题目描述 Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range f ...
- webpack使用 babili-webpack-plugin 报错 "original.line and original.column are not numbers"
按照这个解决 https://github.com/chentsulin/electron-react-boilerplate/issues/1300 changing "babili-we ...
- elixir二进制模式匹配
for << << b1::size(2), b2::size(3), b3::size(3) >> <- "hello" >> ...
- applets
Java Applet 可以大大提高Web页面的交互能力和动态执行能力.包含Applet的网页被称为Java-powered页,可以称其为Java支持的网页. Applet 当用户访问这样的网页时,A ...
- jquery连续滚动
本文非常详细的讲解在jquery里实现图片或文字的连续循环滚动的方法. 连续循环滚动是我们在网页开发中经常要用到的特效,在jquery里,我们要实现文字或图片的连续循环滚动是非常简单的.出处:http ...
- Java基础教程(8)--表达式、语句和块
一.表达式 表达式由变量和运算符组成.下面是一个简单的赋值表达式: a = 0; 表达式都具有运算结果,因为赋值表达式的运算结果是左侧操作数的值,因此上面的表达式将会返回一个0.可以使用简单的 ...
- memcached 细究(一)
memcached是高性能的分布式的内存缓存服务器.由国外社区网站LIVEJOURNAL的开发团队开发. 使用目的: 通过缓存数据库查询结果,减少数据库的访问次数,以提高动态web应用的速度.提高可扩 ...