mongodb用户权限管理配置

作者: secflag 分类: 运维笔记 发布时间: 2018-02-08 18:08

环境

mongodb 3.4

window7

MongoDB常用命令

[root@snails ~]# ps -ef|grep mongod
[root@snails ~]# mongo --host=127.0.0.1 --port=27017
MongoDB shell version: 3.2.7
connecting to: 127.0.0.1:27017/test
 
> show dbs  #显示数据库列表
> show collections  #显示当前数据库中的集合(类似关系数据库中的表)
> show users  #显示用户
> use <db name>  #切换当前数据库,如果数据库不存在则创建数据库。
> db.help()  #显示数据库操作命令,里面有很多的命令
> db.foo.help()  #显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令
> db.foo.find()  #对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)
> db.foo.find( { a : 1 } )  #对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1
MongoDB没有创建数据库的命令,但有类似的命令。 如:如果你想创建一个“myTest”的数据库,先运行use
myTest命令,之后就做一些操作(如:db.createCollection(‘user’)),这样就可以创建一个名叫“myTest”的数据库。

其他命令

> db.dropDatabase()  #删除当前使用数据库
> db.cloneDatabase("127.0.0.1")   #将指定机器上的数据库的数据克隆到当前数据库
> db.copyDatabase("mydb", "temp", "127.0.0.1")  #将本机的mydb的数据复制到temp数据库中
> db.repairDatabase()  #修复当前数据库
> db.getName()  #查看当前使用的数据库,也可以直接用db
> db.stats()  #显示当前db状态
> db.version()  #当前db版本
> db.getMongo()  #查看当前db的链接机器地址
> db.serverStatus()  #查看数据库服务器的状态

需求

MongoDB安装完成后,默认是不需要输入用户名密码即可登录的,但是往往数据库方面我们会出于安全性的考虑而设置用户名密码,本篇文章主要介绍了MongoDB添加管理员/普通用户的方法。

用户权限设置

网上总结了四条

MongoDB是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。 切换到admin数据库,添加的账号才是管理员账号。 用户只能在用户所在数据库登录,包括管理员账号。 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。

创建管理员账号

In the admin database, add a user with the userAdminAnyDatabase role.
For example, the following creates the user myUserAdmin in the admin
database:

在admin数据库中,添加一个用户并赋予userAdminAnyDatabase角色。
例如,下面是在admin数据库中创建一个名为myUserAdmin用户。

注意: The database where you create the user (in this example, admin) is the user’s authentication database. Although the user would authenticate to this database, the user can have roles in other databases; i.e. the user’s authentication database does not limit the user’s privileges.

注意:你创建用户的这个数据库(这里就是admin数据库)是用户认证数据库。
尽管用户是在这个数据库认证,而用户又有其他数据库的角色;即,用户认证数据库不限制用户权限。

在window管理员下启动cmd,并且连接上mongodb,
连接命令:

D:\Program Files\MongoDB\Server\3.4\bin>mongo.exe

创建用户命令:

use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
#结果
Successfully added user: {
    "user" : "admin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

执行以下命令,看看结果

> show users
> db.system.users.find()

开启权限验证

window中:

D:\Program Files\MongoDB\Server\3.4\mongod.cfg

这个配置文件是我自己手动配置,关于mongodb配置,可以参考:

mongodb3.4的安装和配置

在配置文件中添加.

security:
    authorization: enabled

全部配置:

systemLog:
    destination: file
    path: D:\mongodbdata\log\mongod.log
    logAppend: true
storage:
    journal:
        enabled: true
    dbPath: D:\mongodbdata\db
net:
    bindIp: 127.0.0.1
    port: 27017
security:
    authorization: enabled

liunx:

[root@snails ~]# echo "auth = true" >> /root/mongodb/bin/mongodb.conf
[root@snails ~]# systemctl restart systemd-mongodb

接着就是重启mongod实例。说明了就是重启mongodb服务。

验证权限是否生效

D:\Program Files\MongoDB\Server\3.4\bin>mongo.exe
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
> use admin
switched to db admin
> db.auth('myUserAdmin', 'abc123')
1
> show dbs
admin  0.000GB
local  0.000GB

添加普通用户

Once authenticated as the user administrator, use db.createUser() to create additional users. You can assign any built-in roles or user-defined roles to the users.

一旦经过认证的用户管理员,可以使用db.createUser()去创建额外的用户。
你可以分配mongodb内置的角色或用户自定义的角色给用户。

The myUserAdmin user only has privileges to manage users and roles. As myUserAdmin, if you attempt to perform any other operations, such as read from a foo collection in the test database, MongoDB returns an error.

这个myUserAdmin用户仅仅只有特权去管理用户和角色,myUserAdmin,如果你试图执行其他任何操作,例如在test数据库中的foo集合中去读数据,mongodb将返回错误。

注意:The database where you create the user (in this example, test) is that user’s authentication database. Although the user would authenticate to this database, the user can have roles in other databases; i.e. the user’s authentication database does not limit the user’s privileges.

你创建用户的数据库(这里就是test数据库)是该用户认证数据库。尽管用户认证是这个数据库,用户依然可以有其他数据库的角色。即用户认证数据库不限制用户权限。

创建普通用户:

>use test
> db.createUser(
... {
... user:"test1",
... pwd: "test1",
... roles: [{ role: "readWrite", db: "test"}]
... }
... )
Successfully added user: {
        "user" : "test1",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test"
                }
        ]
}
> exit
bye
 
D:\Program Files\MongoDB\Server\3.4\bin>mongo.exe
MongoDB shell version v3.4.1
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.1
 
> use test
switched to db test
> db.auth('test1','test1')
1

创建超极用户root

window中的cmd中执行:

use admin
db.createUser(
  {
    user: "root",
    pwd: "root",
    roles: [ { role: "root", db: "admin" } ]
  }
);

MongoDB数据库角色

 

内建的角色

数据库用户角色:read、readWrite;

数据库管理角色:dbAdmin、dbOwner、userAdmin;

集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;

备份恢复角色:backup、restore;

所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)

内部角色:__system

角色说明:

Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

root:只在admin数据库中可用。超级账号,超级权限