每用户认证插件需求

bp per-user-auth-plugin-reqs

Keystone 应该能够支持要求(基于每个用户)认证插件(Keystone 服务器支持的插件)以进行认证。

问题描述

在许多服务(Web 或其他)中,可以要求某些用户使用不同的认证方法。目前 Keystone 不具备此功能。Keystone 能够支持多种认证类型(例如密码、TOTP、x509 等)。Keystone 无法要求用户(甚至用户组)必须使用特定的(或组合的)插件进行认证;使用任何插件(单独使用)足以提供认证。

提议的变更

Keystone 将支持要求(基于每个用户)某些认证插件,以提供认证。这意味着可以要求用户使用一组认证插件(例如,必须使用“密码 AND TOTP” OR “x509” OR “密码 AND 一次性备份码”)。如果用户没有配置规则(或在逻辑 OR 的情况下,一组规则),则当前的默认行为“Keystone.conf 中配置的任何单个认证插件”将继续有效。

这些规则将以 JSON 格式表示

{
    "required_auth_plugins": [
        ["password", "totp"],
        ["x509"],
        ["password", "one-time-backup"]
    ]
}

这些必需插件的值将作为通过 ORM 关系在用户对象中引用的新表添加。数据库模式将使用 blob 类型(序列化为 JSON)来存储规则集。

如果配置了必需的插件,但未在 Keystone.conf 中启用,则该规则的一部分将被简单地忽略(例如,“密码 AND TOTP”是规则,但 Keystone.conf 仅启用了“密码”,则“TOTP”将被简单地忽略,作为任何/所有用户的认证要求)。

如果用户“需要”的插件只有一个,并且该插件被禁用,Keystone 将回退到默认行为,即“任何配置的插件都足够”。

认证请求将符合 Keystone 当前的标准,用于处理多种认证插件形式

{
    "auth": {
        "identity": {
            "methods": [
                "password",
                "totp"
            ],
            "password": {
                "user": {
                    "id": "0ca8f6",
                    "password": "secretsecret"
                }
            },
            "totp": {
                "user": {
                    "id": "0ca8f6",
                    "passcode": "011011"
                }
            }
        },
        "scope": {
            "domain": {
                "id": "1789d1"
            }
        }
    }
}

如果提供的认证插件不足,将返回 HTTP 401,并附带 JSON 响应,指示认证参数不足。无论传递给认证插件的值是否正确,此响应都将相同。在验证传递给插件的数据之前,将比较给定请求的必需插件与提供的插件数据。

从长远来看,更灵活的认证工作流程,例如提供用户、然后密码、然后 OTP(跨多个页面),可能会使用允许逐步完成工作流程的临时认证令牌来开发。但是,如果实施/处理不当,这些可能会泄露安全信息(用户存在、密码验证等)。

需要一个自助 API(类似于密码更改)来启用给定用户的强制规则。 update-user 可以由管理员直接进行更改。

备选方案

通过联合身份验证使用外部 IDP 可以添加 MFA 风格的支持,如果 IDP(例如“FreeIPA”)原生支持 MFA 的概念。

可以添加更多具有编码在其中的业务逻辑的认证插件形式。例如,一个密码+TOTP 插件,如果用户具有 TOTP 类型的凭据,则会从密码末尾剥离 TOTP,从而实际上使 TOTP+密码成为必需的,但允许使用当前的工作流程。缺点是,随着创建更多的认证方法,认证插件需要变得非常复杂,而不是允许使用规则集来管理哪些认证插件是必需的。

安全影响

这增加了可选的安全功能,允许基于每个用户的不同认证安全级别。

通知影响

NONE

其他最终用户影响

如果启用了规则,终端用户需要使用规则中为该用户指定的必需的认证插件进行认证。

性能影响

认证可能会略微变慢,因为需要处理多个认证插件。总体性能应与今天大致相同。

其他部署者影响

希望强制使用多种认证类型的部署者需要使用新规则创建用户(和/或更新当前用户)。如果部署者不希望用户更新认证插件要求,则需要更新策略以拒绝访问新的自助认证插件要求 API。

开发人员影响

没有重大影响。

实现

负责人

主要负责人

Morgan Fainberg <mdrnstm> Adrian Turjak <adriant-y>

其他贡献者

N/A

工作项

  • 实施数据库迁移以添加用于用户的新的列

  • 支持在认证时要求新的“required_auth_plugins”属性中指定的认证类型。

  • 实施用于更新所需认证插件的自助 API

  • 编写关于更新的认证形式和新的自助 API 的文档(API-REF)。

  • 为自助 API 添加对 keystoneclient 的支持

  • 为更好地处理提供的认证类型不足,添加对 keystoneauth 的支持。

  • 确保 keystoneauth 支持一次使用多个认证插件。

  • 与 Horizon 和 Openstackclient 团队合作,确保对新的多认证类型处理提供良好的 UI/UX。

依赖项

没有外部依赖项。

文档影响

需要新 API 和新认证功能的文档。

参考资料

没有外部引用