云计算国产化之路 vnc登录 文件系统直通(virtio-9p) 扩展qemu接口 gpg WARNING 珍藏博客 虚拟内存情况dommemstat分析 免密码自动登录脚本 Linux网桥 测试网段IP占用情况 Linux 进程状态 systemc强制依赖 调试openstack ut uefi p2v 重做ubuntu内核 virsh创建虚拟机简介 virtio IO路径 虚拟化层升级后磁盘无法卸载卷 vmtouch使用 Taint flags 主机和虚拟机文件共享处理的几种方法 kvm分析工具 kvm中对磁盘的io cache 虚拟化不同导致的guestos中软件安装差异(未解决) 设备直通(PCI Assignment)到底是咋整的 virtio到底是咋整的 内核启动参数 虚拟化实时性提升(零)之配置步骤 中断虚拟化(pic)到底是咋整的 中断虚拟化(apic)到底是咋整的 Raid卡配置丢失导致服务器无法启动 tainted kernels cpu stuck for 23s问题分析 虚拟化实时性提升(一)之hostOS切换为强实时系统 内存虚拟化到底是咋整的 qemu-kvm中vcpu虚拟化到底是咋整的 风河虚拟化技术点分析 使用qga的好处 qemu迁移代码分析 虚拟机串口配置及其导出到主机pts和console.log System-based I/O vs. Raw I/O 虚拟机使用Hugepage(大页) 硬件辅助分页(hardware assisted paging) 修改centos7默认启动项目 virtio的工作流程——kernel中virtio-pci初始化(2) virtio的工作流程——qemu中virtio-backend初始化(1) qmp ceilometer取不到memory.usage指标 Virtio-Balloon超详细分析 slabtop输出 虚拟机磁盘cache导致的host os kernel崩溃 虚拟机cpu和memory性能优化测评 PCI配置空间(PCI Configuration Space) centos下网卡设备直通(VT-dpci passthrough)遇到的问题及其解决思路 libguestfs详解 yum卸载软件包及其依赖 通过原始Centos ISO来定制自己的ISO centos下网卡设备直通(VT-d,pci passthrough) (占位符)window虚拟机中拔盘如何通知到libvirt和qemu后端的 cirrus漏洞分析CVE-2017-2615 XSA-208 qcow2随笔 控制寄存器概览 ceilometer对接postgresql 解压initrd和vmlinuz qemu guest agent验证 QEMU升级指南(待续) ubuntu中kdump的配置 qemu(2.3)接口梳理 热迁移导致的FC存储场景下的multipath卷残留问题分析 virsh命令(4)secret,snapshot,pool,volume部分 virsh命令(3)之interface,filter,network virsh命令(2)monitor,host,nodedev部分 virsh命令(1)之domain部分 QEMU内存管理之FlatView模型(QEMU2.0.0) ovirt基于sanock的高可用(主机粒度HA) Sanlock防脑裂场景功能测试用例 gnocchi配置及与ceilometer对接指南 make patch for libvirt in centos centos使用sanlock指导 高可用nfs资料 ubuntu14中使用sanlock指导 LVM操作指南 sanlock相关功能验证流程汇总 make patch for libvirt in ubuntu libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7' not found gdb debug libvirt 基于ubuntu社区源码包编译libvirt compile libvirt(centos) No PCI buses available nfs lead to Linux halt nfs install and config anti-virus for cloud platform nova fetch image from glance(something about _base) token auth process ovs入门指南 virt software anti-virus something about ceilometer disk sample context interview questions openstack vm injection openstack Restful and RPC murano 概览 创建虚拟机流程(compute节点)之网络创建 创建虚拟机流程之compute_api之虚拟机实例填充之配额检测 创建虚拟机流程之compute_api之基本参数生成 创建虚拟机流程之compute_api 创建虚拟机流程(主) 创建虚拟机之image 创建虚拟机流程之准备网桥 创建虚拟机流程之virt 创建虚拟机流程之compute节点 CI/CD研发流程之工程创建 CI/CD研发流程之代码合入 CI/CD研发流程之UT(单元测试) 向openstack社区合入代码记 openstack/ceilometer/gnocchi杂谈 影子页表原理 mem_add(exec.c) qemu编译安装调试 openstack/ceilometer/gnocchi之Grafana简介 openstack wiki etcd openstack计量ceilometer openstack计费cloudKitty enventlet backdoor USB 安装VMWARE ESX pycharm设置指南 无法执行modprobe -a kvm-intel解决办法 QEMU配置项 网络不通小记 libvirt之XML(虚拟机定义文件) openstack-horizon 证书认证 ceilometer与ceph对接 openstack定时任务剖析(TODO) 服务器重启后mongodb进程无法启动 ubuntu14下新增openstack服务到service的导引 ERROR 1045(28000)-数据库连不上 Python两个内置函数—locals和globals unknown exit, hardware reason 31

token auth process

2016年06月01日

认证

Authentication,认证,用来确定你是谁
你说你是谁,我需要鉴定一下
也就是你提供证据,keystone来认证那个哲学问题
“你妈是你妈”

认证方式有多种,token,公钥,数字证书等等
这里重点分析基于token的keystone服务认证流程

一句话总结

有请求的时候,从header中找到token
然后校验token合法性
非法:抛出异常返回401 合法:业务继续向下流动

代码分析

wsgi服务中可以指定token的认证方式
详见之前的博文

比如指定在nova.conf中指定auth_strategy为keystone认证

也就是说,调用比如nova的api接口的时候,会触发如下的认证过程

之前认证的代码是在keystoneclient中
现在代码已整理至keystonemiddleware中间件项目中

让我们打开代码,会发现实际上起作用的类是AuthProtocol

类图如下

通过之前的wsgi知识可以知道
消息在中间件中传递的时候是调用的中间件的call方法
这里是调用了父类BaseAuthProtocol的call方法

然后调用到AuthProtocol的process_request方法
1.去除header中已有的认证信息,防止token伪造
2.初始化_token_cache,后续用来缓存token
3.调用父类BaseAuthProtocol的process_request方法
3.1这块后面需要仔细分析 4.后续处理,认证不通过抛出异常,通过在请求体中塞入认证信息等

下面仔细看下BaseAuthProtocol的process_request方法
根据header中塞入的内容不同分别走走不同的流程

X-Auth-Token和X-Storage-Token

注:X-Storage-Token is supported for swift/cloud files and for legacy Rackspace use

X-Service-Token

如果带了X-Service-Token,在上面的X-Auth-Token和X-Storage-Token认证通过后
会进行X-Service-Token认证
如果失败,则会返回认证失败 (在不考虑delay_auth_decision的情况下)

可见上面两种,流程大致相同,我们一个个分析

_do_fetch_token

需要注意的调用fetch_token后,会使用access去构造一个对象
access在Kilo版本中是在keystoneclient中
新版本中已经挪到keystoneauth

重点关注fetch_token
这里判断token是否已经缓存
1.如果缓存了,判断当前token是否被撤销了(通过revoked.pem)

2.如果没有缓存,则先使用离线方式校验
3.再不行,就通过keystoneclient调用接口校验

下面先看下离线校验方式,也就是_validate_offline
可见先根据token类型不同进行解压,然后_cms_verify进行处理

这里补充uuid和pkiz类型token的认证过程

继续看_cms_verify

这里cms是的keystoneclient.common下的cms.py
仔细看下也就是通过openssl尝试通信,来验证CMS签名的合法性

_identity_server.verify_token不多看了
主要是使用/tokens/tokenid获取token详情

_validate_token

主要验证token是否快超期

v2版本需要auth_ref.project_id

_confirm_token_bind

根据下面的策略
class _BIND_MODE(object): DISABLED = ‘disabled’ PERMISSIVE = ‘permissive’ STRICT = ‘strict’ REQUIRED = ‘required’ KERBEROS = ‘kerberos’

然后判断绑定的是否合理

至于什么是绑定,为什么绑定,后续再补充吧 TODO

参考文档

http://docs.openstack.org/developer/keystonemiddleware/middlewarearchitecture.html