MongoDB3.4.24集群添加密码认证

  • 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:"123456"})

这将用户duan的密码修改为123456

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值