支持 TOTP 认证¶
支持基于时间的一次性密码 (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"
}
}
}
}
同时使用 token 和 totp 认证方法的示例请求
{
"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 中启用和配置该插件。
依赖项¶
无
文档影响¶
无