zoukankan      html  css  js  c++  java
  • Mongodb安全认证

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

    一、单实例

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

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

      2.1  创建系统管理员用户

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

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

       use admin

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

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

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

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

    比如filedb库

    use filedb

    db.addUser("xzsp"," xzsp")

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

    db.auth("xzsp "," xzsp")

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

     

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

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

    方法如下:

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

    4.删除用户

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

    > use filedb

    switched to db test

    > db.removeUser("xzsp")

    5.修改用户密码

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

    例如:

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

    use filedb

    db.changeUserPassword("xzsp","xzsp@123")

    二、副本集认证

    副本集总体思路是用户名、密码和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

  • 相关阅读:
    fms服务器端呼叫客户端
    Linux C取整的方法
    fms客户端呼叫服务器端
    Tree Control DataProviders
    IE7下的css style display的兼容处理
    Maxthon,TheWorld,MyIE等多标签浏览器的Flash缓存问题
    Android深入浅出系列之实例应用—弹出消息Toast对象的使用纯文本方式(一)
    C#温故而知新学习系列之XML编程—Xml读取器XmlReader类(二)
    一步一个脚印学习WCF系列之WCF概要—生成元数据与代理(五)
    Eclipse 常用快捷键(转)
  • 原文地址:https://www.cnblogs.com/silentjesse/p/4676440.html
Copyright © 2011-2022 走看看