先说个我自己的丢人事。去年某个内部安全巡检,我负责的一套业务系统被人用自动化扫描器扫出"Nacos 控制台疑似未授权访问",当时我第一反应是"不可能,这系统上线前我亲手开的鉴权"。结果登录服务器一看,Nacos 是起来了,鉴权配置也确实写了,但配置文件里鉴权开关被后来的版本升级重置成了 false。那一次我算真正明白:未授权访问从来不是某个开发同学"忘了写登录", 而是一整类容易被忽略、被覆盖、被惯例性跳过的问题。它出现在后端中间件、远程桌面服务、甚至前端路由逻辑里,每一处的成因和修复方式又完全不一样。
这篇文章就从我实际排查过的三个高频场景讲起:Nacos namespace 未授权、VNC 未授权连接、Vue 应用里的前端"假权限控制"。我会把每个场景的成因、排查链路和加固步骤完整记录下来,也会专门整理一套安全自查清单。关于这类问题,如果你只记住一句话,那应该是:不要在信任边界上依赖默认配置或前端逻辑。
1. 先搞清楚"未授权访问"到底意味着什么
1.1 "未授权"和"越权"经常被混为一谈
很多刚接触安全的同事会把"未授权访问"等同于"越权访问",这俩其实不是一回事。
未授权访问,指的是系统在没有任何身份认证的情况下,就对外开放了某个功能或数据接口。就好比你租了一间公寓,大门根本没上锁,任何人都能推门进来翻东西。攻击者不需要猜密码,不需要伪造身份,只要知道地址(IP 和端口)就行。
越权访问则不同,系统是有身份认证的,也校验了"你是谁",但没校验"你能不能看这个"。常见的是水平越权和垂直越权:普通用户 A 登录后,改一下 URL 里的订单号,就能查到用户 B 的订单。这种属于"门锁了,但房间里的每个抽屉都没有独立钥匙"。
本文讨论的 Nacos、VNC、Vue 路由这类未授权访问,本质上都是第一个问题:认证缺失或认证形同虚设。
1.2 为什么未授权访问是攻击者最喜欢的突破口
在安全评估里,未授权访问的价值往往被低估,但它其实是攻击链里性价比极高的一环。
原因很简单:不需要爆破、不需要钓鱼、不需要利用复杂的内存漏洞。攻击者只要通过公网资产测绘发现暴露的服务端口,然后直接发一个普通请求就能看到敏感数据。对防守方来说更难受的是,未授权访问通常不会留下明显的爆破日志,因为访问者"看起来就像一个正常用户",甚至比正常用户更低调。
我经常用一个比喻向业务同学解释:你把公司产品文档放在公网服务器上,其实并不一定有严重后果;但如果你把数据库备份文件放在同一个目录,而且目录允许匿名访问,那就等于把保险柜钥匙贴在门口。未授权访问本身可能只是"一个配置项没打开",但它引发的后果往往是批量性的数据泄露。
1.3 我眼里最常见的三类未授权入口
这几年来我在巡检和应急响应里碰到的未授权访问,基本可以归成三类:
- 管理面组件暴露:Nacos、Kibana、Jenkins、Redis、Elasticsearch、Docker API 这类中间件,本身自带 Web 控制台或管理接口,如果没开启认证,或者配置了容易猜到的默认口令,就会出现典型的"管理后台裸奔"。
- 远程操作类服务暴露:VNC、RDP、Telnet 这类远控协议,如果直接暴露在非信任网络,又没有强密码或认证机制,等于把服务器桌面交给了陌生人。
- 应用层逻辑缺失:前端路由守卫看着拦截了未登录用户,但后端接口根本没校验用户身份或角色。这种情况在 Vue 这类 SPA 项目里非常常见,而且比前两类更隐蔽。
下面的章节,我会分别讲这三类在真实场景里是怎么被发现的、怎么验证、怎么修。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Nacos namespace 未授权访问:配置中心的暴露不是小事
2.1 一次巡检发现的完整链路
Nacos 是目前微服务架构里很常用的配置中心和服务发现组件。那次巡检过程其实不太复杂,但复盘价值很高。
我们团队有一套隔离环境,用于多个业务线的联调测试。某天自动化扫描器报了一条中危:某个 Nacos 端口对外可达,并且返回了疑似未授权访问的特征。我登录到对应的跳板机,用 curl 模拟了一次浏览器访问,发现控制台直接以可操作状态打开了,没有跳转登录页。
随后我继续看了几个关键接口的返回结果,确认了以下几个事实:
- 配置列表可以匿名读取,多个服务的数据库地址、中间件账号、密钥相关配置项在返回数据里能看到。
- 服务注册列表可以匿名查看,哪些服务实例在运行、什么 IP 什么端口、健康状态如何,全部开放。
- 测试环境和联调环境共用了同一个 Nacos 集群,命名空间隔离确实存在,但没有鉴权的隔离等于让命名空间之间"看门的人"全部下班了。
这里补充一个容易误解的点:很多人以为 Nacos 之所以暴露配置泄露,是因为 namespace 配得不好。实际上 namespace 只是用来做资源和配置隔离的逻辑概念,它本身不能承担认证职责。如果你没开启鉴权,那么知道命名空间 ID 的人,就可以读取该命名空间下的所有配置。namespace 未授权访问的问题,本质还是 Nacos 身份认证没生效。
2.2 后来我定位到根因时发现的事故链
这是我特别想复盘的部分。第一轮排查时,系统配置文件里明明写了认证配置,我当时以为是 Nacos 版本太低不支持新配置。后来仔细查版本记录才发现,Nacos 在某个小版本升级后,配置中心的数据被迁移过,新的配置文件里保留了旧的鉴权相关 key,但 nacos.core.auth.enabled 这个开关在升级过程中被注释掉了。
很多真实事故都是这样的:不是因为某个人"没有安全意识",而是因为变更过程中,某个开关被静默复位。所以我在处理未授权访问问题时,从来不只看当前快照,还会查一遍最近一次版本升级、配置变更、重启操作的记录。很多安全事件,本质上是一次失败的变更管理引发的。
如果你也遇到"Nacos 配置好像改了但没生效"的问题,优先排查这几个地方:
application.properties里是否真的存在认证开关,还是被注释了。- Nacos 是否以 Docker 方式运行,外部挂载的配置目录是否和容器内版本匹配。
- 是否同时存在多份配置文件,而启动时加载的是另一份。
- Nacos 集群模式下,各节点配置是否一致。
- 升级后是否重启过节点,配置是否重新加载。
2.3 加固 Nacos 的正确顺序,顺序错了等于白做
修复时不要一上来就想着写复杂的权限策略。我的建议是先做收敛,再做鉴权,最后做隔离加固,顺序反过来容易留下空窗期。
第一步,网络层收敛。Nacos 控制台和 API 端口不应该对全公司甚至公网开放。在安全组或防火墙上限制来源 IP,只允许运维网段、测试网段访问。这一步的作用是先把暴露面降到最小,哪怕鉴权暂时没开启,攻击者也无从访问。
第二步,升级版本并开启鉴权。老版本要先升级,社区已经修复过多轮鉴权绕过问题。开启鉴权时,注意一定要修改默认的密钥和身份标识,不要用文档里那几个默认值。
第三步,核对命名空间的隔离策略。生产、预发、测试环境启动独立 namespace,并且定期清理账号权限,不使用"所有命名空间全读写"的超管账户跑业务。
第四步,保留访问日志。开启 Nacos 的访问日志,方便日后追溯谁在什么时间读到了什么配置。
这里我也顺带补充一个我在加固后经常做的"有效性验证":用无痕浏览器或者一台不受信任网络的机器访问 Nacos 地址,确认控制台确实跳转登录页;再访问一个配置查询相关地址,确认返回的响应从数据变成了 403 或 401。不要刚改完配置就在内网用管理员身份试,那样永远测不出来真实效果。
2.4 一个真实场景里的坑:nacos 默认密钥引发二次暴露
那次修复之后,又过了两周,我收到一条警报,说 Nacos 疑似存在身份绕过特征。我这时候已经很警惕了,立刻查了版本公告,发现问题是出在默认密钥上。
当时我只开了鉴权,但团队为了图省事,没有修改默认的 JWT 相关密钥。攻击者只要知道固定的密钥值,就能自己伪造一个管理员身份令牌,绕过登录限制。这种问题排查起来比普通未授权访问更隐蔽,因为日志里看到的请求都是合法用户身份,很难第一时间定位。
所以我现在的习惯是:凡是开启鉴权的组件,第一件事永远是把默认密钥和默认管理账号全部换掉。不要以为加了一层密码就万事大吉,默认值往往是攻击者的第一手字典。
3. VNC 未授权连接:一条仍在公网游荡的"老远程桌面"
3.1 VNC 未授权问题为什么到现在还没绝迹
VNC 是老牌的远程桌面协议,很多服务器、嵌入式设备、虚拟机管理平台仍然在使用它。这类协议的年代比较早,设计之初假设的前提是"网络环境可信",所以认证机制相对薄弱。
VNC 未授权访问在现实中通常有几种状态;最常见的是空口令,服务端允许客户端不输入密码直接连通;其次是认证绕过,某些版本存在认证逻辑漏洞,攻击者构造特定握手包就能绕过密码校验;还有一种是弱口令,比如密码设置成 123456 甚至 vnc,本质上跟没设置没有太大区别。
我印象比较深的一次排查,是某测试服务器的 5901 端口暴露在办公网某网段下。开发同学说"这台机器只是内网临时用一下,所以没设密码"。实际情况是,这个网段的隔壁就是访客 Wi-Fi 的接入区域,任何一个进到公司访客网络的人都能尝试连接。未授权访问的可怕之处就在这:你觉得"内网就安全"时,边界早就被各种接入方式撕开了。
3.2 从防御视角做 VNC 暴露排查,我分了四步
如果你现在怀疑自己的网络里也有 VNC 端口暴露,我建议按下面的顺序梳理,不要直接去连所有 5900 端口(那样也很容易踩到业务红线)。
- 确认资产归属。先梳理哪些服务器真的需要远程桌面功能。大部分 Linux 服务器根本不需要 VNC,需要的话优先用 SSH。
- 端口扫描配合指纹确认。对需要自查的 IP 范围做 TCP 端口探测,重点看 5900、5901 等默认端口。确认开放后,用协议识别工具确认是不是 VNC。
- 验证认证策略,不暴力破解。安全的验证方式是通过查看服务端启动参数和配置文件,确认
Authentication是否开启、密码文件是否存在、密码策略是否为弱口令。如果确实需要验证远程状态,也应当在获得授权的前提下,做一个不携带爆破动作的连接测试,观察服务端是否返回认证挑战。我不建议在这个环节做任何自动化猜解,那是合规红线。 - 回溯登录日志和访问来源。查看 VNC 服务日志,看有没有异常来源 IP 的连接记录。
3.3 VNC 怎么加固才不背锅
对于必须要保留 VNC 的场景,我的建议是:别让 VNC 直连公网或大范围内网。常见的替代方案是使用 SSH 隧道转发本地端口,把 5901 端口映射到本地来访问。比如下面这两个命令的思路:
bash复制ssh -L 5901:127.0.0.1:5901 user@your-server
# 然后 VNC 客户端连接 vnc://127.0.0.1:5901
这样远端服务器不需要在防火墙里放行 5901 给所有人,只有能通过 SSH 认证的用户,才能通过隧道访问到 VNC 服务。好处是既保留了图形化维护能力,又不需要依赖 VNC 自身那套薄弱的认证。
如果由于架构限制,没法用 SSH 隧道,至少要确保三件事:
- VNC 服务地址只监听在内网或回环地址,不监听
0.0.0.0。 - 密码强度足够,且不能与任何业务系统共用同一套口令。
- 在边界防火墙上按来源 IP 白名单放行,而不是对全网段开放。
另外,补充一个很多工程师忽略的细节:VNC 的密码机制不是用来防止"查看屏幕"的,一旦认证通过,对方在多数场景下拥有完整的桌面操作权限,包括执行命令、拷贝文件。这也意味着 VNC 弱口令的风险等级要比普通 Web 后台弱口令更高,基本上等于把你的服务器桌面拱手让人。
3.4 如果已经发现 VNC 异常连接记录,我建议这样处理
如果日志里已经出现了异常 IP 的连接记录,不要只改密码就结束。第一步,立即断开可疑会话并封禁来源 IP;第二步,保存当前进程列表、登录记录、历史命令等证据;第三步,全面排查系统上是否多出了计划任务、新用户、SSH 公钥等持久化后门;第四步,再升级固件或者版本,修改强密码。换句话说,未授权连接一旦真实发生过,就要按"最坏情况已被控制"的假设来做排查,而不是改了密码就假装无事发生。
4. Vue 应用里的"未授权访问":前端路由守卫是纸糊的闸机
4.1 路由守卫只是用户体验,不是安全边界
这几年微服务架构普及,前端也全面转向了 Vue、React 这类单页应用。Vue Router 的 beforeEach 路由守卫是很多开发同学心中的"权限防线":
javascript复制router.beforeEach((to, from, next) => {
const token = localStorage.getItem('token')
if (!token && to.path !== '/login') {
next('/login')
} else {
next()
}
})
这段代码跑起来之后,效果确实很直观:没登录的用户会被弹回登录页,看起来系统安全了。但问题在于,路由守卫只控制了浏览器端页面的渲染和跳转,它改变不了后端 API 的开放状态。
攻击者根本不会老老实实打开你的页面去点按钮。他会用 postman、curl 或者写一段脚本,直接向后端接口发请求。后端接口如果没校验用户身份,那么前端路由守得再严,数据也会从接口里漏出去。这种情况如果我给开发同学做类比,通常会说:你给商场的电梯安排了保安,只让有购物小票的人上二楼,但是楼梯间的后门一直没锁,所有人都能直接走楼梯上二楼拿商品。路由守卫就是那个保安,后端鉴权才是楼梯间的锁。
4.2 我在审计 Vue 项目时,会重点关注三个位置
第一,请求模块是怎么处理 token 的。常见的情况是 request.js 里统一从 localStorage 取 token 放在 header,但如果某个接口或者某个 axios 实例忘记挂载拦截器,那么这个接口的所有请求都会变成"不带身份信息"。这个接口如果恰好没做后端校验,就等于是未授权接口。
第二,后端接口是否在网关层做了统一鉴权。如果每个业务接口的鉴权逻辑是"开发同学想起就写、忘了就不写",那几乎可以确定会出现漏网之鱼。正确的做法是在网关层做一个统一过滤器,对需要认证的路由前缀进行全局校验。
第三,敏感操作的接口有没有做角色/权限二次校验。只校验"是否登录"远远不够。比如一个后台管理系统的导出接口,任何登录用户都能调,那普通用户也能拿到管理员数据。未登录是未授权,登录了但越权调用,从接口设计角度同样属于访问控制失效。
4.3 一个典型的案例复盘:前端隐藏菜单引发的假象
有一回我在给某个后台管理系统做代码审计,管理员菜单里有个"用户数据导出"的功能,前端代码里用 v-if="role === 'admin'" 把入口按钮藏了起来,非管理员看不到这个按钮。听起来挺合理的对吧?
但我打开浏览器开发者工具,找到这个导出接口的调用,直接构造了一个普通用户身份的请求,后端居然正常返回了数据文件。原因就是后端导出接口只验证了"用户已登录",没有验证"当前用户角色的权限范围"。前端把按钮隐藏,在体验层面是有意义的,但在安全层面,它一点防御作用都没有。
后来修复时,后端在接口上加了权限注解,同时加了数据范围校验:普通用户只能导出自己名下的数据,管理员才能导出全量。前端那个 v-if 继续留着,但它的定位只是"让界面更清爽",而不是安全防线。
4.4 前端代码还能泄露什么敏感信息
说到 Vue 项目,还有个容易踩的点:前端打包后的 JavaScript 文件如果不好好处理,里面可能躺着大量接口地址、内部服务域名、以及一些硬编码的密钥。攻击者拿到这些信息后,可以更快地拼凑出后端攻击面。
有人会觉得,代码经过 Webpack 压缩后不是不可读吗?实际上压缩只是把变量名缩短、空格去掉,并没有真正加密。很多信息通过关键词搜索依然能找出来。所以我给前端同学的建议是:
- 敏感密钥不要出现在前端代码里,哪怕做了混淆也不可靠。
- 接口地址要按环境区分,避免把生产环境以外的内部服务地址也暴露给用户。
- 发布前做一次打包产物信息排查,搜一下有没有云厂商密钥、数据库连接串等关键字。
4.5 修复前端"未授权访问"时,我坚持的验收标准
修复之后我会做两组验证。第一组:退出登录状态,直接访问需要登录才能看到的接口地址,预期返回 401 或 403,而不是业务数据。第二组:用不同角色的普通账号,去调用管理员专属接口,预期同样被拒绝。这两组验证都通过了,我才会认为这个接口的授权逻辑是闭环的。只验证"页面上点按钮看不到报错"是不合格的测试方式。
5. 一套可落地的自查方法:从资产梳理到验证闭环
5.1 先做资产清单,没有清单谈安全都是空话
我在排查未授权访问时,最怕的不是漏洞多,而是企业自己都不知道哪些服务在运行。没有资产清单,扫描器扫到一个端口,你甚至不知道这是哪个团队部署的。所以第一步永远是做资产梳理。
资产梳理的核心是把以下信息记录清楚:服务用途、监听端口、协议类型、部署团队/负责人、是否需要对公网开放、是否开启了认证。记录的时候不要求一步到位,先把最近活跃的服务器和端口扫出来,再逐步打标分类。我见过的很多安全团队之所以响应慢,不是因为没有扫描器,而是因为"扫到告警之后没人认领这台机器",所有的告警最后都变成了噪音。
5.2 通过信息收集做"无害化验证"
对于已发现的疑似未授权访问,我通常采用无害化验证,核心原则是:只验证系统是否允许匿名访问,不去真的读取和下载敏感数据,更不做任何写入和修改操作。
具体到不同组件,验证方式也有区别。Nacos 这类带 Web 控制台的组件,可以用浏览器或 curl 访问其地址,观察是否跳转到登录页,以及登录接口是否在认证之前返回业务数据;VNC 这类协议层服务,则可以通过查看服务进程参数、配置文件或端口响应来判断是否要求密码认证;Vue 后端接口,则可以用不带身份信息的请求访问几个关键接口,观察响应状态码。这里说的都是最基础的访问动作,绕过了暴力破解和敏感数据爬取的红线,在授权范围内做自查是安全的。
这里必须强调一个边界问题:未授权访问的验证动作看起来简单,但如果没有得到资产所有者授权,仍然可能构成对他人系统的未授权访问。所以我建议把所有验证动作限制在自己负责或已获得书面授权的资产范围内,避免因为好奇或演练需求乱扫一气。
5.3 验证结果出来后,按业务价值排序修复
不是所有未授权访问都需要 5 分钟内处理,但也不是都能拖两周。我通常按"攻击者利用成本"和"数据影响范围"两个维度排序:
| 优先级 | 典型场景 | 处理时限建议 |
|---|---|---|
| P0 | 公网可访问的 Nacos/数据库/云管理后台且可读写 | 立即断网或加白名单,当天修复 |
| P1 | 内网可达的配置中心存在匿名读取 | 24 小时内收敛网络并开启鉴权 |
| P2 | 测试环境存在未授权访问但无生产数据 | 3 天内完成修复 |
| P3 | VNC 弱密码但服务仅内网部分网段可达 | 一周内整改,避免使用明文远程桌面协议 |
排序的价值在于:当漏洞数量大、人力有限时,先堵住最容易被利用、影响范围最大的口子。而不是看到什么修什么,最后修了一堆边缘问题,核心资产反而还裸露着。
5.4 用日志监控补上最后一环
只做静态修复还不够。未授权访问是一种反复出现的风险,今天修好了,明天一个新组件上线可能又忘了开鉴权。所以我会建议在日志侧做一些基础的监控规则,比如:
- 对 Nacos、Vue 后端接口、远程桌面服务的访问日志做异常检测,关注未登录却获取到大量数据响应的情况。
- 对敏感接口的访问频率做基线,比如某个配置查询接口突然被同一来源 IP 频繁请求,就要告警提醒。
- 每季度或每次大版本上线后,重新执行一遍未授权访问专项巡检,把它变成常规动作,而不是出了问题才排查。
6. 这些经验是从无数次"我以为没问题"里总结出来的
写这篇文章之前,我回看了自己过去几年的排障笔记,发现但凡出现"我以为没问题"这句话,后面大概率就跟一个未授权访问事故。可能是 Nacos 升级后把鉴权关掉了重启,也可能是测试服务器开 VNC 时顺手取消了密码,还可能是前端把按钮隐藏就当接口安全了。安全建设里最难防的,不是高级攻击,而是这种对"内网可信、默认安全"的惯性依赖。
我现在的习惯是,每次发版或配置变更后,都会用最基础的"无身份视角"重新检查一次新功能。具体动作很简单:打开一个无痕浏览器,模拟一个完全未知的访客,看看哪些页面能访问、哪些接口会返回数据。这个动作两分钟就能完成,但会有效改善"只站在开发视角验收功能"带来的盲区。
另外,关于加固顺序,我想再强调一次:先收敛网络暴露面,再开启组件鉴权,最后补监控和日志。很多团队一上来就调各种复杂的认证插件,但服务端口仍然直接暴露在公网,等于给保险柜换了把好锁,门却一直开着。网络层把门关上,绝大多数未授权访问就已经被挡在门外了。
如果你正准备给自己的系统做一轮未授权访问自查,可以从 Nacos、VNC、Vue 这三类场景开始。这也是我近期在热门漏洞情报里看到频率最高的几个词。把这三类管住了,至少能覆盖掉一大半常见暴露面。
