navicat cloud 同步不传输明文密码,但会上传含加密凭据的 .navicat_project 文件;导出为 .npz 后可解包查看 host/port/user/ssh 等完整连接信息,构成攻击链路;安全协作需剥离连接、仅同步结构与 er 图,并通过数据库层最小权限(如限定表级 select+固定 ip)控制访问。
navicat cloud 本身不传密码,但项目文件里会存加密后的凭据
navicat cloud 不会接收或存储明文数据库密码,这点是确定的。但它同步的是整个 .navicat_project 文件,而该文件若在本地启用了 save password(比如 mysql 连接勾选了“保存密码”),就会把加密后的密码一并打包上传。aes-256 加密虽强,但一旦项目被导出为 .npz 包,用工具解包后可直接看到连接定义里的 host、port、user、ssh_host、ssh_user 等字段——这些信息组合起来就是一条完整攻击链路。
共享前必须剥离连接对象,只留结构和 ER 图
想协作又不暴露生产凭据,核心动作不是“加密上传”,而是“不上传连接”。真实可行路径如下:
- 新建一个空项目(如
shared_model.npz),不要导入任何已有连接 - 用
Tools → Import Wizard → Structure Only导入目标库表结构(不带数据、不带连接) - 右键项目树中的
Connection节点 →Delete Connection(确认删除,不是禁用) - 检查
Project Properties → Security → Password Protection是关闭状态 - 同步前,在
File → Options → General中关闭Auto-save connection passwords
此时项目只剩表结构、视图定义和 ER 图节点,同步到 Cloud 后,团队成员看到的是可读、不可连、无法导出凭证的干净模型。
如果非得共享可连接配置,必须用最小权限账号+固定 IP
某些场景下(如 DBA 给开发配只读账号),确实需要让成员能连上查数据。这时不能靠 Cloud 权限控制连接行为,而要靠「连接层隔离」:
- 为每个成员单独建数据库用户,权限精确到
SELECT ON mydb.report_log+ 固定出口 IP(如'reporter'@'203.0.113.45') - 显式拒绝写权限:
REVOKE INSERT, UPDATE, DELETE, DROP, CREATE, ALTER ON mydb.* FROM 'reporter'@'203.0.113.45' - MySQL 8.0.29 之前版本执行完必须补一句
FLUSH PRIVILEGES - PostgreSQL 还需确保该用户有
CONNECT到 database 的权限,且目标 schema(如public)有USAGE
Navicat Team 的 Viewer 或 Editor 角色完全不干预 SQL 执行流,真正起作用的只有数据库账号本身的权限边界。
最容易被忽略的三个落地细节
很多团队按流程做了授权,上线后仍出问题,往往卡在这三点:
-
GRANT SELECT ON mydb.*是危险的起点——第三方通常只需要 2–3 张表,应缩小到具体表名,否则等于开放整库查询面 - 云函数(如 AWS Lambda)IP 不固定时,
@'%'不是妥协方案,必须配数据库白名单 + 应用层代理,或改用临时凭证(如 IAM 认证) - Navicat 导出的
.npz包解压后虽不含密码,但含 SSH 隧道私钥路径(如ssh_key_file: "/Users/alice/.ssh/id_rsa"),这类元数据泄露可能助攻击者复现跳板链路











