Keystone Fernet tokens

FENET是一种安全的消息传递格式,已被国外的一些公司用于API token中。解决了OpenStack面临的许多相同问题。它们的非持久的、轻量级的特性可以降低运行云所需的开销。

fernet_token格式如下:

gAAAAABaVhKmk-inDnXQjDU-w6bw4BHhVhTAIOIspvGV6vZXHh8P9Kd6FMYdXeR6R8z_JfccBZxyTfooHvomBGhsrodIhWpAkL3lf-bqsAxr9byzPPQyyoHfp_IlOh2OgSngyt9NFVu39Sj4CM_vcInpBOCdMzMeGT7D0BRpyDC-6ziRpTmBlak

 

 

非持久化:不像UUID的token,fernet tokens 不需要被持久化到数据库。

是的!这意味着这个token将是永远是可以用的:

> SELECT * FROM `token`;
Empty set ( 0.00  sec)

 

 

轻量级:与 PKI token 相比,他们比较短,偏向于最小的身份信息和动态授权环境。

它们通常在180到240字节的范围内。从客户端的角度来看,您可以将它们完全视为 UUID token。

 

对称加密:Fernet 使用 AES-CBC 加密,并使用 SHA256 HMAC 进行签名。

简而言之,OpenStack的身份验证和授权元数据都被打包成一个包,然后将其加密并签名为 Fernet token。 OpenStack 支持 三阶段 密钥循环模型,能有效支持密钥的轮询切换和替代。

 

Fernet tokens 包含些什么?

Fernet tokens 包含最少的身份和授权信息:刚好可以让 keystone 实现完整的 token 验证。

在一般情况下(project-scoped token),一个token 会包含一个user id 和 一个 project id,以及一些元数据,如令牌创建时间戳,token时间周期,审计ID和认证方法。 domain-scoped token 会包含 domain ID而不是 project ID。 基于信任的token 将包含信任标识。 基于联合的 token 将包含 有关联盟本身的信息。

除了 token 创建时间戳以外,所有这些都是加密的,因为它是 fernet token 加密消息 的一部分。 fernet 做为包含这些信息的载体,fernet的更多细节可以参考这个https://github.com/fernet/spec/blob/master/Spec.md

如果你想查看一个 fernet 内容,在打包和解包中你将会体会到fernet token 有多复杂和精密。

 

Fernet令牌有多大?

下面可以看一个 project-scoped Fernet token:

gAAAAABaVhKmk-inDnXQjDU-w6bw4BHhVhTAIOIspvGV6vZXHh8P9Kd6FMYdXeR6R8z_JfccBZxyTfooHvomBGhsrodIhWpAkL3lf-bqsAxr9byzPPQyyoHfp_IlOh2OgSngyt9NFVu39Sj4CM_vcInpBOCdMzMeGT7D0BRpyDC-6ziRpTmBlak

上面就只有186个字节,通常都会控制在255字节内。虽然255字节没有硬性限制,并且很长的token虽然存储到数据库里不是什么问题,但是长的 token 用户体验不好。 也有不好的事情,比如一些非UUID的用户可能会有额外的安全风险。

更另人吃惊的是,如果一个用户属于多个组,有可能是属于无穷多的组的时候,这个fernet token就也会相应的很庞大,不过现实私有云环境中,也不太可能一个用户属于3个组以上。

不过如果你将user 分配到二个不同的组,你很快就会看到 Fernet token 的长度迅速增加。

 

Fernet令牌可以离线验证吗?

可以进行一些离线验证,例如验证 token 是否是正确的 Fernet token,并验证创建日期。 但是,如果没有签名密钥或加密密钥,就不能离线验证了。

 

性能怎么样?

Fernet token 的性能比 UUID token 快 85%,比 PKI token 快89%。 

 

怎么配置并使用 Fernet?

只需要以下几步。

1,通过更改 keystone.conf 中[token]下的 provider:

[token]
provider = fernet

 

2,初始化密钥库:

mkdir /etc/keystone/fernet-keys/
keystone-manage fernet_setup


初始化密钥库后,会在 key_repository 里生成一对密钥:一个staged key 用于解密tokens,一个 primary key 用于加密token。

 

3,在部署多节点 keystone 集群时,这时候需要将  key_repository /etc/keystone/fernet-keys/  里的目录和文件 复制到每个其他的keystone节点相对应的目录上。这样确实可以用 fernet token 可以在不同的节点上使用相当的密钥进行解密。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值