天天看點

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", 

        "pwd" : "8c438fc9e2031577cea03806db0ee137", 

        "_id" : objectid("50ad45dd0b12589bdc45cf93") 

{ "_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 

> 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 

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 使用者 

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

      備注:在普通庫中切換成超級使用者失敗,超級使用者需要在 admin 庫中切換才能生效。 

--2.2 在 admin 庫中切換成 root 使用者 

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

      備注:在 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("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 

test_5 

{ "_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 

username (string) – specifies an existing username with access privileges for this database. 

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 

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", 

"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", 

"pwd" : "9bef249456e43c9b819a4ff08f66c744", 

"_id" : objectid("542142ea2f4e2dc152cf19c0") 

{ "_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 

connecting to: 192.168.12.107:27021/admin 

mongos> 

use testdb 

> db.auth('putong','putong'); 

address 

blog 

games 

people 

testa 

usr 

> use 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'); 

---隻有在admin中定義的使用者,才能在admin中認證通過,在testdb中都不行 

備注:在普通庫中切換成超級使用者失敗,超級使用者需要在 admin 庫中切換才能生效 

mongos> db.adduser('putong','putong',true);  --這裡是進的admin,是超級使用者,将putong使用者改成readonly 

"_id" : objectid("542142ea2f4e2dc152cf19c0"), 

"pwd" : "9bef249456e43c9b819a4ff08f66c744" 

隻讀使用者的登入 

[root@viptest2 ~]# mongo 192.168.12.107:27021/testdb  -u putong -p 

connecting to: 192.168.12.107:27021/testdb 

> 

> db.testa.insert({"name":"haha"}); 

not authorized for insert on testdb.testa  --putong使用者隻有隻讀權限 

------------------------------------------------