MongoDB 缺省是没有设置鉴权的,业界大部分使用 MongoDB 的项目也没有设置访问权限。这就意味着只要知道 MongoDB 服务器的端口,任何能访问到这台服务器的人均可以查询和操做 MongoDB 数据库的内容。在一些项目当中,这种使用方式会被当作是一种安全漏洞。数据库
本文介绍如何在单台 MongoDB 服务器上设置鉴权。设置完后,MongoDB 客户端必须用正确的用户名和密码登陆,才能在指定的数据库中操做。安全
首先介绍下 MongoDB 的用户和权限。每一个数据库都有本身的用户,建立用户的命令是db.createUser()(文档),当你建立一个用户时,该用户就属于你当前所在的数据库。服务器
每一个用户包含三个要素:用户名、密码和角色列表。下面是一个例子:架构
{
user: "dbuser",
pwd : "dbpass",
roles: ["readWrite", "clusterAdmin"]
}分布式
这个例子表示一个名为dbuser的用户,它在当前的数据库中拥有 readWrite 和 clusterAdmin 两个角色。spa
--------------------------------------------------------------------------------------------------------------------------文档
MongoDB 内置了不少角色,但要注意,不是每一个数据库的内置角色都同样。其中 admin 数据库就包含了一些其余数据库所没有的角色。it
熟悉 Oracle 的童鞋们都知道,数据库用户有两种,一种是管理员,用来管理用户,一种是普通用户,用来访问数据。相似的,为 MongoDB 规划用户鉴权时,至少要规划两种角色:用户管理员和数据库用户。若是搭建了分片或主从,可能还会要规划数据库架构管理员的角色,它们专门用来调整数据库的分布式架构。test
在建立用户以前,咱们首先要修改 MongoDB 的启动方式。缺省方式下 MongoDB 是不进行鉴权检查的。咱们只要在运行 MongoDB 的命令后面加上一个 --auth 参数便可,例如:登录
mongod --dbpath ./db1 --port 20000 --auth
如何建立用户管理员
用户管理员是第一个要建立的用户。在没有建立任何用户以前,你能够随意建立用户;但数据库中一旦有了用户,那么未登陆的客户端就没有权限作任何操做了,除非使用db.auth(username, password)方法登陆。
用户管理员的角色名叫 userAdminAnyDatabase,这个角色只能在 admin 数据库中建立。下面是一个例子:
> use admin
switched to db admin
> db.createUser({user:"root",pwd:"root123",roles:["userAdminAnyDatabase"]})
Successfully added user: { "user" : "root", "roles" : [ "userAdminAnyDatabase" ] }
这个例子建立了一个名为 root 的用户管理员。建立完了这个用户以后,咱们应该立刻以该用户的身份登陆:
> db.auth("root","root123")
1
db.auth() 方法返回 1 表示登陆成功。接下来咱们为指定的数据库建立访问所需的帐号。
--------------------------------------------------------------------------------------------------------------------------
如何建立数据库用户
首先保证你已经以用户管理员的身份登陆 admin 数据库。而后用 use 命令切换到目标数据库,一样用 db.createUser() 命令来建立用户,其中角色名为 “readWrite”。
普通的数据库用户角色有两种,read 和 readWrite。顾名思义,前者只能读取数据不能修改,后者能够读取和修改。
下面是一个例子:
> use test
switched to db test
> db.createUser({user:"testuser",pwd:"testpass",roles:["readWrite"]})
Successfully added user: { "user" : "testuser", "roles" : [ "readWrite" ] }
> db.auth("testuser","testpass")
1
这样 MongoDB 的数据安全性就获得保障了,没有登陆的客户端将没法执行任何命令。