MongoDB安全及身份认证的示例分析

87次阅读
没有评论

共计 3192 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章主要为大家展示了“MongoDB 安全及身份认证的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“MongoDB 安全及身份认证的示例分析”这篇文章吧。

概述

MongoDB 安全主要包括以下 4 个方面

1、物理隔离

系统不论设计的多么完善,在实施过程中,总会存在一些漏洞。如果能够把不安全的使用方与 MongoDB 数据库做物理上的隔离,即通过任何手段都不能连接到数据库,这是最安全的防护。但,通常这是不现实的。一些重要的数据可能会保存下来,放置到物理隔离的机房中

2、网络隔离

许多公司的开发机处于内网环境中。即使数据库存在漏洞,外部环境也没有机会利用,因为根本无法访问内网

3、防火墙隔离

可以利用防火墙配置 IP 白名单,只允许某些 IP 访问数据库,也可以从一定程度上增加 MongoDB 的安全性

4、用户名密码鉴权

相对于以上 3 种方式,用户名密码鉴权机制是最常见的 MongoDB 安全措施。如果密码设置的比较简单,或者连接环境不是加密环境,很可能被第三方获取到用户名和密码,从而造成 MongoDB 数据库的危险

权限认证

mongodb 存储所有的用户信息在 admin 数据库的集合 system.users 中,保存用户名、密码和数据库信息。mongodb 默认不启用权限认证,只要能连接到该服务器,就可连接到 mongod。若要启用安全认证,需要更改配置文件参数 authorization,也可以简写为 auth。

然后,重启 mongod。查看日志文件,发现权限认证已经开启

但是,不使用用户名和密码依然可以连接到数据库。这是因为,我们还没有创建用户。在用户创建,并且开启权限认证之后,如果不使用用户名和密码将不能够连接到数据库

角色管理

在进行用户管理之前,首先要先了解角色管理

MongoDB 支持基于角色的访问控制(RBAC)来管理对 MongoDB 系统的访问。一个用户可以被授权一个或者多个:ref: 角色 roles 以决定该用户对数据库资源和操作的访问权限。在权限以外,用户是无法访问系统的

数据库角色在创建用户中的 role 参数中设置。角色分为内建角色和自定义角色

【内建角色】

MongoDB 内建角色包括以下几类

1、数据库用户角色

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

2、数据库管理员角色

dbAdmin:允许用户进行索引创建、删除,查看统计或访问 system.profile,但没有角色和用户管理的权限
userAdmin:提供了在当前数据库中创建和修改角色和用户的能力
dbOwner:  提供对数据库执行任何管理操作的能力。这个角色组合了 readWrite、dbAdmin 和 userAdmin 角色授予的特权。

3、集群管理角色

clusterAdmin :  提供最强大的集群管理访问。组合 clusterManager、clusterMonitor 和 hostManager 角色的能力。还提供了 dropDatabase 操作
clusterManager :  在集群上提供管理和监视操作。可以访问配置和本地数据库,这些数据库分别用于分片和复制
clusterMonitor :  提供对监控工具的只读访问,例如 MongoDB 云管理器和 Ops 管理器监控代理。hostManager :  提供监视和管理服务器的能力。

4、备份恢复角色

backup :  提供备份数据所需的能力,使用 MongoDB 云管理器备份代理、Ops 管理器备份代理或使用 mongodump
restore :  提供使用 mongorestore 恢复数据所需的能力 

5、所有数据库角色

readAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读权限  
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限  
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限  
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。

6、超级用户角色

root:提供对 readWriteAnyDatabase、dbAdminAnyDatabase、userAdminAnyDatabase、clusterAdmin、restore 和 backup 的所有资源的访问 

7、内部角色

__system :  提供对数据库中任何对象的任何操作的特权 

【自定义角色】

除了使用内建的角色之外,MongoDB 还支持使用 db.createRole() 方法来自定义角色

[注意] 只能在 admin 数据库中创建角色,否则会失败

role: 自定义角色的名称

privileges: 权限操作

roles:继承的角色。如果没有继承的角色,可以设置为空数组

use admin
db.createRole(
 {
 role:  myClusterwideAdmin ,
 privileges: [ { resource: { cluster: true }, actions: [  addShard  ] },
 { resource: { db:  config , collection:   }, actions: [  find ,  update ,  insert ,  remove  ] },
 { resource: { db:  users , collection:  usersCollection  }, actions: [  update ,  insert ,  remove  ] },
 { resource: { db:  , collection:   }, actions: [  find  ] }
 ],
 roles: [ { role:  read , db:  admin  }
 ]
 },
 { w:  majority  , wtimeout: 5000 }
)

用户管理

【创建用户】

使用 createUser 命令来创建用户

user: 用户名 pwd: 密码

customData: 对用户名密码的说明 (可选项)

roles: {role: 继承自什么角色类型,db: 数据库名称}

db.createUser({user:  ... ,pwd:  ... ,customDate: ... ,roles:[{role:  ... ,db:  ...}]})

1、创建管理员用户

MongoDB 没有默认管理员账号,所以要先添加管理员账号。切换到 admin 数据库,添加的账号才是管理员账号

在 admin 数据库中,添加一个用户并赋予 userAdminAnyDatabase 角色

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

 

2、重新登录数据库,并验证权限

如果 auth() 方法返回 0 则代表授权失败,返回 1 代表授权成功

db.auth()

3、添加普通用户

一旦经过认证的用户管理员,可以使用 db.createUser() 去创建额外的用户。可以分配 mongodb 内置的角色或用户自定义的角色给用户

[注意] 需要在 admin 数据库下进行认证,否则认证不成功

由于该用户只有读权限,所以会写入数据失败

4、创建超级用户

【查看用户】

db.system.users.find()

【删除用户】

db.dropUser()

MongoDB 安全及身份认证的示例分析

【添加用户权限】

db.grantRolesToUser()

给在 db1 数据库中只读的 x 用户,添加写权限

MongoDB 安全及身份认证的示例分析

【修改密码】

db.changeUserPassword()

MongoDB 安全及身份认证的示例分析

以上是“MongoDB 安全及身份认证的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3192字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)