22.3. 一次性密码
重要
用于 OTP 验证的 IdM 解决方案仅支持运行 Red Hat Enterprise Linux 7.1 或更高版本的客户端。
一次性密码(OTP)是一种仅对一个身份验证会话有效的密码,在使用后会无效。不同于传统的静态密码,身份验证令牌生成的 OTP 会不断更改。OTP 作为双因素验证的一部分:
- 用户使用传统密码进行身份验证。
- 用户提供由可识别的 OTP 令牌生成的 OTP 代码。
双因素身份验证被认为比仅使用传统密码进行身份验证更为安全。即使潜在的入侵者在登录期间截获 OTP,被拦截的 OTP 也会在那个时候无效,因为它只能用于成功验证一次。
警告
以下安全性和其他限制目前与 IdM 中的 OTP 支持相关:
- 最重要的安全限制是可能出现跨系统重播攻击的漏洞。复制是异步的,因此 OTP 代码可以在复制期间重复使用。个用户可以同时登录两台服务器。但是,由于综合加密,此漏洞通常很难被利用。
- 无法使用不支持 OTP 验证的客户端获取票据(TGT)。这可能会影响某些用例,如使用
mod_auth_kerb
模块或通用安全服务 API (GSSAPI)进行身份验证。 - 如果启用了 FIPS 模式,则无法在 IdM 解决方案中使用密码 + OTP。
22.3.1. IdM 中的 OTP 身份验证如何工作
22.3.1.1. IdM 中支持的 OTP 令牌
软件和硬件令牌
IdM 同时支持软件和硬件令牌。
用户管理和管理员管理的令牌
用户可以管理自己的令牌,或者管理员可以为其管理自己的令牌:
- 用户管理的令牌
- 用户可以完全控制身份管理中的用户管理令牌:允许他们创建、编辑或删除其令牌。
- 管理员管理的令牌
- 管理员将管理员管理的令牌添加到用户帐户。用户本身具有此类令牌的只读访问权限:他们没有管理或修改令牌的权限,而且无需以任何方式配置令牌。
请注意,如果令牌目前是唯一活跃的令牌,则用户无法删除或取消激活令牌。作为管理员,您无法删除或取消激活最后一个活跃令牌,但您可以删除或取消激活其他用户的最后一个活跃令牌。
支持的 OTP 算法
身份管理支持以下两个标准的 OTP 机制:
- 基于 HMAC 的一次性密码(HOTP)算法是基于计数器的。HMAC 代表哈希消息身份验证代码。
- 基于时间的一次性密码(TOTP)算法是 HOTP 的扩展,来支持基于时间的移动因子。
22.3.1.2. 可用的 OTP 身份验证方法
启用 OTP 身份验证时,您可以从以下验证方法中选择:
- 双因素身份验证(密码 + OTP)
- 使用此方法时,始终需要用户输入标准密码和 OTP 代码。
- 密码
- 使用此方法时,用户仍可以选择仅使用标准密码进行身份验证。
- RADIUS 代理服务器身份验证
- 有关为 OTP 验证配置 RADIUS 服务器的详情,请参考 第 22.3.7 节 “从专有 OTP 解决方案进行迁移”。
全局和用户特定身份验证方法
您可以全局或单独用户配置这些身份验证方法:
- 默认情况下,特定于用户的验证方法设置优先于全局设置。如果没有为用户设置身份验证方法,则将应用全局定义的方法。
- 您可以为任何用户禁用按用户的身份验证方法设置。这样可确保 IdM 忽略每个用户的设置,并且始终为用户应用全局设置。
组合多个身份验证方法
如果您一次设置多个方法,则其中任一方法都足以成功验证。例如:
- 如果您同时配置了双因素和密码身份验证,则用户必须提供密码(第一因素),但在使用命令行时,提供 OTP(第二个因子)是可选的:
First Factor: Second Factor (optional):
- 在 Web UI 中,用户仍然必须提供这两个因素。
注意
单个主机或服务可以配置为需要特定的身份验证方法,如 OTP。如果您试图仅使用第一个因素对此类主机或服务进行身份验证,您将被拒绝访问。请参阅 第 22.4 节 “根据用户身份验证的方式限制对服务和主机的访问”。
但是,当配置了 RADIUS 和另一个验证方法时,会出现一个小的异常:
- Kerberos 将始终使用 RADIUS,但 LDAP 不会用到。LDAP 仅识别密码和双因素身份验证方法。
- 如果您使用外部的双因素身份验证供应商,请使用应用程序中的 Kerberos。如果您要仅允许用户使用密码进行身份验证,请使用 LDAP。建议应用利用 Apache 模块和 SSSD,允许配置 Kerberos 或 LDAP。
22.3.1.3. GNOME 密钥环服务支持
IdM 将 OTP 身份验证与 GNOME 密钥环服务集成。请注意,GNOME Keyring 集成要求用户单独输入第一个和第二个因素:
First factor: static_password Second factor: one-time_password
22.3.1.4. 使用 OTP 进行离线身份验证
IdM 支持离线 OTP 身份验证。但是,为了能够脱机登录,用户必须首先通过输入静态密码和 OTP 分别在系统联机时进行验证:
First factor: static_password Second factor: one-time_password
如果在在线登录时单独输入了这两个密码,那么即使中央身份验证服务器不可用,用户也可以进行身份验证。请注意,只有在用户离线验证时,IdM 才会提示输入传统静态密码。
IdM 还支持在
First factor
提示符的一个字符串中同时输入静态密码和 OTP。但请注意,这与离线 OTP 身份验证不兼容。如果用户在单个提示符中输入了这两个因素,IdM 始终必须在身份验证时联系中央身份验证服务器,这需要系统在线。
重要
如果您在同样离线操作的设备(如笔记本电脑)中使用 OTP 验证,红帽建议单独输入静态密码和 OTP 以确保可以使用离线验证。否则,IdM 不允许您在系统离线后登录。
如果要从 OTP 离线验证中受益,除了单独输入静态和 OTP 密码外,还要确保满足以下条件:
/etc/sssd/sssd.conf
文件中的cache_credentials
选项设置为True
,这将启用缓存第一个因素密码。- 第一个因素静态密码满足
/etc/sssd/sssd.conf
中设置的cache_credentials_minimal_first_factor_length
选项中定义的密码长度要求。默认最小长度为 8 个字符。有关这个选项的详情请参考 sssd.conf(5) man page。
请注意,即使
/etc/sssd/sssd.conf
中的 krb5_store_password_if_offline
选项被设置为 true
,SSSD 不会在系统再次上线时尝试刷新 Kerberos ticket-granting ticket (TGT),因为 OTP 可能已在此时无效。要在这种情形中获取 TGT,用户必须使用这两个因素再次进行身份验证。
22.3.2. 在 FIPS 模式运行的 IdM 服务器中配置 RADIUS 代理所需的设置
在联邦信息处理标准(FIPS)模式中,OpenSSL 默认禁用 MD5 摘要算法。因此,因为 RADIUS 协议需要 MD5 在 RADIUS 客户端和 RADIUS 服务器间加密 secret,因此 FIPS 模式的 MD5 不可用会导致 IdM RADIUS 代理服务器失败。
如果 RADIUS 服务器与 IdM master 在相同的主机上运行,您可以解决这个问题并在安全边界中启用 MD5,请执行以下步骤:
- 使用以下内容创建
/etc/systemd/system/radiusd.service.d/ipa-otp.conf
文件:[Service] Environment=OPENSSL_FIPS_NON_APPROVED_MD5_ALLOW=1
- 重新载入
systemd
配置:# systemctl daemon-reload
- 启动
radiusd
服务:# systemctl start radiusd
22.3.3. 启用两个事实器身份验证
有关与 OTP 相关的可用验证方法的详情,请参考 第 22.3.1.2 节 “可用的 OTP 身份验证方法”。
启用双因素验证:
- Web UI,请参阅 “Web UI:启用两个事实器身份验证”一节。
- 命令行请查看 “命令行:启用两个事实器身份验证”一节。
Web UI:启用两个事实器身份验证
要为所有用户全局设置身份验证方法:
- 选择
。 - 在 User Options 区域中,选择所需的默认用户身份验证类型。
图 22.4. 用户身份验证方法
要确保按用户设置没有覆盖全局设置,请选择 Disable per-user override。如果您没有选择 Disable per-user 覆盖,则每个用户配置的身份验证方法优先于全局设置。
以每个用户为基础单独设置验证方法:
- 选择
,然后单击要编辑的用户名称。 - 在 帐户设置 区域中,选择所需的 用户身份验证类型。
图 22.5. 用户身份验证方法
命令行:启用两个事实器身份验证
要为所有用户全局设置身份验证方法:
- 运行 ipa config-mod --user-auth-type 命令。例如,将全局身份验证方法设置为双因素验证:
$ ipa config-mod --user-auth-type=otp
如需--user-auth-type
接受的值列表,请运行 ipa config-mod --help 命令。 - 要禁用每个用户覆盖,因此请确保不使用每个用户的设置覆盖全局设置,同时添加
--user-auth-type=disabled
选项。例如,要将全局身份验证方法设置为双因素验证,并禁用每个用户覆盖:$ ipa config-mod --user-auth-type=otp --user-auth-type=disabled
如果没有设置--user-auth-type=disabled
,则每个用户配置的身份验证方法优先于全局设置。
为指定用户单独设置身份验证方法:
- 运行 ipa user-mod --user-auth-type 命令。例如,要设置
该用户
需要使用双因素身份验证:$ ipa user-mod user --user-auth-type=otp
要设置多种身份验证方法,请多次添加 --user-auth-type。例如,要为所有用户全局配置密码和双因素身份验证:
$ ipa config-mod --user-auth-type=otp --user-auth-type=password
22.3.4. 添加用户管理的软件令牌
- 使用标准密码登录。
- 在 IdM Web UI 或命令行中创建软件令牌。
- 要在 Web UI 中创建令牌,请单击 OTP 令牌 选项卡下的 Add。如果您以管理员身份登录,则可通过 Authentication 选项卡访问 OTP Tokens 选项卡。
图 22.6. 为用户添加 OTP 令牌
- 要从命令行创建令牌,请运行 ipa otptoken-add 命令。
$ ipa otptoken-add ------------------ Added OTP token "" ------------------ Unique ID: 7060091b-4e40-47fd-8354-cb32fecd548a Type: TOTP ...
有关 ipa otptoken-add 的更多信息,请运行带有--help
选项的命令。
- Web UI 或命令行中会显示 802.11 代码。使用
FreeOTP Authenticator
扫描 QR 代码,将令牌置备到移动设备。
22.3.5. 添加用户管理的 YubiKey 硬件令牌
可编程性硬件令牌(如 YubiKey 令牌)只能从命令行添加。以拥有令牌的用户添加 YubiKey 硬件令牌:
- 使用标准密码登录。
- 插入您的 YubiKey 令牌。
- 运行 ipa otptoken-add-yubikey 命令。
- 如果 YubiKey 有一个空插槽,该命令会自动选择空插槽。
- 如果没有可用的空插槽,则必须使用 --slot 选项手动选择一个插槽。例如:
$ ipa otptoken-add-yubikey --slot=2
请注意,这会覆盖所选的插槽。
22.3.6. 以管理员身份为用户添加令牌
以管理员身份添加软件令牌:
- 确保您已以管理员身份登录。
- 在 IdM Web UI 或命令行中创建软件令牌。
- 要在 Web UI 中创建令牌,请选择
,再单击 OTP 令牌列表顶部的 。在 Add OTP Token 表单中,选择令牌的所有者。 图 22.7. 添加管理员管理的软件令牌
- 要从命令行创建令牌,请使用
--owner
选项运行 ipa otptoken-add 命令。例如:$ ipa otptoken-add --owner=user ------------------ Added OTP token "" ------------------ Unique ID: 5303baa8-08f9-464e-a74d-3b38de1c041d Type: TOTP ...
- Web UI 或命令行中会显示 802.11 代码。使用
FreeOTP Authenticator
扫描 QR 代码,将令牌置备到移动设备。
以管理员身份添加可编程性硬件令牌,如 YubiKey 令牌:
- 确保您已以管理员身份登录。
- 插入 YubiKey 令牌。
- 使用
--owner
选项运行 ipa otptoken-add-yubikey 命令。例如:$ ipa otptoken-add-yubikey --owner=user
22.3.7. 从专有 OTP 解决方案进行迁移
为启用将大型部署从专有 OTP 解决方案迁移到 IdM 原生 OTP 解决方案,IdM 提供了一种将 OTP 验证卸载到第三方 RADIUS 服务器的方法。管理员创建一组 RADIUS 代理,每个代理只能引用单个 RADIUS 服务器。如果需要解决多台服务器,建议创建一个虚拟 IP 解决方案,指向多个 RADIUS 服务器。此类解决方案需要在 RHEL IdM 外部构建,并使用 keepalived 守护进程(例如:然后,管理员将这些代理集中的一个分配给用户。只要用户设置了 RADIUS 代理,IdM 会绕过所有其他身份验证机制。
注意
IdM 不提供对第三方系统中令牌的任何令牌管理或同步支持。
为 OTP 验证配置 RADIUS 服务器,并将用户添加到代理服务器中:
- 确保启用了 radius 用户身份验证方法。详情请查看 第 22.3.3 节 “启用两个事实器身份验证”。
- 运行 ipa radiusproxy-add proxy_name -- secretsecret 命令来添加 RADIUS 代理。命令提示您插入所需信息。RADIUS 代理的配置要求客户端和服务器之间使用通用机密来打包凭据。在
--secret
参数中指定此 secret。 - 运行 ipa user-mod radiususer --radius=proxy_name 命令将用户分配给添加的代理。
- 如果需要,通过运行 ipa user-mod radiususer --radius-username=radius_user 命令将用户名配置为发送到 RADIUS。
因此,用户 OTP 身份验证将开始通过 RADIUS 代理服务器进行处理。
注意
要在启用了 FIPS 模式的 IdM master 上运行 RADIUS 服务器,请执行 第 22.3.2 节 “在 FIPS 模式运行的 IdM 服务器中配置 RADIUS 代理所需的设置” 中描述的步骤。
当用户准备好迁移到 IdM 原生 OTP 系统时,您只需删除用户的 RADIUS 代理分配。
22.3.7.1. 在低网络中运行 RADIUS 服务器时更改 KDC 的超时值
在某些情况下,比如在较慢的网络中运行 RADIUS 代理,IdM KDC 会在 RADIUS 服务器响应前关闭连接,因为等待用户进入令牌时连接超时。
更改 KDC 的超时设置:
- 更改
/var/kerberos/krb5kdc/kdc.conf
文件中的[otp]
部分中的timeout
参数的值。例如,要将超时设置为 120 秒:[otp] DEFAULT = { timeout = 120 ... }
- 重启
krb5kdc
服务:# systemctl restart krb5kdc
22.3.8. 将当前凭证提升为两次身份验证
如果同时配置了密码和双因素验证,但您仅使用密码进行身份验证,您可能会被拒绝访问某些服务或主机(请参阅 第 22.4 节 “根据用户身份验证的方式限制对服务和主机的访问”)。在这种情况下,通过再次进行身份验证,将您的凭证从一个因素提升到双因素身份验证:
- 锁定屏幕.锁定屏幕的默认键盘快捷方式是 Super key+L。
- 解锁屏幕.当系统询问凭据时,请使用 password 和 OTP。
22.3.9. 重新同步 OTP 令牌
22.3.10. 替换丢失的 OTP 令牌
以下流程描述了丢失 OTP 令牌的用户如何替换令牌:
- 作为管理员,为用户启用密码和 OTP 身份验证:
[admin@server]# ipa user-mod --user-auth-type=password --user-auth-type=otp user_name
- 用户现在可以添加新的令牌。例如,要添加在描述 中设置的新令牌 的新令牌:
[user@server]# ipa otptoken-add --desc="New Token"
如需了解更多详细信息,请输入添加ipa otptoken-add --help
参数的命令。 - 用户现在可以删除旧的令牌:
- 另外,还可列出与帐户关联的令牌:
[user@server]# ipa otptoken-find -------------------- 2 OTP tokens matched -------------------- Unique ID: 4ce8ec29-0bf7-4100-ab6d-5d26697f0d8f Type: TOTP Description: New Token Owner: user Unique ID: e1e9e1ef-172c-4fa9-b637-6b017ce79315 Type: TOTP Description: Old Token Owner: user ---------------------------- Number of entries returned 2 ----------------------------
- 删除旧令牌。例如,使用 e1e9e1ef-172c-4fa9-b637-6b017ce79315 ID 删除令牌:
[user@server]# # ipa otptoken-del e1e9e1ef-172c-4fa9-b637-6b017ce79315 -------------------------------------------------------- Deleted OTP token "e1e9e1ef-172c-4fa9-b637-6b017ce79315" --------------------------------------------------------
- 作为管理员,只为用户启用 OTP 验证:
[admin@server]# ipa user-mod --user-auth-type=otp user_name