mongodb密码和传统数据如mysql等有些区别: mongodb的用户名和密码是基于特定数据库的,而不是基于整个系统的。所以所有数据库db都需要设置密码。
对副本集执行访问控制需要配置两个方面:
1、副本集和共享集群的各个节点成员之间使用内部身份验证,可以使用密钥文件或x.509证书。密钥文件比较简单,本文介绍的也是使用密钥文件,官方推荐如果是测试环境可以使用密钥文件,但是正是环境,官方推荐x.509证书。原理就是,集群中每一个实例彼此连接的时候都检验彼此使用的证书的内容是否相同。只有证书相同的实例彼此才可以访问
2、使用客户端连接到mongodb集群时,开启访问授权。对于集群外部的访问。如通过可视化客户端,或者通过代码连接的时候,需要开启授权。
创建keyfile密钥文件
在keyfile身份验证中,副本集中的每个mongod实例都使用keyfile的内容作为共享密码,只有具有正确密钥文件的mongod或者mongos实例可以连接到副本集。密钥文件的内容必须在6到1024个字符之间,并且在unix/linux系统中文件所有者必须有对文件至少有读的权限。
可以用任何方式生成密钥文件例如:
openssl rand -base64 512 > mongodb.key
chmod 400 mongodb.key
第一条命令是生成密钥文件,第二条命令是使用chmod更改文件权限,为文件所有者提供读权限
将密钥复制到集群中的每台机器的指定位置
如:scp /data/mongodb/mongodb.key [email protected]:/data/mongodb
预先创建好一个管理员账号和密码然后将集群中的所有mongod和mongos全部关闭
账号可以在集群认开启认证以后添加。但是那时候添加比较谨慎。只能添加一次,如果忘记了就无法再连接到集群。建议在没开启集群认证的时候先添加好管理员用户名和密码然后再开启认证再重启
连接任意一台机器的mongos
mongo --port 23000
添加用户
use admin //注意一定要使用admin数据库
配置分片集群管理账号和客户端账号
db.createUser({user: "root",pwd: "password", roles: [ { role: "root", db: "admin" } ]})
创建用户自己的数据库的管理角色 这里需要到自己的数据库下面去执行 不然创建的用户会算到admin头上
use yourdatabase
#mongodb里use 就是建库语句了
db.createUser({user: "user",pwd: "password",roles: [ { role: "dbOwner", db: "yourdatabase" } ]})
举个只读帐号的例子
db.createUser({user: "xxxread",pwd: "xxxxx",roles: [ { role: "read", db: "xxxxx" } ]})
说明:可以先开启认证重启后再添加用户。但是只能在admin库添加一次,所以如果忘记了,或者权限分配不恰当就无法再更改,所以建议先添加用户再开启认证重启,并且集群不建议在每个单节点添加用户,并且建议单节点关闭初始添加账号的权限,详情见enableLocalhostAuthBypass)
role: "dbOwner"代表数据库所有者角色,拥有最高该数据库最高权限。比如新建索引等当账号管理员和超级管理员,可以为自己的数据库创建用户了。(坑)这时候一定,一定要切换到所在数据库上去创建用户,不然创建的用户还是属于admin。
如果是读写角色的话,权限设置为role: "readWrite"
然后依次连接到每一台机器上把 mongos mongod mongconfig 关掉
然后删除每个mongod实例存储数据存储路径下面的mongod.lock(如果后面启动不报错可以不处理)
配置config server副本集进行密码认证
在配置里添加一行
keyFile = /data/mongo-4.2.8/mongodb.key
auth = true
每台config server都添加好了之后就重启全部config server
一次重启一个config server,先启动secondary。所有的secondary 节点重新启动完成后,最后需要重新启动primary
shard 同理
然后在mongos里添加一行
keyFile = /data/mongo-4.2.8/mongodb.key
mongos没有 auth这个选项,但是依然需要key验证
重启
测试一下 大功告成
连接mongodb集群
普通用户连接MongoDB实例
mongo --host 10.10.18.11 -u "myTester" --authenticationDatabase "test" -p'xyz123'
命令行
mongo --port 20000 (我这20000端口是mongos)
use admin
db.auth("your account","your password")
如果返回1表示连接成功,然后你就可以访问自己的数据库啦~!如use testDB
删除用户
删除用户必须由账号管理员来删,所以,切换到admin角色
use admin
db.auth("admin","password")
删除单个用户
db.system.users.remove({user:"XXXXXX"})
删除所有用户
db.system.users.remove({})
查看服务器上的数据库
> show dbs
查看当前数据库中的所有集合
> show collections
删除数据库
use进库之后
> db.dropDatabase()