告别黑客攻击!手把手教你在AD域中实施MultiOTP双因素身份验证(2FA)及避坑指南

文章目录

  • 背景
  • 操作
  • 一、在Active Directory域环境部署MultiOTP服务器
  • (一)准备域环境
  • (二)安装MultiOTP(绿色版本,直接解压到我们自己指定文件夹即可)
  • (三)配置MultiOTP与AD集成
  • 二、为域用户配置MultiOTP双重身份验证
  • 三、在 Windows客户端安装和配置 `MultiOTP CredentialProvider`
  • (一)安装前准备工作
  • (二)安装`multiOTP CredentialProvider`
  • 踩坑过程
  • 坑0:同步用户的时候报错
  • 坑1:执行同步命令后,同步了AD中所有的账户
  • 坑2:客户端安装MultiOTP CredentialProvider不生效
  • 坑3:web端无法登录
  • 坑4:命令输出的日志时间与系统时间不一致
  • 坑5:输入二次验证的密码确认后,提示“Wrong one-time password”
  • 背景

    之前朋友公司的服务器被黑客,远程电脑登录密码被破解,系统中所有文件都被勒索病毒加密。幸亏有做完整的备份,只损失了几天的数据。现在远程桌面登录启用多因子认证,已经是必要的安全措施了。

    我们一直使用火绒终端安全,它有个动态口令安全认证的功能还挺好用的(如下图)。不过,在消费降级的当下,要申请花钱订阅会显得不合时宜(俗称:没有预算)。
    火绒安全动态口令安全认证
    所以,寻找一个靠谱的平替方案就成了当务之急。经调研发现开源的MultiOTP 双因素身份验证工具,是一个理想之选。接下来,就让我们一起深入了解如何在AD域环境实施 MultiOTP 双因素身份验证吧。

    操作

    一、在Active Directory域环境部署MultiOTP服务器

    (一)准备域环境
    1. 首先,我们需要创建名为"2FAVPNUsers"的安全组,以便将需要开启双因素认证的用户添加进来。打开 PowerShell,输入以下命令(请确保你具有足够的权限执行此操作):

      命令如下:

      New-ADGroup 2FAVPNUsers -Path 'OU=DG,OU=Groups,dc=yahgee,dc=com' -GroupScope Global -PassThru -Verbose
      

      执行效果:
      创建安全组

    2. 将目标用户添加到2FAVPNUsers

      命令如下:

      Add-ADGroupMember -Identity 2FAVPNUsers -Members konglinggan, test01
      

      执行效果:
      添加目标用户到指定的安全组

    3. 在此AD环境中创建一个新用户multiotp_srv,用于访问 AD(并设置为最小权限)。

      命令如下:

      $passwd = ConvertTo-SecureString -String "P@ssw0rd" -AsPlainText -Force
      New-ADUser -Name "multiotp_srv" -SamAccountName "multiotp_srv" -UserPrincipalName "multiotp_srv@yourDomain.com" -Path "OU=ServiceAccounts,DC=yourDomain,DC=com" –AccountPassword $passwd -Enabled $true
      

      上面设置的新用户multiotp_srv的密码,要替换为自己的密码并记录好。yourDomain也要替换为自己的域名

    (二)安装MultiOTP(绿色版本,直接解压到我们自己指定文件夹即可)
    1. 下载 MultiOTP 服务器安装包:前往 MultiOTP 官方网站(https://download.multiotp.net/),根据你的操作系统版本选择合适的安装包进行下载(我下载的是multiotp_5.9.7.1版本)。
      下载multiOTP

    2. 打开 multiotp_5.9.7.1.zip 压缩文件,从其中提取“Windows”目录,并将其存放到本地驱动器(如 C:\PortableApps)的一个文件夹中。
      解压并提取Windows目录

    (三)配置MultiOTP与AD集成
    1. 打开命令提示符,并转到包含 multiotp.exe 文件的目录。
      打开cmd并进入multiOTP目录

    2. 使用下面的命令,我们将配置 MultiOTP LDAP 设置,以便从AD活动目录数据库中获取指定的用户。

      命令如下:

      multiotp -config default-request-prefix-pin=0
      multiotp -config default-request-ldap-pwd=0
      multiotp -config ldap-server-type=1
      multiotp -config ldap-cn-identifier="sAMAccountName"
      multiotp -config ldap-group-cn-identifier="sAMAccountName"
      multiotp -config ldap-group-attribute="memberOf"
      multiotp -config ldap-ssl=0
      multiotp -config ldap-port=389
      

      执行效果:
      配置 MultiOTP LDAP 设置

      这段命令是用于配置 multiOTP 系统的,multiOTP 是一个开源的多因素认证系统。下面是每个命令的解释:

      1. multiotp -config default-request-prefix-pin=0设置默认的 OTP(一次性密码)请求前缀 PIN 为 0。这意味着在请求 OTP 时,不需要输入前缀 PIN。

      2. multiotp -config default-request-ldap-pwd=0设置默认的 LDAP(轻量级目录访问协议)密码请求为 0。这可能意味着在默认情况下,不使用 LDAP 密码进行 OTP 请求。

      3. multiotp -config ldap-server-type=1 设置 LDAP 服务器类型。不同的值可能对应不同的 LDAP 服务器实现,例如,1 可能代表 OpenLDAP 或其他特定的 LDAP 服务器。

      4. multiotp -config ldap-cn-identifier="sAMAccountName"配置 LDAP 中的通用名称(CN)标识符为sAMAccountName,这是 Active Directory 中用户的登录名。

      5. multiotp -config ldap-group-cn-identifier="sAMAccountName"配置 LDAP 中的组通用名称(CN)标识符为sAMAccountName,用于识别组成员。

      6. multiotp -config ldap-group-attribute="memberOf"设置用于确定用户组成员身份的 LDAP 属性为memberOf。这是 Active Directory 中用来存储用户所属组信息的属性。

      7. multiotp -config ldap-ssl=0禁用 LDAP SSL 加密。设置为 0 表示不使用 SSL 连接到 LDAP 服务器。

      8. multiotp -config ldap-port=389设置连接到 LDAP 服务器的端口为 389。这是 LDAP 服务的默认端口,除非另有配置。

      这些配置命令用于设置 multiOTP 系统如何与 LDAP 服务器交互,包括用户认证和组管理。确保在执行这些命令之前,你已经正确安装并配置了 multiOTP 系统,并且了解每个命令的具体作用,以便正确地进行配置。

      如果运行命令报错找不到xxx.dll(如下图)
      找不到VCRUNTIME140.dll

      可以使用360驱动大师_2.0.0.1870_Single修复系统dll,重启计算机后,再重新执行命令。

      也可以手动下载Visual C++ 组件并安装(x86和x64都需要),参考链接如下:

      https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2015-2017-2019-and-2022

      https://aka.ms/vs/17/release/vc_redist.x86.exe

      https://aka.ms/vs/17/release/vc_redist.x64.exe

    3. 设置域控制器的IP:

      命令如下:

      multiotp -config ldap-domain-controllers=yourDomain-DC-01.yourDomain.com,ldap://10.x.x.x:389
      multiotp -config ldap-base-dn="DC=yourDomain,DC=com"
      

      执行效果:
      设置域控制器的IP

    4. 设置multiOTP在AD中的身份验证的账号信息(也就是我们刚才创建的新用户multiotp_srv):
      命令如下:

      multiotp -config ldap-bind-dn="CN=multiotp_srv,OU=ServiceAccounts,DC=yourDomain,DC=com"
      multiotp -config ldap-server-password="P@ssw0rd"
      

      如何查看AD中的对象的ldap属性信息?

      操作方法:

      在控制台中,点击查看,勾选高级功能。这样属性中会多出属性编辑器页签,在此页签中找到distinguishedName属性(可分辨名称属性),双击打开即可看到属性值。

      勾选高级功能

    5. 设置需要启用一次性密码的用户组(也就是我们创建的"2FAVPNUsers"安全组):

      命令如下:

      multiotp -config ldap-in-group="2FAVPNUsers"
      multiotp -config ldap-network-timeout=10
      multiotp -config ldap-time-limit=30
      multiotp -config ldap-activated=1
      

      执行效果:
      设置需要启用一次性密码的用户组

      这些命令用于配置 multiOTP 系统与 LDAP 目录服务的集成,以及一些网络和激活相关的设置。下面是每个命令的解释:

      1. multiotp -config ldap-in-group="2FAVPNUsers"

      • 这个命令设置了 multiOTP 用于识别需要进行双因素认证(2FA)的用户的 LDAP 组。在这个例子中,任何属于名为"2FAVPNUsers"的 LDAP 组的用户都将被要求使用 multiOTP 进行认证。

      • 这个组名应该与 LDAP 目录中定义的组的 CN(Common Name)相匹配。

    6. multiotp -config ldap-network-timeout=10
    7. • 设置 LDAP 网络操作的超时时间为 10 秒。如果在指定的时间内无法完成 LDAP 网络请求,系统将放弃并返回错误。

    8. multiotp -config ldap-time-limit=30
    9. • 设置 LDAP 搜索操作的时间限制为 30 秒。这个限制适用于 LDAP 搜索查询,如果在 30 秒内没有完成搜索,系统将返回一个超时错误。

    10. multiotp -config ldap-activated=1
    11. • 这个命令激活了 LDAP 功能。设置为 1 表示启用 LDAP 集成,允许 multiOTP 使用 LDAP 进行用户认证和检索用户信息。

      这些配置命令对于确保 multiOTP 系统能够正确地与 LDAP 目录服务交互至关重要。正确配置这些参数可以提高系统的安全性和效率。

      在应用这些配置之前,请确保:

      • LDAP 组"2FAVPNUsers"在 LDAP 目录中已经存在,并且包含了需要进行双因素认证的用户。

      • LDAP 服务器的网络连接是可靠的,并且超时设置适合你的网络环境。

      • 你已经正确配置了 LDAP 服务器的地址、端口和其他相关设置。

      如果你在配置过程中遇到问题,可能需要检查 LDAP 服务器的设置,确保网络连接,或者查看 multiOTP 的日志文件以获取错误信息。

    12. 设置访问MultiOTP server的共享密钥(这个密钥请自行设置并保留好,会在安装或设置MultiOTP客户端程序的时候要用到):

      命令如下:

      multiotp -config server-secret=xxxxxxxxxxxxxx
      

      执行效果:
      设置访问MultiOTP server的共享密钥

      你可以在 https://download.multiotp.net/5.x/readme_5.9.7.1.txt 的 “如何配置 MultiOTP 以从活动目录同步用户” 部分中找到所有选项的详细描述。

    13. 从AD的同步之前添加到"2FAVPNUsers"安全组里面的用户到MultiOTP中:

      命令如下:

      multiotp -debug -display-log -ldap-users-sync
      

      执行效果:
      从AD的同步用户

      小技巧:创建一个系统计划任务,用来定期同步用户数据。这样可以确保 MultiOTP 服务器中的用户信息与 Active Directory 保持一致,避免因用户信息不一致导致的认证问题。

      multiotp -debug -display-log -ldap-users-sync

    14. 以管理员身份运行 “webservice_install.cmd”。它将安装 multiOTP 网络管理界面。

      使用默认登录凭证(用户名:admin,密码:1234)登录 MUltiOTP 网页控制台界面(网址为 http://127.0.0.1:8112/或者https://127.0.0.1:8113/)。
      登录 MUltiOTP 网页控制台

      如果弹出网页显示502 Bad Gateway,需要启动路径:C:\PortableApps\multiotp_5.9.7.1\windows\webservice下的nginx,然后再来访问http://127.0.0.1:8112/或者https://127.0.0.1:8113/

    15. 为了保障安全,建议更改admin的密码。

    二、为域用户配置MultiOTP双重身份验证

    1. 在用户列表部分,可以看到之前同步的域用户。如果未列出,可以再次执行同步命令。
      用户未列出

      执行同步命令

      multiotp -debug -display-log -ldap-users-sync
      

      显示同步的用户
      显示同步的用户

    2. 使用OTP认证app(如:FreeOTP Authenticator、Microsoft Authenticator or Google Authenticator),将对应用户的二次验证密码导入进来(下面方式二选一)

    3. 第一种方式:通过app扫描打印的二维码。
    4. 第二种方式:使用命令multiotp -debug -urllink username,生成账号的动态验证的密钥并复制到app中。
      19-在验证器中导入OTP密钥
    5. 可以通过命令提示符中输入下面的命令,验证获取的用户一次性密码(OTP)。

      命令如下:

      multiotp -display-log konglinggan 850325 #请替换掉后面用户名和一次性密码
      

      执行效果:
      使用命令验证获取的用户一次性密码

      另外,还可以通过web界面操作验证用户的一次性密码:进入“检查用户”部分,输入用户名和一次性密码,点击检查。

      使用控制台验证获取的用户一次性密码

    三、在 Windows客户端安装和配置 MultiOTP CredentialProvider

    接下来,我们到指定的Windows客户端上安装multiOTP-CredentialProvider,以便使用multiOTP实现双因素身份验证。

    multiOTP-CredentialProvider可以兼容:Windows 7/8/8.1/10/11 或 Windows Server 2012 (R2)/2016/2019/2022系统。

    接下来,我们以Windows 10客户端为例,为远程桌面(RDP)用户启用双重身份验证(2FA)。

    (一)安装前准备工作
    1. 在multiOTP服务器和客户端上打开防火墙相应的端口。

      可以在multiOTP服务器和客户端,都执行下面的 PowerShell 命令,创建防火墙策略允许multiOTP访问端口。

      命令如下:

      New-NetFirewallRule -DisplayName "AllowMultiOTP" -Direction Inbound -Protocol TCP –LocalPort 8112 -Action Allow
      

      执行效果:
      打开防火墙相应的端口

    2. 使用域名访问,创建一个A记录(非必要,你可以直接使用IP)。 在DNS中添加multiOTP服务器的A记录

    3. 重启DNS服务,测试解析效果。
      测试DNS解析效果

    (二)安装multiOTP CredentialProvider
    1. 从 GitHub 下载 multiOTP CredentialProvider到本地电脑(截止2025年1月最新版本为 5.9.8.0.)。https://github.com/multiOTP/multiOTPCredentialProvider/releases.

    2. 先解压后,点击安装

       * 输入下列信息,并点击下一步。
        - multiOTP Login Title:自定义即可
        - URL of your multiOTP server:你的multiOTP服务器的IP或者域名加上端口号
        - Secret shared with multiOTP server(s):共享密钥来自 multiOTP 配置中自定义的密钥(就是输入命令`multiotp -config server-secret=xxxxxxxxxxxxxx`中的密钥)。
      

      安装时输入配置信息

       * 点击 Next。  
      

      点击 next

         * 选择 Windows 登录类型以应用一次性密码(OTP)身份验证。
         * 在我们的示例中,我们将仅对 RDP 登录使用双因素身份验证(仅远程桌面需要强制进行 OTP 身份验证)。
      

      仅远程桌面需要强制进行 OTP 身份验证

        * 点击 Install。
      

      点击 Install

        * 点击 Finish。
      

      点击 Finish

      你可以自行更改客户端以何种方式启用一次性密码(OTP)身份验证。
      MultiOTP 凭证提供程序的设置项,保存在注册表下面这个路径,你可以根据自己的需求,在此处更改设置,而无需重新安装代理程序。
      HKEY_CLASSES_ROOT\CLSID {FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978} (注册表路径截图如下)
      MultiOTP 凭证提供程序的设置项

    3. 重新启动 Windows客户端主机,并通过远程桌面协议(RDP)连接。在你输入用户凭证后,会出现一个新的一次性密码验证窗口。从手机上的身份验证器应用程序中获取一次性密码。
      一次性密码验证窗口
      Done!


    踩坑过程

    下面列举一些我在部署过程中遇到的问题,供大家参考避免重蹈覆辙。

    坑0:同步用户的时候报错
  • 问题描述:执行AD用户同步命令的时候提示:在LDAP连接的时候,验证失败(如下图):
    坑0-同步错误

  • 分析过程:经排错后,发现是我少执行了第9个步骤REM Account for multiOTP authentication in AD:
    REM Account for multiOTP authentication in AD

  • 解决方法:完成步骤9之后,再执行同步用户命令,用户同步成功(请记得检查每一步操作,不要像我一样遗漏步骤)。
    用户同步成功

  • 坑1:执行同步命令后,同步了AD中所有的账户
  • 问题描述:服务器端同步账户,未同步指定的2FAVPNUsers安全组中的用户,而是同步了AD中所有的账户
    未同步指定的2FAVPNUsers安全组中的用户

  • 分析过程:咨询我的个人助理后,得知需要设置一个ldap_filter过滤器参数。

    下面是我的小助理的分析过程

    小助理的分析过程

  • 解决方法:

    1. 打开命令提示符并转到包含 multiotp.exe 的目录,然后执行下面的命令

      命令如下:

         multiotp -config ldap_filter="(memberOf=CN=2FAVPNUsers,OU=DG,OU=Groups,DC=YourDomain,DC=com)"
      

      说明:组的路径需要替换为你自己的(如下图)

      安全组的路径

      如果未显示属性编辑器页签,可以通过在控制台-查看,勾选高级功能来开启。

    2. 删除所有用户:

    3. 可以在web界面,点击delete删除。 在multiOTP服务器web控制台删除用户
    4. 也可直接在MultiOTP服务器的程序所在目录,找到users文件夹,直接批量删除。 在Users文件夹批量删除用户
    5. 重新执行同步命令
      重新执行同步命令

    注意:重新同步用户之后,二次验证的动态码需要重新添加!

  • 坑2:客户端安装MultiOTP CredentialProvider不生效
  • 问题描述:在验证环节,客户端安装MultiOTP CredentialProvider之后,远程登录未出现二次验证提示,输入系统的用户名和密码之后直接登录了

  • 分析过程:应该是MultiOTP与火绒安全终端的二次验证服务冲突了。

  • 解决方法:卸载火绒软件,再注销重连,即可出现验证窗口。
    一次性密码验证窗口回来了

  • 坑3:web端无法登录
  • 问题描述:web端登录不了,输入用户名和密码,点击login之后,页面无反应(如下图)。
    multiOTP服务的web控制台无法登录

  • 分析过程:之前可以登录web控制台,当执行了命令multiotp -config debug=1之后,就无法登录了。估计是这个配置导致的。可以先改回去试试。

  • 解决方法:在multiOTP服务器的multiOTP目录下执行下面命令,关闭debug

    命令如下:

    multiotp -config debug=0
    

    执行效果:
    关闭debug

    关闭debug之后,网页可以登录了。

  • 坑4:命令输出的日志时间与系统时间不一致
  • 问题描述:在multiOTP服务器上执行命令debug时,输出的日志内容显示的时间,与本地操作系统的时间不一致。
    日志时间与系统时间不一致

  • 分析过程:MultiOTP的配置时区与系统的时区不同(看到配置文件中时区为欧洲/苏黎世)。
    multiOTP配置文件时区参数

  • 解决方法:将MultiOTP配置的时区,改为你操作系统所在时区(本案例改为:亚洲/上海)。

    命令如下:

    multiotp -config timezone=Asia/Shanghai
    

    执行效果:
    更改时区

    并重启MultiOTP服务,可以看到时间一致了。
    日志时间与系统时间一致了

    注意:要确保你的活动目录域与可靠的时间源同步时间,并且客户端设备具有正确的时间。这些对于一次性密码(OTP)的运行至关重要。如果multiOTP的服务器与multiOTP客户端的时间不一致,将导致验证失败。

  • 坑5:输入二次验证的密码确认后,提示“Wrong one-time password”
  • 问题描述:输入动态密码并点确定,提示一次性密码错误。

    提示密码错误截图(Windows10)
    Wrong one-time password-Windows10

    提示密码错误截图(Windows7)
    Wrong one-time password-Windows7

    在multiOTP服务器的控制台验证一次性密码是可用的。
    在multiOTP控制台验证用户一次性密码

  • 分析过程a:可能是multiOTP服务器与客户端,输入的共享密钥不一致。

  • 解决方法a:在multiOTP服务器,以及客户端,都重新设置共享密钥。

    需要使用multiotp -config server-secret=xxxxxxxxxxxxxx命令修改。

    在服务器端的multiOTP配置文件中记录的共享密钥参数server_secret是密文,直接修改无效。
    multiOTP配置文件共享密钥参数

    在multiOTP客户端,直接修改注册表,操作路径截图如下:
    修改客户端的注册表multiOTP共享密钥值

  • 分析过程b:可能是multiOTP客户端访问服务器的地址输入错误。

  • 解决方法b:在multiOTP客户端,修改客户端的注册表multiOTPServers值(如下图)
    修改客户端的注册表multiOTPServers值

  • 总结下遇到问题的拍错思路:

    先保证服务器上一次性密码可以使用,再保证服务器和和客户端的端口通讯正常,然后检查服务器和客户端的配置是否一致。

    最后,在multiOTP客户端电脑上,在命令提示符进入multiOTP安装目录,执行下面的命令验证结果。

    命令如下:

    multiotp -display-log konglinggan 535057 #请替换掉后面用户名和一次性密码
    

    执行效果:
    在multiOTP客户端执行一次性密码验证命令

    通过以上步骤,我们成功地在 Active Directory 域环境中部署了 MultiOTP 双因素身份验证服务器,并实现了与客户端的集成。希望这份指南能够帮助你提升系统的安全性,有效抵御黑客攻击。

    最后,感谢大自然的馈赠,同时祝愿我们早日迎来消费升级!


    参考链接

    Enable Two-Factor Authentication (2FA) in Windows with MultiOTP – Windows OS Hub

    Free multiOTP MFA cloud hosting with Azure App Service – Neil Sabol’s Blog – IT, weird bikes, and ot

    一招搞定!Windows双重验证轻松上手指南 – 哔哩哔哩

    Wrong one-time Password · Issue #189 · multiOTP/multiotp

    502 Bad Gateway · Issue #181 · multiOTP/multiotp

    Windows 开启双重验证 OTP multiotp 两步认证 动态口令登录 – tonkai – 博客园

    作者:shot_gan

    物联沃分享整理
    物联沃-IOTWORD物联网 » 告别黑客攻击!手把手教你在AD域中实施MultiOTP双因素身份验证(2FA)及避坑指南

    发表回复