增强联合身份映射算法¶
联合身份验证和授权功能随 OpenStack Icehouse 版本发布。其中一个核心功能是 映射 引擎,它将联合身份(例如 SAML2/OpenId Connect)断言中的身份属性转换为 Keystone 特定的参数(user_id、groups)。映射引擎基于为每个已注册的 Identity Provider 配置的 映射 规则 运行。映射规则指定如何解释断言,以授予临时用户访问某些资源的权限。然而,围绕增强映射引擎和映射规则“语言”以实现更轻松、更强大的配置能力,出现了许多讨论。允许云管理员控制分配给临时(联合身份)用户的授权也很重要。
问题描述¶
目前,基础设施准备的一部分是配置 projects、domains、role assignments 和 groups,用于临时用户。这种方法已经足够好,但是对于某些特定用例,可以使其更加透明和自动化。为了涵盖所有可能的组合,需要创建大量的规则。例如,需要为将远程组 devs 的成员映射到本地组 devs、将远程组 admins 的成员映射到本地组 admins 等创建单独的规则。
提议的变更¶
扩展映射引擎,允许将断言/声明中发送的组作为有效本地 Keystone 组的子集。也就是说,通过在用户的主公司/机构中成为 group1、group2 和 group3 组的成员,用户将有效地成为云中临时用户中的这些组的成员。请注意,云管理员仍然需要预先添加这些组。能够白名单和黑名单有效组列表至关重要。否则,如果在用户的家庭配置中分配了组 admin,他将成为云中的 admin 组的成员。通过拥有白名单和黑名单功能,云管理员仍然可以控制用户访问权限。当前的映射引擎功能,例如指定有效组应该保留,因此提议的更改是累加的并且向后兼容。此外,云管理员(或构建映射规则的任何人)应该能够指定有效域(通过 name 或 id 标识)。这是必需的,因为组通常通过名称指定,并且必须存在域名才能精确标识系统中的组实体。
提议的更改包括
更改
local实体,以便可以通过name和domain标识有效组,而不仅仅是id。以下是旧语法和新语法本地groups标识的示例
{
"group" {
"name": "developers",
"domain": {
"name": "clients"
}
}
},
{
"group": {
"id": "89678b"
}
}
将参数表示为应直接映射的组列表,并添加另一个
keywords用于白名单和黑名单有效组列表。在以下示例中,有效地只有来自ADFS_GROUPS的用“;”分隔的组集与whitelist(允许此组集)的交集,以及ADFS_GROUPS_2和blacklist(允许除此列表之外的所有内容)之间的差值将被传递。规则中只能使用一个关键字(whitelist或blacklist)。如果同时使用两者,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方法,允许通过name和domain标识的group对象。此方法将不会通过 v3 Identity API 暴露。增强映射引擎,以便可以通过
name和其domain标识组。添加关键字
whitelist、blacklist以及将断言参数视为用户所属的组集合的能力。
依赖项¶
无。
文档影响¶
应仔细解释和记录新的映射功能,并指出如果云配置不当可能存在的安全风险。
参考资料¶
无。