告别黑客攻击!手把手教你在AD域中实施MultiOTP双因素身份验证(2FA)及避坑指南
文章目录
背景
之前朋友公司的服务器被黑客,远程电脑登录密码被破解,系统中所有文件都被勒索病毒加密。幸亏有做完整的备份,只损失了几天的数据。现在远程桌面登录启用多因子认证,已经是必要的安全措施了。
我们一直使用火绒终端安全,它有个动态口令安全认证
的功能还挺好用的(如下图)。不过,在消费降级的当下,要申请花钱订阅会显得不合时宜(俗称:没有预算)。
所以,寻找一个靠谱的平替方案就成了当务之急。经调研发现开源的MultiOTP 双因素身份验证工具,是一个理想之选。接下来,就让我们一起深入了解如何在AD域环境实施 MultiOTP 双因素身份验证吧。
操作
一、在Active Directory域环境部署MultiOTP服务器
(一)准备域环境
-
首先,我们需要创建名为"
2FAVPNUsers
"的安全组,以便将需要开启双因素认证的用户添加进来。打开 PowerShell,输入以下命令(请确保你具有足够的权限执行此操作):命令如下:
New-ADGroup 2FAVPNUsers -Path 'OU=DG,OU=Groups,dc=yahgee,dc=com' -GroupScope Global -PassThru -Verbose
执行效果:
-
将目标用户添加到
2FAVPNUsers
组命令如下:
Add-ADGroupMember -Identity 2FAVPNUsers -Members konglinggan, test01
执行效果:
-
在此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(绿色版本,直接解压到我们自己指定文件夹即可)
-
下载 MultiOTP 服务器安装包:前往 MultiOTP 官方网站(https://download.multiotp.net/),根据你的操作系统版本选择合适的安装包进行下载(我下载的是multiotp_5.9.7.1版本)。
-
打开 multiotp_5.9.7.1.zip 压缩文件,从其中提取“
Windows
”目录,并将其存放到本地驱动器(如 C:\PortableApps)的一个文件夹中。
(三)配置MultiOTP与AD集成
-
打开命令提示符,并转到包含 multiotp.exe 文件的目录。
-
使用下面的命令,我们将配置 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 系统的,multiOTP 是一个开源的多因素认证系统。下面是每个命令的解释:
-
multiotp -config default-request-prefix-pin=0
设置默认的 OTP(一次性密码)请求前缀 PIN 为 0。这意味着在请求 OTP 时,不需要输入前缀 PIN。 -
multiotp -config default-request-ldap-pwd=0
设置默认的 LDAP(轻量级目录访问协议)密码请求为 0。这可能意味着在默认情况下,不使用 LDAP 密码进行 OTP 请求。 -
multiotp -config ldap-server-type=1
设置 LDAP 服务器类型。不同的值可能对应不同的 LDAP 服务器实现,例如,1 可能代表 OpenLDAP 或其他特定的 LDAP 服务器。 -
multiotp -config ldap-cn-identifier="sAMAccountName"
配置 LDAP 中的通用名称(CN)标识符为sAMAccountName
,这是 Active Directory 中用户的登录名。 -
multiotp -config ldap-group-cn-identifier="sAMAccountName"
配置 LDAP 中的组通用名称(CN)标识符为sAMAccountName
,用于识别组成员。 -
multiotp -config ldap-group-attribute="memberOf"
设置用于确定用户组成员身份的 LDAP 属性为memberOf
。这是 Active Directory 中用来存储用户所属组信息的属性。 -
multiotp -config ldap-ssl=0
禁用 LDAP SSL 加密。设置为 0 表示不使用 SSL 连接到 LDAP 服务器。 -
multiotp -config ldap-port=389
设置连接到 LDAP 服务器的端口为 389。这是 LDAP 服务的默认端口,除非另有配置。
这些配置命令用于设置 multiOTP 系统如何与 LDAP 服务器交互,包括用户认证和组管理。确保在执行这些命令之前,你已经正确安装并配置了 multiOTP 系统,并且了解每个命令的具体作用,以便正确地进行配置。
如果运行命令报错找不到
xxx.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
-
-
设置域控制器的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"
执行效果:
-
设置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
属性(可分辨名称属性),双击打开即可看到属性值。 -
设置需要启用一次性密码的用户组(也就是我们创建的"
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 目录服务的集成,以及一些网络和激活相关的设置。下面是每个命令的解释:
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 的日志文件以获取错误信息。
-
设置访问MultiOTP server的共享密钥(这个密钥请自行设置并保留好,会在安装或设置MultiOTP客户端程序的时候要用到):
命令如下:
multiotp -config server-secret=xxxxxxxxxxxxxx
执行效果:
你可以在 https://download.multiotp.net/5.x/readme_5.9.7.1.txt 的 “如何配置 MultiOTP 以从活动目录同步用户” 部分中找到所有选项的详细描述。
-
从AD的同步之前添加到"
2FAVPNUsers
"安全组里面的用户到MultiOTP中:命令如下:
multiotp -debug -display-log -ldap-users-sync
执行效果:
小技巧:创建一个系统计划任务,用来定期同步用户数据。这样可以确保 MultiOTP 服务器中的用户信息与 Active Directory 保持一致,避免因用户信息不一致导致的认证问题。
multiotp -debug -display-log -ldap-users-sync
-
以管理员身份运行 “webservice_install.cmd”。它将安装 multiOTP 网络管理界面。
使用默认登录凭证(用户名:admin,密码:1234)登录 MUltiOTP 网页控制台界面(网址为http://127.0.0.1:8112/
或者https://127.0.0.1:8113/
)。
如果弹出网页显示
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/
-
为了保障安全,建议更改admin的密码。
二、为域用户配置MultiOTP双重身份验证
-
在用户列表部分,可以看到之前同步的域用户。如果未列出,可以再次执行同步命令。
执行同步命令
multiotp -debug -display-log -ldap-users-sync
显示同步的用户
-
使用OTP认证app(如:FreeOTP Authenticator、Microsoft Authenticator or Google Authenticator),将对应用户的二次验证密码导入进来(下面方式二选一)
- 第一种方式:通过app扫描打印的二维码。
- 第二种方式:使用命令
multiotp -debug -urllink username
,生成账号的动态验证的密钥并复制到app中。
-
可以通过命令提示符中输入下面的命令,验证获取的用户一次性密码(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)。
(一)安装前准备工作
-
在multiOTP服务器和客户端上打开防火墙相应的端口。
可以在
multiOTP
服务器和客户端,都执行下面的 PowerShell 命令,创建防火墙策略允许multiOTP访问端口。命令如下:
New-NetFirewallRule -DisplayName "AllowMultiOTP" -Direction Inbound -Protocol TCP –LocalPort 8112 -Action Allow
执行效果:
-
使用域名访问,创建一个A记录(非必要,你可以直接使用IP)。
-
重启DNS服务,测试解析效果。
(二)安装multiOTP CredentialProvider
-
从 GitHub 下载
multiOTP CredentialProvider
到本地电脑(截止2025年1月最新版本为 5.9.8.0.)。https://github.com/multiOTP/multiOTPCredentialProvider/releases.
-
先解压后,点击安装
* 输入下列信息,并点击下一步。 - multiOTP Login Title:自定义即可 - URL of your multiOTP server:你的multiOTP服务器的IP或者域名加上端口号 - Secret shared with multiOTP server(s):共享密钥来自 multiOTP 配置中自定义的密钥(就是输入命令`multiotp -config server-secret=xxxxxxxxxxxxxx`中的密钥)。
* 点击 Next。
* 选择 Windows 登录类型以应用一次性密码(OTP)身份验证。 * 在我们的示例中,我们将仅对 RDP 登录使用双因素身份验证(仅远程桌面需要强制进行 OTP 身份验证)。
* 点击 Install。
* 点击 Finish。
你可以自行更改客户端以何种方式启用一次性密码(OTP)身份验证。
MultiOTP 凭证提供程序的设置项,保存在注册表下面这个路径,你可以根据自己的需求,在此处更改设置,而无需重新安装代理程序。
HKEY_CLASSES_ROOT\CLSID {FCEFDFAB-B0A1-4C4D-8B2B-4FF4E0A3D978}
(注册表路径截图如下)
-
重新启动 Windows客户端主机,并通过远程桌面协议(RDP)连接。在你输入用户凭证后,会出现一个新的一次性密码验证窗口。从手机上的身份验证器应用程序中获取一次性密码。
Done!
踩坑过程
下面列举一些我在部署过程中遇到的问题,供大家参考避免重蹈覆辙。
坑0:同步用户的时候报错
问题描述:执行AD用户同步命令的时候提示:在LDAP连接的时候,验证失败(如下图):
分析过程:经排错后,发现是我少执行了第9个步骤REM Account for multiOTP authentication in AD:
解决方法:完成步骤9之后,再执行同步用户命令,用户同步成功(请记得检查每一步操作,不要像我一样遗漏步骤)。
坑1:执行同步命令后,同步了AD中所有的账户
问题描述:服务器端同步账户,未同步指定的2FAVPNUsers
安全组中的用户,而是同步了AD中所有的账户
分析过程:咨询我的个人助理后,得知需要设置一个ldap_filter
过滤器参数。
下面是我的小助理的分析过程
解决方法:
-
打开命令提示符并转到包含 multiotp.exe 的目录,然后执行下面的命令
命令如下:
multiotp -config ldap_filter="(memberOf=CN=2FAVPNUsers,OU=DG,OU=Groups,DC=YourDomain,DC=com)"
说明:组的路径需要替换为你自己的(如下图)
如果未显示
属性编辑器
页签,可以通过在控制台-查看,勾选高级功能
来开启。 -
删除所有用户:
- 可以在web界面,点击delete删除。
- 也可直接在MultiOTP服务器的程序所在目录,找到users文件夹,直接批量删除。
重新执行同步命令
注意:重新同步用户之后,二次验证的动态码需要重新添加!
坑2:客户端安装MultiOTP CredentialProvider不生效
问题描述:在验证环节,客户端安装MultiOTP CredentialProvider之后,远程登录未出现二次验证提示,输入系统的用户名和密码之后直接登录了
分析过程:应该是MultiOTP与火绒安全终端的二次验证服务冲突了。
解决方法:卸载火绒软件,再注销重连,即可出现验证窗口。
坑3:web端无法登录
问题描述:web端登录不了,输入用户名和密码,点击login之后,页面无反应(如下图)。
分析过程:之前可以登录web控制台,当执行了命令multiotp -config debug=1
之后,就无法登录了。估计是这个配置导致的。可以先改回去试试。
解决方法:在multiOTP服务器的multiOTP目录下执行下面命令,关闭debug
命令如下:
multiotp -config debug=0
执行效果:
关闭debug之后,网页可以登录了。
坑4:命令输出的日志时间与系统时间不一致
问题描述:在multiOTP服务器上执行命令debug时,输出的日志内容显示的时间,与本地操作系统的时间不一致。
分析过程:MultiOTP的配置时区与系统的时区不同(看到配置文件中时区为欧洲/苏黎世)。
解决方法:将MultiOTP配置的时区,改为你操作系统所在时区(本案例改为:亚洲/上海)。
命令如下:
multiotp -config timezone=Asia/Shanghai
执行效果:
并重启MultiOTP服务,可以看到时间一致了。
注意:要确保你的活动目录域与可靠的时间源同步时间,并且客户端设备具有正确的时间。这些对于一次性密码(OTP)的运行至关重要。如果multiOTP的服务器与multiOTP客户端的时间不一致,将导致验证失败。
坑5:输入二次验证的密码确认后,提示“Wrong one-time password”
问题描述:输入动态密码并点确定,提示一次性密码错误。
提示密码错误截图(Windows10)
提示密码错误截图(Windows7)
在multiOTP服务器的控制台验证一次性密码是可用的。
分析过程a:可能是multiOTP服务器与客户端,输入的共享密钥不一致。
解决方法a:在multiOTP服务器,以及客户端,都重新设置共享密钥。
需要使用multiotp -config server-secret=xxxxxxxxxxxxxx
命令修改。
在服务器端的multiOTP配置文件中记录的共享密钥参数
server_secret
是密文,直接修改无效。
在multiOTP客户端,直接修改注册表,操作路径截图如下:
分析过程b:可能是multiOTP客户端访问服务器的地址输入错误。
解决方法b:在multiOTP客户端,修改客户端的注册表multiOTPServers
值(如下图)
总结下遇到问题的拍错思路:
先保证服务器上一次性密码可以使用,再保证服务器和和客户端的端口通讯正常,然后检查服务器和客户端的配置是否一致。
最后,在multiOTP客户端电脑上,在命令提示符进入multiOTP安装目录,执行下面的命令验证结果。
命令如下:
multiotp -display-log konglinggan 535057 #请替换掉后面用户名和一次性密码
执行效果:
通过以上步骤,我们成功地在 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