• mongodb 学习之——Linux 下MongoDB 单机与集群的安全认证


    一、概述

    MongoDB 默认是没有账号的,可以直接连接,无须身份验证。实际项目中肯定是要权限验证的,否则后果不堪设想。从2016年开始 发生了多起MongoDB黑客赎金事件,大部分MongoDB安全问题 暴露出了安全问题的短板其实是用户,首先用户对于数据库的安全不重视,其次用户在使用过程中可能没有养成定期备份的好习惯,最后是企业可能缺乏有经验和技术的专业人员。所以对MongoDB进行安全认证是必须要做的

    二、用户相关操作

    2-1 切换到admin数据库对用户的添加

    use admin
    db.createUser(
    {
    user: "账号",
    pwd: "密码",
    roles: [
    { role: "角色", db: "安全认证的数据库" },
    { role: "角色", db: "安全认证的数据库" }
     ]
    }
    )

    user:创建的用户名称,如 admin、root 、lagou
    pwd:用户登录的密码
    roles:为用户分配的角色,不同的角色拥有不同的权限,参数是数组,可以同时设置多个
    role:角色,MonngoDB 已经约定好的角色,不同的角色对应不同的权限 后面会对role做详细解释
    db:数据库实例名称,如 MongoDB 4.0.2 默认自带的有 admin、local、config、test 等,即为哪个数
    据库实例 设置用户

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

    2.2 修改密码

    db.changeUserPassword( 'root' , 'rootNew' );

    2.3 用户添加角色

    db.grantRolesToUser( '用户名' , [{ role: '角色名' , db: '数据库名'}])


    2.4 以auth 方向启动mongod

    ./bin/mongod -f conf/mongo.conf --auth
    (也可以在mongo.conf 中添加auth=true 参数)


    2.5 验证用户

    db.auth("账号","密码")

    2.6删除用户

    db.dropUser("用户名")

    2.7 角色

    数据库内置的角色

    //一般设置

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

    //高级设置,拥有一下这些全权限的用户,相当于没有安全认证,权限太高了
    dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system.profile userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限 root:只在admin数据库中可用。超级账号,超级权限 dbOwner:库拥有者权限,即readWrite、dbAdmin、userAdmin角色的合体

    各个类型用户对应的角色

    数据库用户角色:read、readWrite
    数据库管理角色:dbAdmin、dbOwner、userAdmin
    集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
    备份恢复角色:backup、restore;
    所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、
    dbAdminAnyDatabase
    超级用户角色:root
    这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、
    userAdminAnyDatabase)

    三、单机安全认证实现流程

    3.1. 创建管理员

    MongoDB 服务端开启安全检查之前,至少需要有一个管理员账号,admin 数据库中的用户都被视为管理员,如果 admin 库没有任何用户的话,即使在其他数据库中创建了用户,启用身份验证,默认的连接方式依然会有超级权限,即仍然可以不验证账号密码照样能进行 CRUD,安全认证相当于无效。

    • 连接到MongoDB 
    ./bin/mongo --port 57017
    • 切换到admin数据库对用户的添加

    >use admin
    switched to db admin
    > db
    admin
    > db.createUser(
    ... {
    ... user:"root",
    ... pwd:"123456",
    ... roles:[{role:"root",db:"admin"}]
    ... })

    •  验证(无权访问)

    •    认证访问

     3.2 创建普通用户

        testdb 自己新建的数据库,没安全认证之前可以随意 CRUD,其余的都是 mongoDB 4.0.2 自带的数据库,

    即使创建用户之后依然是可以随意 CRUD()

     

     关闭 MongoDB 服务端,之后服务端会以安全认证方式进行启动

    > use admin
    switched to db admin
    > db.shutdownServer()
    server should be down...

    四、 集群的安全认证

    4.1开启安全认证之前 进入路由创建管理员和普通用户

      参考单机认证创建用户

     4.2关闭所有的配置节点 分片节点 和 路由节点

    安装psmisc
    yum install psmisc
    安装完之后可以使用killall 命令 快速关闭多个进程
    killall mongod

     4.3 生成密钥文件 并修改权限

    openssl rand -base64 756 > data/mongodb/testKeyFile.file
    chmod 600 data/mongodb/testKeyFile.file

    4.4 17017~17019.conf配置节点集群和(37017-37019.conf)(47017-47019.conf)分片节点集群开启安全认证和指定密钥文件

    在文件夹shard_cluster 下 mkdir  /data/mongodb -p

    auth=true
    keyFile=data/mongodb/testKeyFile.file

    4.5  在路由配置文件中 设置密钥文件27017

    keyFile=data/mongodb/testKeyFile.file

    4.6 启动所有的配置节点 分片节点 和 路由节点 使用路由进行权限验证

    可以编写一个shell 脚本 批量启动 startup.sh  ,授权  chmod +x  startup.sh

    ./bin/mongod -f mongo_17017.conf
    ./bin/mongod -f mongo_17018.conf
    ./bin/mongod -f mongo_17019.conf
    ./bin/mongod -f shard/shard1/shard1_37017.conf
    ./bin/mongod -f shard/shard1/shard1_37018.conf
    ./bin/mongod -f shard/shard1/shard1_37019.conf
    ./bin/mongod -f shard/shard2/shard2_47017.conf
    ./bin/mongod -f shard/shard2/shard2_47018.conf
    ./bin/mongod -f shard/shard2/shard2_47019.conf
    ./bin/mongos -f route/route_27017.conf

    4.7 启动

    ./startup.sh

                                                                   down......................................................................................

  • 相关阅读:
    关于scrollTop的那些事
    document.documentElement.clientHeight||document.documentElement.scrollHeight
    用JS查看修改CSS样式(cssText,attribute('style'),currentStyle,getComputedStyle)
    Pygame安装教程
    Python基础知识:测试代码
    Python基础知识:文件和异常
    Python基础知识:类
    Python基础知识:字典
    Python基础知识:while循环
    Python基础知识:列表
  • 原文地址:https://www.cnblogs.com/aGboke/p/14189003.html
Copyright © 2020-2023  润新知