🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质: CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥🎈支持我:可点赞👍、可收藏⭐️、可留言📝
📜身份验证令牌
身份服务通过插件配置指定的身份验证过程以确认用户的身份,然后向该用户提供表示用户身份的令牌。典型的用户令牌是有范围的,这意味着它列出了可能使用它的资源和访问权限。令牌的生命周期有限,允许用户在令牌过期或被撤销之前执行服务请求,而无需进行进一步的身份验证。限定范围的令牌列出用户的权限和特权,就像在与当前项目相关的角色中定义的那样。当用户向OpenStack服务发出请求时,服务根据用户提供的角色验证所请求的资源访问,然后允许或拒绝所请求的服务。
任何用户都可以使用openstack token issue命令来请求当前限定范围的令牌,并在输出中显示用户id、项目和新令牌过期时间。此令牌类型实际上是三种授权范围类型中的一种:未限定作用域、项目限定作用域和域限定作用域。因为域是Identity Service v3中支持的新特性,所以早期的文档可能只引用限定作用域和未限定作用域的令牌,其中作用域是基于项目的。
(token:确认用户的身份之后,会给用户提供一个核实身份并且可以用于后续资源请求的令牌,token服务则验证并管理用于验证身份的令牌。keystone会颁发给通过认证服务的用户两种类型的令牌,一类是无明确访问范围的令牌(unscoped token),此种类型的令牌存在的主要目的是用来保存用户的credential,可以基于此令牌获取有确定访问范围的令牌(scoped token)。虽然意义不大,但是keystone还是保留了基于unscoped token查询project列表的功能,用户选择要访问的project,继而可以获取与project或者域绑定的令牌,只有通过与某个特定项目或者域相绑定的令牌,才可以访问此项目或者域内的资源。令牌只在有限的时间内有效。)
📑未限定作用域
未限定作用域的令牌是仅用于身份验证的令牌,不包含项目、角色或服务信息有效负载。例如, 未限定作用域令牌可以使用身份验证身份提供商提供的其他服务,如LDAP,RADIUS,或AD服务器的令牌是用于验证身份服务,然后交流未限定作用域令牌认证用户的适当范围的令牌。未限定范围的令牌也可以称为身份服务默认令牌,它与项目或域没有关联,可以交换限定范围的令牌。
📑项目限定作用域
项目范围的令牌提供使用单个项目的资源在服务端点上执行操作的授权,允许由该项目中的用户角色指定的活动。这些令牌包含相关的服务目录、角色和作为有效负载的项目信息,并被认为与特定的项目相关联。
📑域限定作用域
域范围的令牌应用于发生在域级别的服务。而不是在项目或用户层面。这种类型的令牌具有包含域服务目录的有效负载,并且仅限于不需要每个项目端点的服务。令牌有效负载还包含指定域中用户的特性和角色信息。
📜提供令牌
令牌提供程序有四种类型:UUID、PKI、PKIZ和最新的提供程序Fernet。所有令牌都由一个有效负载组成,以JSON或随机生成的UUID格式。包含在传输格式中,例如url友好的十六进制或加密消息语法(CMS)打包。OpenStack的默认令牌提供程序更改了几次,因为OpenStack开发人员试图解决令牌大小、安全性和性能问题。
📑UUID令牌
UUID令牌是原始和默认令牌提供者直到Red Hat OpenStack 2。它们是随机生成的32字节的UUID,必须持久地存储在身份服务的配置后端中,以允许身份服务在每次用户向任何服务端点发出服务请求时验证UUID。尽管uuid是轻量级的,并且易于通过简单的查找进行验证,但它们有两个缺点
- 首先,因为UUID令牌必须由身份服务后端保留以进行重复查找,所以所使用的存储空间随着新令牌的生成而增长。直到最近,过期的令牌还没有从后端存储中清除,导致服务性能随时间下降。
- 其次,每个单独的服务API调用必须将请求和令牌捆绑在一起发送到服务组件,在服务组件中,服务解包UUID并向身份服务发送验证请求。身份服务查找令牌的身份以确定用户的角色和授权,然后将信息发送回资源服务,以确定服务组件是否将处理用户请求。这将产生大量的网络流量和来往于身份服务的活动,这就造成了伸缩性限制。
📑PKI 和 PKIZ 令牌
Public Key Infrastructure (PKI)令牌是在Red Hat OpenStack 3中引入的,作为一种解决方案,它可以减少身份服务后端上的规模限制开销,并通过使用证书和密钥签名和验证令牌来提高令牌的安全性。PKI使用JSON有效负载、非对称密钥和加密消息语法(CMS)传输格式。PKIZ令牌在JSON有效负载签名后应用zlib压缩以缩小总令牌大小,通常超过1600字节。有效负载包含服务目录,其大小通常与目录中服务条目的数量成比例
由于使用公钥方法,PKI令牌的优点是请求资源服务组件能够验证和读取有效负载授权,而无需为每个请求将令牌发送回身份服务。要处理请求令牌,所请求的服务只需要获得身份服务的签名证书、当前的撤销列表和验证签名证书的CA公共证书。经过验证和未编码的令牌和有效负载使用Memcached存储和共享,消除了一些重复的令牌处理开销。
PKI令牌提供者方法的缺点是由于过大的共享缓存,身份服务后端增加的负载以及与处理大型负载令牌相关的其他问题而导致无法接受的性能。PKI令牌需要更长的时间来创建和验证UUID令牌。因此,UUID令牌取代了PKI和PKIZ令牌,再次成为推荐的令牌提供程序。PKI和PKIZ令牌支持在Mitaka版本中被弃用,在Ocata版本中被删除。
📑Fernet令牌
Fernet令牌是一种对称密钥加密认证方法的实现,使用相同的密钥进行加密和解密,专为处理服务APl请求令牌而设计。Fernet支持使用多个密钥,始终使用列表中的第一个密钥(当前密钥)来执行加密,然后尝试使用早期密钥和暂存密钥(计划成为当前)来执行解密。这种技术允许周期性地轮转Fernet密钥以提高安全性,同时仍然允许用以前密钥创建的令牌被解密。
Fernet令牌不超过250字节,并且不会持久存在于身份服务后端。Fernet令牌有效负载使用MessagePack二进制序列化格式有效地进行身份验证和授权的元数据,然后再进行加密和签名。Fernet令牌不需要持久性,也不需要维护。因为它们是在任何能够访问Fernet对称密钥的身份服务节点上即时创建和验证的。对称的密钥在密钥存储库中的所有身份服务节点上存储和共享,该密钥存储库默认位于/etc/keystone/fernet-keys/。在Kilo版本中引入了Fernet令牌提供程序,并成为Ocata版本中的默认令牌提供程序。在早期的OpenStack开发人员文档中,这些令牌被称为已验证加密(AE)令牌。
注意:所有这些令牌提供程序(UUID、PKI、PKIZ和Fernet)被称为承载令牌,这意味着持有令牌的任何人都可以模拟该令牌中表示的用户,而不必提供任何身份验证凭证。持有者令牌必须受到保护,避免不必要的披露,以防止未经授权的访问。
📜令牌管理
令牌提供程序在正确安装和配置之后,通常需要最少的管理任务。UUID令牌需要按要求刷新过期令牌。PKI令牌提供者需要维护证书,过期、撤消以及持久存储的管理。为了安全起见,Fernet令牌需要按规定轮转密钥。在多节点HA部署中,将密钥存储库分配到所有身份服务节点。因为Fernet令牌现在是默认的令牌提供程序,所以本节只讨论Fernet令牌管理任务。
📑Fernet密钥
Fernet令牌不需要持久性,但是为了验证Fernet令牌,所有身份服务节点必须能够访问Fernet对称密钥。因为记号应该被替换为了最小化创建模拟的Fernet令牌的能力,Fernet令牌提供程序使用一个轮转方法来使用新的对称密钥,而不破坏解密使用前一个密钥创建的Fernet令牌的能力。
Fernet根据轮转中每个键的索引数字来命名它的密钥。它将这些密钥存储在一个密钥库中,这个库默认是控制节点上的/var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys目录。Fernet在轮转过程中使用了三种类型的密钥。
📑主密钥
主密钥被认为是当前密钥。在一个身份服务节点上只能识别一个主键,因为它的文件名总是具有最高的索引号。主密钥用于加密和解密Fernet令牌。
📑次要密钥
次要密钥是一种密钥,以前是主密钥,已经被替换(轮转),它只用于解密Fernet令牌:具体地说,就是对原先加密过的任何剩余的Fernet令牌进行解密。一个副密钥的文件用一个比最高密钥低的索引来命名,但是它的索引从不为0
📑次密钥
次密钥是一个新添加的密钥,当这些密钥下一次轮转时,它将成为下一个主密钥。与次要密钥类似,它只用于解密令牌,这似乎是不必要的,因为它没有审查为主密钥,而且从来没有在身份服务节点上加密令牌。然而,在一个多码身份服务配置中,在密钥存储库用一个新的次密钥更新并分发到所有身份服务节点之后,这些节点将一次执行一个密钥轮转。可能需要一个节点上的暂存密钥来解密另一个节点创建的令牌(该密钥已经成为主密钥)。暂存密钥总是通过索引为0的文件名重新编码
可参考别人文章的分享:https://www.cnblogs.com/dhplxf/p/7966890.html
📑轮转Fernet密钥
默认情况下,overcloud的Fernet管理由Director使用Mistral来执行。管理员应该使用Mistral来启动Fernet键的轮转。当以这种方式初始化时,Mistral将存储Fernet 密钥,并且这些密钥将跨堆栈更新持久化。
要启动Fernet键轮转,执行相关的Mistral工作流tripleo.fernet_keys.v1.rotate_fernet_keys,作为控制器上的stack用户。
使用工作流执行输出中显示的ID,查询工作流执行的状态。当工作流执行完成时,工作流执行的状态将显示为成功。
完成Fernet密钥轮转后,检查控制节点上/var/lib/confiq-data/puppet -generated/keystone/etc/keystone/Fernet -keys目录的内容。您将看到从0开始的编号文件列表。
编号的文件名表示每个文件中包含的密钥的索引。以0索引命名的文件包含新的暂存密钥。以最高索引作为文件名的文件包含新的主密钥。所有其他名称在最高和最低索引之间的文件都包含次要密钥。
📑Fernet密钥轮转频率
对Fernet 密钥的强制轮转限制了攻击者使用折衷密钥获得对OpenStack环境的非授权访问的风险。但是,如果密钥轮转得太频繁。有可能无意中删除了解密有效令牌所需的次要密钥。为了将密钥的移除限制为不再用于令牌加密和解密的密钥,管理员需要在身份服务确认文件中正确确认Fernet令牌参数:
第二个重要参数是max_active_keys,它位于身份服务配置文件的fernet_tokens内容之下。这个参数决定了在任何给定的时间有多少fernet密钥可以同时活动。您可以使用以下命令来显示它的值:
Fernet密钥轮转的时间间隔不能超过令牌到期时间除以小于max_active_keys值的2。因此,在我们的示例中,当令牌过期时间为57600秒,且最多有5个活动的Fernet密钥时,我们不应该比每19200秒或者5小时20分钟轮转Fernet密钥更频繁。如果需要更频繁的轮换。然后,需要依次修改令牌过期参数、max_active_keys参数或两者,以确保对未过期的Fernet令牌进行加密或解密时,不会无意间删除所需的密钥。
📜课本练习
- 启动Fernet密钥轮转。
- 验证Fernet密钥轮转。
[student@workstation ~]$ lab identity-tokens setup
Setting up environment for the exercise:
• Verifying environment....................................... SUCCESS
📑1. 使用crudini命令来确定overcloud是否使用Fernet令牌。
[root@controller0 ~]# crudini --get /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf token provider
fernet
[root@controller0 ~]#
[root@controller0 ~]# crudini --get /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf token driver
sql
📑2. 使用crudini命令确定Fernet密钥存储库的位置,以及活动的Fernet密钥的最大数量。
[root@controller0 ~]# crudini --get /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf fernet_tokens key_repository
/etc/keystone/fernet-keys
[root@controller0 ~]# crudini --get /var/lib/config-data/puppet-generated/keystone/etc/keystone/keystone.conf fernet_tokens max_active_keys
5
📑3.显示激活的Fernet密钥的列表。
[root@controller0 ~]# ll /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/
total 8
-rw-------. 1 42425 42425 44 Oct 23 2018 0
-rw-------. 1 42425 42425 44 Oct 23 2018 1
📑4. 显示活动的Fernet密钥文件的内容。该文件不以换行符结束,因此使用cat命令和echo命令可以更容易地查看关键文件的内容。
[root@controller0 ~]# cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/0; echo
y9f0YApLj1Z7BGBQyxjgF58RMga78y-DBNMR-cd9r2w=
[root@controller0 ~]#
[root@controller0 ~]# cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/1; echo
d9w1tgQhBMWxHOVZ12fB1l2imFcris4UHB-ToPOG4aM=
📑5. 轮转Fernet密钥。
执行Mistral工作流以启动Fernet密钥的轮转。
(undercloud) [stack@director ~]$ openstack workflow execution create tripleo.fernet_keys.v1.rotate_fernet_keys '{"container": "overcloud"}'
+--------------------+-------------------------------------------+
| Field | Value |
+--------------------+-------------------------------------------+
| ID | 8b5dd66e-fcc7-4e94-8c35-47572fe509ee |
| Workflow ID | c00289f9-612a-4744-b94a-a24d8e89736b |
| Workflow name | tripleo.fernet_keys.v1.rotate_fernet_keys |
| Workflow namespace | |
| Description | |
| Task Execution ID | <none> |
| State | RUNNING |
| State info | None |
| Created at | 2020-10-19 07:30:42 |
| Updated at | 2020-10-19 07:30:42 |
+--------------------+-------------------------------------------+
等待两分钟左右,然后查看工作流执行的状态。使用前一个命令输出中显示的工作流执行ID。当状态显示成功时继续。
(undercloud) [stack@director ~]$ openstack workflow execution show 8b5dd66e-fcc7-4e94-8c35-47572fe509ee
+--------------------+-------------------------------------------+
| Field | Value |
+--------------------+-------------------------------------------+
| ID | 8b5dd66e-fcc7-4e94-8c35-47572fe509ee |
| Workflow ID | c00289f9-612a-4744-b94a-a24d8e89736b |
| Workflow name | tripleo.fernet_keys.v1.rotate_fernet_keys |
| Workflow namespace | |
| Description | |
| Task Execution ID | <none> |
| State | SUCCESS |
| State info | None |
| Created at | 2020-10-19 07:30:42 |
| Updated at | 2020-10-19 07:33:35 |
+--------------------+-------------------------------------------+
📑6. 返回到controllero系统并在repository目录中列出活动的Fernet密钥。
[root@controller0 ~]# ll /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/
total 12
-rw-------. 1 42425 42425 44 Oct 19 07:32 0
-rw-------. 1 42425 42425 44 Oct 19 07:32 1
-rw-------. 1 42425 42425 44 Oct 19 07:33 2
📑7. 显示活动的Fernet密钥文件的内容。
[root@controller0 ~]# cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/0; echo
_OeHKlsDRYpiG9Gf0RqRxePa7ZIWolSEr1tns7dsfS8=
[root@controller0 ~]# cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/1; echo
d9w1tgQhBMWxHOVZ12fB1l2imFcris4UHB-ToPOG4aM=
[root@controller0 ~]# cat /var/lib/config-data/puppet-generated/keystone/etc/keystone/fernet-keys/2; echo
y9f0YApLj1Z7BGBQyxjgF58RMga78y-DBNMR-cd9r2w=
📑8. 观察密钥文件
注意,上一个分段密钥文件0的内容现在已经轮转到索引最高的密钥文件2中。现在是主密钥。还要注意,上一个主密钥文件1的内容现在位于索引第二高的密钥文件1中,并且现在是次密钥。最后,请注意,暂存密钥文件0现在包含一个新的暂存密钥。
📑清除实验
[student@workstation ~]$ lab identity-tokens cleanup
💡总结
RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。
以上就是【金鱼哥】对 第三章 集成身份管理--管理身份服务令牌 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
💾 红帽认证专栏系列:
RHCSA专栏: 戏说 RHCSA 认证
RHCE专栏: 戏说 RHCE 认证
此文章收录在RHCA专栏: RHCA 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!