支持 TOTP 认证

bp totp-auth

支持基于时间的一次性密码 (TOTP) 认证作为一种独立的认证机制。来自 Wikipedia

基于时间的一次性密码算法 (TOTP) 是一种从共享密钥和当前时间计算一次性密码的算法。它已被采用为互联网工程任务组标准 RFC 6238,是开放身份验证倡议 (OATH) 的基石,并被用于许多双因素身份验证系统。

该算法被 Google 用于提供“持有因素”作为其多因素身份验证方法的一部分(Gmail、Google Authenticator)。同样适用于 Keystone。

问题描述

Keystone 尚未正式支持多因素身份验证,我们也没有正式支持超出“知识因素”(例如密码)的其他身份验证因素。为了提供更强的身份验证,我们首先必须支持第二个因素,例如“持有因素”(例如生成一次性密码的设备)或“固有因素”(与用户相关联的因素,例如指纹)。本规范建议提供“持有因素”作为实现真正的多因素身份验证的先决条件。

为了支持多种因素,部署者需要继续支持现有的密码机制(例如)以及 TOTP 机制。为了能够在给定的身份验证请求中区分使用哪个机制,TOTP 需要成为一个独立的身份验证插件。

提议的变更

添加一个 totp` 认证方法。

仅使用 totp 认证插件的示例请求(这本身在现实世界中并不特别有用,但说明了 totp 插件在与现有插件相比时不会受到任何不同对待)

{
    "auth": {
        "identity": {
            "methods": [
                "totp"
            ],
            "totp": {
                "user": {
                    "id": "b95b78b67fa045b38104c12fb2729cd0",
                    "passcode": "012345"
                }
            }
        },
        "scope": {
            "project": {
                "id": "9c1c4b2657a04f7fbd46237835a43f59"
            }
        }
    }
}

同时使用 totp 和现有 password 插件的示例请求

{
    "auth": {
        "identity": {
            "methods": [
                "password", "totp"
            ],
            "password": {
                "user": {
                    "id": "b95b78b67fa045b38104c12fb2729cd0",
                    "password": "password"
                }
            },
            "totp": {
                "user": {
                    "id": "b95b78b67fa045b38104c12fb2729cd0",
                    "passcode": "012345"
                }
            }
        },
        "scope": {
            "project": {
                "id": "9c1c4b2657a04f7fbd46237835a43f59"
            }
        }
    }
}

同时使用 tokentotp 认证方法的示例请求

{
    "auth": {
        "identity": {
            "methods": [
                "token", "totp"
            ],
            "token": {
                "id": "'$OS_TOKEN'",
            },
            "totp": {
                "user": {
                    "id": "b95b78b67fa045b38104c12fb2729cd0",
                    "passcode": "012345"
                }
            }
        },
        "scope": {
            "project": {
                "id": "9c1c4b2657a04f7fbd46237835a43f59"
            }
        }
    }
}

可以通过更新 Keystone 配置来交换 totp 插件。将根据用于验证的后端提供 TOTP 插件的多个实现。

认证插件需要用户识别自己并提供客户端生成的一次性密码。然后,插件将验证该一次性密码是否对用户有效。

  • Keystone 将验证给定用户启用的所有具有凭证类型“totp”的凭证,并使用它们来验证 HMAC。

  • 如果有一个匹配,则身份验证被认为成功。

  • 如果没有匹配,则身份验证被认为不成功。

  • 初始实现将不支持时间同步补偿机制,因为我们预计客户端-服务器时间漂移将非常小。

备选方案

安全影响

描述对系统造成的任何潜在安全影响。需要考虑的一些项目包括

  • 需要存储和加密用于生成一次性密码的用户密钥。稍后,此存储可以完成于 Barbican。我们可以利用 Fernet 来加密这些种子,这意味着它们将使用 AES 256 进行加密。

  • 所提出的算法涉及使用密码学 (HMAC) 进行 TOTP 计算。

通知影响

其他最终用户影响

性能影响

其他部署者影响

  • 应在 Keystone 配置文件中指定 OTP 驱动程序。

  • 此更改将添加一个新的可选 TOTP 认证插件,默认情况下未启用。

    keystone.conf 中的示例伪配置

    [auth]
    methods = password, totp
    totp = pkg.path.mfa.Totp
    

开发人员影响

实现

负责人

主要负责人

werner.mendizabal (Werner Mendizabal <nonameentername@gmail.com>)

工作项

  • 在 keystone 中添加服务器端支持,采用新的认证方法。

  • 在 keystoneauth 中添加客户端支持,采用新的认证插件。

  • 使用 keystoneauth 记录 API 和认证插件示例。

  • 添加文档,解释如何在 keystone 中启用和配置该插件。

依赖项

文档影响

参考资料