美文网首页
你的MongoDB还在裸奔吗?

你的MongoDB还在裸奔吗?

作者: zy_think123 | 来源:发表于2020-03-26 10:50 被阅读0次

你还在用root账户来访问你程序的所有数据吗?午夜梦回,你是否有过担心,要是手误操作,一不小心就删库了,应该怎么办?

如果你真有这样的担忧,那么现在开始就让你的用户权限小一点。

mongodb有下面四种认证方式

  1. 用户名+密码 : 默认认证方式,用户信息存储于MongoDB本地数据库
  2. 证书方式 : 采用X.509标准,服务端需要提供证书文件启动,客户端需要证书文件连接服务端,证书由内部或外部CA颁发
  3. LDAP外部认证 : 企业版功能。连接到外部LDAP服务器认证
  4. Kerberos外部认证 : 企业版功能, 连接到外部Kerberos服务器认证

而今天我们探究的是最简单的也是最常用的一种:用户名+密码。

我们一般说到权限控制,都绕不过RBAC:基于角色的访问控制(Role-Based Access Control),MongoDB中也不外如是。

RBAC实际很简单,就是一个用户有哪些角色,而这些角色都有哪些资源。 这样就可以使得拥有对应角色的用户拥有对应的权限。

MongoDB中也存在这么三个概念,User,Role以及Action。

User,Role好理解,就是用户和角色,那么Action是啥玩意呢?Action实际上是用户能对数据库做什么操作,比如增删改查等

更多Action可以查看:https://docs.mongodb.com/manual/reference/privilege-actions/

启用认证

默认情况下,mongodb安装完成后是不启用认证机制的,这个时候你没有用户名,密码也可以登录进去,并且你拥有操作数据库的任何权限(这个时候你的权限最大,也最危险)。

虽然启用认证后,不指定用户名,密码,也可以登录,但是此时只能创建用户,而不能做其他的操作。

启用认证有两种方式,

  1. 在mongod.cfg中指定
security:
  authorization: enabled

https://docs.mongodb.com/manual/reference/configuration-options/#security-options

  1. 通过命令行参数指定
mongod --auth --port 27017 --dbpath /data/db

此时如果你试图做其他操作,比如查询数据就会遇到下面的错误:

db.demo.find();
Error: error: {
  "ok" : 0,
  "errmsg" : "not authorized on test to execute command { find: \"demo\", filter: {}, $db: \"test\" }",
  "code" : 13,
  "codeName" : "Unauthorized"
}

此时我们可以选择创建用户,比如我们创建一个root用户

use admin;

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

上面的命令创建了一个root账户,role是root(对所有数据库都拥有最高权限,下面会讲到mongodb内置有哪些角色)。

此时使用下面的命令来登录mongodb

 mongo -u root -p 123456 --authenticationDatabase admin

设置以auth方式登陆之后,client端通过mongo登陆mongodb,是必须加上“--authenticationDatabase”选项的,“authenticationDatabase”指定了校验用户账户名和密码的数据库,我们一般存储在admin库中。

然后使用下面的命令可以查看对应的授权机制

db.runCommand({getParameter: 1, authenticationMechanisms: 1})
{
  "authenticationMechanisms" : [
          "MONGODB-X509",
          "SCRAM-SHA-1",
          "SCRAM-SHA-256"
  ],
  "ok" : 1
}

当使用Robo 3T工具连接的时候,对应用户的授权机制一定要是上面的其中一种。

MongoDB内置角色以及权限继承关系

mongodb-role-extends.png

可以看到root角色是处于顶层位置的。

当你想知道某个角色有哪些权限的时候可以使用getRole的命令

db.getRole('read', {showPrivileges: true});

getRole命令会给出角色对应的权限,继承下来的权限以及对应的Action

同样的,mongodb也是支持我们自建角色的。

// 创建 sampleRole角色
// 作用在sampledb中的sample Collection,只能拥有read,update操作
db.createRole(
{
  "role": "sampleRole",
  "privileges": [
    {
      "resource": {
        "db": "sampledb",
        "collection": "sample"
      },
      "actions": [
        "update"
      ]
    }
  ],
  "roles": [
    {
      "role": "read",
      "db": "sampledb"
    }
  ]
}
);

// 创建用户绑定角色
db.createUser(
{
  "user": "sampleUser",
  "pwd": "password",
  "roles": [
    {
      "role": "sampleRole",
      "db": "admin"
    }
  ]
}
)

当我们使用sampleUser登录的时候,就不能再向sample Collection中插入数据了。

创建应用用户

我们在实际使用的使用,可以根据不同的使用场景创建不同的用户分配不同的角色,这样可以使得权限控制更小,更加安全。

创建只读用户

db.createUser({user: "reader", pwd: "abc123", roles: [{ role:"read", db: "mydb" }]})

创建读写用户

db.createUser({user: "writer", pwd: "abc123", roles: [{ role:"readWrite", db: "mydb" }]})

相关文章

  • 你的MongoDB还在裸奔吗?

    你还在用root账户来访问你程序的所有数据吗?午夜梦回,你是否有过担心,要是手误操作,一不小心就删库了,应该怎么办...

  • 你家“这位”还在裸奔吗?

    我们总是把家装修的美美的 可是你家还有这个在“裸奔”呢 作为外貌协会会员 怎么能忍受这种情况的发生! 是谁在裸奔?...

  • 水滴筹‖你的家庭还在裸奔吗?

    01 最近经常在朋友圈看到水滴筹,轻松筹,都是亲人朋友生病了,家庭陷入困境,需要帮助的人。每次看到心里都不免一阵唏...

  • 你的在线知识产品还在裸奔吗?

    您还在用微信群或QQ群里语音直播吗? 您还在用电脑录屏制作自己的课程吗? 您还在为如何将自己的课程PPT或视频制作...

  • 视频学习《你的API还在”裸奔“吗?》

    简单区分对称加密、非对称加密对称加密就是使用相同的明文加密出来的密文都是一样的。非对称加密就是使用相同的明文加密出...

  • 【0814理财微专栏#64】

    #爱尚钱#琳希 你的个人信息还在裸奔吗? 现在网络时代,出门不用带现金,不用银行卡,不用带钱包,民间也有...

  • 你的文章是否还在"裸奔"?

    随着各类自媒体平台铺天盖地而来,写作门槛骤然降低,在这个全民写作的时代,人人可以提笔码字,亦可以分分钟将文字公布于...

  • 如何保证MongoDB的安全性?

    上周写了个简短的新闻《MongoDB裸奔,2亿国人求职简历泄漏!》: 根据安全站点HackenProof的报告,由...

  • Spring Cloud Eureka 你还在让它裸奔吗??

    前些天栈长在微信公众号Java技术栈分享了 Spring Cloud Eureka 最新版 实现注册中心的实战教程...

  • 2020-12-10

    什么是尴尬? 眼看四下无人,准备脱衣裸奔,冷不丁跑出一个人拍着你的肩膀说“兄弟,裸奔吗?一起呀”。 我以为你以后再...

网友评论

      本文标题:你的MongoDB还在裸奔吗?

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