MFA 提示一过,隧道就建立起来,而关闭终端会把连接一起带走。这是监管问题,不是认证问题,OpenConnect 已经自带解决它的开关。办法是等启动完成、交互部分真正结束之后,让客户端转入后台。下面是一串检查:按顺序做,遇到第一条不适用于你的网关的就停下。

确认网关在登录时要求什么

动手写命令之前,先记下部署强制的凭据路径。只用证书、密码加令牌、以及经 SAML 提供商的浏览器往返,三者行为不同,后台模式一个都跳不过。这个选项改变的是启动之后发生的事,而不是启动过程中的事。

诱人的捷径是自动化提示。只要识别到密码提示就输入固定答案的包装脚本,会在网关要求一次性代码的那一刻失效,还会把凭据留在别的账户能读到的文件里。如果必须由人批准会话,就让人留在流程里。

先在前台跑一次会话并读输出

正常连接一次,让整个握手过程打印出来。记下所用协议、证书或令牌路径、服务器分配的隧道地址,以及连接被接受前的每条警告。这份记录就是你的基准线,也是日后区分客户端问题与网关变更的唯一廉价办法。把它存到终端缓冲区之外。

然后用后台模式加一个 PID 文件重复同样的调用,例如 openconnect --background --pid-file /run/openconnect.pid vpn.example.net,并把网关要求的协议与认证选项留在同一行。OpenConnect 手册把该选项描述为启动完成后继续在后台运行,正因如此,交互阶段必须先结束。

让运行中的进程可查、可停

PID 文件只有与活进程对得上时才算证据。把它放在服务账户拥有的目录里,发信号之前先把记录的号码与进程表比对。重启和崩溃都会留下这个文件,而文件过期正是停止脚本报告成功、隧道却还在运行的常见原因。把这项检查当作停止流程的一部分,而不是可有可无的步骤。

向已核实的 PID 发信号,然后确认隧道接口真的消失了,而不是相信退出状态。如果客户端需要更高权限来配置接口,信号必须来自有权发送它的账户。

不要把后台模式叠在监管程序之下

systemd 之类的监管程序期望自己拥有所启动的进程,所以转后台的客户端会让它们困惑。监管程序看到启动器退出,真正的连接却还活着,于是重启逻辑、状态报告和停止超时描述的都不再是事实。按受支持的前台写法来写 unit,把守护工作交给监管程序。

--background 留给由人启动、随后离开的会话。如果需求是任何人在登录之前就存在的隧道,缺的是一套获批的非交互身份以及续期方案,任何命令行开关都给不了这两样。把开关加进启动脚本,得到的隧道会在第一份过期的凭据上悄悄失效。

把会话 cookie 当作凭据

OpenConnect 通过 --authenticate 记录了一个独立的认证阶段,产生的材料可以用 --cookie-on-stdin 交回。这一对是给集成工作用的,而它产出的东西和创建它的密码一样敏感。

把这个值挡在 shell 历史、日志以及你开的任何工单之外。交接脚本还必须保留客户端随 cookie 一起收到的已验证端点信息;丢了它,后续运行可能连到你从未认证过的主机,那比连接失败更糟。

关掉终端之前把这清单过一遍

四件事应当成立:交互式登录在前台结束,PID 文件指向你核实过的进程,监管程序的问题已经明确,cookie 有非明文的存储方案。四条都成立时,离开终端是安全的,隧道会继续运行。

若有一条不成立,先修它再碰其他条,因为其余的检查补不上这个缺口。也保留第一次运行的前台记录:下次隧道毫无征兆地断开时,正是这条基准线把网关侧的变更和客户端侧的变更分开。

相关文章