mongo的认证包括客户端-服务器认证和服务器节点间的认证。
客户端-服务器认证
客户端-服务器认证可以通过用户名、密码实现。
举例为nh_sc
库添加用户nh_mongo
,指定角色为dbAdmin:
root@faith129:~# mongo 192.168.47.130
nh_sc:PRIMARY> use nh_sc
switched to db nh_sc
nh_sc:PRIMARY> db.createUser({user:"nh_mongo",pwd:"nh_mongo",roles:[{role:"dbAdmin",db:"nh_sc"}]})
Successfully added user: {
"user" : "nh_mongo",
"roles" : [
{
"role" : "dbAdmin",
"db" : "nh_sc"
}
]
}
查看当前库所有角色:
nh_sc:PRIMARY> show roles
{
"role" : "dbAdmin",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbOwner",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "enableSharding",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "read",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readWrite",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "userAdmin",
"db" : "nh_sc",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
角色可选项:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向 system.users 集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
root:只在 admin 数据库中可用。超级账号,超级权限
登陆admin库可以查看所有用户:
nh_sc:PRIMARY> use admin
switched to db admin
nh_sc:PRIMARY> db.system.users.find()
{ "_id" : "nh_sc.nh_mongo", "userId" : UUID("0de75229-9278-4bdc-aadf-ee66972fc42f"), "user" : "nh_mongo", "db" : "nh_sc", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "xnUr7j8zMJznkCivakZ93g==", "storedKey" : "DYDX9Rn6JoeDtNHWUFtN3SzcSGI=", "serverKey" : "e1r46NjlYTwqnpGFyHNUxR+mEPI=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "q8N1VBRQuEU/WP8c5M+nysb6cD6w8iep7XOItA==", "storedKey" : "+b1pBRgedX03PJ/7Ci4QzzICi15kECLyQa47bZRE8cs=", "serverKey" : "AtrB9wvV6ByjdrMPPxiW8XLj2vI5DGocu1YXVwWkz1s=" } }, "roles" : [ { "role" : "dbAdmin", "db" : "nh_sc" } ] }
测试
db.auth("tom","123")
登陆测试
现在有两种方式进行用户身份的验证。
第一种类似MySql客户端连接时,指定用户名、密码、db名称:
mongo --port 27017 -u "adminUser" -p "adminPass" --authenticationDatabase "admin"
第二种客户端连接后,再进行验证:
root@faith129:/server/deployments/mongodb-4.2.6# mongo 192.168.47.130
nh_sc:PRIMARY> use admin
switched to db admin
nh_sc:PRIMARY> db.auth("nh_admin","nh_admin")
1
注意要先选择数据库再执行db.auth()
,输出 1 表示验证成功。
还有一点需要注意,如果admin
库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,默认的连接方式依然会有超级权限。
服务器节点间认证
启用用户名、密码认证后,登陆mongo集群,会发现副本集状态:
当前登录节点状态为:RECOVERING
集群中其他节点状态为:not reachable/healthy
原因就启用认证后,不仅客户端连接需要认证,集群内不同节点之间也需要相互认证,否则集群内各节点之间无法通信,会造成了当前登录节点一直是RECOVERING状态,而其他节点则为not reachable
状态。
解决方式为添加节点认证,mongodb官方文档:
https://docs.mongodb.com/manual/core/security-internal-authentication/#keyfiles
keyfile为基本认证方式,使用方式为生成秘钥文件,例如:
root@faith129:/server/deployments/mongodb-4.2.6# openssl rand -base64 745 > /data/mongodb/keyfile
root@faith129:/server/deployments/mongodb-4.2.6# cat /data/mongodb/keyfile
/PifVc2MpR/T5spjh3Be6IPIU+cqmCJRpiApdFCvhfRaXcZEt+iszmmsCCsiUwWN
9PdmPRJ/rcXIzI1S+XGiqeEsFuCNH4PDBaf98CHCUv5aHclMi8cHdmSZtLuwBuiD
fmwjvoTk0XMZfN8Qc4NubJ7yAVRwGWYXWdbwb+H/bEhtmWd/8lOcOVhSagK/PHQ7
NXEfvMf+d48tUjBwRdb1NoSO/Jn2VntoAlhDHZVZvN3w4WvzCKE0vOgLbaCkdzUl
NftUMj3/8nWxw8frY6FwoB0Azfr+Upor5ERmfxjcWn/1W2XVI13+aPW/9W2mkQIp
sInot8L8s9IbhSwfDo2i7x9172Bt1f+XBH4IiqtTuPn5+h+k9+ceu2CZQ+0acrSt
nlnf2dlFVoewE+qhg7jrzhauAVYHCQAP4qOIHrbWnN9Idj+gRgqGx+COgf+6xsvs
268Fuh+x2NFqgSwtw8hvtJQQHI1ds9WncEjwN6OsSPd7rYnOyIrjaJZJ17KcMaFH
kbe4VcfoSTIYVMN+EaefMwnQhjesYUuCATGh8cOQ6Rym36oH4FAS7ICmY7/gCHFi
RagAxAHNDuNqpoeIEbCEcNGuUA65Zub88pqIWE4dIUH8K66ss//1iqltBV0ij2OR
C2gj0pBdRvZ9MgIuGy4NRSf/fmW74VSmufe7VsPOp3gwttOt2HyRL/NRfYLmQXGu
Xxpz0eBO7ecaDZJWoGPAwoPRAFavljCDMuE7LTdb19qdLqUGC/1TZMsyCla1DEGw
LXNaYV+Getx/8IwPlZmhpRvMcLDTPRAG+upE044APGtiAJBUe8/G1yUssPFxmXnz
ZuJoZ37o6ivi1BY3Nj78/3M7mKvgvqAzZ+lvy/WRYzPRa6sVrQkqy5R772eyy/Oj
raG56X7yJn3TIsgO8/HJ+Uiws/PVDuuXl28VcVOx1XfDyj40CIVrP5P2RxUfMkpP
i0bDwqZbx8B/Yp5/UTmXEtJw8UI2FHNseA==
root@faith129:/server/deployments/mongodb-4.2.6# scp /data/mongodb/keyfile root@faith130:/data/mongodb
keyfile 100% 1012 1.0KB/s 00:00
root@faith129:/server/deployments/mongodb-4.2.6# scp /data/mongodb/keyfile root@faith141:/data/mongodb
keyfile
分发文件到每个mongo节点,并修改文件权限为600:
root@faith129:/server/deployments/mongodb-4.2.6# chmod 600 /data/mongodb/keyfile
root@faith129:/server/deployments/mongodb-4.2.6# ll /data/mongodb/keyfile
-rw------- 1 root root 1012 May 12 23:45 /data/mongodb/keyfile
在mongodb.yml中配置:
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /data/mongodb/keyfile
再登录认证就可以了。