直接用root角色危险因其在admin库默认拥有全库读写、用户管理等不可细粒度限制的权限,泄露或误操作后果不可逆;云厂商已限制其对admin库写权限,应改用createRole创建最小权限自定义角色。
为什么直接用
角色是危险的
不是因为
不能用,而是它在
库中默认拥有对所有数据库的读写、用户管理、集群控制等权限,且无法被细粒度限制。一旦该账号泄露或误操作(比如执行
),后果不可逆。云厂商(如阿里云 MongoDB 6.0+)已主动限制
对
库的写权限,就是为防这类风险。
用
替代
创建最小权限角色
内置角色太宽泛,自定义角色才能精准匹配业务需求。关键点在于:只授必要集合、只开必需动作、限定作用域。
必须在
库中执行,但新角色可绑定到任意业务库
权限声明用
字段,例如只允许对
集合执行
和
:
不要在
中设
(空资源),这等同于全库通杀
若需跨库读取(如报表服务查多个库),用
比
更可控——它不带用户管理、备份恢复等高危能力
给应用用户分配角色时避开
库认证陷阱
常见错误是创建用户时指定
,导致连接字符串必须带
,而实际业务只操作
库。这增加配置复杂度,也容易暴露管理库路径。
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
用户应在业务库(如
)中创建,并赋予该库内自定义角色:
注意:角色定义在
,但用户归属在
连接时只需指定业务库名和对应认证库:
(
指向用户所在库)
避免把用户建在
库里再赋
—— 这等于变相复活
权限
升级后
突然无法写
库?检查内核版本与迁移路径
MongoDB 6.0+(内核 ≥7.0.4)强制剥离
对
的写权限。如果你的应用曾往
写自定义集合(如
),升级后会静默失败。
先确认当前版本:
和
查内核小版本
用
扫描非
开头的集合
迁移脚本必须在升级前运行,且目标库不能是
或
:
迁移后,所有写操作应指向新库(如
),而非继续依赖
真正难的不是创建角色,而是厘清每个服务到底需要哪几个集合的哪些操作。把
拆成十几个窄口径角色后,连审计日志都更容易定位异常行为——但前提是,你得先画出那张数据访问关系图。
rootrootadmindb.dropDatabase()rootadmincreateRolerootcreateRoleadminprivilegesordersfindinsertdb.createRole({ role: "orderReaderWriter", privileges: [{ resource: { db: "shop", collection: "orders" }, actions: ["find", "insert"] }], roles: []})privileges{ db: "", collection: "" }readAnyDatabaserootadmindb: "admin"--authenticationDatabase adminshopshopuse shop
db.createUser({ user: "app_order_svc", pwd: "xxx", roles: [{ role: "orderReaderWriter", db: "admin" }]})adminshopmongodb://app_order_svc:xxx@host:27017/shop?authSource=shopauthSourceadminreadWriteAnyDatabaserootrootadminrootadminadminadmin.metricsdb.version()db.runCommand({getCmdLineOpts:1})db.getSiblingDB("admin").getCollectionNames()system.localconfigdb.getSiblingDB('admin').getCollectionNames().forEach(function(n) {
if (!n.startsWith('system.')) {
db.adminCommand({ renameCollection: 'admin.' + n, to: 'monitoring.' + n });
}
});monitoringadminroot