Linux如何配置多因素认证_Linux SSH+Google Authenticator【安全】
技术百科
冰火之心
发布时间:2026-01-19
浏览: 次 可通过集成Google Authenticator实现SSH的TOTP多因素认证,步骤包括:安装PAM模块、为用户生成密钥并绑定验证器、配置PAM策略、启用SSH的ChallengeResponseAuthentication、测试登录并设置应急通道。
如果您希望增强Linux服务器SSH登录的安全性,防止仅依赖密码或密钥被破解的风险,则可以通过集成Google Authenticator实现基于时间的一次性密码(TOTP)多因素认证。以下是配置此功能的具体步骤:
一、安装Google Authenticator PAM模块
Google Authenticator以PAM(Pluggable Authentication Modules)模块形式工作,需在系统中安装对应软件包,使SSH服务能调用其验证逻辑。
1、以root用户执行更新软件源命令:apt update(Ubuntu/Debian)或yum update(CentOS 7)或dnf update(CentOS 8/RHEL 8/Fedora)。
2、安装google-authenticator-libpam包:apt install libpam-google-authenticator(Debian/Ubuntu)或yum install google-authenticator(CentOS 7)或dnf install google-authenticator(CentOS 8+)。
3、验证模块文件是否存在:ls /lib/security/pam_google_authenticator.so或ls /usr/lib64/security/pam_google_authenticator.so,确认路径下存在该文件。
二、为用户生成TOTP密钥并配置验证器
每个启用MFA的用户需独立运行初始化命令,生成唯一密钥、二维码及备用恢复码,该过程仅对当前shell用户生效,不涉及系统级密钥共享。
1、切换至目标用户(如ubuntu):su - ubuntu。
2、执行初始化命令:google-authenticator。
3、按提示依次选择:y(启用时间同步令牌)、y(禁用同一令牌多次使用)、y(启用速率限制,每30秒最多3次尝试)、y(保存设置到用户主目录的~/.google_authenticator文件)、y(生成并显示10个一次性应急恢复码)。
4、使用手机端Google Authenticator、Authy或Microsoft Authenticator扫描终端输出的QR码,或手动输入密钥完成绑定。
三、配置PAM策略启用MFA验证流程
PAM负责定义认证顺序与条件,需修改SSH专用PAM配置文件,将Google Authenticator设为必要验证环节,确保每次SSH登录均触发TOTP校验。
1、备份原始配置:cp /etc/pam.d/sshd /etc/pam.d/sshd.bak。

2、在/etc/pam.d/sshd文件顶部添加以下行(Debian/Ubuntu):auth [success=ok default=die] pam_google_authenticator.so nullok secret=/home/${USER}/.google_authenticator。
3、若系统为RHEL/CentOS且使用systemd-logind,还需添加:auth [success=done default=ignore] pam_google_authenticator.so nullok。
4、确保该行位于其他auth段指令之前,避免被skip规则绕过。
四、修改SSH守护进程配置启用键盘交互认证
OpenSSH必须启用ChallengeResponseAuthentication机制,才能在密码验证后继续请求TOTP输入;若关闭此选项,PAM中的Google Authenticator将不会被调用。
1、编辑SSH服务配置文件:nano /etc/ssh/sshd_config。
2、定位并修改以下三项参数值:ChallengeResponseAuthentication yes、PasswordAuthentication yes、UsePAM yes。
3、若同时启用公钥认证,保留PubkeyAuthentication yes,但需注意:当PasswordAuthentication设为no时,TOTP将无法触发,除非额外配置AuthenticationMethods。
4、保存退出后重载服务:systemctl restart sshd(或service ssh restart)。
五、测试MFA登录流程并设置备用访问路径
验证配置是否生效需模拟真实登录场景,同时预留紧急通道以防TOTP失效导致锁死,保障运维可持续性。
1、从另一终端使用SSH连接服务器:ssh username@server_ip。
2、输入用户密码后,等待提示输入“Verification code”:Enter verification code:,此时打开手机Auth应用查看6位动态码并输入。
3、若登录失败,检查/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(RHEL/CentOS)中pam_google_authenticator相关错误条目。
4、为防手机丢失或应用损坏,提前将应急恢复码存于离线安全位置,并确保至少一个备用管理员账户未启用MFA或已配置SSH密钥免密登录。
# 能在
# google
# 最多
# 可通过
# 离线
# 令牌
# 绑定
# 如果您
# 设为
# 配置文件
# microsoft
# word
# linux
# centos
# ubuntu
# default
# ssh
# debian
# go
# var
# 软件包
# die
# dnf
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱
- Windows如何使用BitLocker To G
- 如何在Golang中写入XML文件_生成符合规范的
- 为什么Go需要go mod文件_Go go mod
- Python与Docker容器化部署实战_镜像构建
- php文件怎么变mp4保存_php输出视频流保存为
- 如何在Golang中捕获JSON序列化错误_Gol
- c++怎么使用std::filesystem遍历文
- 如何使用Golang指针与结构体结合_修改结构体内
- 如何解决同一段404代码在不同主机上表现不一致的问
- 如何使用Golang实现多重错误处理_Golang
- Python文件和流处理指南_高效读写大体积数据文
- c++怎么处理多线程死锁_c++ lock_gua
- Windows 11如何开启文件夹加密(EFS)_
- 如何在同包不同文件中正确引用 Go 结构体
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- 如何用列表一次性对 DataFrame 的指定列应
- php能控制zigbee模块吗_php通过串口与c
- Win11如何设置开机问候语 Win11修改登录界
- Django 密码修改后会话失效的解决方案
- c++中如何使用auto关键字_c++11类型推导
- Python变量绑定机制_引用模型解析【教程】
- php订单日志怎么在swoole写_php协程sw
- 如何在Golang中解压文件_Golang com
- Python如何创建带属性的XML节点
- Win11怎么设置默认邮件客户端 Win11修改M
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- Windows 11怎么更改锁屏超时时间_Wind
- php中$this和::能混用吗_对象与静态作用域
- Win11怎么开启空间音效_Windows11耳机
- PHP主流架构怎么部署到Docker_容器化流程【
- php删除数据怎么清空表_truncate与del
- Win11如何设置环境变量 Win11添加和修改系
- Win11如何设置自动关机 Win11定时关机命令
- mac怎么查看wifi密码_MAC查看已连接WiF
- c++ namespace命名空间用法_c++避免
- Win11怎么更改任务栏颜色_Windows11个
- Win10怎样设置多显示器_Win10多显示器扩展
- php转mp4怎么保留字幕_php处理带字幕视频转
- Win11怎么更改文件夹图标_自定义Win11文件
- Python安全爬虫设计_IP代理池与验证码识别策
- 如何使用正则表达式批量替换重复的“-”模式为固定字
- Win11如何更新显卡驱动 Win11检查和安装设
- Win11怎么设置默认浏览器Chrome_Wind
- Go 语言标准库为何不提供泛型 Contains
- Win11怎么关闭自动维护 Win11禁用系统自动
- C++如何使用std::optional?(处理可
- C++ STL算法库怎么用?C++常用算法函数(s
- Windows蓝屏错误0x0000002C怎么解决
- 如何使用Golang反射创建map对象_动态生成键

QQ客服