Mongodb安全认证在单实例和副本集两种情况下不太一样,单实例相对简单,只要在启动时加上 --auth参数即可,但副本集则需要keyfile。

一、单实例

1.启动服务(先不要加auth参数)

2.登陆后切换到admin库并添加管理员账号

2.1  创建系统管理员用户

默认条件下,超级管理员只能用于帐号管理,不能进行其他数据库操作,可以通过自己给自己授权实现。生产环境中的管理员,如果某个帐号包含了角色userAdminAnyDatabase或者userAdmin,就应该仅仅用于帐号和角色管理,不应该再授予别的角色了。

(1)我们首先就要建立一个超级管理员,然后再用超级管理员建立其他帐号:

use admin

db.addUser( { user: "superman", pwd: "talent", roles: [ "userAdminAnyDatabase" ] } )

(2)为帐号启用admin数据库认证,这样他就可以操作admin数据库了。
   db.auth("root", "123456")  //为账号授权
   db.system.users.find(); //查看当前已有的用户信息

(3)使用用刚才的超级帐号登录数据库(admin)mongo localhost:27017admin -u superman -p superman

现在,我们就可以为其他数据库添加用户了:

比如test库

use test

db.addUser("text","text")

授予这个用户的权限:(必须要,否则无法进行读写操作)

db.auth("text","text")

(4)现在可以用新用户登录并且操作test数据库了

3.关闭本地例外登录方式

一旦拥有了超级管理员,就可以考虑关闭本地例外方式登录了

方法如下:

重启数据库,启动时候加上--setParameter enableLocalhostAuthBypass=0即可,这样登录的话就必须要用账户认证了

4.删除用户

删除用户要针对某个数据库进行删除

> use test

switched to db test

> db.removeUser("superman11111")

5.修改用户密码

普通用户只能修改自己的密码,userAdmin角色帐号可以修改其他用户密码

例如:

mongo 192.168.69.54:40000/admin -u superman -p superman

use test

db.changeUserPassword("test","111")

二、副本集认证

副本集总体思路是用户名、密码和keyfile文件,keyfile需要各个副本集服务启动时加载而且要是同一文件,然后在操作库是需要用户名、密码

KeyFile文件必须满足条件:

(1)至少6个字符,小于1024字节

(2)认证时候不考虑文件中空白字符

(3)连接到副本集的成员和mongos进成的keyfile文件内容必须一样

(4)必须是base64编码,但是不能有等号

(5)文件权限必须是x00,也就是说,不能分配任何权限给group成员和other成员

注:win下可以通过记事本文件,输入任意内容,删除后缀名后使用,是否可行还在试验

以副本集sh0为例:(以下为linux系统操作,win系统出了创建keyfile文件不一样 其他相同)

1.生成keyFile文件:

在54上执行:

[root@54 ~]# openssl rand -base64 100 > /mongodb/scheme2/keyfile0 --文件内容采base64编码,一共100个字符

2.修改文件权限:

[root@54 ~]#chmod 600 /mongodb/scheme2/keyfile0

把生成的文件拷贝到副本集剩余各台机器上,存放的目录可以不一样,注意权限。

3.三台机器启动时指定--keyFile选项

numactl --interleave=all  mongod  --replSet sh0 --port 10000 \

--dbpath=/mongodb/scheme2/sh0/data --logpath=/mongodb/scheme2/sh0/logs/sh0.log \

--logappend --fork --directoryperdb --bind_ip=127.0.0.1,192.168.69.54 --nohttpinterface \

--keyFile=/mongodb/scheme2/keyfile0

这样,没有这个文件的机器就无法加入副本集,Sh1和sh2副本集的操作类似。

开启了keyFile,隐含就开启了auth,这个时候连接副本集就需要进行认证了,否则只能通过本地例外方式操作数据库。

在副本集中添加用户需要在服务未加--keyFile参数启动的情况加按照单实例方法添加(访问任意一个副本器操作,其他副本集会自动同步),账户添加、授权成功后重新加入keyFile启动服务,即可完成并使用。

三 副本集+分片环境下的认证

结合上面的两种环境的认证方式,可以实现副本集+分片环境中安全认证,需要注意以下几点

1.在分片集群环境中,副本集内成员之间需要用keyFile认证,mongos与配置服务器,副本集之间也要keyFile认证,集群所有mongod和mongos实例使用内容相同的keyFile文件。

2.进行初始化,修改副本集时,都从本地例外登录进行操作

3.由于启用了认证,需要建立一个管理员帐号,才能从远程登录。建立管理员帐户,利用管理员账户从远程登录后,需要建立一个可以操作某个数据库的用户,客户端就用这个用户访问数据库。

4.分片集群中的管理员帐号需要具备配置服务器中admin和config数据库的读写权限,才能进行分片相关操作

5.集群中每个分片有自己的admin数据库,存储了集群的各自的证书和访问权限。如果需要单独远程登录分片,可以按照3.2的办法建立用户

相关操作如下:

1.启动集群中的配置服务器,路由进程和副本集,每个进程都要指定KeyFile文件,而且每个进程的keyfile内容相同,详细操作见3.2。

2.初始化副本集。

3. 连接mongos,为集群建立管理员帐号和普通帐号,步骤如下;

(1)建立管理员帐号

管理员需要具备对集群中配置服务器的读写权限,这些权限包括:

建立新的普通管理员,用于客户端连接集群中的数据库;

分片相关权限,例如查看分片状态,启用分片,设置片键等操纵。

首先用本地例外方式登录,建立管理员帐号:

[root@54 ~]# mongo --port 30000

mongos> use admin

db.addUser( { user: "superman",

pwd: "superman",

roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase" ] } )

mongos> db.auth("superman","superman")

mongos> use config

switched to db config

mongos> db.addUser( { user: "superman",

pwd: "superman",

roles: [ "clusterAdmin","userAdminAnyDatabase","dbAdminAnyDatabase","readWriteAnyDatabase" ] } )

mongos> db.auth("superman","superman")

(2)用上面建立的管理员帐号登录mongos进程,对数据库(比如test)启用分片,设置集合片键。

(3)用管理员账户登录,建立新账户,让他可以读写数据库test

[root@54 ~]# mongo localhost:30000/admin -u superman -p superman

mongos> use test

switched to db test

mongos> db.addUser("test","test")

{

"user" : "test",

"readOnly" : false,

"pwd" : "a6de521abefc2fed4f5876855a3484f5",

"_id" : ObjectId("51fb5d4ecaa5917203f37f63")

}

mongos> db.auth("test","test")

1

(4)用新帐号test登录,操作数据库test

[root@54 ~]# mongo localhost:30000/test -u test -p test

MongoDB shell version: 2.4.4

connecting to: localhost:30000/test

> for( var i = 1; i < 100000; i++ ) db.test.insert( { x:i, C_ID:i } );

说明:为分片集群启用认证后,本地例外方式登录由于只具备admin数据库读写权限,无法进行分片操作。对本例来讲,添加分片,查看分片状态等操作都需要用superman帐号登录才行。执行数据库test操作用test帐号,这个帐号就是提供给客户端的帐号。

四 java操作中用户验证登陆

对于认证启动的服务,在java中操作在原有基础上增加一部db验证即可

DB db = mongo.getDB("dbname");

boolean auth = db.authenticate("name","password".toCharArray());

验证成功则返回true 否则返回false

注:db验证只能一次,如果成功后就不能继续验证,否则会报重复验证异常

然就就可按需求进行相关操作

Mongodb安全认证及Java调用的更多相关文章

  1. Java 调用 groovy 脚本文件,groovy 访问 MongoDB

    groovy 访问 MongoDB 示例: shell.groovy package db import com.gmongo.GMongoClient import com.mongodb.Basi ...

  2. Rsession让Java调用R更简单

    Rsession让Java调用R更简单 R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒. ...

  3. MONGODB(三)——Java操作Mongo

    相比于java调用MySqlApI来操作数据库,调用Mongo要简洁容易的多.通过一个简单的样例,很容易地就可以上手 一.导入Jar包 添加Monog支持Java的jar包,这里使用的是2.9.3 & ...

  4. Java 调用翻译软件实现英文文档翻译

    前言: 因最近要进行OCP的考试准备.看着大堆英文文档确实有些疼痛.又因文档内容有点大,又需要逐一去翻译 又很费时费力.于是 百度了一番,找到一些 可以使用Java来调用百度翻译软件的API( 注:( ...

  5. Java 调用Restful API接口的几种方式--HTTPS

    摘要:最近有一个需求,为客户提供一些Restful API 接口,QA使用postman进行测试,但是postman的测试接口与java调用的相似但并不相同,于是想自己写一个程序去测试Restful ...

  6. Mongodb安全认证

    Mongodb安全认证在单实例和副本集两种情况下不太一样,单实例相对简单,只要在启动时加上 --auth参数即可,但副本集则需要keyfile. 一.单实例 1.启动服务(先不要加auth参数) 2. ...

  7. PHP&Java 调用C#的WCF

    步骤一:用C#声明WCF [ServiceContract] public interface IService1 { [OperationContract] void DoWork(); [Oper ...

  8. JAVA调用R脚本

    0 前言R是一种非常方便易用的绘图.统计分析.ML算法设计方面的脚本语言.实际中有这样一种场景:算法工程师用R搭建了机器学习算法模型,想用于javaweb之中但是又不想重新用java写一遍算法模型,那 ...

  9. JAVA调用 keytool 生成keystore 和 cer 证书

    keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据: 密钥实体( ...

随机推荐

  1. hdoj2191 珍惜现在,感恩生活(01背包 || 多重背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路 由于每种大米可能不止一袋,所以是多重背包问题,可以直接使用解决多重背包问题的方法,也可以将 ...

  2. JS日期、时间 格式化转换方法

    Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth()+1, //月份 "d+& ...

  3. CAS和Synchronized

    CAS compareAndSwap 原理 CAS(V,E,N) V表示要更新的变量   E表示预期值   N表示新值 (当前值和底层值一样时候,才更新) 传入的值是工作内存,底层的值是主内存,工作内 ...

  4. poj-1251-最小生成树

    title: poj-1251-最小生成树 date: 2018-11-20 16:38:14 tags: acm 刷题 categories: ACM-最小生成树 概述 前段时间数据结构的课上提到了 ...

  5. Socket 编程之 TCP 实现

    前几天介绍了计算机网络的一些概念,并介绍了几个协议.下面就说说 Java 中的 Socket 编程,服务器和客户端是如何通信的呢? 首先要介绍一下 Socket ,我们知道在 TCP/IP 协议簇中, ...

  6. Stream中reduce()使用记录

    一.reduce()使用1.第一个参数是我们给出的初值,2.第二个参数是累加器,可以自己用实现接口完成想要的操作,这里使用Bigdecimal的add方法 3.最后reduce会返回计算后的结果 Bi ...

  7. dhcp 提示could not load neutron.agent

    错误日志如下: N版存在问题,其它版本不知道 解决方法(代码问题): /usr/lib/python2.7/site-packages/neutron/common/utils.py 在这个方法上(d ...

  8. Java设计模式GOF之工厂模式

    一.工厂模式(Factory) 1.实现了创建者和调用者的分离 2.应用场景 ①JDK中 Calendar 的 getInstance(): ②JDBC 的 Connection 对象的获取: ③Hi ...

  9. luoguP4036 [JSOI2008]火星人 平衡树+hash

    这个操作十分的复杂 但是可以拿平衡树维护 直接二分答案然后用$hash$值判断即可 复杂度$O(10000 * log^2 n + n \log n)$ #include <cstdio> ...

  10. Codeforces Round #355 (Div. 2) A. Vanya and Fence 水题

    A. Vanya and Fence 题目连接: http://www.codeforces.com/contest/677/problem/A Description Vanya and his f ...