天天看点

MongoDB安全认证

MongoDB 默认是没有账号的,可以直接连接,无须身份验证。实际项目中肯定是要权限验证的,否则 后果不堪设想。所以对MongoDB进行安全认证 是必须要做的。

为了能保障mongodb的安全可以做以下几个步骤:

1、使用新的端口,默认的27017端口如果一旦知道了ip就能连接上,不太安全

2、设置mongodb的网络环境,最好将mongodb部署到公司服务器内网,这样外网是访问不到的。

3、开启安全认证。认证要同时设置服务器之间的内部认证方式,同时要设置客户端连接到集群的账号密码认证方式

环境准备

最简单的集群是3*3,即三个分片和三个副本集,可以保证高可用,即使一台机器全宕机了,服务仍然能够正常访问。

use admin;

db.createUser(userDocument):用于创建 MongoDB 登录用户以及分配权限的方法

user:创建的用户名称,如 admin、root 、lagou

pwd:用户登录的密码

roles:为用户分配的角色,不同的角色拥有不同的权限,参数是数组,可以同时设置多个

role:角色,MonngoDB 已经约定好的角色,不同的角色对应不同的权限

db:数据库实例名称,如 MongoDB 4.0.2 默认自带的有 admin、local、config、test 等,即为哪个数据库实例设置用户

创建 mydb1 数据库并创建了两个用户,zhangsan 拥有读写权限,lisi 拥有只读权限测试这两个账户的权限。

以超级管理员登录测试权限。

MongoDB 服务端开启安全检查之前,至少需要有一个管理员账号,admin 数据库中的用户都被视为管理员

如果 admin 库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,默认的连接方式依然会有超级权限,即仍然可以不验证账号密码照样能进行 CRUD,安全认证相当于无效。

如下所示 rpp_resume 是自己新建的数据库,没安全认证之前可以随意 CRUD,其余的都是 mongoDB4.0.2 自带的数据库

为 admin 库创建管理员之后,现在来为普通数据库创建普通用户,以 rpp_resume 为例,方式与创建管理员一致,切换到指定数据库进行创建即可。

如下所示,为 rpp_resume 数据库创建了两个用户,zhangsan 拥有读写权限,lisi 拥有只读权限,密码 都是 123456.

接着从客户端关闭 MongoDB 服务端,之后以安全认证方式进行启动

普通用户现在仍然像以前一样进行登录,如下所示直接登录进入 rpp_resume 数据库中,登录是成功的,只是登录后日志少了很多东西,而且执行 show dbs 命令,以及 show tables 等命令都是失败的,即使没有被安全认证的数据库,用户同样操作不了,这都是因为权限不足,一句话:用户只能在自己权限范围 内的数据库中进行操作

如下所示,登录之后必须使用 db.auth(“账号”,“密码”) 方法进行安全认证,认证通过,才能进行权限范围内的操作

客户端管理员登录如下所示,管理员 root 登录,安全认证通过后,拥有对所有数据库的所有权限。

参考上面的单机安全认证实现流程

可以编写一个shell 脚本 批量启动