开启集群内部认证是生产环境强制前提,keyFile为最轻量internal auth方式,需6–1024字节随机二进制数据、600权限,且mongos不支持该配置;启用后客户端须显式指定SCRAM-SHA-256及--authenticationDatabase admin。 把“开启集群内部认证”

把“开启集群内部认证”说成是“建议”,那可太客气了。在生产环境里,这压根儿不是一道选择题,而是必须完成的强制项。不配置keyFile,集群里的节点之间就建立不起可信的通信通道。这意味着什么?意味着“恶意替换或加入节点”这种听起来像攻击场景的事,在未认证的状态下,其实是系统默认允许的。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
无论是副本集还是分片集群,节点之间都依赖心跳和数据同步来维持状态。但默认配置下,mongod进程可不会去校验对端的身份。只要网络可达、端口开放,并且在配置里看到了对方的host信息,它就会欣然接受连接,开始同步oplog或者chunk数据。问题来了:攻击者只要摸清了集群的拓扑结构——比如从config server执行sh.status()的结果里,或者从日志泄露的信息中——就能轻松伪造一个节点加入进来。这个“冒牌货”不仅不会被拒绝,甚至有可能被选举为Primary,或者参与到关键的数据分发流程中。
rs.add("evil:27017")命令就能成功执行。这个新加入的“恶意节点”会立刻开始拉取全量数据。mongos进行注册。如果集群没有通过IP限制或启用TLS来加固,那么sh.addShard()操作很可能也会接受这个非法节点。shards集合里的记录,就能把数据流量导向攻击者控制的节点。keyFile的本质是什么?它既不是密码,也不是复杂的密钥交换协议。你可以把它理解成所有节点共享的一份“接头暗号”,用来证明“我们是一伙的”。这种方式虽然轻量,但对细节的要求近乎苛刻,稍有不慎就会导致整个集群认证失效:
keyFile配置,它会直接报出Authentication failed错误,这可不是简单重启就能解决的问题。openssl rand -base64 756 > /etc/mongod-keyfile来生成。千万别用echo "abc" > keyfile这类方式,因为其中包含的换行符和非二进制字符会导致启动直接失败。600,即chmod 600 /etc/mongod-keyfile这一步绝不能省略。否则,日志里只会留下一句颇为隐晦的报错:Permissions on /path/to/keyfile are too open,不会再给你更多排查线索。mongos(路由进程)的配置里不支持security.keyFile这个字段。如果你错误地给它加上了,会导致Failed to load configuration from file,这实际上是配置语法校验失败。这是运维过程中一个非常典型的“坑”。很多人会误以为,开启了节点间的内部认证(internal auth),客户端连接方式还和以前一样。实际上,这两套认证体系是相互独立的——keyFile只管节点之间的通信安全,并不直接影响你的应用或工具连接数据库。但是,一旦internal auth启用,整个集群的安全上下文就升级了。如果你还用老一套方法去连接,就会出现“能连上,但执行任何操作都报权限错误”的尴尬局面:
authMechanism=SCRAM-SHA-256,不能依赖MongoDB的默认机制协商。--authenticationDatabase admin参数。否则,即使你的用户名和密码完全正确,也会收到not authorized on admin to execute command这样的提示。db.createUser({user:"admin", pwd:"...", roles:["root"]})。只在一个节点上创建,其他节点是不会认可的。最后,还有一个真正容易被忽略的关键点:internal auth一旦启用,就没有“回退窗口”这个概念。你不能为了调试某个节点,就临时关掉它的认证——因为集群里的其他节点会立刻拒绝与这个“不安全”的节点通信。因此,在部署之前,就必须确保keyFile的分发、文件权限、配置路径以及所有节点上的用户创建,都一步到位,万无一失。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述