2025年MongoDB3.4.24集群添加密码认证

MongoDB3.4.24集群添加密码认证MongoDB 默认不启用授权认证 只要能连接到该服务器 就可连接到 mongod 若要启用安全认证 需要更改配置文件 mongdb conf 中的参数 auth MongoDB 的用户是跟数据库相关联的 具体的数据库 需要有对应的用户 超级管理员也不能操作其他数据库的 MongoDB 存储所有的用户信息在 admin

大家好,我是讯享网,很高兴认识大家。
  • MongoDB默认不启用授权认证,只要能连接到该服务器,就可连接到mongod。若要启用安全认证,需要更改配置文件mongdb.conf中的参数auth。
  • MongoDB的用户是跟数据库相关联的,具体的数据库,需要有对应的用户,超级管理员也不能操作其他数据库的。
  • MongoDB存储所有的用户信息在admin 数据库的集合system.users中,保存用户名、密码和数据库信息。

环境:

​ 服务器已经做了MongoDB数据库的分片集群,其中包括了config,shard,mongos。

1、 配置集群所需角色

1.1 创建集群管理员

登录随意一台服务器的mongos,进入到admin数据库进行设置

mongos> show dbs # 查看数据库 adbox 0.002GB admin 0.000GB config 0.001GB fbbox 0.047GB mongos> use admin # 进入到数据库 switched to db admin mongos> db.createUser({ 
   user:"admin",pwd:"pass",roles:[{ 
   role:"clusterAdmin",db:"admin"},{ 
   role:"clusterManager",db:"admin"},{ 
   role:"clusterMonitor",db:"admin"}]}) Successfully added user: { 
    "user" : "admin", "roles" : [ { 
    "role" : "clusterAdmin", "db" : "admin" }, { 
    "role" : "clusterManager", "db" : "admin" }, { 
    "role" : "clusterMonitor", "db" : "admin" } ] } mongos> 

讯享网

在这里插入图片描述
讯享网

这部分代码创建了一个名为 “admin” 的用户,密码为"pass"分配了 clusterAdminclusterManagerclusterMonitor 角色,这些角色用于管理MongoDB集群。

  1. clusterAdmin(集群管理员):
    • 允许用户执行集群级别的管理操作。
    • 这包括控制和监视整个MongoDB集群,如添加或删除分片、复制集成员的管理等。
  2. clusterManager(集群管理器):
    • 允许用户管理集群配置,包括配置设置、维护操作和监控操作。
    • 该角色通常用于控制集群配置和性能调整。
  3. clusterMonitor(集群监视员):
    • 允许用户监视集群的状态和性能。
    • 可以查看有关集群健康状况的信息,但不能执行配置更改或其他管理操作。

1.2 创建管理员用户

登录随意一台服务器的mongos,进入到admin数据库进行设置

讯享网mongos> show dbs # 查看数据库 adbox 0.002GB admin 0.000GB config 0.001GB fbbox 0.047GB mongos> use admin # 进入到admin数据库 switched to db admin mongos> db.createUser({ 
   user:"root",pwd:"pass",roles:[{ 
   role:"readWriteAnyDatabase",db:"admin"},{ 
   role:"dbAdminAnyDatabase",db:"admin"},{ 
   role:"userAdminAnyDatabase",db:"admin"}]}) Successfully added user: { 
    "user" : "root", "roles" : [ { 
    "role" : "readWriteAnyDatabase", "db" : "admin" }, { 
    "role" : "dbAdminAnyDatabase", "db" : "admin" }, { 
    "role" : "userAdminAnyDatabase", "db" : "admin" } ] } 

在这里插入图片描述

这部分代码创建了一个名为 “root” 的管理员用户,密码是"pass",分配了 readWriteAnyDatabasedbAdminAnyDatabaseuserAdminAnyDatabase 角色,这些角色允许用户对所有数据库执行读写操作、数据库管理和用户管理。

  1. readWriteAnyDatabase(读写任何数据库):
    • 允许用户对系统中的任何数据库执行读写操作。
    • 这包括对用户创建的数据库以及系统数据库(如"admin"、"local"等)的读写权限。
  2. dbAdminAnyDatabase(数据库管理员):
    • 允许用户执行数据库级别的管理操作,包括创建和删除数据库、管理集合、索引和用户等。
    • 这允许用户在系统中的任何数据库上执行数据库管理操作。
  3. userAdminAnyDatabase(用户管理员):
    • 允许用户执行用户和角色管理操作,包括创建、删除和修改用户,以及分配或回收角色。
    • 这允许用户在系统中的任何数据库上执行用户和角色管理操作。

1.3 查看所有用户(show users)

在这里插入图片描述

1.4 赋予用户所有权限(看需求执行)

mongos> db.grantRolesToUser( "admin" , [ { 
    role: "dbOwner", db: "admin" },{ 
    "role": "clusterAdmin", "db": "admin" },{ 
    "role": "userAdminAnyDatabase", "db": "admin" },{ 
    "role": "dbAdminAnyDatabase", "db": "admin" },{ 
    role: "root", db: "admin" } ]) 

在这里插入图片描述

可以看到admin用户的权限增多了。这部分代码赋予了 “admin” 用户更多的角色,包括 dbOwnerclusterAdminuserAdminAnyDatabasedbAdminAnyDatabaseroot,使该用户拥有对 “admin” 数据库的完全权限,包括集群管理权限。

2、 给数据库adbox和fbbox创建普通用户

在某一个数据库中创建的用户只能在这个数据库中使用该用户

2.1 进入到adbox数据库创建用户

讯享网mongos> show dbs # 查看数据库 adbox 0.002GB admin 0.000GB config 0.001GB fbbox 0.047GB mongos> use adbox # 进入到adbox switched to db adbox mongos> show users # 查看所有用户 mongos> db.createUser({ 
   user:"dev",pwd:"P@ssw0rd",roles:[{ 
   role:"readWrite",db:"adbox"}]}) Successfully added user: { 
    "user" : "dev", "roles" : [ { 
    "role" : "readWrite", "db" : "adbox" } ] } mongos> show users { 
    "_id" : "adbox.dev", "userId" : BinData(4,"v1B5v/EaSxO20ziUIgIyZw=="), "user" : "dev", "db" : "adbox", "roles" : [ { 
    "role" : "readWrite", "db" : "adbox" } ] } mongos> 

在这里插入图片描述

这段代码在MongoDB中创建一个名为 “dev” 的用户,该用户的密码是 “P@ssw0rd”,并被授予对 “adbox” 数据库的 “readWrite” 权限。这意味着用户 “dev” 将能够在 “adbox” 数据库中执行读取和写入操作。

2.2 进入到fbbox数据库创建用户

mongos> show dbs # 查看数据库 adbox 0.002GB admin 0.000GB config 0.001GB fbbox 0.047GB mongos> use fbbox # 进入到fbbox switched to db fbbox mongos> db.createUser({ 
   user:"dev",pwd:"P@ssw0rd",roles:[{ 
   role:"readWrite",db:"fbbox"}]}) Successfully added user: { 
    "user" : "dev", "roles" : [ { 
    "role" : "readWrite", "db" : "fbbox" } ] } mongos> show users { 
    "_id" : "fbbox.dev", "userId" : BinData(4,"tpuFB+yiRJibzAcPRl4PPg=="), "user" : "dev", "db" : "fbbox", "roles" : [ { 
    "role" : "readWrite", "db" : "fbbox" } ] } mongos> 

在这里插入图片描述

这段代码在MongoDB中创建一个名为 “dev” 的用户,该用户的密码是 “P@ssw0rd”,并被授予对 “fbbox” 数据库的 “readWrite” 权限。这意味着用户 “dev” 将能够在 “fbbox” 数据库中执行读取和写入操作。

2.3 常见权限如下

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

3、 设置集群的密码

3.1 进入到mongodb容器的/data/mongodb/conf/生成密钥文件

讯享网[root@76415a52bb3f conf]# pwd /data/mongodb/conf [root@76415a52bb3f conf]# openssl rand -base64 512 > mongodb.key [root@76415a52bb3f conf]# ll total 16 -rw-r--r-- 1 root root 262 Nov 2 13:43 config.conf -rw-r--r-- 1 root root 695 Nov 8 13:31 mongodb.key -rw-r--r-- 1 root root 256 Nov 7 11:53 mongos.conf -rw-r--r-- 1 root root 323 Nov 2 13:47 shard1.conf 

在这里插入图片描述

3.2 设置密钥文件的权限为600

[root@76415a52bb3f conf]# chmod 600 mongodb.key  [root@76415a52bb3f conf]# ll total 16 -rw-r--r-- 1 root root 262 Nov 2 13:43 config.conf -rw------- 1 root root 695 Nov 8 13:31 mongodb.key -rw-r--r-- 1 root root 256 Nov 7 11:53 mongos.conf -rw-r--r-- 1 root root 323 Nov 2 13:47 shard1.conf 

在这里插入图片描述

4、 将密钥文件传输到其他节点

容器环境需要先退出容器后进行操作

讯享网[root@localhost ~]# scp /data/mongodb/conf/mongodb.key root@172.16.0.162:/data/mongodb/conf/  [root@localhost ~]# scp /data/mongodb/conf/mongodb.key root@172.16.0.163:/data/mongodb/conf/ 

在这里插入图片描述

5、 修改配置文件添加密码认证(所有节点)

5.1 编辑config.conf(所有节点)

添加如下字段:

auth=true keyFile=/data/mongodb/conf/mongodb.key 

auth:开启认证

keyFile:认证秘钥key路径

在这里插入图片描述

5.2 编辑mongos.conf文件和shard1.conf文件(所有节点)

如果有很多个shard分片,就都需要添加

添加如下字段:

讯享网keyFile=/data/mongodb/conf/mongodb.key 

5.3 重启mongodb

  • 方法1:使用ps -ef |grep mongo查看到pid,再使用kill命令杀死
  • 方法2:使用systemctl restart mongodb命令重启
  • 容器部署的话就重启容器

6、 测试密码认证

6.1 登录任意一台mongos测试admin数据库

6.1.1 登录到mongos,进入到admin数据库查看所有用户

[root@76415a52bb3f /]# mongo --port 30000 MongoDB shell version v3.4.24 connecting to: mongodb://127.0.0.1:30000/ MongoDB server version: 3.4.24 mongos> use admin # 进入到admin数据库 switched to db admin mongos> show users # 查看所有用户 2023-11-08T15:29:59.383+0800 E QUERY [thread1] Error: not authorized on admin to execute command { 
    usersInfo: 1.0 } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype.getUsers@src/mongo/shell/db.js:1539:1 shellHelper.show@src/mongo/shell/utils.js:797:9 shellHelper@src/mongo/shell/utils.js:704:15 @(shellhelp2):1:1 mongos> 

在这里插入图片描述

查看用户时,提示未授权。表示现在没有权限,这就表示我们启用认证成功

6.1.2 使用root用户和密码登录admin数据库

讯享网mongos> db.auth("root","pass") 1 

使用db.auth(“root”,”pass”)进行auth认证,看到返回的值为1,这就表示认证成功了,然后我们再使用命令查看用户和数据库。

在这里插入图片描述

6.2 登录任意一台mongos测试adbox数据库

6.2.1 登录到mongos,进入到adbox数据库查看表

如果使用同一节点需要先退出刚才使用root用户登录的mongos,因为root用户权限较高,可以访问所有的数据库,无法测试

[root@76415a52bb3f /]# mongo --port 30000 MongoDB shell version v3.4.24 connecting to: mongodb://127.0.0.1:30000/ MongoDB server version: 3.4.24 mongos> use adbox # 进入到adbox数据库 switched to db adbox mongos> show tables # 查看表 2023-11-08T15:54:55.051+0800 E QUERY [thread1] Error: listCollections failed: { 
    "ok" : 0, "errmsg" : "not authorized on adbox to execute command { listCollections: 1.0, filter: {} }", "code" : 13, "codeName" : "Unauthorized" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:807:1 DB.prototype.getCollectionInfos@src/mongo/shell/db.js:819:19 DB.prototype.getCollectionNames@src/mongo/shell/db.js:830:16 shellHelper.show@src/mongo/shell/utils.js:807:9 shellHelper@src/mongo/shell/utils.js:704:15 @(shellhelp2):1:1 

在这里插入图片描述

查看表时,提示未授权。表示现在没有权限,这就表示我们启用认证成功

6.2.2 使用dev用户登录adbox数据库

讯享网mongos> db.auth("dev","P@ssw0rd") 1 

使用db.auth(“dev”,”P@ssw0rd”)进行auth认证,看到返回的值为1,这就表示认证成功了,然后我们就可以使用命令查看数据库中的内容。
在这里插入图片描述

7、 用户操作的命令

7.1 创建普通用户

需要进入到某一个数据库中创建数据某一个数据库的用户

mongos> db.createUser({ 
   user:"dev",pwd:"P@ssw0rd",roles:[{ 
   role:"readWrite",db:"adbox"}]}) 

创建一个名为 “dev” 的用户,该用户的密码是 “P@ssw0rd”,并被授予对 “adbox” 数据库的 “readWrite” 权限。这意味着用户 “dev” 将能够在 “adbox” 数据库中执行读取和写入操作。

7.2 进入数据库,使用密码认证

数据库中必须有指定的用户才可以登录到这个数据库中

讯享网mongos> use adbox mongos> db.auth("dev","P@ssw0rd") 1 

7.3 快速认证登录数据库

mongo xcsa_mongodb:30000/adbox -u dev -p P@ssw0rd 

命令直接登录adbox数据库

-u跟用户名

-p跟密码

7.3 删除用户

注意:需要使用有管理员权限的用户才可以删除,先进入admin数据库,然后登录admin用户,再进入相对应的数据库去删除相对应的用户

讯享网mongos> db.dropUser("duan") 

这将删除名为duan的用户

7.4 修改用户密码

注意:需要使用有管理员权限的用户才可以修改密码,先进入admin数据库,然后登录admin用户,再进入相对应的数据库去修改相对应的用户

mongos> db.updateUser("duan",{ 
   pwd:""}) 

这将用户duan的密码修改为

小讯
上一篇 2025-04-09 09:24
下一篇 2025-01-14 07:58

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/12358.html