为本地用户RDP登录配置带双因素认证(2FA)的FreeRadius
本地用户RDP登录配置带双因素认证(2FA)的FreeRadius
首先直接给你明确答案:
完全可行! 这个方案是非常成熟的,很多运维场景里都在用FreeRadius结合Google Authenticator给RDP登录加双因素认证,既能沿用本地用户体系,又能大幅提升登录安全性。
下面是一步步的配置指南,我尽量写得通俗易懂,适合新手跟着操作:
第一步:安装必要组件(以Debian/Ubuntu为例,RHEL/CentOS类系统包名稍作调整)
- 先更新系统包列表,然后安装FreeRadius、Google Authenticator的PAM模块和相关工具:
如果你用的是Windows RDP服务器,不用装这些,而是要在Windows上启用自带的**网络策略服务器(NPS)**来做Radius客户端对接FreeRadius。sudo apt update && sudo apt install freeradius freeradius-utils libpam-google-authenticator
第二步:给本地用户配置Google Authenticator
- 切换到需要启用2FA的本地用户(比如
john),执行生成密钥的命令:
跟着提示走就行:su - john google-authenticator- 问是否基于时间生成密码?选
y(这是TOTP标准,Google Authenticator默认用这个) - 问是否更新
~/.google_authenticator文件?选y - 问是否禁止重复使用同一验证码?选
y(防止重放攻击) - 问是否允许30秒宽限窗口?选
y(避免客户端和服务器时间差导致验证失败) - 问是否启用速率限制?选
y(比如每30秒最多试3次,防止暴力破解)
执行完会弹出二维码、密钥和几个紧急验证码,一定要把这些存好——二维码用Google Authenticator app扫一下就能添加账户,紧急验证码是万一手机丢了的时候用的。
- 问是否基于时间生成密码?选
第三步:配置FreeRadius对接Google Authenticator
先配置FreeRadius的PAM模块:
编辑/etc/freeradius/3.0/mods-available/pam,找到pam_auth段,确保PAM服务名是radiusd:pam_auth { pam = "radiusd" }然后启用这个模块:
sudo ln -s /etc/freeradius/3.0/mods-available/pam /etc/freeradius/3.0/mods-enabled/配置PAM的
radiusd服务规则:
创建/etc/pam.d/radiusd文件,写入以下内容:auth required pam_google_authenticator.so nullok account required pam_unix.so这里
nullok的意思是允许还没配置2FA的用户临时登录,如果你想强制所有用户必须用2FA,直接删掉这个参数就行。调整FreeRadius的认证流程:
编辑/etc/freeradius/3.0/sites-enabled/default,在authorize区块里加上pam,在authenticate区块里也加上pam——这样FreeRadius处理认证请求时,会先通过PAM调用Google Authenticator做验证。添加RDP服务器为FreeRadius的授权客户端:
编辑/etc/freeradius/3.0/clients.conf,添加一段:client rdp-server { ipaddr = 127.0.0.1 # 要是RDP和FreeRadius不在同一台机器,就填RDP服务器的IP secret = my_secure_shared_secret # 这个是共享密钥,后面RDP端配置要和这个一致 shortname = rdp }
第四步:配置RDP服务器对接FreeRadius
如果你用的是Linux xrdp服务器:
- 安装xrdp的Radius插件:
sudo apt install xrdp-radius - 编辑
/etc/xrdp/xrdp.ini,在[Globals]部分把认证方式改成Radius:auth_provider=radius - 编辑
/etc/xrdp/radius.ini,填入FreeRadius的信息:[Radius] server=127.0.0.1 port=1812 secret=my_secure_shared_secret # 必须和FreeRadius clients.conf里的密钥一致 timeout=5 retries=1 - 重启xrdp服务:
sudo systemctl restart xrdp
如果你用的是Windows RDP服务器:
- 打开服务器管理器,添加「网络策略和访问服务」角色,安装NPS(网络策略服务器)。
- 打开NPS,在「Radius客户端」里添加FreeRadius服务器:填入IP地址和刚才设置的共享密钥。
- 配置「连接请求策略」:新建策略,指定匹配RDP(3389端口)的连接请求,把认证请求转发到FreeRadius服务器。
- 配置「网络策略」:允许RDP登录,认证方式选「Radius认证」,注意Windows用户登录时,要把本地密码+Google Authenticator的6位验证码拼在一起输入(比如密码是
123456,验证码是789012,就输入123456789012)。
第五步:测试认证是否正常
- 先重启FreeRadius服务:
sudo systemctl restart freeradius - 用
radtest工具测试认证:
这里radtest john mypassword123456 127.0.0.1 0 my_secure_shared_secretmypassword123456是用户的本地密码加上6位验证码,如果返回Access-Accept就说明认证成功了。 - 最后用RDP客户端尝试登录,输入用户名和拼接后的密码+验证码,看看能不能正常登录。
备注:内容来源于stack exchange,提问作者Damola




