mongodb副本集加分片集群安全认证使用账号密码登录

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值