【Keystone】token

来源:互联网 发布:遗传算法视频讲解 编辑:程序博客网 时间:2024/06/10 21:34

Keystone是OpenStack中负责管理身份验证、服务规则和服务令牌功能的模块。


如果用户每次在访问服务的过程中,都需要提供用户名和密码,那么势必存在信息泄露的风险;token,即服务令牌,就可以解决这个问题。

用户在访问OpenStack之前,首先需要使用用户名和密码获取一个token,接下来就可以使用此token访问任何资源。

OpenStack目前支持4种令牌,分别是UUID令牌、PKI令牌、PKIZ令牌和Fernet令牌。


uuid令牌,顾名思义,在Keyston中是一串36位的ASCII字符串,用于唯一标识一个令牌。这个uuid的内容是没有实际意义的,有关的令牌信息包括超时时间、用户id以及额外信息等都需要记录在数据库(包括内存数据库memcached和自己实现的kvs)中。每次访问资源或者API的时候都需要传递该uuid令牌,OpenStack的所有组件都需要访问Keystone去验证该uuid令牌,然后鉴权并执行操作。


PKI令牌,是一种借助非对称加密实现的令牌。在这里Keystone充当其中的ca,每当生成一个令牌,Keystone都会使用私钥对其进行签名;与uuid令牌不同的是,PKI令牌内包含了令牌的有效信息,因此使用该PKI令牌访问资源或API时,OpenStack的组件无需去Keystone进行验证,而是使用Keystone提供的数字证书进行本地验证,这有效的减轻了Keystone的压力。但是,带了一个新的问题,PKI令牌最小都会打到KB级别,导致传递的数据包的长度过长。


为了解决PKI令牌的问题,引入了PKIZ令牌,就是使用ZLIB对PKI令牌进行压缩,但是压缩效果并不是十分明显。


以上3种令牌,都需要存入数据库,当运行时间很长以后,就会有大量的token存储于数据库中,包括已经过期的。这就会影响到Keystone的数据库读写性能,继而影响到资源或API的调用。为了解决这个问题,我们可以定期使用"keystone-manage token_flush"清理掉Keystone中已过期的token。但这个方法治标不治本,为此OpenStack社区引入了Fernet令牌,它是不需要进行持久化的,只有K版及以上版本才支持该令牌。Fernet令牌使用对称加密进行加密,里面只包含少量的令牌信息;使用该令牌访问资源或API时,OpenStack组件需要去Keystone进行验证并返回更多的有效信息。该令牌由于使用对称加密,因此安全性较低,需要经常更换密钥。