使用 privacyIDEA 实现 Windows RDP 多因素认证 (MFA)

前言

在等保 2.0 标准中有要求:

d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。

可以借助开源的 privacyIDEA 配合 AD 域环境实现 RDP + MFA 认证登录以满足上面的要求. 本文使用 3 台 VM 进行演示, 主要步骤:

  1. 部署 AD 环境 (Windows)
  2. 部署 privacyIDEA 服务器 (Ubuntu)
  3. 客户端加域
  4. 客户端安装 privacyIDEA Credential Provider 插件
  5. 测试验证

部署 AD 环境 (172.31.43.98)

启动一台 Windows Server 2022 虚拟机, 执行下面 PowerShell 命令配置为 Domain Controller.

powershell 复制代码
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Install-ADDSForest -DomainName ps.com -InstallDNS

部署 privacyIDEA 服务器 (172.31.41.28)

启动一台 Ubuntu 22.04 虚拟机, 执行下面命令安装和配置 privacyIDEA 服务端. 官方文档

shell 复制代码
sudo su
wget https://lancelot.netknights.it/NetKnights-Release.asc
mv NetKnights-Release.asc /etc/apt/trusted.gpg.d/
add-apt-repository http://lancelot.netknights.it/community/jammy/stable
apt install -y privacyidea-apache2

# 创建系统管理员账号
pi-manage admin add admin -e admin@localhost

继续修改系统 DNS 使用 DC 做解析, 目的是为了后面通过 LDAP 访问 AD 数据的时候能正常解析, 172.31.43.98 是上一步准备好的 DC 地址.

shell 复制代码
echo "DNS=172.31.43.98" >> /etc/systemd/resolved.conf
resolvectl dns ens5 172.31.43.98
systemctl restart systemd-resolved
ping ps.com
# 能解析出来内网地址就行

启动客户端

再启动一台 Windows Server 2022 作为客户端, 执行下面 PowerShell 命令:

powershell 复制代码
# 改 DNS
Set-DnsClientServerAddress -InterfaceAlias (Get-NetAdapter | select -Property Name).Name -ServerAddresses 172.31.43.98
# 加域
Add-Computer -DomainName ps.com -Credential (Get-Credential "ps.com\administrator") -Restart

重启后使用域账号登录 administrator@ps.com, 下载 privacyIDEA Credential Provider 插件安装:
https://github.com/privacyidea/privacyidea-credential-provider/releases/
CSDN 备用下载地址 privacyIDEACredentialProviderSetup-v3.5.3.msi

Hostname 填写上面准备好的 Ubuntu 地址, 测试期间先忽略 SSL. 生产环境务必得用有效的证书 , 篇幅原因本文不展开了.

其余步骤全部默认(留空)下一步就行. 安装完成后 Windows 开始菜单中并不会出现什么快捷方式, 也不会有 TrayIcon 什么的.

配置 privacyIDEA

在客户端系统里面访问 privacyIDEA 地址, 使用之前创建的管理员账号进行登录.

首次使用提示 Create default realm, 选择 No, 因为我们要继续配置从 AD 里面获取用户信息.

创建 Resolver

依次 Config > Users > New Ldapresolver

Resolver name: ps.com-ldap [自己起] 
Server URI: ldap://[DCHOSTNAME].ps.com
STARTTLS: [不选]
Base DN: dc=ps,dc=com [没有OU, 就直接写成根一级了]
Bind Type: Simple
Bind DN: cn=administrator,cn=users,dc=ps,dc=com [管理员的完整 DN]
Bind Password: [管理员的密码]
[其余选项保持默认就行]

点击 Preset Active Directory 按钮直接使用预制的过滤模板, 点击 Test LDAP Resolver 测试通过后 Save.

这一步很容易出现失败的情况, 需要根据报错提示来判断错误的原因, 整理主要可能涉及到的有:

  • privacyIDEA 所在的 Ubuntu 系统 DNS 没有配置使用 DC 做解析, 导致通信失败
  • Base DN 填写不对, 演示用的是一个空的自建 AD 环境, 实际环境中通常会包含 OU 信息, 注意检查路径格式和有效性
  • Bind DN 填写不对, 同上面的 Base DN, 务必需要确保使用的域账号 DN 格式正确和有效

创建 Realm

Config > Realms, 起个名字, 勾选上 resolver, Create

分配 Token

切到 Users 界面可以看到从 AD 同步过来的用户信息, 找到 Administrator 点进去

Enroll New Token

选择 TOTP, 直接 Enroll Token

使用手机扫描二维码进行绑定, 支持 Google/Microsoft Authenticator, Authy, 宁盾等 App. 注意这里绑定的时候就扫一下就行了, App 上会直接添加成功.

客户端 RDP + MFA 测试

重新使用 RDP 连接客户端, 正常输入域账号和密码后, 会显示:

在 One-Time Password 中输入 App 中显示的动态码, 匹配一致即登录成功. 若动态码输入错误, 则会显示:

后话

除了配置 MFA 之外, 等保 2.0 中还有许多其他的安全要求, 分享一个 Github 上大佬写的 PowerShell 脚本可以用于批量修改本地安全/组策略加固系统:
https://github.com/WeiyiGeek/SecOpsDev/tree/master/OperatingSystem/Security/Windows

需要注意, 不建议直接运行这个脚本, 里面会改 WSUS 配置, 作为参考自己挑着跑一下还好.

另外, Web 管理界面过一会儿不操作就会自动锁

解锁后就会再提示一遍 Welcome, 挺讨厌的

参考文档 https://privacyidea.readthedocs.io/en/latest/policies/webui.html#logout-time

You can define a policy in PrivacyIdea with scope "WebUI", Condition: select the realm your admins are in and define: {"logout_time": "3600" }

相关推荐
胜天半子祁厅22 分钟前
Python学习打卡:day15
windows·python·学习
橙子味冰可乐1 小时前
input()函数——输入
linux·服务器·windows·python·tcp/ip·sqlite
空名_Noname2 小时前
Win脚本开机自启ALIst和RClone
网络·windows
day3ZY2 小时前
win10修改远程桌面端口,Windows 10下修改远程桌面端口及服务器关闭445端口的操作指南
运维·服务器·windows
White_______5 小时前
PVE更新 报错过程解决
windows
发菜君16 小时前
LangChain真的好用吗?谈一下LangChain封装FAISS的一些坑
人工智能·windows·langchain·大模型·faiss·ai大模型
bcdaren21 小时前
《Windows API每日一练》6.2 客户区鼠标消息
c语言·汇编·windows
小鹏linux1 天前
【windows|011】TCP/IP5层模型常见协议及应用总结大全
linux·网络·windows·网络协议·tcp/ip
love6a61 天前
WINDOWS+PHP+Mysql+Apache环境中部署SQLi-Labs、XSS-Labs、UPload-Labs、DVWA、pikachu等靶场环境
windows·mysql·php