zoukankan      html  css  js  c++  java
  • Mongodb安全认证及Java调用

    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验证只能一次,如果成功后就不能继续验证,否则会报重复验证异常

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

  • 相关阅读:
    The Quad
    将OrCAD Capture CIS的设计文件(.dsn)导入到PADS Logic VX.2.3
    OrCAD Capture CIS 16.6 将版本16.6的设计文件另存为版本16.2的设计文件
    Eclipse IDE 添加jar包到Java工程中
    PADS Logic VX.2.3 修改软件界面语言
    切换Allegro PCB Editor
    Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件
    Allegro PCB Design GXL (legacy) 设置自动保存brd文件
    Could not create an acl object: Role '16'
    windows 下apache开启FastCGI
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4426023.html
Copyright © 2011-2022 走看看