1.keystone集成需求介绍
公司要搭建基于openstack的私有云平台,提供IAAS。私有云用户是公司员工,考虑到公司已经有一套单点登录认证系统,需要openstack的keystone身份认证服务能集成该认证系统。
keystone提供openstack的认证授权服务,它实现了OpenStack的Identity API,除此之外它还负责提供目录服务(提供服务的url)。keystone缺省提供基于用户名口令、LDAP等认证方式,此外还可开发python认证模块来提供其它的认证方式。
2.keystone外部认证流程
集成公司已有的认证系统需要使用到keystone的外部(external authentication)认证,整个认证过程如下图。
1)、用户在openatck控制台(该控制台可基于openstack的Horizon进行改造或重新开发)的登录页面中输入用户名、口令等,提交到公司认证系统进行登录认证。
2)、公司认证系统认证通过后,返回访问凭证(通常是访问token)、用户名。
3)、openstack控制台通过http协议将第二步收到的访问token和用户名通过keystone提供的认证接口发给keystone,发送的http请求大致如下:
POST http://172.19.106.242:5000/v2.0/tokens
REMOTE_USER: 用户名
EXTERNAL_ACCESS_TOKEN: 访问token
Accept: application/json
Content-Type: application/json
{"auth" : { } }
REMOTE_USER头是keystone进行外部认证必须要有的,请求中存在该头keystone才会执行外部认证,其值为用户名;EXTERNAL_ACCESS_TOKEN头是自定义的,其值是公司认证系统返回的访问token。
http body是json格式,只有auth属性,内容为空。其他的如口令等都不需要。
4)、keystone收到该请求后,识别出认证请求中存在REMOTE_USER头,就进行外部认证的处理,主要是根据REMOTE_USER头中的用户名查询keystone的user表,看用户记录是否存在(所以需要将公司用户信息同步到keystone的user表中,不需同步密码字段),存在就通过了keystone的认证,后续处理流程和进行用户名/密码验证的相同,主要是颁发keystone的unscoped token等(该token不和具体的project/tenant绑定)。
基于安全的原因,keystone会到公司认证系统验证访问token(EXTERNAL_ACCESS_TOKEN头中携带),确保该token是公司认证系统颁发,且没过期。
该验证也可采用其他方式,如keystone回调openstack控制台来验证该访问token,或openstack控制台和keystone之间采用对称或非对称密钥,keystone对opentack传过来的签名进行验证(该签名放在另一个http头中,去掉EXTERNAL_ACCESS_TOKEN头)。外加iptables进行控制台ip地址限制。
在这一步的处理需要修改keystone的代码,具体的代码修改将在下面给出。
5)、返回keystone unscoped token给控制台。
3.涉及到的代码修改
keystone代码修改(基于openstack havana版)位于两个文件中,/opt/stack/keystone/keystone/token/controllers.py (对应v2.0认证接口)和/opt/stack/keystone/keystone/auth/controllers.py (对应v3认证接口),实际的文件位置根据安装来定。
第一个文件的修改位于def _authenticate_external方法中,需要注意的是由于keystone的http底层代码会将收到的REMOTE_USER头加HTTP_前缀后改成HTTP_REMOTE_USER(目前的havana版存在该bug),因此在该方法中的context对象中是获取不到REMOTE_USER头的,需要在该方法开头进行如下的修改:
#如果REMOTE_USER头和HTTP_REMOTE_USER头都没有,则抛异常
if 'REMOTE_USER' not in context.get('environment', {}) and 'HTTP_REMOTE_USER' not in context.get('environment', {}):
raise ExternalAuthNotApplicable()
#如果REMOTER_USER为None,则将HTTP_REMOTE_USER的值赋给它。
remoteUser = context.get('environment', {}).get('REMOTE_USER')
if not remoteUser:
context['environment']['REMOTE_USER'] = context['environment']['HTTP_REMOTE_USER']
到公司认证系统验证访问token的逻辑略去。
第二个文件的修改位于 def authenticate(self, context, auth_info, auth_context)方法中,和第一个文件类似,不过该文件中对外部认证的处理还有其他几个小问题,通过调试很容易发现并修改。
相关推荐
openstack keystone 命令详细openstack keystone 命令详细openstack keystone 命令详细openstack keystone 命令详细openstack keystone 命令详细openstack keystone 命令详细openstack keystone 命令详细openstack ...
Openstack keystone 安装包 简单快捷的搭建Keystone
Keystone4J是openstack keystone组件的纯Java实现。 Keystone4J允许您通过构建一个Openstack身份服务器并管理令牌,服务目录,端点,域,项目,用户等,并且可以将其功能集成到您自己的Java程序中。 安装指南 可从...
OpenStack Keystone的基本概念理解 Keystone简介 Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证、服务规则和服务令牌的功能, 它实现了OpenStack的Identity API。Keystone类似一个服务...
Keystone安装列表Openstack组件部署—Overview和前期环境准备Openstack组建部署—EnvironmentofControllerNodeOpenstack组件部署—Keystone功能介绍与认证实现流程Openstack组件部署—KeystoneInstall&...
Keystone OpenStack Ansible角色 地位 在主分支上 在开发部门 在Ansible Galaxy上 OpenStack Keystone身份服务安装。 使用Juno在Ubuntu Precise(12.04)和Trusty(14.04)上进行了测试。 要求 已经配置了用户和...
openstackOpenStack Keystone云计算云计算云计算
该项目的目的是开发一个两因素身份验证功能,将 Twilio 与 OpenStack Keystone 和 Horizon 集成 使用 OpenStack Keystone v3 创建一个 OTP 身份验证插件,该插件将使用 Twilio 服务通过 SMS 发送 OTP 值。 如果...
keystone为openstack提供了身份验证机制,其中token是贯穿整个op的钥匙!
OpenStack 安装 Keystone.doc
Keystone::V2_0::客户端Ruby 客户端与 API 2.0 版的 OpenStack Keystone 身份和服务目录服务交互。安装将此行添加到应用程序的 Gemfile 中: gem 'ruby-keystone-client' 然后执行: bundle 或者自己安装: gem ...
rabbitmq-auth-backend-keystone #Overview 该插件为 RabbitMQ 代理提供了使用 OpenStack Keystone 身份服务执行身份验证(确定谁可以登录)的能力。 授权(确定用户有什么权限)目前仍由RabbitMQ内部授权机制管理,...
(4) 更新系统,安装 centos7 下的 mitaka 依赖文件(使用“ OpenStack 模板 1” 不需要此步骤,在模 板中已经提前更新过了) yum install centos-release-openstack-mitaka yum install ...
官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装