• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

MongoDB数据库的密码和权限问题

武飞扬头像
凌空暗羽
帮助1

1.引言

    前几天发现自己的数据库被大佬入侵了,主要原因是mongoDB数据没有设置用户名和密码,加上数据库使用的默认端口号都没有改,拿到我的网站ip直接就能访问,于是花了点事件看了看相关的知识,总结分享给大家。

2.mongoDB设置密码

    首先需要明确一点,mongoDB默认是没有数据库和密码的,需要手动设置。具体的可以类比于mysql数据库,虽然两者不是同一种数据库,但是两者在权限管理上极为相似。设置密码其实就是里面拥有各种权限的用户带有的密码,由不同的用户名和密码对应不同权限的连接。所以,用户密码归根到底还是用户权限问题。

3.mongoDB用户权限

    首先说明mongoDB里面存在的各种权限:
(1)数据库用户角色:read、readWrite;
(2)数据库管理角色:dbAdmin、dbOwner、userAdmin;
(3)集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
(4)备份恢复角色:backup、restore;
(5)所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
(6)超级用户角色:root
(7)系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
    常用的角色或者说对于向我们这种萌新使用的话,一般包括:dbOwnerdbAdminAnyDatabaseroot ,当然由于dbAdminAnyDatabase的特殊性,可能用的也不多,稍微严格点的可能还会用到readreadWrite
    基于阿里云服务器 宝塔面板和MongoDB 4.4.6,经过不断尝试,得到如下结论:

3.1mongoDB修改默认端口

    修改默认端口之后,需要重启mongoDB服务。如果使用了宝塔面板,可以直接在面板处快捷修改(因为被攻击过这里就不展示端口号了):
学新通
    当然,也可以直接去mongoDB的配置项里面修改(因操作系统或者版本不同,路径可能稍有差异,但是一定会存在这个配置文件的):
学新通
    修改之后记得重启服务。可能你发现连不上去了,系统直接把这个连接路径看成了文件目录了,解决方法:使用如下访问方式:

mongo mongodb://127.0.0.1:{你设置的端口}/

3.2mongoDB设置用户

    这里直接给出案例,然后再来说明:

//创建root用户
use admin
db.createUser({user:"超级管理员名称",pwd:"你的密码",roles:["root"]})
db.auth("超级管理员名称","你的密码")

//创建管理用户
db.createUser({ user: "管理员名称", pwd: "你的密码", roles: [{ role: "userAdminAnyDatabase", db: "admin" }] })
db.auth("管理员名称","你的密码")

//创建用户
use 被指定数据库
db.createUser({ user: "所有者用户名", pwd: "你的密码", roles: [{ role: "dbOwner", db: "指定数据库名称" }] })
db.auth("所有者用户名","你的密码")

    说明:创建root级别的用户和管理员级别的用户都只能在admin数据库里面执行,创建指定数据库的所有者需要通过use切换数据库。另外,需要注意,系统级别的函数,比如:db.system.users.find()(查看系统所有用户),只能在admin数据库下执行,创建用户和执行其他系统函数的时候需要使用db.auth验证权限:
学新通
    指定的数据库某个非admin数据库里面只含有部分角色,比如某个test数据库里面不含有dbAdminAnyDatabase等用户,也就是说创建用户并赋予权限的时候是不能设置这些用户身份的。另外这些指定的数据库里面也不能指定系统级别的函数,除上面那个外,常用的还有这些:

//删除指定数据库,结果返回删除的用户个数
db.system.users.remove({user:'root'})

    其语法同基本的mongoDB语法,其实在admin里面调用系统函数查所有用户你会发现,查询结果就像是一条记录,有_idobjectId等信息。其他的好像也没有了,因为这种用户一旦确定很少会修改。
    !!!记住,改完之后需要修改配置文件,将配置文件里面的authorization,然后重启服务。
学新通

3.3连接mongoDB

    这里我们使用mongDB compass来连接数据库,使用方法如下:
学新通
学新通
填写ip、端口、用户名和密码就行,然后点击连接就行。最后,实践发现dbOwnerdbAdminAnyDatabaseroot 三种不同的用户中,在admin数据库中rootdbAdminAnyDatabase没有任何区别,两个能够互删(其实按道理这个应该dbAdminAnyDatabase是没有权限删除root的(小声)),于是很好奇这两者的区别,最后有趣的一幕发生了:dbOwner只能查看它所对应的数据库,看不了其他数据库,dbAdminAnyDatabase能看到所有的数据库,但是看不到任何数据库里面的内容,只是保留了编辑权限,就尬住了:
学新通
root能够查看所有数据库的详细信息,root还是root啊!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgaccjb
系列文章
更多 icon
同类精品
更多 icon
继续加载