增强联合身份映射算法

bp mapping-enhancements

联合身份验证和授权功能随 OpenStack Icehouse 版本发布。其中一个核心功能是 映射 引擎,它将联合身份(例如 SAML2/OpenId Connect)断言中的身份属性转换为 Keystone 特定的参数(user_idgroups)。映射引擎基于为每个已注册的 Identity Provider 配置的 映射 规则 运行。映射规则指定如何解释断言,以授予临时用户访问某些资源的权限。然而,围绕增强映射引擎和映射规则“语言”以实现更轻松、更强大的配置能力,出现了许多讨论。允许云管理员控制分配给临时(联合身份)用户的授权也很重要。

问题描述

目前,基础设施准备的一部分是配置 projectsdomainsrole assignmentsgroups,用于临时用户。这种方法已经足够好,但是对于某些特定用例,可以使其更加透明和自动化。为了涵盖所有可能的组合,需要创建大量的规则。例如,需要为将远程组 devs 的成员映射到本地组 devs、将远程组 admins 的成员映射到本地组 admins 等创建单独的规则。

提议的变更

扩展映射引擎,允许将断言/声明中发送的组作为有效本地 Keystone 组的子集。也就是说,通过在用户的主公司/机构中成为 group1group2group3 组的成员,用户将有效地成为云中临时用户中的这些组的成员。请注意,云管理员仍然需要预先添加这些组。能够白名单和黑名单有效组列表至关重要。否则,如果在用户的家庭配置中分配了组 admin,他将成为云中的 admin 组的成员。通过拥有白名单和黑名单功能,云管理员仍然可以控制用户访问权限。当前的映射引擎功能,例如指定有效组应该保留,因此提议的更改是累加的并且向后兼容。此外,云管理员(或构建映射规则的任何人)应该能够指定有效域(通过 nameid 标识)。这是必需的,因为组通常通过名称指定,并且必须存在域名才能精确标识系统中的组实体。

提议的更改包括

  • 更改 local 实体,以便可以通过 namedomain 标识有效组,而不仅仅是 id。以下是旧语法和新语法本地 groups 标识的示例

{
    "group" {
        "name": "developers",
        "domain": {
            "name": "clients"
        }
    }
},
{
    "group": {
        "id": "89678b"
    }
}
  • 将参数表示为应直接映射的组列表,并添加另一个 keywords 用于白名单和黑名单有效组列表。在以下示例中,有效地只有来自 ADFS_GROUPS 的用“;”分隔的组集与 whitelist(允许此组集)的交集,以及 ADFS_GROUPS_2blacklist(允许除此列表之外的所有内容)之间的差值将被传递。规则中只能使用一个关键字(whitelistblacklist)。如果同时使用两者,Keystone 将拒绝此类映射规则。示例

{
    "remote": [
        {
            "type": "ADFS_GROUPS",
            "whitelist": [
                "g1", "g2", "g3", "g4"
            ]
        },
        {
            "type": "ADFS_GROUPS_2",
            "blacklist": [
                "admin", "superadmin", "managers"
            ]
        },
    ]
},
{
    "local": [
        {
            "groups": {0},
            "domain": {
                "name": "domain_name"
            }
        },
        {
            "groups": {1},
            "domain": {
                "id": "456hy643"
            }
        },
    ]

}

备选方案

无。

安全影响

  • 此更改是否涉及敏感数据,例如令牌、密钥或用户数据?

    否。

  • 此更改是否以可能影响安全性的方式更改了 API,例如访问敏感信息的新方式或登录的新方式?

    否。

  • 此更改是否涉及密码学或哈希?

    否。

  • 此更改是否需要使用 sudo 或任何特权?

    否。

  • 此更改是否涉及使用或解析用户提供的数据?这可能是直接在 API 级别,或间接例如更改缓存层。

    它为 Keystone 中已有的机制添加了新功能。

  • 此更改是否会启用资源耗尽攻击,例如允许单个 API 交互消耗大量的服务器资源?这方面的一些例子包括为每个连接启动子进程,或 XML 中的实体扩展攻击。

    否。

通知影响

无。

其他最终用户影响

python-keystoneclient 不需要任何更改,因为更改的是规则结构。可能可以简化整体配置,方法是不准备所有有效组。

性能影响

无。

其他部署者影响

如果使用直接组映射,部署者应仔细指定白名单和黑名单,以防止任何权限提升。

开发人员影响

无。

实现

负责人

主要负责人

Marek Denis <marek-denis>

其他贡献者

Nathan Kinder <nkinder> Rodrigo Duarte <rodrigodsousa> Victor Silva <vsilva> Henry Nash <henry-nash>

工作项

  • 实现 get_group_by_name 方法,允许通过 namedomain 标识的 group 对象。此方法将不会通过 v3 Identity API 暴露。

  • 增强映射引擎,以便可以通过 name 和其 domain 标识组。

  • 添加关键字 whitelistblacklist 以及将断言参数视为用户所属的组集合的能力。

依赖项

无。

文档影响

应仔细解释和记录新的映射功能,并指出如果云配置不当可能存在的安全风险。

参考资料

无。