MongoDB3.0.x版本用户授权配置(单机环境)

MongoDB数据库默认情况下是没有做权限控制的,只要能够连接所开放的端口就能进行访问,而且拥有root级别的权限;对于生产环境而言是极不安全的,所以需要建立用户,进行授权控制。

  • 单机环境下的用户授权模块配置:

MongoDB的社区版本中有两个模块可以控制用户的访问:

--auth: 在mongod启动项中加入--auth,mongodb启动后,就可以完成授权模块的启用);

PS:虽然auth模块启用后本机还能否登陆到数据库,但是不具备增删改查的权限了,所以启动auth模块之前就应该创建一个超级用户

--keyFile <file>: 主要用于分片集群与副本集相互之间的授权使用,在单机情况下只要用到auth,如果是在集群(分片+副本集)环境下,就必须要用到该参数;

security.authorization: 在MongoDB 2.6版本开始,mongod/mongos的启动配置文件增加了YAML格式的写法,功能更auth是一样的,后面的操作中,都是采用该格式

security.keyFile: 格式与security.authorization相同,功能与--keyFile相同。

  • 首先验证下非配置认证模块的访问:

[[email protected] bin]# ./mongo
MongoDB shell version: 3.0.7
connecting to: test
Server has startup warnings:
2015-10-29T15:12:14.257+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-10-29T15:12:14.257+0800 I CONTROL  [initandlisten]
> show dbs
local  0.000GB

在没有配置的情况下,登录到数据库后,可以做任何操作。

  • 配置认证模块及重启服务:

编写了一个启动配置文件:mongodb.conf(文件中标红部分就为auth的授权模块)

[[email protected] bin]# cat mongodb.conf
systemLog:
   destination: file
   path: "/data/auth/log/mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/data/auth/db"
   directoryPerDB: true
   engine: wiredTiger
   wiredTiger:
      engineConfig:
         cacheSizeGB: 4
         directoryForIndexes: true
         journalCompressor: zlib
      collectionConfig:
         blockCompressor: zlib
      indexConfig:
         prefixCompression: true
net:
   port: 27017
processManagement:
   fork: true
security:
   authorization: enabled                                                      
  • 创建授权用户(超级管理员):

MongoDB在V3.0版本之后内置了root 角色,也就是结合了readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin4个角色权限,类似于ORACLE的sysdba角色,但是MongoDB的超级管理员用户名称是可以随便定义的:

[[email protected] bin]# ./mongo
MongoDB shell version: 3.0.7
connecting to: test
Server has startup warnings:
2015-10-30T16:24:36.127+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-10-30T16:24:36.127+0800 I CONTROL  [initandlisten]
> use admin
switched to db admin
> db.createUser(
...    {
...      user: "ljaiadmin",
...      pwd: "123456",
...     roles: [ { role: "root", db: "admin" } ]
...   }
... )
Successfully added user: {
        "user" : "ljaiadmin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}

这样就创建好一个ljaiadmin的超级管理员用户,创建全局用户或者超级用户,需要在MongoDB的admin数据库中创建(在其他库也可以创建,但是没有该角色功能),重启完mongod进程后,接下来做一下权限的验证:

[[email protected] bin]# ./mongo
MongoDB shell version: 3.0.7
connecting to: test
> show dbs  (注:此时查看已提示没有授权执行listDatabases命令了)
2015-10-30T16:41:31.131+0800 E QUERY    Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
}
    at Error (<anonymous>)
    at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)
    at shellHelper.show (src/mongo/shell/utils.js:630:33)
    at shellHelper (src/mongo/shell/utils.js:524:36)
    at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47
> use admin
switched to db admin
> db.auth(‘ljaiadmin‘,‘123456‘) (注:切换到admin用户进行授权验证)
1
> show dbs                      (注:验证完成后,就可以读写等操作)
admin    0.000GB
local    0.000GB
test100  0.000GB
test2    0.000GB
> use test2
switched to db test2
> show tables
test
test2
> db.test2.find()
{ "_id" : ObjectId("5632cf116207909a76446af7"), "name" : "1" }
> db.test2.drop()
true
> db.dropDatabase()
{ "dropped" : "test2", "ok" : 1 }
> show dbs
admin    0.000GB
local    0.000GB
test100  0.000GB
> use test100
switched to db test100
> db.test111.insert({"test":"test"})
WriteResult({ "nInserted" : 1 })
> db.test111.find()
{ "_id" : ObjectId("56332db373f771b3d95638bb"), "test" : "test" }
> use admin
switched to db admin
> show users
{
        "_id" : "admin.ljaiadmin",
        "user" : "ljaiadmin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}
> 
  • 创建普通用户

用可以对test123数据库读写的rwtest123用户为例:

> use test123
switched to db test123
> db.createUser(
...    {
...      user: "rwtest123",
...      pwd: "123456",
...     roles: [ { role: "readWrite", db: "test123" } ]
...   }
... )
Successfully added user: {
        "user" : "rwtest123",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test123"
                }
        ]
}
#所建的rwtest123用户可以在test123数据库中进行增删改查操作,但是其他操作就不行了
>db.auth(‘rwtest123‘,‘123456‘)
switched to db test123
> db.test123.insert({"test":"test"})
WriteResult({ "nInserted" : 1 })
> db.test123.find()
{ "_id" : ObjectId("563332ebc8a59ae4fe96bbf5"), "test" : "test" }
> db.test123.drop()
true
> use test100
switched to db test100
> db.test100.find()
Error: error: { "$err" : "not authorized for query on test100.test100", "code" : 13 }
>
  • 配置参考:

MongoDB数据库的用户权限控制权限还是比较多的,有系统自带的,已经定义好的角色,也可以自己定义角色权限,需要根据业务需要进行权限分配:

自带角色的说明(一般内置的角色基本上就可以满足生产环境需求了):

https://docs.mongodb.org/manual/core/security-built-in-roles/

用户自行定义角色的说明:

https://docs.mongodb.org/manual/core/security-user-defined-roles/

用户管理配置的说明

https://docs.mongodb.org/manual/reference/method/#user-management-methods

时间: 2024-12-29 23:52:26

MongoDB3.0.x版本用户授权配置(单机环境)的相关文章

mysql8.0无法给用户授权或提示You are not allowed to create a user with GRANT的问题

mysql8.0无法给用户授权或提示You are not allowed to create a user with GRANT的问题 提示意思是不能用grant创建用户,mysql8.0以前的版本可以使用grant在授权的时候隐式的创建用户,8.0以后已经不支持,所以必须先创建用户,然后再授权,命令如下: mysql> create user 'zabbix'@'localhost' IDENTIFIED BY '111111'; Query OK, 0 rows affected (0.0

SqlServer用户授权配置

1 --创建登录账户:用户默认为public角色 2 USE [master] 3 GO 4 CREATE LOGIN [登录名] WITH PASSWORD=N'密码', DEFAULT_DATABASE=[test], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF 5 GO 6 7 --删除登录账户(登录名不用引号,'[]'号为必须,防止用户为单纯的数字) 8 USE [master] 9 go 10 EXEC sys.sp_revokedbaccess @n

Spring boot2.0 与 2.0以前版本 跨域配置的区别

一·简介 spring boot升级到2.0后发现继承WebMvcConfigurerAdapter实现跨域过时了,那我们就紧随潮流. 二·全局配置 2.0以前 支持跨域请求代码: 1 import org.springframework.context.annotation.Configuration; 2 import org.springframework.web.servlet.config.annotation.CorsRegistry; 3 import org.springfram

修改mongodb3.0副本集用户密码遇到的坑

最近公司对项目安全方面的问题很是重视,进行了多次各种安全漏洞的扫描,于是乎就扫到了mongodb弱口令的问题. 在项目部署初期,因为大家对这个都不是特别重视,大概是因为觉得反正是内网项目吧,所以mongodb数据库的用户名和密码就都是admin. 这次扫到弱口令之后,要求解决这个问题,于是任务便分到了我的头上. 遵循强口令的标准,我把admin改成了由大写字母.小写字母.数字和特殊字符共同组成的密码,但是在更改的过程中却并不像想象的那么顺利,其中遇到的问题我称之为mongodb副本集密码的一些坑

0702-spring cloud config-git仓库配置、用户授权

一.概述 参看地址:https://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_environment_repository 例如:git.svn.基于git本地存储. 本地存储.Vault 二.git EnvironmentRepository的默认实现使用Git后端.要更改存储库的位置,可以在配置服务器中设置“spring.cloud.config.server.git.uri”配置属性(

基于 Laravel (5.1) & Ember.js (1.13.0) 的用户授权系统

Laravel 本身提供了完整的用户授权解决方案,对于由 PHP 驱动的多页面应用,Laravel 能够完美解决用户授权问题.但是在 SPA 中,laravel 退化成一个 API server,页面路由和表单提交完全由前端框架控制,此时面临2个问题: 如何在前端实现页面访问权限控制? 如何对 ajax 请求做授权? 如何在前端实现页面访问权限控制? Ember.js 1.13.0 没有提供 authentication 功能,我使用了一个名为 ember-simple-auth 的第三方扩展.

OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token

在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等. 选择微博登陆后,爱奇艺会向用户申请授权用于微博登陆(当用户已经登陆了微博时会直接申请授权,当用户没有登陆时会提示用户登陆微博): 此时提示窗口的 url 为:https://api.weibo.com/oauth2/authorize?scope=&redirect_uri=http%3A%2F

linux下storm(0.9版本以上)的环境配置和小Demo

一.引言: 在storm发布到0.9.x以后,配置storm将会变得简单很多,也就是只需要配置zookeeper和storm即可,而不再需要配置zeromq和jzmq,由于网上面的storm配置绝大部分都是0.9以前的storm版本,所以有很多工作是不需要进行的,下面就storm的0.9.5版本在linux环境下进行配置进行详细解析. 由于配置storm只需要两个步骤,大大简化了配置,也是storm团队做了很大的努力,让程序员们专注于程序,让storm配置进行异常简单,好了,废话说了不少,下面正

mongodb3.0副本集搭建补充~~非admin数据库的用户权限

之前有搭建mongodb3.0的副本集,不过当时直接使用的admin数据库,用户也是直接给的root. 链接:http://blog.csdn.net/tuzongxun/article/details/51723259 最近想要把数据移到非admin数据库上,便重新以非admin库创建用户,过程大致和之前的一样,但创建用户的时候还是遇到了一些问题,主要是在用户角色和权限上. 我搭建过程中参考了下边的用户权限相关的博客: http://blog.csdn.net/tuzongxun/articl