MongoDB 安全认证(登录时,账户和密码的验证)
MongoDB 安全认证
MongoDB安全主要包括以下4个方面
1、物理隔离
系统不论设计的多么完善,在实施过程中,总会存在一些漏洞。如果能够把不安全的使用方与MongoDB数据库做物理上的隔离,即通过任何手段都不能连接到数据库,这是最安全的防护。但,通常这是不现实的。一些重要的数据可能会保存下来,放置到物理隔离的机房中
2、网络隔离
许多公司的开发机处于内网环境中。即使数据库存在漏洞,外部环境也没有机会利用,因为根本无法访问内网
3、防火墙隔离
可以利用防火墙配置IP白名单,只允许某些IP访问数据库,也可以从一定程度上增加MongoDB的安全性
4、用户名密码鉴权
相对于以上3种方式,用户名密码鉴权机制是最常见的MongoDB安全措施。如果密码设置的比较简单,或者连接环境不是加密环境,很可能被第三方获取到用户名和密码,从而造成MongoDB数据库的危险
在开始之前需要了解一下概念
1)启用访问控制:
MongoDB使用的是基于角色的访问控制(Role-Based Access Control,RBAC)来管理用户对实例的访问。 通过对用户授予一个或多个角色来控制用户访问数据库资源的权限和数据库操作的权限,在对用户分配 角色之前,用户无法访问实例。
在实例启动时添加选项--auth 或指定启动配置文件中添加选项 auth=true 。
2)角色:
在MongoDB中通过角色对用户授予相应数据库资源的操作权限,每个角色当中的权限可以显式指定, 也可以通过继承其他角色的权限,或者两都都存在的权限。
3)权限:
权限由指定的数据库资源(resource)以及允许在指定资源上进行的操作(action)组成。
1. 资源(resource)包括:数据库、集合、部分集合和集群;
2. 操作(action)包括:对资源进行的增、删、改、查(CRUD)操作。
在角色定义时可以包含一个或多个已存在的角色,新创建的角色会继承包含的角色所有的权限。在同一 个数据库中,新创建角色可以继承其他角色的权限,在 admin 数据库中创建的角色可以继承在其它任意 数据库中角色的权限。
2. MongoDB创建用户角色及开启验证
先启动单例的mongodb
建立存放数据和日志的目录
#-----------myrs
mkdir -p /mongodb/replica_sets/myrs_27017/log \ &
mkdir -p /mongodb/replica_sets/myrs_27017/data/db
然后配置 vi mongodb.conf文件
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/mongodb/replica_sets/myrs_27017/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
dbPath: "/mongodb/replica_sets/myrs_27017/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/mongodb/replica_sets/myrs_27017/log/mongod.pid"
net:
#服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
#bindIpAll: true
#服务实例绑定的IP 注意ip必须存在否启动不了mongoDB
bindIp: localhost,xxx.xxx.xxx.xx
#bindIp
#绑定的端口
port: 27017
MongoDB的用户在admin数据库中的user集合中,初始化时,没有这个user集合
//切换到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"]})
//创建专门用来管理admin库的账号myadmin,只用来作为用户权限的管理
> db.createUser({user:"cjy",pwd:"123456",roles: [{role:"userAdminAnyDatabase",db:"admin"}]})
验证命令:
>db.auth("用户名","密码")
配置MongoDB开启连接验证
在mongod.conf配置文件中加入:
security:
#开启授权认证
authorization: enabled
客户端重新连接时,需要验证用户名和密码,否则查看不到数据库和集合
【注意:验证失败时,需要切换数据库,比如切换到admin】