Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

22.3. 一次性密码

重要
用于 OTP 验证的 IdM 解决方案仅支持运行 Red Hat Enterprise Linux 7.1 或更高版本的客户端。
一次性密码(OTP)是一种仅对一个身份验证会话有效的密码,在使用后会无效。不同于传统的静态密码,身份验证令牌生成的 OTP 会不断更改。OTP 作为双因素验证的一部分:
  1. 用户使用传统密码进行身份验证。
  2. 用户提供由可识别的 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,请执行以下步骤:
  1. 使用以下内容创建 /etc/systemd/system/radiusd.service.d/ipa-otp.conf 文件:
    [Service] 
    Environment=OPENSSL_FIPS_NON_APPROVED_MD5_ALLOW=1
  2. 重新载入 systemd 配置:
    # systemctl daemon-reload
  3. 启动 radiusd 服务:
    # systemctl start radiusd

22.3.3. 启用两个事实器身份验证

有关与 OTP 相关的可用验证方法的详情,请参考 第 22.3.1.2 节 “可用的 OTP 身份验证方法”
启用双因素验证:

Web UI:启用两个事实器身份验证

要为所有用户全局设置身份验证方法:
  1. 选择 IPA ServerConfiguration
  2. User Options 区域中,选择所需的默认用户身份验证类型

    图 22.4. 用户身份验证方法

    用户身份验证方法
要确保按用户设置没有覆盖全局设置,请选择 Disable per-user override。如果您没有选择 Disable per-user 覆盖,则每个用户配置的身份验证方法优先于全局设置。
以每个用户为基础单独设置验证方法:
  1. 选择 IdentityUsers,然后单击要编辑的用户名称。
  2. 帐户设置 区域中,选择所需的 用户身份验证类型

    图 22.5. 用户身份验证方法

    用户身份验证方法

命令行:启用两个事实器身份验证

要为所有用户全局设置身份验证方法:
  1. 运行 ipa config-mod --user-auth-type 命令。例如,将全局身份验证方法设置为双因素验证:
    $ ipa config-mod --user-auth-type=otp
    如需 --user-auth-type 接受的值列表,请运行 ipa config-mod --help 命令。
  2. 要禁用每个用户覆盖,因此请确保不使用每个用户的设置覆盖全局设置,同时添加 --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. 添加用户管理的软件令牌

  1. 使用标准密码登录。
  2. 确保在您的移动设备上安装了 FreeOTP Authenticator 应用程序。要下载 FreeOTP Authenticator,请参阅 FreeOTP 源页面
  3. 在 IdM Web UI 或命令行中创建软件令牌。
    • 要在 Web UI 中创建令牌,请单击 OTP 令牌 选项卡下的 Add。如果您以管理员身份登录,则可通过 Authentication 选项卡访问 OTP Tokens 选项卡。

      图 22.6. 为用户添加 OTP 令牌

      为用户添加 OTP 令牌
    • 要从命令行创建令牌,请运行 ipa otptoken-add 命令。
      $ ipa otptoken-add
      ------------------
      Added OTP token ""
      ------------------
        Unique ID: 7060091b-4e40-47fd-8354-cb32fecd548a
        Type: TOTP
      ...
      
      有关 ipa otptoken-add 的更多信息,请运行带有 --help 选项的命令。
  4. Web UI 或命令行中会显示 802.11 代码。使用 FreeOTP Authenticator 扫描 QR 代码,将令牌置备到移动设备。

22.3.5. 添加用户管理的 YubiKey 硬件令牌

可编程性硬件令牌(如 YubiKey 令牌)只能从命令行添加。以拥有令牌的用户添加 YubiKey 硬件令牌:
  1. 使用标准密码登录。
  2. 插入您的 YubiKey 令牌。
  3. 运行 ipa otptoken-add-yubikey 命令。
    • 如果 YubiKey 有一个空插槽,该命令会自动选择空插槽。
    • 如果没有可用的空插槽,则必须使用 --slot 选项手动选择一个插槽。例如:
      $ ipa otptoken-add-yubikey --slot=2
      请注意,这会覆盖所选的插槽。

22.3.6. 以管理员身份为用户添加令牌

以管理员身份添加软件令牌:
  1. 确保您已以管理员身份登录。
  2. 确保在移动设备上安装了 FreeOTP Authenticator 应用程序。要下载 FreeOTP Authenticator,请参阅 FreeOTP 源页面
  3. 在 IdM Web UI 或命令行中创建软件令牌。
    • 要在 Web UI 中创建令牌,请选择 AuthenticationOTP Tokens,再单击 OTP 令牌列表顶部的 Add。在 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
      ...
      
  4. Web UI 或命令行中会显示 802.11 代码。使用 FreeOTP Authenticator 扫描 QR 代码,将令牌置备到移动设备。
以管理员身份添加可编程性硬件令牌,如 YubiKey 令牌:
  1. 确保您已以管理员身份登录。
  2. 插入 YubiKey 令牌。
  3. 使用 --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 服务器,并将用户添加到代理服务器中:
  1. 确保启用了 radius 用户身份验证方法。详情请查看 第 22.3.3 节 “启用两个事实器身份验证”
  2. 运行 ipa radiusproxy-add proxy_name -- secretsecret 命令来添加 RADIUS 代理。命令提示您插入所需信息。
    RADIUS 代理的配置要求客户端和服务器之间使用通用机密来打包凭据。在 --secret 参数中指定此 secret。
  3. 运行 ipa user-mod radiususer --radius=proxy_name 命令将用户分配给添加的代理。
  4. 如果需要,通过运行 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 的超时设置:
  1. 更改 /var/kerberos/krb5kdc/kdc.conf 文件中的 [otp] 部分中的 timeout 参数的值。例如,要将超时设置为 120 秒:
    [otp]
    DEFAULT = {
      timeout = 120
      ...
    }
  2. 重启 krb5kdc 服务:
    # systemctl restart krb5kdc

22.3.8. 将当前凭证提升为两次身份验证

如果同时配置了密码和双因素验证,但您仅使用密码进行身份验证,您可能会被拒绝访问某些服务或主机(请参阅 第 22.4 节 “根据用户身份验证的方式限制对服务和主机的访问”)。在这种情况下,通过再次进行身份验证,将您的凭证从一个因素提升到双因素身份验证:
  1. 锁定屏幕.锁定屏幕的默认键盘快捷方式是 Super key+L
  2. 解锁屏幕.当系统询问凭据时,请使用 password 和 OTP。

22.3.9. 重新同步 OTP 令牌

22.3.10. 替换丢失的 OTP 令牌

以下流程描述了丢失 OTP 令牌的用户如何替换令牌:
  1. 作为管理员,为用户启用密码和 OTP 身份验证:
    [admin@server]# ipa user-mod --user-auth-type=password --user-auth-type=otp user_name
  2. 用户现在可以添加新的令牌。例如,要添加在描述 中设置的新令牌 的新令牌:
    [user@server]# ipa otptoken-add --desc="New Token"
    如需了解更多详细信息,请输入添加 ipa otptoken-add --help 参数的命令。
  3. 用户现在可以删除旧的令牌:
    1. 另外,还可列出与帐户关联的令牌:
      [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
      ----------------------------
    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"
      --------------------------------------------------------
  4. 作为管理员,只为用户启用 OTP 验证:
    [admin@server]# ipa user-mod --user-auth-type=otp user_name