MongoDB 教程番外篇之添加用户及设置用户权限 ( Rockmongo登陆设置 )

MongoDB 系列教程索引 : MongoDB 教程索引 (附有视频)

 

继上一篇 MongoDB 教程番外篇之管理工具: Rockmongo ,MongoDB 缺省是没有设置鉴权的,业界大部分使用 MongoDB 的项目也没有设置访问权限。这就意味着只要知道 MongoDB 服务器的端口,任何能访问到这台服务器的人都可以查询和操作 MongoDB 数据库的内容。在一些项目当中,这种使用方式会被看成是一种安全漏洞。

本文介绍如何在单台 MongoDB 服务器上设置鉴权。设置完后,MongoDB 客户端必须用正确的用户名和密码登录,才能在指定的数据库中操作。

首先介绍下 MongoDB 的用户和权限。每个数据库都有自己的用户,创建用户的命令是db.createUser()文档),当你创建一个用户时,该用户就属于你当前所在的数据库。

每个用户包含三个要素:用户名、密码和角色列表。下面是一个例子:

{
    user: "dbuser",
    pwd : "dbpass",
    roles: ["readWrite", "clusterAdmin"]
}

这个例子表示一个名为dbuser的用户,它在当前的数据库中拥有 readWrite 和 clusterAdmin 两个角色。

MongoDB 2.4新引入了一套权限控制的机制,而旧的addUser的方法在3.0已经不再提供

MongoDB 内置了很多角色,但要注意,不是每个数据库的内置角色都一样。其中 admin 数据库就包含了一些其他数据库所没有的角色。

(1).数据库用户角色

针对每一个数据库进行控制。
read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.

(2).数据库管理角色

每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。

(3).集群管理权限

admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。

(4).所有数据库角色

admin数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

(5). 超级管理员权限

root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。

(6). 备份恢复角色:backup、restore;

(7). 内部角色:__system

PS:关于每个角色所拥有的操作权限可以点击上面的内置角色链接查看详情。

官方实例

use products # mongoDB的权限设置是以库为单位的,必选要先选择库
db.createUser( 
{ "user" : "accountAdmin01", 
 "pwd": "cleartext password",
 "customData" : { employeeId: 12345 },
 "roles" : [ { role: "clusterAdmin", db: "admin" }, 
             { role: "readAnyDatabase", db: "admin" },
             "readWrite" ] },
{ w: "majority" , wtimeout: 5000 } ) # readWrite 适用于products库,clusterAdmin与readAnyDatabase角色适用于admin库

 

熟悉 Oracle 的童鞋们都知道,数据库用户有两种,一种是管理员,用来管理用户,一种是普通用户,用来访问数据。类似的,为 MongoDB 规划用户鉴权时,至少要规划两种角色:用户管理员和数据库用户。如果搭建了分片或主从,可能还会要规划数据库架构管理员的角色,它们专门用来调整数据库的 分布式架构。

在创建用户之前,我们首先要修改 MongoDB 的启动方式。缺省方式下 MongoDB 是不进行鉴权检查的。我们只要在运行 MongoDB 的命令后面加上一个 --auth 参数即可,例如:

mongod --dbpath ./db1 --port 20000 --auth

MongoDB默认不启用安全授权机制。在单节点环境下,你需要在启动mongod时指定–auth,或者在参数里设置auth=true来启用这个特性。

如果上述命令无效的话,那就 手动开启用户权限认证

[gideon@ikeepstudying]$ vi /etc/mongodb.conf           //将auth=true前面的注释拿掉
[gideon@ikeepstudying]$ /etc/init.d/mongod restart      //重启生效
// 或者使用 sudo service mongod restart 重启

如何创建用户管理员

用户管理员是第一个要创建的用户。在没有创建任何用户之前,你可以随意创建用户;但数据库中一旦有了用户,那么未登录的客户端就没有权限做任何操作了,除非使用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 的数据安全性就得到保障了,没有登录的客户端将无法执行任何命令。

除了db.createUser(),下面几个函数也是常用的:
获得数据库的所有用户权限信息:db.getUsers()
获得某个用户的权限信息:db.getUser()
创建角色: db.createRole()
更新角色:db.updateRole()
删除角色:db.dropRole()
获得某个角色信息:db.getRole()
删除用户:db.dropUser()
删除所有用户:db.dropAllUsers()
将一个角色赋予给用户:db.grantRolesToUser()
撤销某个用户的某个角色权限:db.revokeRolesFromUser()
更改密码:db.changeUserPassword()
更多内容可以去看下 reference

那么,设置完这些后,如果需要登陆Rockmongo的话,可参考如下设置:

进入Rockmongo安装的根目录下,通常在/var/www/rockmongo路径下。找到config.php文件并打开,在文件下面添加如下几行配置代码:

/**
 * This is the configuration  for remote mongodb
 */
$MONGO["servers"][$i]["mongo_name"] = "The name of mongodb"; // 随便自己命名,显示在rockmongo的db昵称,如: mongoHQ-helloworld
$MONGO["servers"][$i]["mongo_host"] = "The host of mongodb"; // 远程mongodb服务器的主域名,如:troup.mongohq.com
$MONGO["servers"][$i]["mongo_port"] = "The port of mongodb"; // 远程mongodb服务器提供的端口,如37017
$MONGO["servers"][$i]["mongo_user"] = "The username of mongodb"; // 拥有权限操作该db的用户名,如:pigerla
$MONGO["servers"][$i]["mongo_pass"] = "The password of mongodb"; // 拥有权限操作该db的用户密码,如:xxxxxx
$MONGO["servers"][$i]["mongo_db"] = "The database's name of mongodb"; // 数据库的名称,如:helloworld
$MONGO["servers"][$i]["mongo_auth"] = false; // 当值为false时,表示rockmongo使用这里的配置去连接远程mongodb,否则,只能在rockmongo登录界面输入以上信息进行登录
$MONGO["servers"][$i]["control_users"]["admin"] = "admin"; // 当mongo_auth为false时,这设置才有效,表示在rockmongo登录界面,用户名为admin,密码为
admin,这也是默认配置。
$i ++;

我个人设置如下:

/** 
* Configuration of MongoDB servers
* 
* @see more details at http://rockmongo.com/wiki/configuration?lang=en_us
*/
$MONGO["servers"][$i]["mongo_name"] = "Localhost";//mongo server name
//$MONGO["servers"][$i]["mongo_sock"] = "/var/run/mongo.sock";//mongo socket path (instead of host and port)
$MONGO["servers"][$i]["mongo_host"] = "127.0.0.1";//mongo host
$MONGO["servers"][$i]["mongo_port"] = "27017";//mongo port
$MONGO["servers"][$i]["mongo_timeout"] = 0;//mongo connection timeout
//$MONGO["servers"][$i]["mongo_db"] = "MONGO_DATABASE";//default mongo db to connect, works only if mongo_auth=false
//$MONGO["servers"][$i]["mongo_user"] = "MONGO_USERNAME";//mongo authentication user name, works only if mongo_auth=false
//$MONGO["servers"][$i]["mongo_pass"] = "MONGO_PASSWORD";//mongo authentication password, works only if mongo_auth=false
$MONGO["servers"][$i]["mongo_auth"] = TRUE;//enable mongo authentication?

$MONGO["servers"][$i]["control_auth"] = true;//enable control users, works only if mongo_auth=false
$MONGO["servers"][$i]["control_users"]["admin"] = "admin";//one of control users ["USERNAME"]=PASSWORD, works only if mongo_auth=false

$MONGO["servers"][$i]["ui_only_dbs"] = "";//databases to display
$MONGO["servers"][$i]["ui_hide_dbs"] = "";//databases to hide
$MONGO["servers"][$i]["ui_hide_collections"] = "";//collections to hide
$MONGO["servers"][$i]["ui_hide_system_collections"] = false;//whether hide the system collections

//$MONGO["servers"][$i]["docs_nature_order"] = false;//whether show documents by nature order, default is by _id field
//$MONGO["servers"][$i]["docs_render"] = "default";//document highlight render, can be "default" or "plain"

$i ++;

这样,rockmongo可以自动查询登陆信息是否正确了。

另外 mongo_host 和 mongo_port 都可以在 /etc/mongodb.conf 文件中找到,下面是我个人的截图:

Selection_063

更多配置看官方文档  https://code.google.com/p/rock-php/wiki/configuration 或者 http://rockmongo.com/wiki/configuration  

 

MongoDB 系列教程索引 : MongoDB 教程索引 (附有视频)

上一篇:  MongoDB 教程番外篇之管理工具: Rockmongo

下一篇: MongoDB 教程五: MongoDB固定集合和性能优化

本文:MongoDB 教程番外篇之添加用户及设置用户权限 ( Rockmongo登陆设置 )

Loading

Add a Comment

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload CAPTCHA.