keystone revocation event (part)




问题症状

在虚拟机里部署OpenStack环境,遇到一个问题,openstack token issue可以正常生成token,但nova list等命令都报401错误,用curl GET请求验证生成的token也都401错误。

解决方法先讲下,最终发现是因为虚拟机的时间不同步导致的,用ntpdate命令同步下时间之后就可以了。虚拟机时间不同步,应该是做快照过程中pause虚拟机导致其时间停止,从而发生时间延后,因为延后的时间比较长,有好几个小时,所以才导致这个问题。

分析过程

keystone日志看到如下告警:

但明明是刚生成的token,怎么会不可用?

直接加断点调试,调到最后发现token invalid的原因在:

头一次听说还要检查token的生成时间,以前看老版本keystone代码,貌似只有对expires_at过期时间的检查。

继续看为啥要检查生成时间,找到了revoke event,在更新用户、revoke token等操作过程中就会执行相关检查,event的注册代码:

以revoke token为例说明相关流程:

token内容类似(有audit_ids,但没看到audit_chain_id):

数据库更新记录:

 

再以更新用户为例:

之后执行注册好的回调:

之后就与上面的revoke token流程类似了,数据库更新记录:

 

补充知识

为啥要有revoke流程?(以下内容为个人猜测,未经验证)

之前用uuid格式的token,都存在token表里面,有个valid字段标识是否可用,删掉或者更新用户导致失效的,就把这个字段改成0,表示已失效,但是fernet格式token没有数据库记录,没办法做这种操作,只能改为把revoke相关记录保存在单独的表中,也就是revocation_event表。

这只是revocation event相关流程的一部分,所以本文的标题加了part,其他部分还没研究,等后面有机会看明白了再补充。