mongodb安全认证

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介:

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

再登录认证就可以了。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
存储 NoSQL 安全
MongoDB基本操作(五)——分片集群与安全认证
MongoDB基本操作(五)——分片集群与安全认证
442 0
MongoDB基本操作(五)——分片集群与安全认证
|
1月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
2月前
|
存储 NoSQL 关系型数据库
非关系型数据库-MongoDB技术(二)
非关系型数据库-MongoDB技术(二)
|
2月前
|
NoSQL 关系型数据库 MongoDB
非关系型数据库-MongoDB技术(一)
非关系型数据库-MongoDB技术(一)
|
21天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
22天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
23天前
|
存储 NoSQL MongoDB
MongoDB 数据库引用
10月更文挑战第20天
14 1
|
1月前
|
存储 NoSQL Shell
MongoDB 创建数据库
10月更文挑战第12天
52 4