使用 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" }

相关推荐
梓仁沐白2 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
九鼎科技-Leo6 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Yang.998 小时前
基于Windows系统用C++做一个点名工具
c++·windows·sql·visual studio code·sqlite3
我不瘦但很逗8 小时前
Windows下使用DBeaver连接云数据库(MySQL)
数据库·windows
ashane131410 小时前
Java list
java·windows·list
万里沧海寄云帆10 小时前
Word 插入分节符页码更新问题
windows·microsoft·word
dot.Net安全矩阵11 小时前
.NET 通过模块和驱动收集本地EDR的工具
windows·安全·web安全·.net·交互
编程修仙12 小时前
Collections工具类
linux·windows·python
程序员小羊!14 小时前
高级 SQL 技巧讲解
windows
xiangshangdemayi15 小时前
Windows环境GeoServer打包Docker极速入门
windows·docker·容器·geoserver·打包·数据挂载