美文网首页
基于角色的访问控制 - MongoDB安全设置

基于角色的访问控制 - MongoDB安全设置

作者: DreamsonMa | 来源:发表于2019-02-02 00:24 被阅读0次

    MongoDB使用默认配置启动时,一旦客户端连接后就可以对数据库做任意操作,而且可以远程访问数据库,所以在生产环境要注意安全方面的问题。提高MongoDB安全性有以下几个方面:限制特定IP地址访问、设置监听端口、设置登录的账户密码、使用TLS/SSL加密传输等。

    限制特定IP地址访问、设置监听端口

    方法1、 设置配置文件/etc/mongod.conf

    [root@gz-tencent ~]# cat /etc/mongod.conf 
    # mongod.conf
    ...
    # network interfaces
    net:
      port: 27017
      bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.
    

    方法2、直接带参数启动

    [root@gz-tencent ~]# mongod --bind_ip 127.0.0.1 --port 27017
    

    设置登录账户密码

    MongoDB默认不需要验证账户和密码,启动后可以直连MongoDB,并获得所有库的root操作权限。创建一个数据库新用户使用db.createUser(user, writeConcern)方法,如果用户存在则返回一个用户重复错误。

    user:创建关于用户的身份认证和访问信息

    属性 描述
    user 用户的名字
    pwd 用户的密码
    cusomData 为任意内容,例如可以为用户全名介绍
    roles 指定用户的角色,可以用一个空数组给新用户设定空角色

    writeConcern:保证MongoDB提供写操作的成功报告

    属性 描述
    w选项 允许的值分别是 1、0、大于1的值、"majority"、<tag set>
    j选项 确保mongod实例写数据到磁盘上的journal(日志),这可以确保mongd意外关闭不会丢失数据。设置true启用。
    wtimeout 指定一个时间限制,以毫秒为单位。wtimeout只适用于w值大于1。

    添加账号步骤:

    1、给admin库添加数据库管理角色
    2、给需要操作的库添加数据库用户角色

    [root@gz-tencent ~]# mongo 127.0.0.1:27018
    ...
    > use admin
    > db.createUser(
      {
        user: "root",
        pwd: "root",
        roles: [ "root" ]
      }
    )
    > db.createCollection("test")
    { "ok" : 1 }
    > use test
    switched to db test
    > db.createUser( 
        { "user" : "test",
          "pwd": "test123",
          "customData" : { employeeId: 007 },
          "roles" : [ 
                { role: "clusterAdmin", db: "admin" },
                { role: "readAnyDatabase", db: "admin" },
                "readWrite"
            ] 
        },
        { w: "majority" , wtimeout: 5000 } 
    )
    

    3、重新登录mongod

    [root@gz-tencent ~]# mongo 127.0.0.1:27018/test
    MongoDB shell version v4.0.5
    connecting to: mongodb://127.0.0.1:27018/test?gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("008fbb2b-e6bb-43f2-92fa-ea836a9a6d49") }
    MongoDB server version: 4.0.5
    > db.test.find()
    Error: error: {
        "ok" : 0,
        "errmsg" : "command find requires authentication",
        "code" : 13,
        "codeName" : "Unauthorized"
    }
    > db.auth("test","test123")
    1
    > db.test.find()
    { "_id" : ObjectId("5c546dc31f5a1d6f8c9b037a"), "name" : "Dreamson.Ma" }
    > exit
    bye
    [root@gz-tencent etc]# mongo 127.0.0.1:27018/test -u test -p test123
    > db.test.find()
    { "_id" : ObjectId("5c546dc31f5a1d6f8c9b037a"), "name" : "Dreamson.Ma" }
    

    4、更新用户密码

    [root@gz-tencent etc]# mongo 127.0.0.1:27018/admin -u root -p root
    ...
    > use test
    switched to db test
    > db.changeUserPassword("test","test")
    > exit
    bye
    [root@gz-tencent etc]# mongo 127.0.0.1:27018/test -u test -p test123
    ...
    2019-02-02T00:34:53.282+0800 E QUERY    [js] Error: Authentication failed. :
    ...
    [root@gz-tencent etc]# mongo 127.0.0.1:27018/test -u test -p test
    MongoDB shell version v4.0.5
    connecting to: mongodb://127.0.0.1:27018/test?gssapiServiceName=mongodb
    Implicit session: session { "id" : UUID("bede758c-ab00-4ee5-aeff-aa229492239e") }
    ...
    

    5、删除用户

    [root@gz-tencent etc]# mongo 127.0.0.1:27018/admin -u root -p root
    ...
    > use test
    switched to db test
    > db.dropUser("test")
    false
    > show users
    > exit
    bye
    

    Mongo内置角色

    属性 描述
    数据库用户角色 read、readWrite
    数据库管理角色 dbAdmin、dbOwner、userAdmin
    集群管理角色 clusterAdmin、clusterManager、clusterMonitor、hostManager
    备份恢复角色 backup、restore
    所有数据库角色,只用于admin数据库 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    超级用户角色 root
    内部角色 __system

    用户管理函数:

    函数 说明
    db.auth 对数据库进行用户身份验证。
    db.createUser 创建一个新用户。
    db.updateUser 更新用户数据。
    db.changeUserPassword 更改现有用户的密码。
    db.dropAllUsers 删除与数据库关联的所有用户。
    db.dropUser 删除单个用户。
    db.grantRolesToUser 将角色及其特权授予用户。
    db.revokeRolesFromUser 从用户删除一个角色。
    db.getUser 返回关于指定用户的信息。
    db.getUsers 返回与数据库关联的所有用户的信息。

    相关文章

      网友评论

          本文标题:基于角色的访问控制 - MongoDB安全设置

          本文链接:https://www.haomeiwen.com/subject/qcljsqtx.html