首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >腾讯云服务器 SSH 反复弹出二维码验证 — 完整排查与解决

腾讯云服务器 SSH 反复弹出二维码验证 — 完整排查与解决

原创
作者头像
用户11905087
发布2026-06-09 11:01:31
发布2026-06-09 11:01:31
900
举报

每次 SSH 连接腾讯云轻量应用服务器都弹出微信扫码二维码,密钥认证完全失效。本文从根本原因出发,提供完整的排查和解决方案。


问题描述

在使用 SSH 连接腾讯云轻量应用服务器时,每次新建连接都会弹出微信扫码验证:

代码语言:atom
复制
██████████████████████████████████████████████████████████████████████
██              ██████  ██████  ████      ████    ████              ██
...(各种图案)...
请使用微信扫码安全登录。

症状:

  • SSH 密钥认证(id_ed25519)完全失效,返回
代码语言:bash
复制
  Permission denied (publickey)`
  • 每次 SSH 都弹二维码,包括同一台机器的连续连接
  • 即使已在 Web 控制台扫码登录,终端 SSH 仍然弹

根本原因

腾讯云轻量应用服务器默认安装了主机安全(YunJing)组件。该组件通过以下三种方式注入二维码验证:

注入方式

路径

说明

PAM 模块动态注入

/usr/lib/x86_64-linux-gnu/security/pam_qrlogin.so

SSH 认证前强制弹出二维码

YunJing 自带 PAM 插件

/usr/local/qcloud/YunJing/pam_plugin/pam_qrlogin.so

替代系统 PAM 模块

SSH Banner 输出

/etc/ssh/banner.txt

SSH 登录后输出二维码文本

核心问题在于 /etc/pam.d/sshd 中的 pam_qrlogin.so 模块,它在 SSH 认证流程中插入了二维码验证,跳过了正常的公钥认证。

完整解决步骤

前提:通过其他方式登录

在解决 SSH 之前,需要先用以下方式之一登录服务器:

  1. 腾讯云控制台网页终端:登录腾讯云控制台 → 轻量应用服务器 → 点击"运行命令"或"Web Shell"
  2. 腾讯云 VNC:在控制台使用 VNC 远程登录
  3. 之前能连的终端会话:如果已有已登录的 SSH 会话保持中

第一步:注释 PAM 中的二维码模块

代码语言:bash
复制
# 查看当前的 PAM SSH 配置
cat /etc/pam.d/sshd | grep -n qrlogin

# 注释掉 pam_qrlogin 行
sed -i 's/^auth.*pam_qrlogin.so/# &/' /etc/pam.d/sshd

# 验证修改
cat /etc/pam.d/sshd | grep -n qrlogin

修改后应该看到 # auth required pam_qrlogin.so(前面带 # 注释)。

第二步:关闭 SSH Banner 二维码

YunJing 还会通过 SSH Banner 输出二维码信息:

代码语言:bash
复制
# 查看当前 Banner 配置
grep -i "banner" /etc/ssh/sshd_config

# 注释掉 Banner 配置
sed -i 's|^Banner /etc/ssh/banner.txt|#Banner none|' /etc/ssh/sshd_config

# 验证修改
grep -i "banner" /etc/ssh/sshd_config

第三步:卸载 YunJing 主机安全组件

⚠️ 警告:卸载后服务器将失去主机安全防护(入侵检测、恶意文件扫描等)。请确认你已有其他安全措施(防火墙、安全组等)。

代码语言:bash
复制
# 执行卸载脚本
/usr/local/qcloud/YunJing/uninst.sh

# 或者手动卸载
systemctl stop aliyun.service 2>/dev/null
systemctl stop YunJing 2>/dev/null
rm -rf /usr/local/qcloud/YunJing
rm -f /usr/lib/x86_64-linux-gnu/security/pam_qrlogin.so

# 清理残留的 PAM 配置
ls /etc/pam.d/sshd | xargs grep -l qrlogin && \
  sed -i '/qrlogin/d' /etc/pam.d/sshd

第四步:修复 SSH 公钥认证

二维码解决后,密钥认证可能因为权限问题仍然无法使用。修复权限:

代码语言:bash
复制
# 修复 home 目录权限(不能太宽松)
chmod 755 /home/ubuntu

# 修复 .ssh 目录权限
chmod 700 /home/ubuntu/.ssh

# 修复 authorized_keys 权限
chmod 600 /home/ubuntu/.ssh/authorized_keys

# 将公钥写入 authorized_keys(如果还没有)
cat /home/ubuntu/.ssh/id_ed25519.pub >> /home/ubuntu/.ssh/authorized_keys

# 确保文件属主正确
chown -R ubuntu:ubuntu /home/ubuntu/.ssh

第五步:重启 SSH 服务并测试

代码语言:bash
复制
# 重启 SSH
systemctl restart sshd

# 测试 SSH 连接(不要弹二维码)
ssh -i ~/.ssh/id_ed25519 ubuntu@你的服务器IP

如果连接成功且不弹二维码,说明问题已彻底解决。

常见问题

现象

原因

解决方法

还是弹二维码

YunJing 进程重新注入 PAM 模块

执行卸载脚本,并确认 pam_qrlogin.so 被删除

Permission denied (publickey)

公钥未写入或目录权限过宽

修复权限 + 写入公钥

Git Bash 提示私钥不存在

Windows 路径反斜杠问题

~/.ssh/id_ed25519/c/Users/你的用户名/.ssh/id_ed25519

Ubuntu WSL 连不上

私钥在 Windows 侧

cp /mnt/c/Users/用户名/.ssh/id_ed25519 ~/.ssh/

防止复发

  1. 定期监控 PAM 配置:# 添加到 crontab 定期检查 crontab -e添加:0 3 * * 1 grep -q qrlogin /etc/pam.d/sshd && echo "WARN: qrlogin detected"
  2. 避免安装 YunJing:轻量应用服务器创建时,在镜像选择时注意是否预装了 YunJing
  3. 使用安全组替代主机防护:通过腾讯云控制台的安全组规则(IP 白名单)替代主机层面的防护

安全提示

  • 卸载 YunJing 后,建议确认腾讯云安全组只开放必要端口
  • 定期检查登录日志:cat /var/log/auth.log | grep sshd
  • 考虑配置 AllowUsersAllowGroups 限制 SSH 登录用户
  • 密钥文件权限必须为 600,否则 SSH 会拒绝使用

本文基于腾讯云轻量应用服务器 Ubuntu 22.04 环境编写,适用于所有搭载 YunJing 组件的腾讯云实例。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 根本原因
  • 完整解决步骤
    • 前提:通过其他方式登录
    • 第一步:注释 PAM 中的二维码模块
    • 第二步:关闭 SSH Banner 二维码
    • 第三步:卸载 YunJing 主机安全组件
    • 第四步:修复 SSH 公钥认证
    • 第五步:重启 SSH 服务并测试
  • 常见问题
  • 防止复发
  • 安全提示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档