MongoDB 安全认证

  • 1.1 MongoDB的用户角色权限简介
  • 1.2 单实例环境
    • 1.2.1 关闭已开启的服务
    • 1.2.2 添加用户和权限
    • 1.2.3 服务端开启认证 & 客户端连接登录
    • 1.2.4 SpringDataMongoDB 连接认证
  • 1.3 副本集环境
    • 1.3.1 前言
    • 1.3.2 关闭已开启的副本集服务
    • 1.3.3 通过主节点添加一个管理员账号
    • 1.3.4 创建副本集认证的key文件
    • 1.3.5 修改配置文件指定keyfile
    • 1.3.6 重新启动副本集
    • 1.3.7 在主节点上添加普通账号
    • 1.3.8 在SpringDataMongoDB连接副本集
      • 3.3.8 在SpringDataMongoDB连接副本集
  • 1.4 分片集群环境
    • 1.4.1 关闭已开启的集群服务
    • 1.3.2 创建副本集认证的key文件
    • 1.3.3 修改配置文件指定的keyfile
    • 1.3.4 重新启动节点
    • 1.3.5 创建账号和认证
    • 1.3.8 SpringDataMongoDB连接分片集群

1.1 MongoDB的用户角色权限简介

默认情况下,MongoDB 实例启动运行时是没有启用用户访问权限控制的,也就是说,在实例本机服务器上都可以随意连接到实例进行各种操作,MongoDB不会对连接客户端进行用户验证,这是非常危险的。

MongoDB官网上说,为了能保障MongoDB的安全可以做以下几个步骤:

  1. 使用新的端口,默认的27017端口一旦知道ip就能连接上,不太安全。
  2. 设置MongoDB的网络环境,最好将MongoDB部署到公司服务器内网,这样外网是访问不到的。公司内部访问使用VPN等。
  3. 开启安全认证。认证要同时设置服务器之间的内部认证方式,同时要设置客户端连接到集群的账号密码认证方式。

为了强制开启用户访问控制(用户验证),则需要在MongoDB实例启动时使用选项--auth或在指定启动配置文件中添加选项auth=true

在开始之前需要了解一下概念

1)启用访问控制:

MongoDB 使用的是基于角色的控制访问(Role-Based Access Control,RBAC)来管理用户对实例的访问。通过对用户授予一个或多个角色来控制用户访问数据库资源的权限和数据库操作的权限,在对用户分配角色之前,用户无法访问实例。

2)角色:

在MongoDB中通过橘色对用户授予相应数据库资源的操作权限,每个角色当中的权限可以显示指定,也可以通过继承其他角色的权限,或者两者都存在的权限。

3)权限:

权限由指定的数据库资源(resource)以及允许在指定资源上进行的操作(action)组成。

  1. 资源(resource):数据库、集合、部分集合、集群
  2. 操作(action):对资源进行增删改查(CRUD)操作

在角色定义时,可以包含一个/多个已存在的角色,新创建的角色会继承包含的角色的所有的权限。在同一个数据库中,新创建的角色可以继承其他角色的权限,在admin数据库中创建的角色可以继承在其他任意数据库中角色的权限。

关于角色权限的查看,可以通过如下命令查询:

// 查询所有角色权限(仅用户自定义角色)
> db.runCommand({ rolesInfo: 1 })// 查询所有角色权限(包含内置角色)
> db.runCommand({ rolesInfo: 1, showBuiltinRoles: true })//查询当前数据库中的某角色的权限
> db.runCommand({ rolesInfo: "<rolename>" })//查询其他数据库中指定的角色权限
> db.runCommand({ rolesInfo: {role: "<rolename>", db: "<database>"} })//查询多个角色权限
> db.runCommand({rolesInfo: ["<rolename>",{ role:"<rolename>", db: "database" },...]}
)

常用的内置角色:

  • 数据库用户角色:read、readWrite
  • 所有数据库用户角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  • 数据库管理角色:dbAdmin、dbOrder、userAdmin
  • 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
  • 备份回复角色:backup、restore
  • 超级用户角色:root
  • 内部角色:system

角色说明:

角色 权限描述
read 可以读取指定数据库中的任何数据。
readWrite 可以读写指定数据库中的任何数据,包括创建、重命名、删除集合。
readAnyDatabase 可以读取所有数据库中任何数据(除了数据库config和local之外)。
readWriteAnyDatabase 可以读写所有数据库中任何数据(除了数据库config和local之外)。
userAdminAnyDatabase 可以在指定数据库中创建和修改用户(除了数据库config和local之外)。
dbAdminAnyDatabase 可以读取任何数据库以及对数据进行清理、修改、压缩、统计获取信息、执行检查等操作(除了数据库config和local之外)。
dbAdmin 可以读取任何数据库以及对数据进行清理、修改、压缩、统计获取信息、执行检查等操作。
userAdmin 可以在指定数据库创建和修改用户。
clusterAdmin 可以对整个集群或数据库系统进行管理操作。
backup 备份MongoDB数据最小的权限。
restore 从备份文件中还原恢复MongoDB数据(除了system.profile集合)的权限。
root 超级账号,超级权限。

1.2 单实例环境

目标:对单实例的MongoDB服务开启安全认证,这里的单实例指的是未开启副本集或分片的MongoDB实例。

1.2.1 关闭已开启的服务

增加mongod的单实例安全认证功能,可以在服务搭建的时候直接添加,也可以在之前搭建好的服务上添加。

本文使用之前搭建好的服务,因此,先停止之前的服务

停止服务的方法:快速关闭、标准关闭:

(1)快速关闭方法(快速、简单、数据可能出错)

目标:通过系统的kill指令直接杀死进程:

杀完要检查一下,避免没有杀掉。

#通过进程编号关闭节点
kill -2 54410

【补充】

如果一旦是因为数据损坏,则需要进行如下操作(了解):

1)删除lock文件:

rm -f /mongodb/single/data/db/*.lock

2)修复数据:

/usr/local/mongodb/bin/mongod --repair --dbpath=mongodb/single/data/db

(2)标准关闭方法(数据不容易出错、麻烦)

目标:通过mongo客户端中的shutdownServer命令来关闭服务

主要的操作步骤参考如下:

//客户端登陆服务,注意,这里通过localhost登录,如果需远程登录,必须先登录认证才行。
mongo --port 27017
//切换到admin库
use admin
//关闭服务
db.shutdownServer()

1.2.2 添加用户和权限

(1)先按照普通无授权认证的配置,来配置服务端的配置文件/mongod/single/mongo.conf

systemLog:#发送所有日志输出的目标指定为文件destination: file#mongod或mongos应向其大宋所有诊断日志记录信息的日志文件的路径path: "/mongodb/single/log/mongod.log"logAppend: true#mongod实例存储其数据的目录。storage.dbpath设置仅适用于mongod。
storage: #mongod实例存储其数据的目录。storage.dbpath设置仅适用于mongod。dbPath: "/mongodb/single/data/db"joural:#启用或禁用持久性日志以确保数据文件保持有效和可恢复。enabled: true
processManagement:#启用在后台运行mongos或mongod进程的守护进程模式fork: true#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将其写入其PIDpidFilePath: "/mongodb/single/log/mongod.pid"
net:#服务实例绑定ipbindIp: localhost,192.168.0.2#绑定的端口port: 27017

(2)按之前未开启认证的方式(不添加--auth参数)来启动MongoDB服务:

/usr/local/mongodb/bin/mongod -f /mongod/single/mongod.conf

提示:

在操作用户时,启动mongod服务时尽量不要开启授权。

(3)使用Mongo客户端登录:

/usr/local/mongodb/bin/mongo --host ip地址 --port 27017

(4)创建两个管理员用户,一个是系统的超级管理员myroot,一个是admin库的管理用户myadmin

//切换到admin库
> use admin
//创建系统超级用户 myroot,设置密码123456,设置角色root
//> db.createUser({user:"myroot",pwd:"123456",roles:[ {"role" : "root" , "db" : "admin"} ]})
//或
> db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
Successfully added user: {"user" : "myroot", "roles" : ["root"]}
//创建专门用来管理admin库的账号myadmin,只用来作为用户权限的管理
> db.createUser({user:"myadmin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {"user" : "myadmin","roles" : [{"role" : "userAdminAnyDatabase","db" : "admin"}]
}

更多命令:

//查看已创建用户的情况:
> db.system.find()//删除用户
> db.dropUser("myadmin")//修改密码
> db.changeUserPassword("myroot","123456")

提示:

  1. 本案例创建了两个用户,分别对应超管和专门用来管理用户的角色,事实上,你只需要一个用户即可。如果你对安全性要求很高,防止超管泄露,则不要创建超管用户。
  2. 和其他数据库(MySQL)一样(权限管理类似),也是将用户、权限信息保存到数据库对应的表中。Mongodb存储所有的用户信息在admin数据库的集合system.users中,保存用户名、密码和数据库信息。
  3. 如果不指定数据库,则创建的指定权限的用户在所有的数据库上有效,如{role: "userAdminAnyDatabase",db:""}

(5)认证测试

测试添加的用户是否正确:

//切换到admin
> use admin
//密码输错
> db.auth("myroot","12345")
Error: Authentication failed.
0
//密码正确
> db.auth("myroot","123456")
1

(6)创建普通用户

创建普通用户可以在没有开启认证的时候添加,也可以在开启认证之后添加,但开启认证之后,必须使用有操作admin库的用户登录认证后才能操作。底层都是将用户信息保存在了admin数据库的集合system.users中。

//创建(切换)将来要操作的数据库articledb
> use articledb
switched to db articledb
//创建用户,拥有articledb数据库的读写权限readWrite,密码123456
> db.createUser({user: "hello", pwd:"123456", role: [{ role: "readWrite", db: "articledb" }]})
Successfully added user : {"user" : "hello","roles" : [{"role" : "readWrite","db" : "articledb"}]
}
//测试是否可用
> db.auth("hello","123456")
1

提示:

  • 如果开启认证后,登录的客户端用户必须使用admin库的角色,如拥有root角色的myadmin用户,再通过myadmin用户去创建其他角色的用户

1.2.3 服务端开启认证 & 客户端连接登录

(1)关闭已经启动的服务

1)使用linux命令杀死进程

[root@localhost single]# ps -ef |grep mongo
root    23482   1  0  08:08 ?       00:00:55  /usr/local/mongdb/bin/mongod -f /mongodb/single/mongd.conf
[root@localhost single]# kill -2 23482

2)在mongo客户端中使用shutdownServer命令来关闭。

> db.shutdownServer()
shutdown command only works with the admin database; tru 'use admin'
> use admin
switched to db admin
> db.shutdownServer()
2021-11-13T22:49.450+0880 E QUERY  [js]Error: shutdownServer failed: {"ok" : 0,"errmsg" : "shutdown must run from localhost when runnning db without auth","code" : 13,"codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.shutdownServer@src/mongo/shell/db.js:453:1
@(shell):1:1

需要几个条件:

  • 必须是在admin库下执行该关闭服务命令。
  • 如果没有开启认证,必须是从localhost登录的,才能执行关闭服务命令。
  • 非locahost的、通过远程登陆的,必须有登录且必须登录用户有对admin操作权限才可以。

(2)以开启认证的方式启动服务

有两种方式开启权限认证启动服务:一种是参数方式,一种是配置文件方式。

1)参数方式

在启动时指定参数--auth,如:

/usr/local/mongodb/bin/mongod -f mongodb/single/mongd.conf --auth

2)配置文件方式

在mongod.conf配置文件中加入:

vim /mongodb/single/mongod/conf

编辑:

security:#开启授权认证authorization: enabled

启动时可不加--auth参数:

/usr/local/mongodb/bin/mongod -f mongodb/single/mongd.conf

(3)开启认证的情况下的客户端登录

有两种认证方式,一种是先登录,在mongo shell 中认证,一种是登录时直接认证。

1)先连接再认证

[root@localhost bin]# /usr/local/mongodb/bin/mongo --host ip地址 --port 27017
MongoDB shell version v4.0.10
connecting to: mongodb://ip地址:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("53fef661-35d6-4d29-b07c-020291d62ela")}
MongoDB server version: 4.0.10
>

提示:

  • 开启认证后,发现打印的日志比较少了

相关操作需要认证才可以:

查询admin库中的system.users集合的用户:

> use admin
switched to db admin
> db.system.users.find()
Error: error: {"ok" : 0,"errmsg" : "command find requires authentication","code" : 13,"codeName" : "Unauthorized"
}
> db.auth("myroot", "123456")
1
> ab.system.users.find()
//...

查询articledb库中的comment集合的内容:

> use articledb
switched to db articledb
> db.comment.find()
Error: error: {"ok" : 0,"errmsg" :"not authorized on articledb to execute command { find:\"comment\",filter:  {},lsid: { id: UUID(\"53fef661-35d6-4d29-b07c-020291d62ela\") }, $db:
"articledb\" }","code" : 13,"codeName" : "Unauthorized"
}

1.2.4 SpringDataMongoDB 连接认证

使用用户名和密码连接到MongoDB服务器,必须使用’username:password@hostname/dbname’格式,'username’为用户名,'password’为密码。

目标:使用 “用户hello、密码123456” 连接到MongoDB 服务。

application.yaml

spring: #数据源配置data: mongodb: # 主机地址#host: ip地址# 数据库#database: articledb# 端口号 (默认27017)#port: 27017# 账号#username: hello# 密码#password: 123456# 单机有认证的情况下,也使用字符串连接uri: mongodb://hello:123456@ip地址:27017/articledb

提示:

  • 分别测试用户名/密码 正确以及不正确情况。

1.3 副本集环境

1.3.1 前言

对于搭建好的MongoDB副本集,为了安全,启动安全认证,使用账号密码登录。

副本集环境架构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1FpmmCPs-1636822002052)(D:\桌面信使\桌面信使3\Mongo\img\image-09.png)]

节点间通过校对key文件进行安全认证。

1.3.2 关闭已开启的副本集服务

增加副本集的安全认证和服务鉴权 功能,可以在副本集搭建的时候直接添加,也可以在之前搭建好的副本集服务上添加。

停止服务的两种方式:快速关闭 & 标准关闭:

(1)快速关闭方法(快速、简单、数据可能出错)

目标:通过系统的kill命令直接杀死进程:

依次杀死仲裁者、副本节点、主节点,知道所有成员都离线。建议主节点最后kill,以避免潜在的回滚。杀完要检查以下,避免有的没有杀掉。

#通过进程编号关闭节点
kill -2 54410

【补充】

如果一但是因为数据损坏,则需要进行如下操作

1)删除lock文件:

rm -f /mongod/replica_sets/myrs_27017/data/db/*.lock
/mongod/replica_sets/myrs_27018/data/db/*.lock
/mongod/replica_sets/myrs_27019/data/db/*.lock

2)依次修复数据

/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/replica_sets/myrs_27017/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/replica_sets/myrs_27018/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/replica_sets/myrs_27019/data/db

(2)标准的关闭方法(数据不容易出错,但麻烦)

目标:通过mongo客户端的shutdownServer命令来依次关闭各个服务

关闭副本集中的服务,建议依次关闭仲裁节点、副本节点、主节点。

主要的操作步骤参考如下:

//客户端登陆服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录人认证才行
mongo --port 27017
//告知副本集说本机要下线
rs.stepDown()
//切换到admin库
use admin
//关闭服务
db.shutdownServer()

1.3.3 通过主节点添加一个管理员账号

只需要在主节点上添加用户,副本集会自动同步。

开启认证之前,创建超管用户:myroot,密码:123456

myrs:PRIMARY> use admin
switched to db admin
myrs:PRIMARY> db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
Successfully added user: { user:"myroot",pwd:"123456",roles:["root"] }

详细操作见单例环境的添加用户和权限的相关操作。

提示:

  • 该步骤也可以在开启认证之后,但需要通过localhost登录后才允许添加用户,用户数据也会自动同步到副本集。
  • 后续再创建其他用户,都可以使用该超管用户创建。

1.3.4 创建副本集认证的key文件

生成一个key文件到当前文件夹中

可以使用任何方法生成密钥文件。例如,以下操作使用openssl生成密码文件,然后使用chmod来更改文件权限,仅为文件提供者提供读取权限。

[root@localhost ~]# openssl rand -base64 90 -out ./mongo.keyfile
[root@localhost ~]# chmod 400 ./mongo.keyfile
[root@localhost ~]# ll mongo.keyfile

提示:

  • 所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错permissions on /mongodb/replica_sets/myrs_27017/mongo.keyfile are too open

  • 一定要保证密钥文件一致,文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置,都放到和配置文件一起的目录中。

这里拷贝文件至多个目录中:

[root@localhost ~]# cp mongo.keyfile /mongodb/replica_sets/myrs_27017
[root@localhost ~]# cp mongo.keyfile /mongodb/replica_sets/myrs_27018
[root@localhost ~]# cp mongo.keyfile /mongodb/replica_sets/myrs_27019

1.3.5 修改配置文件指定keyfile

分别编辑几个服务的mongod.conf文件,添加相关内容:

/mongodb/replica_sets/myrs_27017/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongod/replica_sets/myrs_27017/mongo.keyfile#开启认证方式运行authorization: enabled

/mongodb/replica_sets/myrs_27017/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongod/replica_sets/myrs_27018/mongo.keyfile#开启认证方式运行authorization: enabled

/mongodb/replica_sets/myrs_27019/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongod/replica_sets/myrs_27019/mongo.keyfile#开启认证方式运行authorization: enabled

1.3.6 重新启动副本集

如果副本集是开启状态,则先分别关闭副本集中的每个mongod,从次节点开始。直到副本集的所有成员都离线,包括任何仲裁者。主节点必须时最后一个成员以避免潜在的回滚。

#通过进程编号关闭三个节点
kill -2 54410 54261 54257

分别启动副本集节点:

/usr/local/mongdb/bin/mongod -f /mongodb/replica_sets/myrs_27017/mongo.conf
/usr/local/mongdb/bin/mongod -f /mongodb/replica_sets/myrs_27018/mongo.conf
/usr/local/mongdb/bin/mongod -f /mongodb/replica_sets/myrs_27019/mongo.conf

查看进程情况:

[root@localhost ~]# ps -ef |grep mongod

1.3.7 在主节点上添加普通账号

//先用管理员账号登录
//切换到admin库
use admin
//管理员账号认证
db.auth("myroot","123456")
//切换到要认证的库
use articledb
//添加普通用户
db.createUser({user: "hello", pwd: "123456", roles: ["readWrite"]})

重新连接,使用普通用户hello重新登录,查看数据。

注意:也要使用rs.status()命令查看副本集是否健康。

1.3.8 在SpringDataMongoDB连接副本集

3.3.8 在SpringDataMongoDB连接副本集

使用用户名密码连接到 MongoDB 服务器,比如使用’username:password@hostname/dbname’格式,'username’为用户名,'password’为密码。

目标:使用 “用户hello、密码123456” 连接到MongoDB服务。

application.yaml

spring: #数据源配置data: mongod: #副本集有认证的情况下,字符串连接uri://hello:123456@ip地址:27017,ip地址:27018,ip地址:27019/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs

1.4 分片集群环境

1.4.1 关闭已开启的集群服务

分片集群环境下的安全认证和副本集环境下基本上一样。

但分片集群的服务器环境和架构较为复杂,建议在搭建分片集群的时候,直接加入安全认证和服务器间的鉴权,如果之前有数据,可以将之前的数据备份出来,再还原回去。

停止服务的两种方式:快速关闭 & 标准关闭:

(1)快速关闭方法(快速、简单、数据可能出错)

目标:通过系统的kill命令直接杀死进程:

依次杀死仲裁者、副本节点、主节点,知道所有成员都离线。建议主节点最后kill,以避免潜在的回滚。杀完要检查以下,避免有的没有杀掉。

#通过进程编号关闭节点
kill -2 54410

【补充】

如果一但是因为数据损坏,则需要进行如下操作

1)删除lock文件:

rm -f /mongod/sharded_cluster/myshard01_27018/data/db/*.lock
/mongod/sharded_cluster/myshard01_27118/data/db/*.lock
/mongod/sharded_cluster/myshard01_27218/data/db/*.lock
/mongod/sharded_cluster/myshard02_27318/data/db/*.lock
/mongod/sharded_cluster/myshard02_27418/data/db/*.lock
/mongod/sharded_cluster/myshard02_27518/data/db/*.lock
/mongod/sharded_cluster/myconfigrs_27019/data/db/*.lock
/mongod/sharded_cluster/myconfigrs_27119/data/db/*.lock
/mongod/sharded_cluster/myconfigrs_27219/data/db/*.lock

2)依次修复数据

/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myshard01_27018/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myshard01_27118/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myshard01_27218/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myshard02_27318/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myshard02_27418/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myshard02_27518/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myconfigrs_27019/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myconfigrs_27119/data/db
/usr/local/mongodb/bin.mongod --repair --dbpath=/mongodb/sharded_cluster/myconfigrs_27219/data/db

(2)标准的关闭方法(数据不容易出错,但麻烦)

目标:通过mongo客户端的shutdownServer命令来依次关闭各个服务

关闭副本集中的服务,建议依次关闭仲裁节点、副本节点、主节点。

主要的操作步骤参考如下:

//客户端登陆服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录人认证才行
mongo --port 27017
//告知副本集说本机要下线
rs.stepDown()
//切换到admin库
use admin
//关闭服务
db.shutdownServer()

1.3.2 创建副本集认证的key文件

生成一个key文件到当前文件夹中,可以使用任何方法生成密钥文件。

例如,以下操作使用openssl生成密码文件,然后使用chmod来更改文件权限,仅为文件提供者提供读取权限。

[root@localhost ~]# openssl rand -base64 90 -out ./mongo.keyfile
[root@localhost ~]# chmod 400 ./mongo.keyfile
[root@localhost ~]# ll mongo.keyfile

提示:

  • 所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错permissions on /mongodb/replica_sets/myrs_27017/mongo.keyfile are too open

  • 一定要保证密钥文件一致,文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置,都放到和配置文件一起的目录中。

这里拷贝文件至多个目录中:

ehco '/mongodb/sharded_cluster/myshard01_27018/mongo.keyfile /mongodb/sharded_cluster/myshard01_27118/mongo.keyfile /mongodb/sharded_cluster/myshard01_27218/mongo.keyfile /mongodb/sharded_cluster/myshard02_27318/mongo.keyfile /mongodb/sharded_cluster/myshard02_27418/mongo.keyfile /mongodb/sharded_cluster/myshard02_27518/mongo.keyfile /mongodb/sharded_cluster/myconfigrs_27019/mongo.keyfile /mongodb/sharded_cluster/myconfigrs_27119/mongo.keyfile /mongodb/sharded_cluster/myconfigrs_27219/mongo.keyfile /mongodb/sharded_cluster/mymongos_27017/mongo.keyfile /mongodb/sharded_cluster/mymongos_27217/mongo.keyfile' | xargs -n 1 cp -v /root/mongo/keyfile

1.3.3 修改配置文件指定的keyfile

分别编辑几个服务的mongo.conf文件,添加相关内容:

/mongodb/sharded_cluster/myshard01_27018/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshard01_27018/mongod.conf#开启认证方式运行authorization: enabled

/mongodb/sharded_cluster/myshard01_27118/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshard01_27118/mongod.conf#开启认证方式运行authorization: enabled

/mongodb/sharded_cluster/myshard01_27218/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshard01_27218/mongod.conf#开启认证方式运行authorization: enabled

/mongodb/sharded_cluster/myshard01_27318/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshard01_27318/mongod.conf#开启认证方式运行authorization: enabled

/mongodb/sharded_cluster/myshard01_27418/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshard01_27418/mongod.conf#开启认证方式运行authorization: enabled

/mongodb/sharded_cluster/myshard01_27518/mongod.conf

security: #KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshard01_27518/mongod.conf#开启认证方式运行authorization: enabled

1.3.4 重新启动节点

必须依次启动配置节点、分片节点、路由节点:

/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myconfgirs_27019/mongod.conf
/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myconfgirs_27119/mongod.conf
/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myconfgirs_27219/mongod.conf/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myshardrs01_27018/mongod.conf
/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myshardrs01_27118/mongod.conf
/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myshardrs01_27218/mongod.conf/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myshardrs02_27318/mongod.conf
/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myshardrs02_27418/mongod.conf
/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/myshardrs02_27518/mongod.conf/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/mymongos_27017/mongod.conf
/usr/local/mongodb/bin/mongo -f /mongodb/shared_cluster/mymongos_27117/mongod.conf

注意:

这里有个非常特别的情况,就是启动顺序。先启动配置节点,再启动分片节点,最后启动路由节点。

如果先启动分片节点,会卡住,提示:

about to fork child process, waiting until server is ready for connections.

1.3.5 创建账号和认证

客户端mongo,通过localhost登录任意一个mongos路由。

[root@localhost]# /usr/local/mongodb/bin/mongo --port 27107

提示:相当于一个后门,只能在admin下添加用户。

创建一个管理员账号:

mongos> use admin
switched to db admin
mongos> db.createUser({user:"myroot",pwd:"123456",roles:["root"]})
Successfully added user: {"user" : "myroot", "roles" : ["root"]}

提示:

  • 如果在开启认证之前已经创建了管理员账号,这里可以忽略。

创建一个普通权限账号:

mongos> use admin
switched to db amdin
mongos> db.auth("myroot","123456")
1
mongos> use articledb
switched to db articledb
mongos> db.createUser({user: "hello", pwd:"123456", role: [{ role: "readWrite", db: "articledb" }]})
Successfully added user : {"user" : "hello","roles" : [{"role" : "readWrite","db" : "articledb"}]
}
mongos> db.auth("hello","123456")
1

提示:

  • 通过mongos添加的账号信息,只会保存到配置节点的服务中,具体数据节点不保存账号信息,因此,分片中的账号信息不涉及到同步问题。

mongo客户但登录mongos路由,用管理员账号登录可查看分片情况:

sh.status()

1.3.8 SpringDataMongoDB连接分片集群

使用用户名密码连接到 MongoDB 服务器,比如使用’username:password@hostname/dbname’格式,'username’为用户名,'password’为密码。

目标:使用 “用户hello、密码123456” 连接到MongoDB服务。

spring:#数据库配置data: mongodb: #分片集群有认证的情况下,连接路由字符串uri: mongodb://hello:123456@ip地址:27017,ip地址:27117/articledb?connect=replicaSet&slaveOk=true&replicaSet=myrs

通过日志发现,写入数据的时候,会选择一个路由写入。

【MongoDB】安全认证相关推荐

  1. 开启docker中MongoDB的认证授权

    开启docker中MongoDB的认证授权 思路 开启MongoDB服务后,默认是没有权限验证的.直接通过IP加端口就可以远程访问数据库,并对数据库进行任意操作.下面介绍一下如何开启docker中Mo ...

  2. springboot集成mongoDB 异常认证

    springboot集成mongoDB 异常认证 参考文章: (1)springboot集成mongoDB 异常认证 (2)https://www.cnblogs.com/mh-study/p/980 ...

  3. MongoDB安全认证

    1.安全认证概述 MongoDB 默认是没有账号的,可以直接连接,无须身份验证.实际项目中肯定是要权限验证的,否则后果不堪设想.从2016年开始 发生了多起MongoDB黑客赎金事件,大部分Mongo ...

  4. MONGODB 权限认证

    使用mongoDB 是从2.4 版本开始的,但那时的权限管理相对比较简单.也就没有去弄这个. 现在再回头看几个版本的权限管理,看到各个版本间都在变化. 并且集群与单机也有很大的不同, 下面是以2.6版 ...

  5. mongodb带认证的副本集搭建

    Mongodb副本集带用户认证的 概述 本次实验是在一台虚拟机上做的,正式环境一定要分开实现,以免影响服务的正常使用和性能. 准备工作: 操作系统:centos7.2 Mongodb版本:3.4.1 ...

  6. MongoDB 权限认证

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),因为考虑到数据安全的原因特地花了一点时间研究了一下,网上搜出来的解 ...

  7. MongoDb连接认证错误(Command failed with error 18)

    最近新起一项目用到了mongodb,然后直接采用 spring-boot-starter-data-mongodb 做依赖直接使用框架的mongodb配置,连接mongo然后开发及测试都没问题,上生产 ...

  8. spring.data.mongodb.uri认证失败Authentication failed

    使用spring.data.mongodb.uri=mongodb://root:ve#duj7-wa06yhg$@192.154.81.16:27017/xxxx老是出现Authentication ...

  9. mongoDB Linux 认证配置、重置密码、远程登录配置详解

    一.配置用户 1.启用.关闭认证 vi /etc/mongod.conf//注释这两句 => 关闭认证 #security: # authorization: enabled//打开这两句 =& ...

  10. spring security:基于MongoDB的认证

    spring security对基于数据库的认证支持仅限于JDBC,而很多项目并非使用JDBC,比如Nosql数据库很多使用的是 Mongo Java Driver,这样就无法用默认的<jdbc ...

最新文章

  1. 为什么将 0.1f 改为 0 会使性能降低 10 倍?
  2. 胡正是什么lisp_《亲爱的挚爱的》演员公开,吴白还是胡一天,grunt却换了人
  3. web服务器配置(静态页面)
  4. postman如何改成中文版_在 Windows 上如何用 Postman 重现 Dubbo 反序列化漏洞
  5. Visual Studio Code是什么
  6. 终于学会后空翻!历经多次NG,波士顿动力机器人再get新技能
  7. 分布式微服务云架构电子商务平台
  8. 程序员考证之信息系统项目管理师
  9. css中背景图像移动_深入了解:在CSS中使用编码图像(背景图像)
  10. 紫猫中控-脚本界面的基本设计和代码结构
  11. Outlook设置自动存档
  12. IDEA Unable to import maven project: See logs for details具体解决方法
  13. IDAFicator / OllyDBG Plug-in by Zool@nder|AT4RE
  14. BMP390高精度压力传感器数据读取与处理(基于STM32)
  15. datadog-define-tags by AOP
  16. 自制一个 LoRa PM2.5 监测器
  17. 汇编语言实现 大小写字母转换
  18. Node.js 下载与安装教程
  19. vscode调出大纲
  20. 三国演义java_三国演义全集高清_java进阶(34)–File类、目录复制

热门文章

  1. 一个程序员的日常书单(更新于2018/10/7)
  2. Python自动化办公:pdf文档操作
  3. iframe 接班人-微前端框架 qiankun 在中后台系统实践
  4. W05 - 999、云小蜜人工智能训练师
  5. 数据库数据迁移失败,如何进行修复操作
  6. 3.5折怎么用计算机算,论几十块钱的小主机能干什么?手把手教你改造神器!(32位黑裙晖安...
  7. bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测
  8. 究竟什么是CRM(客户关系管理系统)呢?
  9. python函数参数用法之——双星号
  10. AWS S3 让IAM用户可以list bucket