外包人员离场,权限没收回来的代价有多大
外包人员离开项目后,内网访问权限没及时回收,是很多 IT 团队踩过的坑。人事流程走完了,工牌交了,电脑还了,但那个能连 GitLab、能查生产库、能登 Jenkins 的账号还活着。等出了问题再去查,往往已经过去几周甚至几个月。权限回收这件事,难的不是“想不想收”,而是“收的时候根本想不起来他到底有多少入口”。
外包场景和正式员工离职有本质区别。正式员工通常在 AD 或 LDAP 里有完整账号体系,禁用账号、踢出组、吊销证书是一条链路。外包人员很多用的是临时账号、共享账号,或者干脆是项目组自己开的一些独立凭证。更麻烦的是访问路径不统一:有人走 VPN,有人用端口映射,有人通过某些远程工具直接连内网。权限散落在三层——账号层、网络层、资源层,任何一层漏掉,都是洞。
要做到“一键回收”,前提是把访问入口收敛到一个可控点。否则“一键”无从谈起,只能靠人工翻各种系统。
先把外包访问内网的路径归到一条可控链路
通用做法是:不为外包人员开放 VPN 全域访问,而是让他们通过统一的远程访问通道进入内网,只暴露指定资源。这条通道必须具备三个特征:
- 访问对象白名单化:外包人员只能看到指定的 GitLab 项目、指定的数据库实例、指定的 CI/CD 页面,而不是整个内网网段。
- 设备与账号双重绑定:只有授权的设备加上有效的账号才能建立连接,单纯拿到密码没用。
- 连接可实时中断:管理员能在后台随时断开某个人的当前会话,而不需要去改路由器 ACL 或撤销 VPN 证书。
如果团队已经部署了堡垒机或零信任接入网关,权限回收的动作可以简化为“在网关里删除该用户/设备的授权”。但如果外包人员还能通过其他通道进来——比如之前开的公网端口映射、SSH 隧道、甚至内网某台机器上的跳板脚本——那这条链路就没收敛干净。
一些团队的实际操作是:在外包入场阶段就明确规定“只允许通过指定接入点访问内网”,同时在接入点上按人授权。离场时,只需在该接入点上移除用户条目,禁用对应设备授权,操作时间可以控制在半分钟内。前提还是那一句:所有入口都在这一个地方。
回收操作该覆盖的四个层面
即便入口收敛了,回收操作也不能只做一步。把离场时的动作拆开,至少有四个层面需要检查:
| 层面 | 回收动作 | 容易漏掉的地方 |
|---|---|---|
| 账号层 | 禁用临时账号、删除共享账号 | 外包人员在 GitLab、MySQL 等系统内有独立创建的子账号 |
| 认证层 | 吊销证书、使 Token 失效 | 某台电脑上仍保存的 SSH 私钥或长期 Token |
| 设备层 | 撤销设备授权、禁止该设备再次接入 | 项目期间换过电脑,旧设备记录还留在白名单里 |
| 资源层 | 关闭端口开放、删除单项资源访问权限 | 只做了全局删除,但已单独开放针对某项目的端口规则没同步清理 |
实际操作中,真正省时间的做法是阶段一。在 NexTunnel 这类按设备和端口授权远程访问的产品里,外包人员离场时,管理员在管理后台找到对应的人员与设备,勾选后禁用,连接会被中断且无法重新建立。这是现在不少团队选择把外包接入收敛到这种“接入点可托管、可审计”工具的原因——回收动作就变成一个清晰可重复的操作流程,而不是一次全面排查。
用 NexTunnel 落地一条“外包离场回收”流程
如果团队本身没有现成的堡垒机体系,可以按下面这个思路把流程建起来。NexTunnel Server 部署在内网侧,不做网络改造,Server 的角色是内网的资源发布端。外包人员的电脑安装 Client,但他们无法直接自己添加资源,能访问哪些服务、连哪台机器,全由管理员在后台指定。
实际操作上,外包入场阶段就按这个顺序做:
- 在外包人员电脑上安装 NexTunnel Client。
- 管理员在后台为该设备创建授权,并绑定对应的外包项目成员。
- 选择要开放的内网目标,比如只开 GitLab 所在服务器的 80 或 443 端口、只开测试库 MySQL 的 3306、只开 Jenkins 页面,而不是开放整台主机的所有端口。
- 开通端口前检查该目标是否有简单认证,弱口令的目标不要直接给。
离场时的操作不用回内网改防火墙,登录 NexTunnel 后台,在设备授权列表里找到该外包人员的 Client,执行禁用。当前连接立即中断,后续也无法再以该设备连入。回收“内网访问权限”不再取决于有没有禁用他的 GitLab 账号,网络接入层已经先把门关上了。后续审计日志中仍保留他项目周期内访问目标及连接时段的记录——这部分是留给事后排查用的底盘,也是审计要求的残留证据,具体保留策略视企业自己的安全策略而定。
对于资源规模稍大的团队,可以要求每一个外包项目的资源单独归类,离场时直接整体关闭该项目对应的全部授权。这样也不会影响正在进行的其他项目仍在正常使用的账号资源。
操作完之后,再验一次,而不是“觉得收干净了”
收回权限的动作做了,不等于做完了。给一个简单的验证清单:
- 用该外包名下设备尝试建立连接,应提示无权限或连接拒绝。
- 检查该账号在 GitLab、数据库等服务中是否存在未禁用的残留凭证,尤其是他在项目期间自行创建的 Deploy Token、个人 Access Token。
- 如果是通过数据库账号直接暴露过,手动执行一次连接验证,确认密码已失效。
- 查最近一周的审计记录,确认无异常访问时段,尤其离场前一两天是否有集中拉取代码或数据导出动作。
“验证”这一步花不了十分钟,但它能把“我自己觉得收干净了”变成“系统确认进不来了”。对于审计要求比较高的团队,还可以把上面的动作固化成一个离场检查清单,每处理一个外包人员就过一遍。这比每次临时想一遍、或者是通过开除接口人和 IT 扯皮更靠谱。
权限回收本来是一个流程问题,不是一个技术难题。它能一键的前提,全在入场时你给的是分散的门还是同一条可控通道。能在十分钟内收回的东西,别让它在人走之后留半年。