1. 先创建帐号哦, 再开启认证
use admin
db.createUser(
{
user:"zcyroot",
pwd:"zcyroot",
roles:[{role:"root",db:"admin"}]
}
)
角色列举,root角色是超级帐号, 必须在admin库中登录,就可以切换到任意库进行操作了
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
2. 创建帐号 (重要)
1> 由于mongodb用户的账号是跟着数据库走的, 在不同库建一样的帐号
2> 分片,副本集 也需要每一个片都要建帐号
建议提前把帐号全部建好后, 再开启mongo的auth ,
或者至少先创建的root角色的帐号, 然后这个帐号就可以在不同库创建其他帐号了
继续操作语法如下:
由于mongodb用户的账号是跟着数据库走的, 在不同库建一样的帐号
user admin
db.auth('zcyroot','zcyroot')
1. 创建一个帐号, 具备对 testdb 库 读写权限,创建表,索引等权限
use testdb;
db.createUser(
{ user: "dba",pwd: "dba",
roles: [ { role: "readWrite", db: "testdb"},
{ role: "dbAdmin", db: "testdb"}
]
})
2. 查看用户
>use testdb;
>show users;
显示内容如上信息
>use admin
>show users
显示没有dba这个用户
因为帐号是跟着数据库走的, 由于1中在testdb创建的db,所以在admin库中查不到dba用户
3. 追加权限
use testdb;
db.grantRolesToUser("dba",[{ role: "userAdmin", db: "testdb"}])
结果:
{ role: "readWrite", db: "testdb"},
{ role: "dbAdmin", db: "testdb"}
{ role: "userAdmin", db: "testdb"}
4. 替换权限
use testdb;
db.updateUser("zcy",{"roles":[ { role: "dbAdmin", db: "testdb" }]})
结果:{ role: "dbAdmin", db: "testdb"}
5. 删除权限
use testdb;
基于3的结果
db.revokeRolesFromUser("zcy",[{ role: "readWrite", db: "testdb"}])
结果:
{ role: "dbAdmin", db: "testdb"}
{ role: "userAdmin", db: "testdb"}
此时zcy的用户. 无法find 表 ,提示没有权限
6. 修改用户密码
use testdb;
db.auth('zcy','zcy');
db.changeUserPassword('zcy','111');
7. 删除用户
db.dropUser("zcy")
8. 查看全局所有账户
use admin
db.auht('zcyroot','zcyroot')
db.system.users.find().pretty() -- 显示所有的帐号
9. 当前库下的账户
use admin
db.auht('zcyroot','zcyroot')
show users; -- 当前库下admin库的帐户
use testdb;
show users; -- 当前库下testdb库的帐户
DATAX 采集mongo 数据, 需要有admin库的权限, 同时需要对业务数据库的读写权限,因此创建帐号:
use admin
db.auth('zcyroot','zcyroot') -- 最高权限帐号, 但是必须在admin库中登录
db.createUser( { user: "dataxuser",pwd: "dataxuser",roles: [ { role: "root", db: "admin" }]}) -- 对admin库有最高权限
use testdb; --- 业务库
db.createUser( { user: "dataxuser",pwd: "dataxuser",roles: [ { role: "readWrite", db: "testdb" }]}) -- 在testdb库建同名用户dataxuser, 有读写权限
2、生成密钥文件
在集群主机中任何一台机器上执行:
openssl rand -base64 756 > /data/mongodb/testKeyFile.file
chmod 400 /data/mongodb/keyfile/testKeyFile.file
第一条命令是生成密钥文件,第二条命令是使用chmod更改文件权限,为文件所有者提供读权限
将密钥testKeyFile.file复制到集群中的每台机器的指定位置
一定要保证密钥文件一致。文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置
3. 修改配置
mongos比mongod少了authorization:enabled的配置。原因是,副本集加分片的安全认证需要配置两方面的,副本集各个节点之间使用内部身份验证,用于内部各个mongo实例的通信,只有相同keyfile才能相互访问。所以都要开启keyFile: /data/mongodb/testKeyFile.file
然而对于所有的mongod,才是真正的保存数据的分片。mongos只做路由,不保存数据。所以所有的mongod开启访问数据的授权authorization:enabled。这样用户只有账号密码正确才能访问到数据
在集群所有主机上的config server,shard1,shard2,shard3,sharen 都加入下面的配置文件
security:
keyFile: /data/mongodb/testKeyFile.file
authorization: enabled
或者:
#开启权限验证
auth=true
keyFile=/data/mongodb/testKeyFile.file
依次在每台机器上的mongos配置文件中加入下面一段配置
security:
keyFile: /data/mongodb/testKeyFile.file
或者
#指向keyFile
keyFile=/usr/local/mongodb/key/keyFile.key
4. 停止/启动服务
1. 停服务
依次登录mongos、mongod节点、mongo-cfg节点,然后执行:
use admin
db.shutdownServer()
或者执行
killall mongos
killall mongod
或者 ps 出来, kill -9
我先停止了 mongos
然后分片的服务,片1全部停止, 在停止片2,...
最后停止config
2. 启动服务 (因为我的认证配置在了配置文件里面,所以启动命令不需要再加认证的参数 (例如--auth等))
mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos
以此启动所有集群的config. 再启动所有集群share1. 再启动所有集群share2,再启动所有集群share3, 最后启动所有集群mongos
mongod -f /data/mongodb/config.conf
mongod --config /data/mongodb/shard1.conf --wiredTigerCacheSizeGB=50 --slowms=200 --profile=1
mongod --config /data/mongodb/shard2.conf --wiredTigerCacheSizeGB=50 --slowms=200 --profile=1
mongod --config /data/mongodb/shard3.conf --wiredTigerCacheSizeGB=50 --slowms=200 --profile=1
mongos -f /data/mongodb/mongos.conf
5. 链接
mongo ip:port
use admin
db.auth("your account","your password")
java链接
mongodb://user:passwd@ip1:27017,ip2:27017,ip3:27017/dbname