`
LJ你是唯一LT
  • 浏览: 238712 次
社区版块
存档分类
最新评论

mongodb的用户认证

阅读更多
MongoDB:用户认证 



       MongoDB 安装后默认不启用认证,也就是说在本地可以通过 mongo 命令不输入用户名密码,
直接登陆到数据库,下面介绍下启用 mongodb 用户认证,详细如下:

      启用 mongodb 认证只需要在启动 mongod 服务时配置 auth 参数成 'true'即可可 ,在配置
参数前先添加超级用户。


一 启用认证
--1.1 增加管理用户

> use admin;
switched to db admin
> db.addUser('root','123456');
{
        "user" : "root",
        "readOnly" : false,
        "pwd" : "34e5772aa66b703a319641d42a47d696",
        "_id" : ObjectId("50ad456a0b12589bdc45cf92")
}

> db.system.users.find();
{ "_id" : ObjectId("50ad6ecda579c47efacf811b"), "user" : "root", "readOnly" : false, "pwd" : "34e5772aa66b703a319641d42a47d696" }

   备注:在 admin 库中增加的用户为超级用户,权限最大,可以访问所有库。


--1.2 增加普通用户

> use skytf;
switched to db skytf
> db.addUser('skytf','skytf');
{
        "user" : "skytf",
        "readOnly" : false,
        "pwd" : "8c438fc9e2031577cea03806db0ee137",
        "_id" : ObjectId("50ad45dd0b12589bdc45cf93")
}

> db.system.users.find();
{ "_id" : ObjectId("50ad6ef3a579c47efacf811c"), "user" : "skytf", "readOnly" : false, "pwd" : "8c438fc9e2031577cea03806db0ee137" }

  
--1.3 配置 auth 参数
vim /database/mongodb/data/mongodb_27017.conf,增加 " auth = true ” 参数

fork = true
bind_ip = 127.0.0.1
port = 27017
quiet = true
dbpath = /database/mongodb/data/
logpath = /var/applog/mongo_log/mongo.log
logappend = true
journal = true
auth = true
    备注:增加 “auth = true” 配置。


--1.4 重启 mongodb

[mongo@redhatB data]$ ps -ef | grep mongo
root     10887 10859  0 04:47 pts/0    00:00:00 su - mongo
mongo    10889 10887  0 04:47 pts/0    00:00:00 -bash
root     10984 10964  0 04:53 pts/1    00:00:00 su - mongo
mongo    10986 10984  0 04:53 pts/1    00:00:00 -bash
mongo    12749     1  0 07:54 ?        00:00:01 mongod -f /database/mongodb/data/mongodb_27017.conf
mongo    13035 10986 13 08:21 pts/1    00:00:00 ps -ef
mongo    13036 10986  0 08:21 pts/1    00:00:00 grep mongo
[mongo@redhatB data]$ kill 12749

[mongo@redhatB data]$ mongod -f /database/mongodb/data/mongodb_27017.conf
forked process: 13042
all output going to: /var/applog/mongo_log/mongo.log

  


--1.5 测试 skytf 帐号

[mongo@redhatB data]$ mongo 127.0.0.1/skytf -u skytf -p
MongoDB shell version: 2.2.1
Enter password:
connecting to: 127.0.0.1/skytf
Error: { errmsg: "auth fails", ok: 0.0 }
Thu Nov 22 08:23:11 uncaught exception: login failed
exception: login failed
[mongo@redhatB data]$ mongo 127.0.0.1/skytf -u skytf -p
MongoDB shell version: 2.2.1
Enter password:
connecting to: 127.0.0.1/skytf

> show collections;
system.indexes
system.users
test_1
test_2
test_3
test_4
things
things_1

> db.test_5.find();
{ "_id" : ObjectId("50ad7177d114dcf18a8bb220"), "id" : 1 }

> show dbs;
Thu Nov 22 08:24:03 uncaught exception: listDatabases failed:{ "errmsg" : "need to login", "ok" : 0 }

> use test;
switched to db test

> show collections;
Thu Nov 22 09:01:32 uncaught exception: error: {
        "$err" : "unauthorized db:test ns:test.system.namespaces lock type:0 client:127.0.0.1",
        "code" : 10057

  
    备注:从上看出, skytf 用户的认证已生效,并且能查看数据库 skytf 里的集合,但不能执行 “show dbs”
              命令;并且能连接数据库 test ,但没有权限执行“show collections” 命令。


二 切换用户
--2.1 在普通库中切换成 root 用户

> use test;
switched to db test
> db.auth('root','123456');db.auth('root','123456');
Error: { errmsg: "auth fails", ok: 0.0 }
0

      备注:在普通库中切换成超级用户失败,超级用户需要在 admin 库中切换才能生效。
  

--2.2 在 admin 库中切换成 root 用户

> use admin;
switched to db admin


> db.auth('root','123456');
1

      备注:在 admin 库中切换成超级用户成功。
 


三 新增只读帐号
--3.1 增加只读帐号

> db.addUser('skytf_select','skytf_select',true);
{
        "user" : "skytf_select",
        "readOnly" : true,
        "pwd" : "e344f93a69f20ca9f3dfbc40da4a3082",
        "_id" : ObjectId("50ad71c7d114dcf18a8bb221")
}
> db.system.users.find();db.system.users.find();
{ "_id" : ObjectId("50ad6ef3a579c47efacf811c"), "user" : "skytf", "readOnly" : false, "pwd" : "8c438fc9e2031577cea03806db0ee137" }
{ "_id" : ObjectId("50ad71c7d114dcf18a8bb221"), "user" : "skytf_select", "readOnly" : true, "pwd" : "e344f93a69f20ca9f3dfbc40da4a3082" }

    备注:只需在 addUser 命令中增加第三个参数,并指定为“true” ,即可创建只读帐号。  


--3.2 测试

[mongo@redhatB data]$ mongo 127.0.0.1/skytf -u skytf_select -p
MongoDB shell version: 2.2.1
Enter password:
connecting to: 127.0.0.1/skytf
> show collections;
system.indexes
system.users
test_1
test_2
test_3
test_4
test_5
things
things_1

> db.test_5.find();
{ "_id" : ObjectId("50ad7177d114dcf18a8bb220"), "id" : 1 }
{ "_id" : ObjectId("50ad724ed114dcf18a8bb222"), "id" : 2 }

> db.test_5.save({id:3});
unauthorized

  
    备注:以只读帐号 skytf_select 登陆库 skytf,有权限执行查询操作,没有权限执行插入操作;



四 附 命令参考

--4.1 db.addUser
Parameters:

username (string) – Specifies a new username.
password (string) – Specifies the corresponding password.
readOnly (boolean) – Optional. Restrict a user to read-privileges only. Defaults to false.


Use this function to create new database users, by specifying a username and password as arguments
to the command. If you want to restrict the user to have only read-only privileges, supply a true third
argument; however, this defaults to false。


--4.2 db.auth
Parameters:

username (string) – Specifies an existing username with access privileges for this database.
password (string) – Specifies the corresponding password.

Allows a user to authenticate to the database from within the shell. Alternatively use mongo
--username and --password to specify authentication credentials.


五 参考
http://docs.mongodb.org/manual/tutorial/control-access-to-mongodb-with-authentication/
http://docs.mongodb.org/manual/administration/security/
http://blog.163.com/dazuiba_008/blog/static/36334981201110311534143/




-----以上是单个mongodb的用户认证,下面是集群的

7、登录mongos添加用户:
   use admin
   db.addUser("<user>","<password>")
  db.addUser("<user>","<password>",true) //添加只读用户

8、关闭三台机器的全部mongod,mongos:
  sudo killall mongod
  sudo killall mongos
9、生成keyfile:(每个进程的key file都保持一致)
  openssl rand -base64 753 >keyfile
  将生成的keyfile 拷贝到mongod/mongos 进程对应的文件夹
  并执行语句更改权限:sudo chmod 600 keyfile
  使用--keyFile参数指定前面生成的keyfile文件,重启三台机器全部mongod,mongos进程 

  在serverA上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_1/db --logpath=/data/mongo/s1_1/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_1/keyfile

  在serverB上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_2/db --logpath=/data/mongo/s1_2/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_2/keyfile

  在serverC上:mongod --replSet s1 --port 27020 --dbpath=/data/mongo/s1_3/db --logpath=/data/mongo/s1_3/log/mongo.log --logappend --fork --keyFile  /data/mongo/s1_3/keyfile

  

  在serverA上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_1/db --logpath=/data/mongo/s2_1/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_1/keyfile

  在serverB上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_2/db --logpath=/data/mongo/s2_2/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_2/keyfile

  在serverC上:mongod --replSet s2 --port 27021 --dbpath=/data/mongo/s2_3/db --logpath=/data/mongo/s2_3/log/mongo.log --logappend --fork --keyFile  /data/mongo/s2_3/keyfile

  

  在serverA上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile

  在serverB上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile

  在serverC上:mongod  -fork --configsvr --dbpath /data/mongo/config/db --port 27018 --logpath /data/mongo/config/log/mongo.log --fork --keyFile  /data/mongo/config/keyfile



  在serverA上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile

  在serverB上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile

  在serverC上:mongos -fork --logpath /data/mongo/route/log/mongo.log --configdb ServerA:27018,ServerB:27018,ServerC:27018 --port 27017 --keyFile  /data/mongo/route/keyfile

  完毕!



------------------------
安全与认证
如果开启了安全性检查,则只有数据库认证用户才能执行读或写操作。
mongodb会将普通的数据作为admin数据库处理,admin数据库中的用户被视为超级用户。
认证之后,管理员可以读写所有数据库,执行特定的管理命令,如listDatabase和shutdown
mongos> use admin
switched to db admin
mongos> db.addUser("root","abc")
{
"user" : "root",
"readOnly" : false,
"pwd" : "9ebcc685b65db596c75fd6128803440f",
"_id" : ObjectId("54213c293a41399ef4a3d60e")
}
use test
mongos> db.addUser("test_user","def");
{
"user" : "test_user",
"readOnly" : false,
"pwd" : "2d7ad5ae62d41e5253c32831a63079b1",
"_id" : ObjectId("54213c5f3a41399ef4a3d60f")
}
mongos> db.addUser("read_only","ghi",true);
{
"user" : "read_only",
"readOnly" : true,
"pwd" : "67e8e24078ad4a487c54cb16527af13a",
"_id" : ObjectId("54213c7d3a41399ef4a3d610")
}
mongos> db.system.users.find();
{ "_id" : ObjectId("54213c293a41399ef4a3d60e"), "user" : "root", "readOnly" : false, "pwd" : "9ebcc685b65db596c75fd6128803440f" }
{ "_id" : ObjectId("54213c5f3a41399ef4a3d60f"), "user" : "test_user", "readOnly" : false, "pwd" : "2d7ad5ae62d41e5253c32831a63079b1" }
{ "_id" : ObjectId("54213c7d3a41399ef4a3d610"), "user" : "read_only", "readOnly" : true, "pwd" : "67e8e24078ad4a487c54cb16527af13a" }
上面添加了管理员root,在test数据库添加了两个普通账号,其中一个有只读权限,不能对数据库写入
调用addUser必须有相应数据库的写权限。

addUser不仅能添加用户,还能修改用户口令或者只读窗台。
重启服务器,加入--auth命令行选项,开启安全检查。跟刚刚一样的,需要

[root@viptest2 ~]# openssl rand
Usage: rand [options] num
where options are
-out file             - write to file
-engine e             - use engine e, possibly a hardware device.
-rand file:file:... - seed PRNG from files
-base64               - base64 encode output
-hex                  - hex encode output
[root@viptest2 ~]# openssl rand -base64 753
WYPee/+hqZZ+SLJuTtupYklSJRGWS0sH7yZ1qxSa9ErBsriyHRsaKVCKN7Ngu/BS
B0D1QKyBGZ3A+JXugLu+n7d319AKwQkX+6SBff1KS4KWL6biaX9oURuQMgb6HUty
e6ep4kFqpt2zkE6SqY8Rg7Cuouhs/CQsrgpU7af5CfSLXMBGED284wKaE+wh7yls
QVznZCoIjR2mrb68P0r4bgivynRyRq49TgdxmiQmXCXKXNNyVPG8MjzWtJaTazR6
/lvSfDWqk+VDC0b97MFEdPEsQiLNa6EAv8xqN9aycaJH+bQANtysala0wxsqDv8q
YuT9EmnTJM6F5L3Z8PK7EZKtSOlXnJaEX2jvLfwpYNTH4nhHkQV9KZJXD6lGx7Wn
ifnqIl3pVyxDBGDe9PBmgeh0+sgaK8jHP386h4gU5MkX/bEHDV8TL60kU+cARJ0C
xeHNy8IQer1c9E5n1D6iT9JqdidSgfKWOYGB7l937hTjdVQG9ektxGGM39Y04ObV
FpB87QZFoVhOobb/TTbV5tl64rmjBlN0bhH0kDmBvIvFT3GfTyYa92+1QxAAXC4k
3ge0fDKoocxw0LmQdJpE7n6Zn8HBzC20EzxJ4yqCmY1kfhRjS1X6zMk1Xi2nOoIY
myGqEvkrkWybBWh83WSSlhMtBgvFzgo8rnT+ru/r3BaFXkRRM1DX1Cvw5G9+qG8i
7AvJdYZpheqLR71GFjZc+PSRiBD+PKlkZJjYe8fJM9VXO/ZZGcShasrr+A3rHLb8
j92AmLbIU8nZwW54gcs8lZC0ufOrhauxNhCay7k8YXhxqr/+3HQvAH8OZYWRZfdG
gXMo0fOk8HsmuahMN9U3TiAmBoh6MhOHyGefJF8O7g6iP0TkQxWWDQLuUqWJZnzu
lLwK8Na4B7gnoHlRt7lWBYLuUM1PTcKF7RtVuARkvlmE6FsrRIpc5RL8k25Ed67H
NSZ7PpP2xLmHvC27CBCw5A9gux3r

在testdb中创建一个普通用户
mongos> use testdb
switched to db testdb
mongos> db.addUser('putong','putong');
{
"user" : "putong",
"readOnly" : false,
"pwd" : "9bef249456e43c9b819a4ff08f66c744",
"_id" : ObjectId("542142ea2f4e2dc152cf19c0")
}
mongos> db.system.users.find();
{ "_id" : ObjectId("542142ea2f4e2dc152cf19c0"), "user" : "putong", "readOnly" : false, "pwd" : "9bef249456e43c9b819a4ff08f66c744" }


[root@testvip1 ~]# openssl rand -base64 753 >keyfile1
[root@testvip1 ~]# chmod 600 keyfile1
[root@testvip1 ~]# scp keyfile1 192.168.12.107:/root
keyfile1                                                                                                                                           100% 1020     1.0KB/s   00:00   
[root@testvip1 ~]# mongod --dbpath=/mongo1 --port 27017 --rest --keyFile=/root/keyfile1  --分配和config每个都这么启动

[root@viptest2 ~]# mongos --port 27021 --configdb=192.168.12.107:27018 --keyFile=/root/keyfile1 --mongos这么启动


使用mongo 192.168.12.107:27021/admin 登录进来后,可以看到,权限已经变更,需要认证才能进行操作。
> db.usr.find().limit(10);
error: { "$err" : "not authorized for query on testdb.usr", "code" : 16549 }

[root@viptest2 ~]# mongo 192.168.12.107:27021/admin -u root -p  使用用户root 密码abc进来
MongoDB shell version: 2.4.6
Enter password:
connecting to: 192.168.12.107:27021/admin
mongos>


use testdb
> db.auth('putong','putong');
1
> show collections;
address
blog
games
people
system.indexes
system.users
testa
usr

> use admin
switched to db admin
> show dbs
Tue Sep 23 18:19:10.744 listDatabases failed:{
"note" : "not authorized for command: listDatabases on database admin",
"ok" : 0,
"errmsg" : "unauthorized"
} at src/mongo/shell/mongo.js:46
> db.auth('root','abc');
1
---只有在admin中定义的用户,才能在admin中认证通过,在testdb中都不行
备注:在普通库中切换成超级用户失败,超级用户需要在 admin 库中切换才能生效
mongos> db.addUser('putong','putong',true);  --这里是进的admin,是超级用户,将putong用户改成readonly
{
"_id" : ObjectId("542142ea2f4e2dc152cf19c0"),
"user" : "putong",
"readOnly" : true,
"pwd" : "9bef249456e43c9b819a4ff08f66c744"
}

只读用户的登录
[root@viptest2 ~]# mongo 192.168.12.107:27021/testdb  -u putong -p
MongoDB shell version: 2.4.6
Enter password:
connecting to: 192.168.12.107:27021/testdb
>

> db.testa.insert({"name":"haha"});
not authorized for insert on testdb.testa  --putong用户只有只读权限

------------------------------------------------
分享到:
评论

相关推荐

    mongodb数据库详细使用教程.zip_mongodb为什么快

    mongodb数据库详细教程.zip 启动方式:非auth验证方式启动mongo,以auth方式启动mongo 增删查改,批量更新 迁移mongodb数据库 可视化工具 指定数据库文件存放位置 忘记mongodb密码怎么办 mongodb用户认证,权限管理

    Linux下安装MongoDB复制集+用户认证,与Spring集成操作

    网上找的资料都不齐全,于是自己根据网上查找的资料整合起来,在Linux下安装mongodb复制集+用户认证,Spring集成mongodb测试,整理操作文档,并附上源码。

    centos7下mongodb4.0.6分片集群搭建(psa)-用户认证关键问题汇总

    公司单节点升级到分片下,搜索了一圈大多数MongoDB集群的部署方案都是分片+副本集,没有讲述如何从单节点升级到分片+复制集的方法,亲自试验后记录整个过程以及中间的参考内容和疑难解决,以备后查。内容包含复制集+...

    真实可用的mongodb下周地址.txt

    视频目录: 01-mongodb文档型数据库特点介绍 01-NoSQL简介 ...08-用户管理 09-mongoDB备份与恢复 09-安全和认证 10-replication复制集 10-主从复制 11-shard分片 11-分片 12-使用java操作mongodb

    Mongodb 3.2.9开启用户权限认证问题的步骤详解

    主要给大家介绍了关于Mongodb 3.2.9开启用户权限认证问题的详细步骤,通过开启权限认证,会对大家的Mongodb更加保护的安全些,文中将步骤介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。

    No Sql Manager for mongodb 3.7

    2. 对认证企业的MongoDB 2.4和2.6版本 3. 全功能蒙戈GUI外壳采用代码自动完成和提示 4. 支持副本集和独立主机的连接 5. 易于使用的文档查看器和编辑器树,表和JSON视图模式 6. 数据库,收集,索引,用户,角色和功能...

    MongoDB复制集及与Spring集成操作

    网上找的资料都不齐全,根据网上查找的资料整合起来,在Linux下安装mongodb复制集+用户认证,Spring集成mongodb测试,整理操作文档,并附上源码。运维不懂开发,那是不行了!

    MongoDB_Demo

    //2、通过uri方式连接MongoDB uri根据选择的数据库修改登录用户dzs MongoClientURI mongoClientUri =new MongoClientURI(uri); MongoClient mongoclient =new MongoClient(mongoClientUri); //连接到数据库 ...

    mongodb学习手册

    MongoDB学习手册 说明 一、 Mongodb简介 二、 MongoDB特性 适用场景: 不适用场景: 三、 MongoDB的工作方式 四、 MongoDB的下载 五、 MongoDB的安装 六、 MongoDB数据类型 1. Timestamp类型 2. ObjectId...

    MongoDB权威指南(中文版)高清

    1098.1.3 停止MongoDB 1108.2 监控 1108.2.1 使用管理接口 1108.2.2 serverStatus 1128.2.3 mongostat 1138.2.4 第三方插件 1138.3 安全和认证 1148.3.1 认证的基础知识 1148.3.2 认证的工作原理 ...

    mongodb资料大全

    安全与认证: use test2 //选择数据库 db.addUser("username","password") //普通权限,可读写 db.addUser("username","password",true) //可读、不可写 db.system.users.remove({user:"username"}) //删除用户 ...

    MongoDB权限设置

    和其他所有数据库一样,权限的管理都差不多一样。mongodb存储所有的用户信息在admin 数据库的...mongodb默认不启用授权认证,只要能连接到该服务器,就可连接到mongod。若要启用安全认证,需要更改配置文件参数auth。

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    11.6.3 复制的认证问题 11.7 本章小结 第12章 sharding 分片 12.1 分片简介 12.2 MongoDB中的自动分片 12.3 片键 12.3.1 将已有的集合分片 12.3.2 递增片键还是随机片键 12.3.3 片键对操作的...

    mongodb 添加用户及权限设置详解

    例如:mysql安装配置好后,有一个自带的mysql数据库,里面有一张user表,用来存放用户,以及用户权限,而mongodb这个最像关系型的数据库,有没有这样的表呢。 一,掌握权限,理解下面4条基本上就差不多 1,mongodb是...

    Centos 7下mongodb的安装.docx

    详细介绍了在centos7上安装mongodb3.6,并添加用户认证及用户管理。

    mongodb权限设置之添加管理员、普通用户的方法

    主要介绍了mongodb添加管理员、普通用户的方法,同时介绍了mongodb开启权限认证后PHP客户端的两种连接方法,需要的朋友可以参考下

    MongoDB安全配置详解

    当admin.system.users一个用户都没有时,即使mongod启动时添加了–auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以–auth 参数启动),直到在admin.system.users中添加...

    MongoDB数据库用户角色和权限管理详解

    使用终端命令行输入 mongo 登陆 mongodb 之后切换到 admin 库,并认证后可查看所有数据库,操作如下所示: [root@renwole.com ~]# mongo MongoDB shell version v4.4.0 connecting to: mongodb://127.0.0.1:27017/?...

Global site tag (gtag.js) - Google Analytics