前言
在等保 2.0 标准中有要求:
d)应采用口令、密码技术、生物技术等两种或两种以上组合的鉴别技术对用户进行身份鉴别,且其中一种鉴别技术至少应使用密码技术来实现。
可以借助开源的 privacyIDEA 配合 AD 域环境实现 RDP + MFA 认证登录以满足上面的要求. 本文使用 3 台 VM 进行演示, 主要步骤:
- 部署 AD 环境 (Windows)
- 部署 privacyIDEA 服务器 (Ubuntu)
- 客户端加域
- 客户端安装 privacyIDEA Credential Provider 插件
- 测试验证
部署 AD 环境 (172.31.43.98)
启动一台 Windows Server 2022 虚拟机, 执行下面 PowerShell 命令配置为 Domain Controller.
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Install-ADDSForest -DomainName ps.com -InstallDNS
部署 privacyIDEA 服务器 (172.31.41.28)
启动一台 Ubuntu 22.04 虚拟机, 执行下面命令安装和配置 privacyIDEA 服务端. 官方文档
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 地址.
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 命令:
# 改 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” }