银河麒麟V10 SP1/SP2需通过PAM集成Google Authenticator实现SSH TOTP双因子认证,关键步骤包括关闭SELinux、启用NTP同步、安装libpam-google-authenticator与qrencode、为普通用户初始化密钥、在/etc/pam.d/sshd顶部添加secret=路径的auth规则、禁用PubkeyAuthentication并重启sshd。

银河麒麟操作系统(V10 SP1/SP2)作为基于Linux内核的国产安全操作系统,需通过PAM模块集成Google Authenticator实现SSH双因子认证,其配置逻辑与Ubuntu/CentOS一致但存在关键路径差异:默认禁用root远程登录、/etc/pam.d/sshd中已有麒麟自定义规则、用户家目录权限策略更严格。
确认系统环境与前置条件
执行lsb_release -a确认为银河麒麟V10 SP1或SP2;运行systemctl is-active sshd确保SSH服务已启用;【必须关闭SELinux】——银河麒麟默认启用SELinux且未适配pam_google_authenticator.so的上下文标签,不关闭会导致PAM模块静默失败,执行sudo setenforce 0并编辑/etc/selinux/config将SELINUX=disabled。
同步系统时间:银河麒麟默认未启用chronyd,执行sudo timedatectl set-ntp true后等待30秒,再运行timedatectl status | grep "System clock"确认偏差小于±15秒。
安装Google Authenticator及依赖
银河麒麟V10使用apt源但软件包名与Ubuntu不同:执行sudo apt update && sudo apt install libpam-google-authenticator qrencode -y。若提示无法定位软件包,需先启用麒麟官方安全更新源:sudo apt-add-repository 'deb https://archive.kylinos.cn/kylin/KYLIN-ALL kylindesktop-10.1 main',再重试安装。
注意:qrencode必须安装,否则google-authenticator命令无法生成二维码,仅输出密钥文本——这会极大增加手机端手动录入错误率。
为目标用户初始化TOTP密钥
切换到目标普通用户(禁止直接为root初始化):su - username,运行google-authenticator。
按以下顺序严格选择:
① Do you want authentication tokens to be time-based? → 输入y(TOTP是唯一兼容安卓/iOS主流验证器的标准)
② Do you want me to update your "/home/username/.google_authenticator" file? → 输入y
③ Do you want to disallow multiple uses of the same authentication token? → 输入y(防止重放攻击,此选项不选将导致验证码可重复使用)
④ By default, tokens are good for 30 seconds → 输入n(银河麒麟默认NTP同步精度足够,调宽窗口反而降低安全性)
⑤ Do you want to enable rate-limiting? → 输入y(限制每30秒最多3次尝试,防暴力破解)
保存生成的10个备用恢复码到离线介质——【该文件一旦丢失且无备份码,账户将永久锁定】。
配置PAM强制调用验证模块
编辑/etc/pam.d/sshd:sudo vim /etc/pam.d/sshd。
在文件最顶部插入新行(必须在所有@include行之前):auth [success=ok new_authtok_reqd=ok default=bad] pam_google_authenticator.so secret=/home/$USER/.google_authenticator。
关键点:使用secret=参数硬编码路径,避免nullok参数允许未配置用户跳过验证;[success=ok default=bad]确保验证失败立即终止认证流程,不回退到密码环节。
修改SSH服务策略启用交互式认证
编辑/etc/ssh/sshd_config:sudo vim /etc/ssh/sshd_config。
确认以下三行已取消注释且值为yes:
ChallengeResponseAuthentication yes
UsePAM yes
PasswordAuthentication yes
特别注意:银河麒麟默认启用PubkeyAuthentication yes,必须将其改为no或在对应用户~/.ssh/authorized_keys中删除no-touch-required等免交互标记,否则公钥登录将绕过TOTP验证。
执行sudo systemctl restart sshd重启服务。
客户端登录时触发验证码输入
使用PuTTY连接时,在“Connection → SSH → Auth”页面取消勾选“Allow agent forwarding”,在“Connection → SSH → Auth → GSSAPI”中取消所有选项;然后在“Connection → Data”中将“Terminal-type string”改为xterm。
登录时,先输入用户密码,回车后光标停留不动——此时服务器已等待验证码输入,直接输入手机Google Authenticator当前显示的6位数字并回车即可完成认证。

















