mongodb之用户/认证/角色/权限管理


一、前言
用户权限管理很重要,只给需要的权限,防止应用系统漏洞导致脱库,

1.下载:

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.6.tgz

2.解压

tar -zxvf mongodb-linux-x86_64-rhel70-4.2.6.tgz  -C /usr/local/mongodb

3.新建目录

mkdir /var/log/mongodb

mkdir /var/lib/mongo

mkdir /var/run/mongodb

4.增加配置文件内容

vi /etc/mongod.conf

systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1 

启动:
mongod --dbpath=/var/lib/mongo --logpath=/var/log/mongodb/mongod.log --logappend --port=27017 --fork --auth 

或: mongod --config /etc/mongod.conf 

停止:
mongod --shutdown --config /etc/mongod.conf  或登陆后操作:db.shutdownServer();

登录:

mongo --port 27017 -u "username" -p "url编码" --authenticationDatabase "admin"

二、基本操作

查询数据库
  show dbs
  或
  show databases
创建数据库
  use dbName
  查看表
  show tables;
插入数据
  db.<tableName>.insert();
  如:db.members.insert({name:"Michael",age:18,...});
查询
  db.<tableName>.find();   或  db.system.users.find();  或  show users;
修改
  如:db.members.update({name:"Michael"},{$set:{age:20}});
删除表中的数据
  如:db.members.remove({name:"Michael"});
  删除全部:db.members.remove({});
删除表
  db.members.drop();
删除数据库
  db.dropDatabase();

四、用户管理
添加用户,切换到需要添加用户的db
use xxxx
执行添加
db.createUser(
    {
        user:"username",
        pwd:"password_url编码",
        roles:[
            {role:"read", db:"xxxx"},
            {role:"readWrite", db:"test"}
        ]
    }
)

添加超级用户,切换到admin数据库
use admin
执行添加
db.createUser(
    {
        user:"username",
        pwd:"password_url编码",
        roles:[
            {role:"root", db:"admin"},
            {role:"dbAdminAnyDatabase",db:"admin"}
        ]
    }
)

删除用户,切换到用户授权的db
use xx
执行删除操作
db.dropUser("username") 或者:db.system.users.remove({user:"test"})

更新用户
切换到用户授权的db
use xx
执行更新,字段会覆盖原来的内容
db.updateUser("username",{
    pwd:"new password_url编码",
    customData:{
        "title":"PHP developer"
    }
})

更新用户密码
use xx
db.changeUserPassword("username","newpassword_url编码")

查看用户信息
use admin
db.getUser("username")

删除用户角色
use xx
db.revokeRolesFromUser(
    "usename",
    [
      { role: "readWrite", db: "accounts" }
    ]
)  

添加用户角色
use xx
db.grantRolesToUser(
    "reportsUser",
    [
      { role: "root", db: "admin" }
    ]
)

五,角色管理
自定义角色
自定义角色保存在admin数据库system.roles集合中
切换到admin数据库
use admin
执行添加
db.createRole(
   {
     role: "manageOpRole",
     privileges: [
       { resource: { cluster: true }, actions: [ "killop", "inprog" ] },
       { resource: { db: "", collection: "" }, actions: [ "killCursors" ] }
     ],
     roles: []
   }
)
  
查看角色信息
use admin
db.getRole("rolename",{showPrivileges:true})

删除角色
use admin
db.dropRole("rolename")

六,系统内置用户角色
大部分内置的角色对所有数据库共用,少部分仅对admin生效

数据库用户类
read 
非系统集合有查询权限
readWrite 
非系统集合有查询和修改权限

数据库管理类
dbAdmin 
数据库管理相关,比如索引管理,schema管理,统计收集等,不包括用户和角色管理
dbOwner 
提供数据库管理,读写权限,用户和角色管理相关功能
userAdmin 
提供数据库用户和角色管理相关功能

集群管理类
clusterAdmin 
提供最大集群管理权限
clusterManager 
提供集群管理和监控权限
clusterMonitor 
提供对监控工具只读权限
hostManager 
提供监控和管理severs权限

All-Database类
readAnyDatabase 
提供读取所有数据库的权限除了local和config数据库之外
readWriteAnyDatabase 
和readAnyDatabase一样,除了增加了写权限
userAdminAnyDatabase 
管理用户所有数据库权限,单个数据库权限和userAdmin角色一样
dbAdminAnyDatabase 
提供所有用户管理权限,除了local,config

超级用户类
root 
数据库所有权限
内部角色
__system 
提供数据库所有对象任何操作的权限,不能分配给用户,非常危险

七,备份和恢复类
backup 
提供数据库备份权限
/usr/bin/mongodump --host 127.0.0.1 --port 27017 --db db--username admin --password password_url编码 --out /home/mongobackup/ --authenticationDatabase admin
restore 
提供数据恢复权限