官方手册中启动 MongoDB 服务时没有任何参数,一旦客户端连接后可以对数据库任意操作,而且可以远程访问数据库,所以推荐开发阶段可以不设置任何参数,但对于生产环境还 是要仔细考虑一下安全方面的因素,而提高 MongoDB 数据库安全有几个方面:
1、绑定 IP 内网地址访问 MongoDB 服务
2、设置监听端口
3、使用用户名和口令登录
1、绑定 IP 内网地址访问MongoDB 服务
MongoDB 可以限制只允许某一特定 IP 来访问,只要在启动时加一个参数 bind_ip 即可,如 下:
服务端限制只有 192.168.1.103 这个 IP 可以访问 MongoDB 服务 :
mongod.exe --bind_ip 192.168.1.103
客户端访问时需要明确指定服务端的 IP,否则会报错:
mongo.exe 192.168.1.102
2、设置监听端口
官方默认的监听端口是 27017,为了安全起见,一般都会修改这个监听端口,避免恶意的连接尝试,具体如下: 将服务端监听端口修改为 28018
mongo.exe 192.168.1.102:28018
3、使用用户名和口令登录
MongoDB默认的启动是不验证用户名和密码的,启动MongoDB后,可以直接用MongoDB连接,对所有的库具有 root 权限。所以启动的时候指定参数,可以阻止客户端的访问和连接。
mongod.exe --auth --dbpath "E:Program Files\MongoDB\data"
很奇怪,为什么我们启用了登录验证模块,但我们登录时没有指定用户,为什么还可以登录 呢?在最初始的时候 MongoDB 都默认有一个 admin 数据库(默认是空的), 而 admin.system.users 中将会保存比在其它数据库中设置的用户权限更大的用户信息。 注意:当 admin.system.users 中没有添加任何用户时,即使 MongoDB 启动时添加了 –auth 参数,如果在除 admin 数据库中添加了用户,此时不进行任何认证依然可以使用任何操作, 直到你在 admin.system.users 中添加了一个用户。
1、建立root用户
db.createUser({user:'root',pwd:'0316',roles:['userAdminAnyDatabase']})
user文档字段介绍:
user字段,为新用户的名字;
pwd字段,用户的密码;
cusomData字段,为任意内容,例如可以为用户全名介绍;
roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色;
在roles字段,可以指定内置角色和用户定义的角色。
Built-In Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
PS:关于每个角色所拥有的操作权限可以点击上面的内置角色链接查看详情。
exit,退出后,再进来:
mongo.exe 不登录
已经没有权限操作了。
切换到超级用户(再admin库中创建的用户是超级用户可以访问所有数据库)
use admin
db.auth('root','0316)