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

背景

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

我们一直使用火绒终端安全,它有个动态口令安全认证的功能还挺好用的(如下图)。不过,在消费降级的当下,要申请花钱订阅会显得不合时宜(俗称:没有预算)。
火绒安全动态口令安全认证
所以,寻找一个靠谱的平替方案就成了当务之急。经调研发现开源的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)相匹配。

    • multiotp -config ldap-network-timeout=10

    • 设置 LDAP 网络操作的超时时间为 10 秒。如果在指定的时间内无法完成 LDAP 网络请求,系统将放弃并返回错误。

    • multiotp -config ldap-time-limit=30

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

    • multiotp -config ldap-activated=1

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

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

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

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

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

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

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

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

    命令如下:

    multiotp -config server-secret=xxxxxxxxxxxxxx
    

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

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

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

    命令如下:

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

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

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

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

  8. 以管理员身份运行 “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/

  9. 为了保障安全,建议更改admin的密码。
    在这里插入图片描述

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

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

    执行同步命令

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

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

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

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

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

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

坑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 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值