之前安装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中可用
``