一文搞懂Linux CentOS7中关于MongoDB的认证和授权设置

2022-09-26 11:04:38 浏览数 (1)

前言

首先,这篇文章不会讲Mongodb在Linux CentOS7中如何去安装,所以如果有不会安装数据库的朋友可以去参考一下Mongodb官网的安装步骤,还是比较详细的,也可以自行搜索。

官方地址:https://docs.mongodb.com/guides/server/install/

说实在的,写博客的时候,个人第一次接触Mongodb,然后也不知道有这么些事情,就直接在服务器安装了,然后就直接开始用了。后面就意识到了数据库存在一个重大安全隐患,就是不管是谁的电脑都可以通过我的公网IP加27017端口号直接链接到我的数据库进行增删改查,这。。。。。。。就很尴尬了!!So,经过此事,就给各位朋友分享一下经历和解决方法,这里就不废话了,直接开整吧。

正文

MongodDB存储所有的用户信息在admin数据库的集合system.users中,保存数据库、密码和数据库信息。MongoDB默认不启用权限认证,只要能连接到服务器,就可连接到mongod。

若要启用安全认证,需要更改配置文件Authorization,也可简写为 auth。或者在命令行启动MongoDB时加上 -auth参数启动,这样当MongoDB启动后就需要用户和密码进行认证了。

上面已经说了启用安全认证,是有两种方式进行设置,这里我给大家推荐前者,也就是直接去配置文件内改一下Authorization的值,配置文件位置在/etc/mongod.conf,我们可以直接使用vim去进行编辑,然后保存。下面是我的配置文件内容

代码语言:javascript复制
# mongod.conf

# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.

security:
  authorization: enabled

# operationProfiling:

# replication:

# sharding:

## Enterprise-Only Options

# auditLog:

# snmp:

编辑好后需要重启数据库让配置生效,重启数据库可执行如下命令

代码语言:javascript复制
sudo service mongod restart # 重启MongoDB

重启好了后,就开启了安全模式,后续所有针对数据库的一些操作都需要先登录认证,这里的所有操作指的是数据库增删改查。 其实设置安全模式是第二步,第一步我们需要去数据库创建一些用户,用来管理数据库,这里一定要注意,要先在不是安全模式下创建好用户,再去启用安全模式!!! 当然,创建用户,肯定是有一些角色的,以下是Mongodb的一些内建角色

Built-In Roles

数据库用户角色

代码语言:javascript复制
read
readWrite

数据库管理角色

代码语言:javascript复制
dbAdmin
dbOwner
userAdmin

集群管理角色

代码语言:javascript复制
clusterAdmin
clusterManager
clusterMonitor
hostManager

备份恢复角色

代码语言:javascript复制
backup
restore

所有数据库角色

代码语言:javascript复制
readAnyDatabase
readWriteAnyDatabase
userAdminAnyDatabase
dbAdminAnyDatabase

超级用户角色

代码语言:javascript复制
root

内部角色

代码语言:javascript复制
__system

还有几个角色间接或直接提供了系统超级用户的访问

代码语言:javascript复制
dbOwner 
userAdmin
userAdminAnyDatabase

有了这些角色就可以去按自己的需要去对应创建用户,当然如果这些角色还不满足你的需求,你也可以自定义一个角色,但是通常情况下我们有这些角色就已经足够了,所以这里我就不去讲如何去自定义一个角色。 下面,要先去admin数据库创建一个全局用户,也可以说是超级用户,代码如下

终端执行如下命令,进入Mongodb命令模式
代码语言:javascript复制
mongo

创建一个用户

代码语言:javascript复制
use admin # 切换到admin数据库
db.createUser({
    user:"用户名", pwd:"密码",
    roles:[{    # 指定角色名称以及认证库
        role:"角色", db:"数据库名称"
    }]
})

# 例如,给admin数据库创建一个超级用户
db.createUser({
  user: "wujia",
  pwd: "123456",
  roles: [
    {
      role: "root",
      db: "admin"
    }
  ]
})

查看用户

代码语言:javascript复制
db.getUser("wujia")
db.system.users.find()

删除用户

代码语言:javascript复制
db.dropUser('wujia')
db.dropAllUsers() # 删除当前库所有用户

修改权限

代码语言:javascript复制
db.updateUser("wujia", {
  roles: [ 
      {
        role: "userAdmin",
        db:"admin"
      } 
    ]
})

注意:

updateuser它是完全替换之前的值,如果要新增或添加roles而不是代替它 则使用方法:db.grantRolesToUser() 和 db.revokeRolesFromUser()

修改密码

代码语言:javascript复制
db.changeUserPassword("wujia", "wujia123");
db.updateUser("wujia", {pwd: "wujia123"});

以上就是对用户的一些操作命令,这样就可以对指定数据库创建一个或多个用户,来用做管理数据库,不过上面只是给admin数据库创建了一个超级用户,如果需要其它数据库授权登录,请给数据库创建需要的用户!!!当数据库用户创建完成后,我们就需要去设置上面说的安全模式了,然后重启数据库,这样以来你对应对数据库就需要进行用户认证才能进一步操作,这里如果你要通过mongo命令去操作数据库就需要先进入对应数据库,然后进行登录认证,才能进一步操作,如下例子

代码语言:javascript复制
use admin # 进入数据库
# 登录认证
db.auth("wujia", "wujia123")
show users # 查看当前数据库用户权限

如上例子,一定要登录认证后再去操作数据库,不然就会报错,让你去登录认证,获得权限!!!

结语

下面有一个坑,请各位一定要注意!!!关闭MongoDB,千万不要 kill -9 pid,使用 db.shutdownServer()。 在MongoDB中删除库和集合并不会级联删除对应的角色和用户。因此如果想彻底删除对应的业务应该先删除库与其对应的角色和用户。 如果既想实现精细化权限控制又想简化用户管理,原则上建议只给开发创建一个账户,并且使用admin做认证库,这样可以避免清理过期业务库而导致无法登陆的问题。

0 人点赞