Mongo开启安全认证

之前安装Mongo为了省事儿,就没有开启keyFile和sequrity,结果系统上线,被运维组做安全扫描,扫出了安全漏洞,结果还得开启认证。事实再次印证,出来混迟早得还,所以开始就不要为了省事儿,偷懒少做工作了,后期还得带着风险补回来,下面来说说安全认证这点事儿吧

为什么要开启安全认证

如果不开启的话,mongo只要有一个admin用户,就会不用输入任何用户名密码登陆进系统,可以查看到数据库中的数据,Mongo在安装后就会有一个默认的用户,在不输入任何用户名和密码时,都可以连接数据库并获取其中的所有数据,很流氓吧。如下图所示:
在这里插入图片描述
在这里插入图片描述
看看,如果不开启Mongo的安全认证,只要对方知道你的数据库IP和端口,就可以随间拿到你的数据了。所以对于生产环境DB来讲,开启其它全认证还是很有必要的。下面来说说怎么开启它。

如何开启安全认证

只需要在配制文件中进行如下配制就可以
下面配制中的
security:
authorization: "enabled"是关键,如果不需要开启安全认证,可以把这个注掉,默认为disable

storage:
    dbPath: '/data/db'
systemLog:
    destination: file
    path: '/data/mongo/mongo.log'
    logAppend: true
processManagement:
    fork: true
net:
    bindIp: 127.0.0.1,192.168.1.223
    port: 27017
security:
    authorization: "enabled"
#operationProfiling:
#    mode: "slowOp"


分片集群布署需要增加Keyfile

如果你的数据库是多台分片或集群,那么在集群间做数据复制时,还需要增加keyFile的认证。但如果是单台Mongo,就不需要做此步操作了,如果集群之前不开启keyFile,冒似是每次登陆副本集做任何操作都需要做用户授权,大家可以试下如果不加keyFile的直观现象。那如何开启KeyFile呢,需要以下几步

生成keyFile

openssl rand -base64 745 > /data/mongo/mongodb-keyfile

文件授权,权限为400或600都可以

chmod 400 /data/mongo/mongodb-keyfile

配制文件修改

storage:
    dbPath: '/data/db'
systemLog:
    destination: file
    path: '/data/mongo/mongo.log'
    logAppend: true
processManagement:
    fork: true
net:
    bindIp: 127.0.0.1,192.168.1.188
    port: 27017
replication:
    replSetName: 'shard-a'
#sharding:
#    clusterRole: shardsvr
security:
    keyFile: '/data/mongo/mongodb-keyfile'
    authorization: 'enabled'
#operationProfiling:
#    mode: 'slowOp'

keyFile传递到集群中其它DB

注:如果是分片的话,建议配制和分片还有副本集都用相同的keyFile,免得配不好容易出错,另外路由的配制,只需要开启 authorization: 'enabled’即可,不需要配制keyFile。
接下来重启DB即可了

安全认证开启后的用户配制

DB重启后,我发现原来创建的应用用户无法访问数据库了,一直报授权问题,给当前用户用以下命令授权,扔无法访问

db.getSiblingDB("admin").auth("admin", "admin" )
db.getSiblingDB("backend").auth("backend", "backend" )

后来尝试在admin数据库创建一个system用户,该用户拥有root角色,再用system用户授权,解决了无法访问数据库中数据问题。

db.createUser(
{
user:"system",
pwd:"C4T2s~BwRE111",
roles:[{role:"root",db:"admin"}]
}
)
#db.auth('system',C4T2s~BwRE) 
db.grantRolesToUser( "admin", [ { role: "readWrite", db: "backend" } ] )
db.grantRolesToUser("backend", [{ role: "readWrite", db: "backend" } ] )

这样admin和backend用户就都有了对业务库backend的访问权限了

如何做用户授权

把sequrity打开后,如果提示未授权需要执行以下两句
db.getSiblingDB("admin").auth("admin", "C4T2s~BwRE111" ) 
db.getSiblingDB("admin").auth("system", "C4T2s~BwRE111" ) 
db.getSiblingDB("backend").auth("backend", "KrBCmz$x1P111" ) 

用户具有的角色说明

  • 数据库用户角色(Database User Roles)
read : 授权User只读数据的权限,允许用户读取指定的数据库
readWrite  授权User读/写数据的权限,允许用户读/写指定的数据库
  • 数据库管理角色(Database Admininstration Roles)
dbAdmin:在当前的数据库中执行管理操作,如索引的创建、删除、统计、查看等
dbOwner:在当前的数据库中执行任意操作,增、删、改、查等
userAdmin :在当前的数据库中管理User,创建、删除和管理用户。
  • ​​​​​​​备份和还原角色(Backup and Restoration Roles)​​​​​​​
backup
restore
  • 跨库角色(All-Database Roles)
readAnyDatabase:授权在所有的数据库上读取数据的权限,只在admin 中可用
readWriteAnyDatabase:授权在所有的数据库上读写数据的权限,只在admin 中可用
userAdminAnyDatabase:授权在所有的数据库上管理User的权限,只在admin中可用
dbAdminAnyDatabase: 授权管理所有数据库的权限,只在admin 中可用
  • 集群管理角色(Cluster Administration Roles)
clusterAdmin:授权管理集群的最高权限,只在admin中可用,可以用mongostat
clusterManager:授权管理和监控集群的权限
clusterMonoitor:授权监控集群的权限,对监控工具具有readonly的权限
hostManager:管理server
  • 超级角色(super master Roles)
root :超级账户和权限,只在admin中可用
``

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值