Keystone Fernet tokens

本文介绍了Fernet Token的特点及其在OpenStack中的应用。Fernet Token采用对称加密方式,具有非持久化、轻量级等特性,能有效降低云平台运行开销。文章还详细解析了Fernet Token的内容构成、大小及验证机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 可以在不同的节点上使用相当的密钥进行解密。


<think>好的,我现在需要解决用户提到的OpenStack Keystone服务连接失败的问题,具体错误包括身份验证URL不可用和HTTP连接池重试超时。首先,我得理清用户提供的引用信息,找出可能的故障点。 用户引用了四个错误信息,主要涉及Keystone服务的连接问题。例如,引用[1]提到无法连接到http://10.2.5.156:35357/v3/auth/tokens,最大重试次数超限,连接被拒绝,错误码111。这说明目标主机的35357端口可能未开放或服务未运行。引用[2]和[3]显示发现身份版本失败,尝试解析URL中的版本,但curl测试时连接被拒绝,说明服务可能未启动或端口监听有问题。引用[4]则建议检查wsgi-keystone.conf配置文件,这可能与Apache配置相关,因为Keystone通常通过Apache的WSGI来部署。 接下来,我需要按照常规排错步骤来解决问题。首先检查Keystone服务状态,确认服务是否正在运行。如果服务未启动,自然无法连接。然后查看端口监听情况,35357和5000端口是否被正确监听。如果端口未监听,可能是服务配置错误或未绑定正确地址。 然后需要检查防火墙设置,确保相关端口没有被防火墙阻止。同时,检查Keystone的配置文件,如/etc/keystone/keystone.conf,确认admin_endpoint和public_endpoint的URL是否正确,是否有拼写错误或指向错误的主机名/IP。另外,Apache的配置文件wsgi-keystone.conf是否正确配置了虚拟主机和监听端口,确保Apache正确代理Keystone服务。 如果配置正确,但服务仍无法访问,可能需要检查DNS解析或/etc/hosts文件,确保controller、ct等主机名能正确解析到对应的IP地址。例如,用户引用中的错误地址是http://ct:5000,而curl测试时无法解析ct,可能需要配置hosts文件,将ct指向正确的IP。 另外,用户提到的错误涉及v3版本的身份验证,需要确认Keystone是否启用了v3 API,并且在配置文件中正确设置。同时,查看日志文件,如/var/log/keystone/keystone.log或Apache的error_log,寻找更详细的错误信息,帮助定位问题。 可能的解决方案包括重启Keystone和Apache服务,重新加载配置,或者修复配置文件中的错误。如果之前修改过配置文件,可能需要重新部署或同步配置。此外,网络连通性测试,如使用telnet或nc检查端口可达性,也是必要的步骤。 总结起来,解决步骤大致分为:检查服务状态和端口监听,检查防火墙,验证配置文件的正确性,检查DNS/hosts解析,查看日志,最后进行必要的服务重启或配置调整。需要逐步排查,从服务是否运行开始,逐步深入到配置细节和网络设置。</think>### OpenStack Keystone服务连接失败解决方案 #### 1. 检查Keystone服务状态 首先需确认Keystone服务是否正常运行: ```bash systemctl status openstack-keystone httpd # 检查服务状态 ``` 若服务未启动,需执行: ```bash systemctl start openstack-keystone httpd # 启动服务 systemctl enable openstack-keystone httpd # 设置开机自启 ``` #### 2. 验证端口监听状态 Keystone默认使用端口`35357`(admin)和`5000`(public)。执行以下命令检查端口是否监听: ```bash netstat -tulnp | grep -E '35357|5000' # 查看端口占用情况 ``` 若未监听,可能原因包括: - Keystone配置文件`/etc/keystone/keystone.conf`中`admin_endpoint`或`public_endpoint`配置错误 - Apache的WSGI配置未正确加载(检查`/etc/httpd/conf.d/wsgi-keystone.conf`)[^4] #### 3. 防火墙配置检查 确保防火墙允许相关端口通信: ```bash firewall-cmd --list-ports | grep -E '35357/tcp|5000/tcp' # 查看开放端口 ``` 若未开放,添加规则: ```bash firewall-cmd --add-port={35357/tcp,5000/tcp} --permanent firewall-cmd --reload ``` #### 4. 验证身份认证URL可达性 使用`curl`测试身份认证端点: ```bash curl -v http://controller:35357/v3 # 测试admin端点 curl -v http://ct:5000/v3 # 测试public端点 ``` 若返回`Connection refused`(错误码111)[^3],需排查: - 网络连通性(`ping ct`检查DNS解析) - `/etc/hosts`中是否包含正确的主机映射(如`10.2.5.156 ct controller`) #### 5. 配置文件关键参数验证 检查`/etc/keystone/keystone.conf`: ```ini [token] provider = fernet # 确保使用有效token生成方式 [DEFAULT] admin_endpoint = http://10.2.5.156:35357/v3 # 需与实际IP一致 public_endpoint = http://ct:5000/v3 ``` #### 6. 日志分析 查看关键日志定位具体错误: ```bash tail -f /var/log/keystone/keystone.log # Keystone服务日志 journalctl -u httpd -f # Apache服务日志 grep 'ERROR' /var/log/httpd/ssl_error_log # WSGI错误日志 ``` #### 7. 服务重建与同步 若配置修改后未生效,可尝试: ```bash keystone-manage db_sync # 同步数据库 apachectl graceful # 平滑重启Apache systemctl restart openstack-keystone # 重启Keystone ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值