如何为mongodb分片集群配置全局的访问控制_在mongos上开启auth认证机制

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 directorykeyfile 必须在所有 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 同步状态、以及权限角色和分片操作之间的隐含依赖——三者差一环,整个链路就静默失败。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。