-
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"分配了 clusterAdmin
、clusterManager
和 clusterMonitor
角色,这些角色用于管理MongoDB集群。
clusterAdmin
(集群管理员):- 允许用户执行集群级别的管理操作。
- 这包括控制和监视整个MongoDB集群,如添加或删除分片、复制集成员的管理等。
clusterManager
(集群管理器):- 允许用户管理集群配置,包括配置设置、维护操作和监控操作。
- 该角色通常用于控制集群配置和性能调整。
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",分配了 readWriteAnyDatabase
、dbAdminAnyDatabase
和 userAdminAnyDatabase
角色,这些角色允许用户对所有数据库执行读写操作、数据库管理和用户管理。
readWriteAnyDatabase
(读写任何数据库):- 允许用户对系统中的任何数据库执行读写操作。
- 这包括对用户创建的数据库以及系统数据库(如"admin"、"local"等)的读写权限。
dbAdminAnyDatabase
(数据库管理员):- 允许用户执行数据库级别的管理操作,包括创建和删除数据库、管理集合、索引和用户等。
- 这允许用户在系统中的任何数据库上执行数据库管理操作。
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” 用户更多的角色,包括 dbOwner
、clusterAdmin
、userAdminAnyDatabase
、dbAdminAnyDatabase
和 root
,使该用户拥有对 “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