• Mongo开启用户认证


     

    1. 介绍

      由于mongodb默认没有设置密码访问,而且mongodb的访问权限设计,必须使用有权限的用户给每个库设置一个用户,才能使用,且2.X版本与3.X版本区别有点大,所以要注意以下几点。

    1.mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。

    2.切换到admin数据库,添加的账号才是管理员账号。

    3.用户只能在用户所在数据库登录,包括管理员账号。

    4.管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在其它数据库下认证才可以。

    5.用户创建只能在本地。

    6.mongo命令工具远程时,备份时,命令仅向下兼容。

     

    2. Mongo的内置角色

      在mongo里面,有许多内置角色对应各种权限,下面简单介绍一下。

    • Built-In Roles(内置角色):

    数据库用户角色: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数据库中可用。超级账号,超级权限。

     

    3. Mongo2.4版本开启用户认证

      由于2.4版本比较老,且2.4一般为centos6.5默认包版本,所以2.4版本只是简单的讲解一下步骤。

    1.首先开启了用户认证后,第一次登录还是不需要密码的。

     

    2.进入admin数据库,然后创建一个管理账户。

      Use 数据库名,如果没有改库,那么就会自动创建这个库

    Mongo2.4版本创建数据库如果没有其它readonly或者其它要求,创建只需要用户名以及密码就可以了

     

    3.一旦创建了用户,首先需要认证,否则在改库下做任何操作都没有权限。

     

    4.认证后查看

    返回值为1代表认证成功

           

    5.查看当前数据库下的用户

     

    6.现在创建了admin的数据库,可以查看其它数据库,在本地登录时,mongo2.4版本只要登录了admin账户,那么可以切换到其它数据库做操作

     

    7.远程访问admin数据库可登录,访问lizexiong数据库无效

    在远程上无法授权和创建用户,并且,如果lizexiong库没有用户,直接远程过来会失败,但是远程登录admin之后在切换lizexiong库是没有问题的,但lizexiong库如果没有用户,java,php等程序直接连接lizexiong库会失败,所以需要给lizexiong创建一个用户.这里为了方便记忆,所以用户名和密码与admin库一模一样。

    Mongo3.X如果给了root权限可以随意切换(前提是在非admin库下创建root角色),且3.X版本查看用户以及角色命令发生变化,信息更加详细。

     

    首先测试远程admin并且切换到lizexiong操作成功

    然后直接远程lizexiong失败

     

    8.给lizexiong库设置用户,然后远程访问

    创建用户

    远程测试,连接上了,此时只能访问lizexiong库里的内容,其它库一概没有权限,而且必须要到本地去给其它库加用户。

     

    9.如果要给其它库创建只读用户,mongo2.4版本只需要加一个True就可以了

     db.addUser('tank2','test',true);

    4. Mongo 3.X开启用户认证

      2.X与3.X配置文件完全改版,所以3.X开启用户认证以及添加用户方式完全不同,但是如果程序想要远程连接,还是和2.X版本一样,每一个库都必须有一个用户。

     

    1.Mongo3.X开启用户认证.

    由于版本不同,配置文件区别也较大,所以这里贴出配置文件,下文中标黄的就是开启认证

    [root@CentOS7 ~]# egrep -v "^#|^$" /etc/mongod.conf.bak 
    systemLog:
      destination: file
      logAppend: true
      path: /usr/local/mongodb/logs/mongod.log
    storage:
      dbPath: /usr/local/mongodb/data
      journal:
        enabled: true
    processManagement:
      fork: true  # fork and run in background
      pidFilePath: /usr/local/mongodb/tmp/mongod.pid  # location of pidfile
    net:
      port: 27017
      bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
    security:
        authorization: enabled

      2.登录,然后切换到admin,发现是没有任何权限的(不同此版本结果不一样,3.4.24可以直接查询)

     

    3.现在创建一个root角色的用户。

    3X版本创建用户命令也发生了改变,创建成功之后,还是要去认证一下,否者干什么都是无权限。

    > db.createUser(
    ...      {
    ...        user:"root",
    ...        pwd:"huawei",
    ...        roles:[{role:"root",db:"admin"}]
    ...      }
    ...   )
    Successfully added user: {
     "user" : "root",
     "roles" : [
      {
       "role" : "root",
       "db" : "admin"
      }
     ]
    }

    手动认证

     

    4.现在尝试远程登录admin库成功,登录test库失败,因为test库还没有用户

    登录test失败

     

    5.现在给test创建用户,然后尝试远程登录。

    给一个库建立用户,那么就要用角色dbOwner,此角色可以限制该用户无法访问其它库信息

    远程登录测试

    可以看到,无法访问其它库的信息

     

    6.验证,在admin库和test库查看角色和用户信息。

    admin

    test

     

    7.本小节属于扩展篇,对于其它库远程,使用同一个账户,且可以任意切换数据库。

    那就是在比如test库里面创建root角色,然后root的所属库还是admin,不知道算不算一个bug(因为之前版本测试在非admin库里面时是无法创建root角色的)

    首先删除dbOwner角色用户,然后创建root角色用户

    然后远程访问测试

    这个时候可以访问了

    可以看到,Mongo里不仅能看到test的信息,还可以看到其它库的信息

    然后在user库下面查看用户

    所以说这种方式,变相的给了test库加了一个root的角色权限,那么可以即使在远程的时候也可以随意切换库来操作了。

     

    作者:小家电维修

    相见有时,后会无期。

  • 相关阅读:
    Linux下解析域名命令-dig 命令使用详解
    重写、覆盖、重载、多态几个概念的区别分析
    介绍python中运算符优先级
    介绍Python中6个序列的内置类型
    Mysql(Mariadb)数据库主从复制
    winscp中使用sudo的方法
    git push跳过用户名和密码认证配置教程
    案例:通过shell脚本实现mysql数据备份与清理
    毕业季,我的Linux求职之路
    PHP和ajax详解
  • 原文地址:https://www.cnblogs.com/lizexiong/p/14640937.html
Copyright © 2020-2023  润新知