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")
授予这个用户的权限:(必须要,否则无法进行读写操作)
(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验证只能一次,如果成功后就不能继续验证,否则会报重复验证异常
然就就可按需求进行相关操作
部分参考 http://www.91linux.com/html/article/database/MongoDB/2013/0923/22679.html
相关参考 http://www.linuxidc.com/Linux/2012-06/63588.htm
http://www.dotblogs.com.tw/newmonkey48/archive/2012/12/05/85431.aspx
http://www.cnblogs.com/-clq/archive/2012/03/02/2376972.html
http://blog.csdn.net/lzy_1515/article/details/7027474
http://www.blogjava.net/anchor110/articles/385978.html
http://www.oschina.net/code/snippet_35115_2888
http://blog.sina.com.cn/s/blog_8413c1e201019l4e.html
http://www.linuxidc.com/Linux/2013-07/86926.htm
http://www.cnblogs.com/zcy_soft/archive/2011/04/09/2010578.html
相关推荐
目前,Java驱动通常使用的是MongoDB Java Driver,可以在Maven仓库中找到对应的依赖,例如: ```xml <groupId>org.mongodb <artifactId>mongodb-driver-sync <version>4.3.0 ``` 接下来,我们需要配置MongoDB...
MongoDB 是一种流行的开源、高性能、无模式的文档型数据库,设计用于处理大规模数据并提供高可用性和可扩展性。...通过Java调用,开发人员可以充分利用MongoDB的功能,构建高效、可扩展的应用程序。
在Java中使用MongoDB,首先需要安装并配置对应的驱动版本,以确保与正在运行的MongoDB服务器兼容。 1. MongoDB驱动介绍: MongoDB提供了多种语言的驱动程序,Java驱动是其中之一。它基于Java 6及更高版本,实现了...
为了方便开发者使用 Java 进行开发,MongoDB 提供了官方的 Java 驱动程序(MongoDB Java Driver),使得 Java 应用能够轻松地与 MongoDB 数据库进行交互。 #### 二、基本概念与连接 在开始使用 MongoDB Java Driver...
### MongoDB Java调用示例详解 #### 一、概述 本文档主要介绍如何在Java环境中使用MongoDB进行数据库操作的基本方法。通过一个简单的Java程序,我们将会了解到如何连接MongoDB服务器、创建数据库、插入文档、查询...
12. **安全性**:MongoDB支持身份验证和权限控制,Java驱动API可以进行用户认证,并在连接时指定角色和数据库。 总的来说,MongoDB Java驱动API是一个功能丰富的工具,它提供了对MongoDB所有特性的全面支持,使得...
以上是 MongoDB Java API 的基本使用教程,包括连接管理、对象保存与查询、认证以及文档操作等方面的内容。这些知识点涵盖了大部分常见的 MongoDB 应用场景,可以帮助初学者快速上手并熟练掌握如何使用 Java 驱动...
5. **安全性**:MongoDB 3.4.2版本增强了安全性,Java驱动程序支持身份验证、授权和SSL/TLS连接,以确保数据的安全传输。开发者需要配置MongoDB实例的访问控制,并在Java代码中设置相应的认证参数。 6. **副本集和...
在实际开发中,你可能会遇到如性能优化、连接池管理、异常处理、安全认证等方面的问题。例如,使用`MongoClientOptions`配置连接池大小,或者使用`MongoCredential`进行用户验证。此外,`MongoDB Java驱动程序`的...
我们将涵盖MongoDB的Linux安装、MongoVUE客户端的使用以及Java API与MongoDB的交互。 【标签】: "java", "mongodb" **一、Linux安装MongoDB** 1. **下载安装包**: 首先,你需要从MongoDB官网下载适用于Linux的...
总之,Java连接MongoDB涉及的主要知识点包括MongoDB的Java驱动程序使用、数据库和集合操作、数据的CRUD(创建、读取、更新、删除)以及连接管理。通过理解这些概念和实践,开发者能够有效地在Java应用中集成MongoDB...
MongoDB是一种流行的开源、分布式文档数据库,常用于处理大规模数据。在Java开发中,与MongoDB的...记住,实践是学习的最佳途径,动手尝试这些示例,结合MongoDB_Demo中的代码,你会更快掌握MongoDB与Java的结合使用。
在开发过程中,确保遵循最佳实践,如适当管理数据库连接,使用安全的认证方式,以及合理设计数据模型,以充分利用MongoDB的灵活性和性能优势。 总之,MongoDB 3.0结合Java驱动,为Java开发者提供了强大的文档数据库...
6. **安全认证**:支持MongoDB的多种认证机制,如SCRAM-SHA-1和MONGODB-CR,确保数据库的安全访问。 7. **源码包**:提供的`mongo-java-driver-2.11.0-sources.jar`包含了源代码,这对于开发者进行调试和学习驱动的...
Java 是广泛使用的编程语言,MongoDB 提供了 Java 驱动程序,使得开发者可以轻松地在 Java 应用程序中操作 MongoDB 数据库。在本文中,我们将详细探讨如何使用 Java MongoDB 驱动程序来获取集合。 首先,我们需要...
通过这三个JAR文件,开发者可以构建出功能完备、高效且安全的Java应用,充分利用MongoDB的灵活性和高性能。在实际项目中,开发者还需要结合Spring Data MongoDB或者其他的ORM框架,以简化代码并提高开发效率。
Java驱动程序提供了配置认证的接口,使开发者能安全地连接到受保护的MongoDB集群。 10. **分片和复制集**:MongoDB支持数据分片和复制集,以提高可扩展性和高可用性。Java驱动程序提供了与这些特性交互的API,允许...
为了更好地理解和使用这个API,你可以查阅MongoDB Driver for Java 2.5.3的CHM文件,其中详细解释了每个类、接口和方法的功能和用法。这将帮助你编写出高效且健壮的MongoDB应用程序。在实际开发中,理解如何正确处理...
在Java开发中,我们通常使用MongoDB的Java驱动程序来与数据库进行交互,包括插入文档。以下是对【标题】"MongoDB Java插入文档.pdf"和【描述】中所述知识点的详细解释: 1. **MongoDB Java驱动程序**: MongoDB...
10. 安全性:了解如何设置访问控制、角色和权限,以确保数据库的安全性,是使用MongoDB的重要部分。 总之,MongoDB 2.2的Java API提供了强大且易用的工具,让开发者能够充分利用MongoDB的功能。尽管此版本相对较旧...