mongos启用认证必须同时指定--auth及keyfile或x.509,且需先在开启认证的config server上创建admin用户,再启动mongos;客户端连接须显式指定authSource=admin,分片操作还需clusterAdmin等特定角色权限。

mongos 启动时必须指定 --auth 且配置 keyfile 或 x.509
不加 --auth,mongos 根本不校验任何用户凭据,所有连接都等同于 root 权限。但光加 --auth 不行——它只是“开关”,背后得有认证凭证体系支撑。
生产环境只推荐两种方式:keyfile(轻量、适合内网)或 x.509(强身份绑定、适合多租户或跨域)。用 SCRAM-SHA-256 用户密码本身不能让 mongos 自动信任分片节点,它只管自己入口的登录,后端路由到 shard 或 config server 时还得靠内部信任链。
-
mongos启动命令里漏掉--keyFile /etc/mongod-keyfile,即使加了--auth,也会报错:Failed to load keyfile: No such file or directory -
keyfile必须在所有mongos、shard、config server上完全一致,且权限严格设为600,否则服务拒绝启动 - 别用
--setParameter enableLocalhostAuthBypass=false试图绕过本地免密——它在mongos上无效,且可能掩盖真实配置问题
必须先在 config server 上创建 admin 用户,再让 mongos 加载
mongos 本身不存用户数据,它从 config server 的 admin.system.users 集合读取认证信息。所以顺序错了就永远登不进去:先启 mongos,再连上去建用户?不行,没 auth 连不进 config server;直接连 config server 建用户?对,但得确保 config server 也开了 --auth 和 --keyFile,且已正常运行。
- 正确流程:启动 config server(带
--auth+--keyFile)→ 用mongo --port 27019连 config server → 在admin库执行db.createUser({user:"root",pwd:"xxx",roles:["root"]})→ 再启动mongos - 如果 config server 没提前建好用户,
mongos启动后执行db.runCommand({createUser:...})会返回"not master"错误,因为它把请求转发给了只读的 config server 副本集成员 - 用户角色必须含
"__system"或"root"才能跨分片执行管理命令;普通"readWriteAnyDatabase"在mongos上无法创建数据库或分片集合
客户端连接 mongos 时,authSource 必须显式指定为 admin
很多人连不上,不是密码错,是默认 authSource 被当成当前库名。比如用 mongo -u user -p pass myapp,客户端会尝试在 myapp 库里查用户,但实际用户全在 admin 库。
- 正确连接方式:
mongo "mongodb://user:pass@mongos-host:27017/admin?authSource=admin" - Driver 里也一样:Node.js 的
mongodb://URL 必须带?authSource=admin;Python PyMongo 的client = MongoClient(..., authSource="admin") - 用
use admin+db.auth()也能登录,但脚本或应用里不推荐——容易因自动切换库导致后续命令在错误上下文执行 - 如果用了
SCRAM-SHA-256,还要额外加?authMechanism=SCRAM-SHA-256,否则旧驱动可能默认用SCRAM-SHA-1导致失败
分片集合操作失败常因权限粒度太粗,不是 auth 没开
开了全局 auth,但执行 sh.shardCollection("mydb.mycoll", {_id: "hashed"}) 报 "not authorized"?大概率不是认证失败,而是用户缺具体操作权限。MongoDB 的分片权限和普通 CRUD 权限是分离的。
- 必须给用户授予
"clusterAdmin"角色(或至少"shardAdmin"),才能调用shardCollection、moveChunk等命令 -
"dbAdmin"在mongos上不能创建分片集合,也不能对已有分片集合drop——得用"root"或"clusterAdmin" - 应用账号不该有
"root",建议按需建专用运维账号(如shard-op)和应用账号(如app-user),后者只给"readWrite"到对应业务库 - 权限变更后不用重启
mongos,但旧连接会缓存权限,新连接才生效;可用db.logout()强制刷新
真正卡住人的地方,往往不是“怎么开 auth”,而是 config server 和 mongos 的 auth 启动顺序、keyfile 同步状态、以及权限角色和分片操作之间的隐含依赖——三者差一环,整个链路就静默失败。











