各位大佬好,请教下交换机双因子认证是不是有Bug?目前测试单纯密码或密钥是可以ssh认证登录的,状况是python通过SSH连接,SFTP下载交换机的配置文件到本地,以下为交换机的版本信息
H3C Comware Software, Version 7.1.070, Release 6343P08
Copyright (c) 2004-2022 New H3C Technologies Co., Ltd. All rights reserved.
H3C S5048PV3-EI uptime is 0 weeks, 3 days, 17 hours, 44 minutes
Last reboot reason : User reboot
Boot image: flash:/s5000v3_ei-cmw710-boot-r6343p08.bin
Boot image version: 7.1.070, Release 6343P08
Compiled Sep 21 2022 11:00:00
System image: flash:/s5000v3_ei-cmw710-system-r6343p08.bin
System image version: 7.1.070, Release 6343P08
Compiled Sep 21 2022 11:00:00
Slot 1:
Uptime is 0 weeks,3 days,17 hours,44 minutes
S5048PV3-EI with 1 Processor
BOARD TYPE: S5048PV3-EI
DRAM: 512M bytes
FLASH: 256M bytes
PCB 1 Version: VER.A
Bootrom Version: 146
CPLD 1 Version: 001
Release Version: H3C S5048PV3-EI-6343P08
Patch Version : None
Reboot Cause : UserReboot
[SubSlot 0] 48GE+4SFP
基于你的描述和软件版本,这很可能是一个已知问题或配置细节未妥善处理,而非设备本身的Bug。
我整理了一份排查清单,你可以对照着逐步检查,大概率能定位到原因。
软件版本已知问题:你当前使用的 Release 6343P08 版本,在H3C的知了社区中,已有用户反馈过类似的双因子认证(密码+公钥)在SFTP场景下存在问题。这是需要优先考虑的。
Python库认证逻辑问题:paramiko 等库在实现双因子认证时,对“同时提供密码和公钥”的处理方式可能不符合交换机的预期。有时库可能默认只使用一种认证方式。
交换机配置不完整:可能遗漏了关键步骤,例如没有正确地将公钥与SSH用户关联,或认证类型未设置为 password-publickey。
客户端/服务端SSH版本或算法协商失败:尽管单独认证能成功,但双因子认证可能触发了不同的协商流程,如果算法(如密钥交换算法、加密算法)不匹配,也可能导致连接失败。
建议按照以下顺序操作:
这是解决已知问题最直接的方法。
请登录交换机,逐一核对以下关键配置。
确认SSH用户认证方式:执行 display ssh user-information,确保相应用户的 Authentication-type 字段显示为 password-publickey。
确认公钥已正确导入并关联:
用标准的SSH客户端(如 PuTTY 或 SecureCRT)进行一次手动双因子登录测试。
目的:确认在手动输入密码和加载私钥的情况下,能否成功登录。
结果判断:
如果手动登录也失败:问题基本在交换机侧的配置或版本上。
如果手动登录成功:问题几乎可以肯定是出在你的Python脚本逻辑上。
paramiko)确认同时传递了密码和私钥:在 paramiko 的 connect() 方法中,需要同时指定 password 和 pkey 参数。
检查私钥格式:确保 paramiko 能正确解析你的私钥文件(通常是PEM格式)。如果私钥有密码保护,需要在 from_private_key_file() 方法中提供 password 参数。
登录交换机,执行 display logbuffer 命令,查看是否有SSH认证失败的具体错误信息。这些日志能提供最直接的线索。
暂无评论
并不是交换机存在 Bug,99% 是配置错误 + Python SSH 库调用逻辑不满足「双因子同时校验」要求
你的设备版本 R6343P08 本身完整支持 password-publickey 双因子(密码 + 密钥全部校验通过才放行),不存在官方已知漏洞。
你当前现象:单用密码、单用密钥都能登录,说明现在认证模式是 all(或 default 兼容模式,二选一即可放行),并未开启强制双因子。
一、先搞懂 Comware V7 SSH 4 种认证模式(根源)
plaintext
1. password:仅密码登录
2. publickey:仅密钥免密登录
3. password-publickey【真正双因子】:SSH2客户端必须**密钥校验成功 + 密码校验成功,两个全都通过才能登录**
4. all(你现在大概率是这个):密钥/密码任意一个通过就能登录,这就是你「单用密码、单用密钥均可连上」的根本原因
官方手册明确:password-publickey 才是严格双因素认证,二选一放行 = 配置错误。
二、交换机标准正确双因子完整配置(覆盖 SSH+SFTP)
1、前置基础(确保已做)
shell
system-view
# 生成服务器主机密钥(必须)
public-key local create rsa
ssh server enable
ssh server version 2 # 强制仅SSH2,杜绝SSH1降级漏洞
# VTY线路认证模式
user-interface vty 0 15
authentication-mode scheme
protocol inbound ssh
quit
2、给目标 SSH 用户开启【强制双因子】(关键修正命令)
shell
# 1.本地用户配置密码、权限、服务类型
local-user admin class manage
password cipher Admin@123456
service-type ssh sftp
authorization-attribute user-role network-admin
quit
# 2.导入客户端公钥(把你的本地公钥上传交换机导入)
public-key peer ClientKey import sshkey flash:/id_rsa.pub
# 3.绑定公钥给SSH用户 + 强制双因子认证 password-publickey
ssh user admin publickey ClientKey
ssh user admin service-type ssh sftp
# 重点:双因子认证模式,必须写 password-publickey
ssh user admin authentication-type password-publickey
3、全局 SSH 服务器兜底模式(可选加固)
shell
# 全局默认双因子,防止新建用户逃逸策略
ssh authentication-type default password-publickey
4、校验配置是否生效
shell
# 查看用户SSH认证模式,必须显示 authentication-type: password-publickey
display ssh user-information admin
# 查看SSH全局配置
display ssh server configuration
配置完成后:
只带密钥不带密码 → 认证失败
只输密码不带密钥 → 认证失败
必须密钥验证通过 + 再输入正确密码,才能建立 SSH/SFTP 连接。
三、Python 脚本 SFTP 仍然能单方式登录的 2 个核心原因
原因 1:Python Paramiko/Netmiko 默认只会执行单阶段认证
绝大多数 SSH 库逻辑:
优先尝试密钥认证,如果密钥成功,直接完成登录,不会再触发二次密码校验;
只有密钥失败时,才会弹窗 / 传入密码做二次认证。
交换机双因子要求:密钥校验成功之后,仍然强制弹出密码输入环节,但 Paramiko 默认流程走完密钥成功就结束流程,不会主动提交密码,导致出现两种诡异表现:
脚本传了私钥 + 密码:密钥过了就直接登录,跳过密码校验;
只传密码:走密码认证也能登录。
解决 Python 适配双因子 SSH 写法(Paramiko 示例)
必须开启「密钥成功后再次交互式提交密码」,标准双因子调用模板:
python
运行
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
private_key = paramiko.RSAKey.from_private_key_file(r"C:\ssh_key\id_rsa")
# 关键:允许密钥认证后继续进行密码交互式认证
ssh.connect(
hostname='交换机IP',
username='admin',
password='Admin@123456',
pkey=private_key,
look_for_keys=False,
allow_agent=False
)
# 后续建立sftp会话
sftp = ssh.open_sftp()
如果使用 Netmiko,需要额外添加 auth_timeout 并开启 banner_timeout 适配二次密码弹窗。
原因 2:交换机存在两条配置叠加冲突
用户 SSH 认证模式是 password-publickey
全局配置了 ssh authentication-type default all
全局 default 配置会覆盖用户策略,依然允许二选一登录。
排查命令:
shell
display current-configuration | include ssh authentication-type default
如果存在 ssh authentication-type default all,删除该配置即可:
shell
undo ssh authentication-type default
四、是否存在版本 Bug?
R6343P08 无 password-publickey 认证失效的官方 BUG 公告;
仅极早期 R6305 版本存在双因子绕过漏洞,你的版本不受影响;
稳妥方案:升级至 S5048PV3-EI 最终正式版本 R6343P10,补齐全部 SSH 安全补丁。
五、分步排错落地流程
Console 登录交换机,执行 ssh user admin authentication-type password-publickey 严格绑定双因子模式;
删除全局 ssh authentication-type default all 兜底兼容配置;
使用 Xshell、SecureCRT 手动测试:
仅导入私钥登录:会在密钥校验通过后,强制弹出密码输入框,不输密码拒绝登录;
只输密码不提供私钥:直接认证拒绝;
手动验证正常 = 交换机配置无误。
修改 Python 代码,同时传入私钥 + 密码,适配双阶段认证流程。
复测 SFTP 下载配置,此时无法只用密钥 / 只用密码绕过认证。
六、额外加固补充(防止逃逸双因子)
shell
# 禁止SSH键盘交互式绕过
undo ssh server keyboard-interactive authentication enable
# 限制SSH来源IP,仅运维服务器允许连接
acl number 3000
permit source 运维服务器IP 0
ssh server acl 3000
七、总结
不是交换机 Bug,是认证模式配成了all(二选一放行),没有启用真正的password-publickey双因子;
Python SSH 库默认逻辑在密钥认证成功后不会再提交密码,看上去像是 “绕过了密码校验”;
修正 SSH 用户认证模式 + 修改 Python 代码同时传入密钥和密码,即可实现严格「密钥 + 密码双重校验」。
暂无评论
亲~登录后才可以操作哦!
确定你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作
举报
×
侵犯我的权益
×
侵犯了我企业的权益
×
抄袭了我的内容
×
原文链接或出处
诽谤我
×
对根叔社区有害的内容
×
不规范转载
×
举报说明
暂无评论