Jenkins 远程访问的权限失控是怎么发生的
运维团队给外包或异地开发开 Jenkins 权限时,最常见的做法是把 Jenkins 暴露到公网,然后靠 Jenkins 自带的用户体系做登录限制。问题在于 Jenkins 本身不是为公网暴露设计的,历史版本绕过认证的 CVE 不少,插件生态里的权限漏洞更多。一旦实例被打穿,攻击者拿到的往往不只是构建日志,还有挂载在流水线里的制品库凭证、生产服务器 SSH Key、内部 GitLab Token。很多团队以为“只读用户翻不了天”,但实际上一个未授权访问配合 Groovy 脚本控制台,或某个老插件任意文件读取,整个内网暴露面就全开了。
另一个更隐蔽的问题是权限接口不收敛。即使不改 Jenkins 配置,把端口映射到公网后,所有人都会先撞一遍登录页,撞不动也会持续探测插件端点、更新接口、CRUMB 接口。而你需要真正远程访问 Jenkins 的人可能只有三五个,结果付出的公网攻击面覆盖了半个互联网。NexTunnel 在这类场景下的价值不是替代 Jenkins 权限体系,而是把“谁能到达 Jenkins 的登录页”这个第一道关口收到你自己手里。
为什么端口映射与 VPN 都踩在这条线上
端口直连方案下,知道 IP 和端口的人都站在门外,剩余防线只剩 Jenkins 自己。VPN 方案会好一些,但也把设备和内网其他资源一起拉到一个大网络里,再配合路由做隔离的复杂度并不低,不少团队最后干脆放行整个内网网段,这和权限隔离的初衷正好相反。
| 方案 | 到达范围 | 授权粒度 | 审计落点 | 部署前提 |
|---|---|---|---|---|
| 公网端口映射 | 全世界可到达 Jenkins 端口 | 仅 Jenkins 登录用户 | 需单独配 Nginx/系统日志 | 公网 IP、防火墙放开 |
| 传统 VPN | 整个内网网段 | 网络层,需额外路由策略 | 依赖 VPN 网关,粒度粗 | 公网 IP、路由器改配置 |
| NexTunnel | 指定设备的指定端口白名单 | 设备 + 资源两层 | 后台按访问记录审计 | 内网侧可出站即可,无需公网 IP |
表里的“设备 + 资源两层”是本篇要讲的主线。Jenkins 权限做登录后的动作控制,NexTunnel 做登录前的到达控制。等你把这两层分开后,审计责任也分离了:谁能建连、谁说知道访问地址、谁试图访问过,归 NexTunnel 的审计记录;谁登录张三的账号做了什么,归 Jenkins 自己的用户日志。
用 NexTunnel Server 部署在内网侧做“会话前隔离”
安装步骤的核心不是敲命令,而是想清楚内网侧装在哪、资源映射怎么划。NexTunnel Server 部署在企业内网侧,只需能够连接外部网络完成与 Client 的信令协商,不需要任何入站端口。也就是说防火墙可以保持原样不动,不必写 DNAT、不必向运营商多申请公网 IP。Server 绑定到企业的资源模板后,就能负责外网 Client 设备的对接。
落地前需要先梳理资源面的三个角色:
- 资源模板:比如把 Jenkins 控制台按“16 机制造部”“23 机后端组”分成不同资源标签,仅内网 Jenkins 页面和必要的前置接口可开放。
- 授权对象:每个客户端设备单独受理,仓库管理员不见得访问 Jenkins,但流水线外包负责人需要。
- 放行路径:当 Server 无法与某些复杂网络下的 Client 建立 P2P 通道时,会基于中继转发拉通,这使得不在同一网段的设备也能连上目标端口。
[插图建议:NexTunnel Server 内网侧资源面板与 Jenkins 端口资源绑定示意]
实际配置时,不要只给一个“全部设备可连接 Jenkins”的模板。即使是同组也别共用密级相同的设备权限。外包员工的机器和内部员工的机器天然安全水位不同,资源模板上拆开有利于后续排查。没有公网 IP、不改内网防火墙,是这个方案对外暴露最小化的关键,这一点比纯粹限速限端口更本质。
端口白名单与设备授权才是真正的隔离层
很多团队混淆了“账号控制”与“资源的端口可达性”。Jenkins 自身的基于角色策略做得再细,只要端口暴露路径在公网侧不变,安全性依旧绑定在应用层。外网用户首先要到的不是 Jenkins 的成功登录页,而是设备接入门槛与端口白名单。
NexTunnel 的客户端安装后,设备不会在无授权的情况下默认获得任何资源访问。授权时需要在后台对两个动作分别确认:设备通不通过、目标端口放不放行。某个外包人员配备的设备可以被指定只访问内网 Jenkins 所在服务的特定端口,其他内网端口一律不通。这样即使这台机器失陷,被拿到远程控制,攻击者动的最多是这条固定通道里的资源。
如果把这种控制和 Jenkins 的用户策略叠加,会发现日常审计的口径很清楚:
- Jenkins 层面负责:某一账号可读哪些 Job、谁可打断构建、谁能管理凭据。
- NexTunnel 层面负责:哪些设备能到 Jenkins 的指定端口,用什么链路接入,访问起止何时发生。
设备授权做得更严格一点的部署,可以做成临时授权,完成一次交付或一个 Sprint 后回收,Client 本地用户对这个动作没有任何处置能力,权限不落在员工电脑自身。
审计与链路质量:真正可追责的运行记录
出问题以后才补审计的团队,通常看到的是公网入口上只有模糊的系统日志。如果当初直接走的反向代理,查访问最多知道哪个地址在试,和具体的设备打不开闭合链。NexTunnel 的访问审计是在识别设备身份之后记录的,不指向单一用户也没关系,因为授权已经下放到具体设备。你能回答三个安全闭环问题:
- 谁连过 Jenkins:授权设备标识与 Net 接入记录。
- 什么时候连的:连接建立时间、断开时间落在后台记录里。
- 允许什么路径:是直接 P2P 直连还是中继转发,分别针对不同网络质量的客户端,也影响故障定位速度。
关于中继要补一句:P2P 打通后,连接本身不经过中继;P2P 失败时也不会失去连接,因为中继已经接棒转发。这对分布在不同城市的测试和配管人员非常关键。你既不能在内部维护不稳定的专线 VPN,也不需要把中继设在境外未知节点造成延迟,可以在内网侧或受控主机上部署私有化中继,大幅保留审计控制权。
| 检查点 | 传统映射后暴露出的问题 | NexTunnel 后的变化 |
|---|---|---|
| 能到达 Jenkins 入口的用户面 | 公网全部可尝试 | 授权设备 + 端口白名单限制 |
| 跳级访问 | 拿到入口后可横向尝试相邻端口 | 目标端口放行策略单独设置 |
| 异地办公网络方式 | 常需统一 VPN,策略沉重 | 客户端从外网直连或中继接回 |
| 事后追踪粒度 | 茫茫 IP 日志,难定位设备主 | 识别设备映射记录及资源访问段 |
部署落地建议
先从运维切入,选一台能访问 Jenkins 的内网主机安装 NexTunnel Server,给内网 Jenkins 划一组最小端口资源模板,只把构建控制台绑进去,不要把服务器子网直接做成模板。然后分批授权:第一批给内部运维,验证连接是否会掉、走的是直连还是中继,第二批才放给外包配管和开发负责人。发布前先确认三件事:
- 任何外部机器未经设备授权时不能解析也不能到达 Jenkins 目标端口。
- 回收设备权限后现有连接是否同资源一齐断掉。
- 是否能在后台看到与 Jenkins 环境相关的审计记录,用于后续排障和复核。
把安全的关卡放回网络层的前端,不被 Jenkins 的账号功能限制住,同时不以硬碰公网瓶颈。最直观的收益是安全事件相对边界收拢后,内网 Jenkins 也减少了不少公网碰触探测。