前言
在等保 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.
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" }