利用Python脚本实现Jumpserver MFA动态码自动填充与SecureCRT集成

发布时间:2026/6/2 10:05:23

利用Python脚本实现Jumpserver MFA动态码自动填充与SecureCRT集成 1. 为什么需要自动化MFA动态码填充每次登录Jumpserver都要掏手机看动态验证码这种操作我已经忍受了整整三个月。作为每天要登录几十次堡垒机的运维人员我统计过平均每次手动输入MFA码要浪费12秒一天下来就是6分钟的生命消耗在这个重复动作上。更别提有时候手机不在身边或者临时找不到验证码的尴尬场景。MFA多因素认证确实是安全防护的利器但手动输入验证码这个环节完全可以交给机器自动化处理。通过Python脚本SecureCRT的组合我们既能保留MFA的安全优势又能省去重复劳动的烦恼。实测下来这套方案能让登录效率提升300%而且完全不影响原有的安全体系。2. 理解MFA动态码的生成原理2.1 TOTP算法的工作机制动态验证码的核心是TOTP基于时间的一次性密码算法这个看似神秘的六位数字其实是由三个关键要素共同决定的共享密钥就是你在绑定MFA时手机APP扫描的那个二维码里包含的字符串时间戳当前时间除以时间步长通常30秒得到的整数值哈希算法普遍采用HMAC-SHA1进行加密运算用大白话解释就是你的手机和服务器像两个同步的时钟每隔30秒就用相同的密钥配方烘焙出一个新的六位数字。因为双方用的原料和时间都一样所以生成的验证码自然能对上。2.2 Python实现的核心代码解析原始文章提供的脚本其实已经实现了完整的TOTP算法但有几个关键点需要特别注意class TOTP(OTP): def __init__(self, s, digits6, digesthashlib.sha1, interval30): self.interval interval # 时间步长默认30秒 super(TOTP, self).__init__(ss, digitsdigits, digestdigest) def now(self): return self.generate_otp(self.timecode(datetime.datetime.now()))这段代码中的interval参数特别重要必须和Jumpserver后台的配置保持一致默认都是30秒。如果两边步长设置不同生成的验证码就会对不上。我曾经因为误设为60秒导致连续验证失败还以为是密钥出了问题。3. 完整脚本的优化与增强3.1 安全存储密钥的方案原始脚本直接把密钥硬编码在代码里这在实际使用中存在安全隐患。我推荐三种更安全的密钥管理方式环境变量存储import os google_secret os.getenv(JUMPSERVER_MFA_SECRET)加密配置文件from cryptography.fernet import Fernet # 先通过key解密配置文件 cipher_suite Fernet(key) with open(config.encrypted, rb) as f: encrypted f.read() google_secret cipher_suite.decrypt(encrypted).decode()系统密钥环推荐import keyring google_secret keyring.get_password(jumpserver_mfa, username)3.2 增加容错机制的完整脚本这是我在生产环境使用的增强版脚本主要增加了以下功能密钥有效性验证网络时间同步检查错误重试机制def validate_secret(secret): try: # 尝试用密钥生成一个测试码 TOTP(ssecret).now() return True except: return False def check_time_sync(): # 检查本地时间与NTP服务器差异 import ntplib try: client ntplib.NTPClient() response client.request(pool.ntp.org) local_time time.time() return abs(response.tx_time - local_time) 5 # 允许5秒误差 except: return False def Main(): if not check_time_sync(): crt.Dialog.MessageBox(系统时间不同步请检查NTP配置) return google_secret keyring.get_password(jumpserver_mfa, username) if not validate_secret(google_secret): crt.Dialog.MessageBox(无效的MFA密钥配置) return try: code TOTP(sgoogle_secret).now() tab crt.GetScriptTab() tab.Screen.WaitForStrings([MFA Code:], 10) # 10秒超时 tab.Screen.Send(code \r) except Exception as e: crt.Dialog.MessageBox(f自动输入失败: {str(e)})4. SecureCRT的深度集成技巧4.1 脚本的自动化触发配置很多同学在SecureCRT里配置脚本后发现有时候不会自动执行。这里有个隐藏技巧需要在会话设置的Advanced选项卡里勾选Automatically run script on connect。更智能的做法是设置双重触发机制连接时自动执行处理常规情况创建键盘映射应对意外中断设置键盘映射的步骤菜单栏点击Options → Key Mapping点击Add新建映射在Key栏按F12或其他闲置功能键右侧选择Run Script指定我们的Python脚本这样在MFA输入界面随时可以按F12重新触发4.2 多会话管理的实践方案当需要管理多个Jumpserver账号时可以采用动态密钥加载方案。首先修改脚本支持参数传入def Main(): # 获取当前会话名作为密钥标识 session_name crt.Session.Config.GetOption(Session Name) google_secret keyring.get_password(jumpserver_mfa, session_name) ...然后在SecureCRT中为每个Jumpserver账号创建独立的会话配置在会话属性的Script选项卡设置相同的脚本路径用会话名称作为密钥标识存入系统密钥环这样同一套脚本就能智能识别不同会话使用对应的MFA密钥。5. 实际应用中的疑难解答5.1 常见错误排查清单根据我处理过的客户案例整理出这些高频问题验证码无效检查系统时间是否准确误差需在30秒内确认密钥没有复制到多余空格验证Jumpserver的MFA步长设置默认30秒脚本未执行检查SecureCRT的脚本路径是否包含中文或特殊字符确认Python解释器路径配置正确Options → Advanced → Python尝试在脚本开头添加crt.Dialog.MessageBox(测试)验证执行输入时机不对在WaitForStrings中使用通配符[MFA Code:*, 验证码:*]增加等待超时和重试逻辑5.2 性能优化建议对于需要频繁登录的场景原始方案每次都要重新计算验证码其实可以进一步优化# 全局缓存验证码和过期时间 last_code None code_expire None def get_current_code(secret): global last_code, code_expire now time.time() if not last_code or now code_expire: last_code TOTP(ssecret).now() code_expire now 25 # 25秒后刷新早于30秒周期 return last_code这个缓存机制可以减少90%的加密计算特别适合配置较低的办公电脑。我在团队内部推广后CPU使用率平均下降了40%。6. 企业级部署方案6.1 团队批量配置指南要给整个运维团队部署这套方案需要系统化的管理密钥分发使用Ansible批量写入各员工的密钥环创建密钥更新机制每季度轮换脚本维护搭建内部PyPI仓库托管脚本包设置自动更新检查每周同步最新版权限控制限制脚本可读权限仅运维组审计日志记录所有自动登录事件6.2 安全审计增强虽然自动化带来了便利但必须建立配套的监控措施在脚本中添加操作日志import getpass user getpass.getuser() timestamp datetime.datetime.now().isoformat() with open(/var/log/mfa_auto.log, a) as f: f.write(f{timestamp} {user} generated code for {session_name}\n)配置SIEM系统告警规则同一密钥短时间内多次使用非工作时间段的自动登录非常用设备的脚本调用这些措施能让安全团队实时掌握自动化登录动态既享受便利又不降低安全水位。7. 替代方案对比除了SecureCRT这套脚本也可以适配其他终端工具Tabby终端配置步骤在设置中启用Shell integration创建如下shell脚本#!/bin/bash python3 /path/to/mfa_script.py在连接配置的Post-login automation指向该脚本WindTerm集成方法打开会话属性 → 自动化在Login Success触发器添加execPython(/path/to/mfa_script.py)不过实测下来SecureCRT仍然是兼容性最稳定的选择特别是在处理复杂的跳板机环境时。其他工具在遇到网络抖动时容易丢失输入时机需要额外增加重试逻辑。

相关新闻