RBAC 策略测试

https://blueprints.launchpad.net/tempest/+spec/rbac-policy-testing

OpenStack 部署具有标准的 RBAC(基于角色的访问控制)策略,这些策略会被 OpenStack 用户以不同的方式定制。需要强制执行和验证这些策略,以确保 OpenStack 部署的安全运行。

问题描述

目前,没有统一的方法来测试 RBAC 策略是否被正确执行。这一点很重要,因为这些策略定义了如何访问潜在的敏感信息和功能。

提议的变更

建议的解决方案是创建一个插件,该插件能够以验证指定 rbac_role 上是否正确执行了单个策略的方式编写 RBAC 测试。测试应主要作为现有 Tempest 测试的扩展来编写,并被插件的功能所包装。该插件根据该服务的 policy.json 文件确定哪些角色应该有权访问给定的 API。

例如,可以编写一个测试,仅测试“compute_extension:services”的策略,如下所示

@test.requires_ext(extension='os-services', service='compute')
@rbac_rule_validation.action(
    component="Compute",
    rule="compute_extension:services")
@test.idempotent_id('ec55d455-bab2-4c36-b282-ae3af0efe287')
def test_services_ext(self):
    try:
        rbac_utils.switch_role(self, switchToRbacRole=True)
        self.client.list_services()
    finally:
        rbac_utils.switch_role(self, switchToRbacRole=False)

这些测试的一个关键方面是,它们仅测试单个策略,即使正常的流程可能需要使用涵盖多个策略的操作。为了实现这一点,测试中使用的角色将在“admin”和配置选项中指定的“rbac_role”之间交替。这样做是为了确保除了被测试的策略之外,没有其他策略会改变测试结果。要切换角色,调用 rbac_utils 的 switch_role 方法。使用 switchToRbacRole=True 调用该方法会告诉 Keystone 将当前角色设置为“rbac_role”,而使用 switchToRbacRole=False 调用该方法会告诉 Keystone 将当前角色设置为“admin”。

这项工作包括为新的测试创建插件,以验证正确的 RBAC 策略执行。这项工作将包括示例测试,但并非旨在提供所有策略和 API 的完整测试覆盖。核心代码将存在于包含插件的外部存储库中,而单个测试将在插件内编写。目前不需要向 tempest/lib 添加任何功能,但这可能会随着更多测试的编写而改变。

替代方案

另一种选择是利用正在考虑的 cinnamon-role 插件。

优点:利用 cinnamon-role 插件可以在现有测试周围包装 RBAC 功能,只需付出最少的额外努力。

缺点:Cinnamon-role 不允许在测试过程中切换角色来测试单个 API 端点。

另一种选择是将 RBAC 测试框架添加到 Tempest 的核心功能中。

优点:部署更容易,不需要额外的插件。

缺点:Rbac 测试不被认为是 Tempest 核心功能的一部分。

项目

列出受此规范影响的 QA 项目。例如:* openstack/tempest

实现

负责人

主要负责人

david-purcell [david.purcell@att.com] jallirs [randeep.jalli@att.com] syjulian [julian.sy@att.com] fm577c [felipe.monteiro@att.com] sblanco1 [samantha.blanco@att.com]

里程碑

完成目标里程碑

ocata-2

工作项

  • 创建角色测试插件

  • 如果需要,向 tempest/lib/rbac 添加支持代码

  • 添加初始测试组

依赖项