1.安全认证描述

  MongoDB 默认是没有账号的,可以直接连接,无须身份验证。实际项目中肯定是要权限验证的,否则
后果不堪设想。从2016年开始 发生了多起MongoDB黑客赎金事件,大部分MongoDB安全问题 暴露出
了安全问题的短板其实是用户,首先用户对于数据库的安全不重视,其次用户在使用过程中可能没有养
成定期备份的好习惯,最后是企业可能缺乏有经验和技术的专业人员。所以对MongoDB进行安全认证
是必须要做的。

2.安全认证

2.1 相关操作

1)创建用户

db.createUser( 
{ user: "账号", 
pwd: "密码", 
roles: [ { role: "角色", db: "安全认证的数据库" }, { role: "角色", db: "安全认证的数据库" } ] } )

例如:
db.createUser( 
{user:"root", pwd:"123321", roles:[{role:"root",db:"admin"}] })

2)修改密码
db.changeUserPassword( ‘root’ , ‘rootNew’ );
3)用户添加角色
db.grantRolesToUser( ‘用户名’ , [{ role: ‘角色名’ , db: ‘数据库名’}])
4)已安全认证方式运行
./bin/mongod -f conf/mongo.conf --auth
或者在conf配置文件中指定参数auth=true
5)验证用户
db.auth(“账号”,“密码”)
6)删除用户
db.dropUser(“用户名”)
7)数据库内置的角色

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

案例:创建 mydb1 数据库并创建了两个用户,zhangsan 拥有读写权限,lisi 拥有只读权限测试这两个账户的
权限。
1)首先创建管理员
在开启安全认证访问之前至少需要一个管理员账号,admin数据库中的用户都被视为管理员,如果admin库中没有任何用户的话,即使在其他数据库中创建了用户,启用了身份验证访问,默认的连接方式依然会有超级权限,即仍然可以不验证账号密码照样能进行 CRUD,安全认证相当于无效。

use admin
#创建超级用户
db.createUser({user:"root",pwd:"123123",roles:[{role:"root",db:"admin}]})

#创建普通用户
use mydb1

db.createUser({user:"zhangsan",pwd:"123123",roles:[{role:"readWrite",db:"mydb1"}]})

db.createUser({user:"lisi",pwd:"123123",roles:[{role:"read",db:"mydb1"}]})

#插入测试数据
db.c1.insert({name:"testdb1"})

2)验证权限
以安全认证方式启动MongoDB

#直接登录mydb1
mongo localhost:57017/mydb1
#直接查看数据库
show dbs #直接查看会报错
#验证身份
db.auth("zhangsan","123123")
> show dbs
mydb1  0.000GB
#这时可以看到数据库mydb1
#查询c1
> db.c1.find()
{ "_id" : ObjectId("5fe45cc5f151d09cf6947720"), "name" : "testdb1" }
> 
#插入一条数据
> db.c1.insert({name:"test2"})
WriteResult({ "nInserted" : 1 })
> 
#切换用户
> db.auth('lisi','123123')
#查询数据
> db.c1.find()
{ "_id" : ObjectId("5fe45cc5f151d09cf6947720"), "name" : "testdb1" }
{ "_id" : ObjectId("5fe548fbca1e1c6682c226c2"), "name" : "test2" }
#插入数据
> db.ci.insert({name:"test3"})
WriteCommandError({
	"ok" : 0,
	"errmsg" : "not authorized on mydb1 to execute command { insert: \"ci\", ordered: true, lsid: { id: UUID(\"d6849291-d907-422c-bec4-b3a5c47e4d64\") }, $db: \"mydb1\" }",
	"code" : 13,
	"codeName" : "Unauthorized"
})

以上验证可以看出zhangsan用户对mydb1有读写权限,lisi用户只有读权限

2.3 分片集群安全认证

分片集群搭建可以参考我的另一篇博客《MongoDB分片集群搭建》

1)首先进入路由节点增加管理员用户和普通用户,与2.2步骤相同
这里创建测试账号 u:test1 p:123123
2)关闭所有配置节点,分片节点和路由节点
ps:可以使用killall mongod ,需要安装yum install psmisc
3)生成秘钥文件

openssl rand -base64 756 > /data/mongo/testKeyFile.file 
chmod 600 /data/mongo/keyfile/testKeyFile.file

4)配置节点和分片节点开启安全认证并制定秘钥文件

auth=true
keyFile=/data/mongo/testKeyFile.file

5)在路由配置文件中设置秘钥文件

keyFile=/data/mongo/testKeyFile.file

6)启动所有配置节点 分片节点 路由节点

从路由节点进入,验证方式同单机一样

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐