设为首页 收藏本站
查看: 1288|回复: 0

[经验分享] openstack keystone外部认证

[复制链接]

尚未签到

发表于 2016-1-9 04:21:14 | 显示全部楼层 |阅读模式
  1.keystone集成需求介绍
  公司要搭建基于openstack的私有云平台,提供IAAS。私有云用户是公司员工,考虑到公司已经有一套单点登录认证系统,需要openstack的keystone身份认证服务能集成该认证系统。
  keystone提供openstack的认证授权服务,它实现了OpenStack的Identity API,除此之外它还负责提供目录服务(提供服务的url)。keystone缺省提供基于用户名口令、LDAP等认证方式,此外还可开发python认证模块来提供其它的认证方式。
  2.keystone外部认证流程
  集成公司已有的认证系统需要使用到keystone的外部(external authentication)认证,整个认证过程如下图。
  
DSC0000.png
      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)方法中,和第一个文件类似,不过该文件中对外部认证的处理还有其他几个小问题,通过调试很容易发现并修改。
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-162012-1-1.html 上篇帖子: 云----OpenStack的灵魂keystone 下篇帖子: 结合OpenStack 谈谈云计算
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表