基於MongodbDB的用戶認證-運維筆記

 

MongoDB默認是不認證的,默認沒有帳號,只要能鏈接上服務就能夠對數據庫進行各類操做,MongoDB認爲安全最好的方法就是在一個可信的環境中運行它,保證以後可信的機器才能訪問它,可能這些對一些要求高的環境,安全還不夠。MongoDB提供用戶認證,須要在啓動時加上--auth開啓認證linux

1、MongoDB安裝git

Mongodb各版本下載地址:https://www.mongodb.org/dl/linux/x86_64-rhel62
本案例的Mongodbv3.2百度下載地址:https://pan.baidu.com/s/194ef261BpcypxzAl9aRaQg
提取密碼:tv8m
下載放到服務器的/usr/local/src目錄下

1.1)安裝MongoDB
[root@MongoDB-server ~]# cd /usr/local/src/
[root@MongoDB-server src]# ll mongodb-linux-x86_64-rhel62-v3.2-latest.tgz
-rw-r--r-- 1 root root 86699142 Nov 22  2017 mongodb-linux-x86_64-rhel62-v3.2-latest.tgz
[root@MongoDB-server src]# tar -zvxf mongodb-linux-x86_64-rhel62-v3.2-latest.tgz
[root@MongoDB-server src]# mv mongodb-linux-x86_64-rhel62-3.2.17-34-g4c1bae566c /usr/local/mongodb
  
[root@MongoDB-server src]# ll /usr/local/mongodb              //Mongodb主目錄
total 100
drwxr-xr-x 2 root root  4096 Sep 20 22:33 bin
-rw-r--r-- 1 root root 34520 Nov 21  2017 GNU-AGPL-3.0
-rw-r--r-- 1 root root 16726 Nov 21  2017 MPL-2
-rw-r--r-- 1 root root  2262 Nov 21  2017 README
-rw-r--r-- 1 root root 35910 Nov 21  2017 THIRD-PARTY-NOTICES
  
[root@MongoDB-server src]# mkdir /usr/local/mongodb/data     //Mongodb數據目錄,能夠存放在一個獨立的大分區上
[root@MongoDB-server src]# mkdir /usr/local/mongodb/log      //Mongodb日誌目錄
  
1.2)啓動MongoDB
使用mongod命令創建一個mongodb數據庫連接,數據庫的路徑爲/usr/local/mongodb/data,日誌路徑爲/usr/local/mongodb/log/mongo.log
mongodb的啓動程序放在後臺執行,下面命令執行後,按ctrl+c。
[root@MongoDB-server src]# nohup /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/log/mongo.log &
  
==========================================
mongodb的參數說明:
--dbpath 數據庫路徑(數據文件)
--logpath 日誌文件路徑
--master 指定爲主機器
--slave 指定爲從機器
--source 指定主機器的IP地址
--pologSize 指定日誌文件大小不超過64M.由於resync是很是操做量大且耗時,最好經過設置一個足夠大的oplogSize來避免resync(默認的 oplog大小是空閒磁盤大小的5%)。
--logappend 日誌文件末尾添加
--port 啓用端口號
--fork 在後臺運行
--only 指定只複製哪個數據庫
--slavedelay 指從複製檢測的時間間隔
--auth 是否須要驗證權限登陸(用戶名和密碼)
==========================================
  
[root@MongoDB-server src]# ps -ef|grep mongodb
root     13216 10204  0 22:38 pts/1    00:00:00 /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/log/mongo.log
root     14185 10204  0 22:42 pts/1    00:00:00 grep mongodb
  
MongoDB默認端口是27017,啓動後,等一下子端口就會起來。若是啓動後,發現端口沒有起來,能夠查看日誌/usr/local/mongodb/log/mongo.log
[root@MongoDB-server src]# lsof -i:27017
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
mongod  13216 root    6u  IPv4 4260453      0t0  TCP *:27017 (LISTEN)
  
1.3)設置mongodb的環境變量
[root@MongoDB-server src]# vim /etc/profile
......
export PATH=$PATH:/usr/local/mongodb/bin/
[root@MongoDB-server src]# source /etc/profile
[root@MongoDB-server src]# mongod --version
db version v3.2.17-34-g4c1bae566c
git version: 4c1bae566c0c00f996a2feb16febf84936ecaf6f
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
allocator: tcmalloc
modules: none
build environment:
    distmod: rhel62
    distarch: x86_64
    target_arch: x86_64
  
1.4)爲了更方便的啓動和關閉MongoDB,可使用Shell寫腳本,固然也能夠加入到service中。更好的方式是採用配置文件,把MongoDB須要的參數寫入配置文件,
而後在腳本中引用;
[root@MongoDB-server src]# vim /usr/local/mongodb/mongodb.conf
#表明端口號,若是不指定則默認爲27017
port=27017
#綁定ip
bind_ip=0.0.0.0
#MongoDB數據文件目錄
dbpath=/usr/local/mongodb/data
#MongoDB日誌文件目錄
logpath=/usr/local/mongodb/log/mongo.log
#日誌文件自動累加
logappend=true
  
編寫MongoDB啓動腳本
[root@MongoDB-server src]# vim /etc/init.d/mongodb
#!/bin/bash
#
# mongod        Start up the MongoDB server daemon
#
     
# source function library
. /etc/rc.d/init.d/functions
#定義命令
CMD=/usr/local/mongodb/bin/mongod
#定義配置文件路徑
INITFILE=/usr/local/mongodb/mongodb.conf
start()
{
    #&表示後臺啓動,也可使用fork參數
    $CMD -f $INITFILE &
    echo "MongoDB is running background..."
}
     
stop()
{
    pkill mongod
    echo "MongoDB is stopped."
}
     
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo $"Usage: $0 {start|stop}"
esac
  
授予腳本可執行權限
[root@MongoDB-server src]# chmod 755 /etc/init.d/mongodb
  
[root@MongoDB-server src]# /etc/init.d/mongodb status
Usage: /etc/init.d/mongodb {start|stop}
[root@MongoDB-server src]# /etc/init.d/mongodb stop
Terminated
[root@MongoDB-server src]# lsof -i:27001
[1]+  Done                    nohup /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/log/mongo.log
[root@MongoDB-server src]# lsof -i:27001
[root@MongoDB-server src]# /etc/init.d/mongodb start
MongoDB is running background...
[root@MongoDB-server src]# ps -ef|grep mongodb
root     16060     1  2 22:49 pts/1    00:00:00 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb.conf
root     16205 10204  0 22:49 pts/1    00:00:00 grep mongodb
  
[root@MongoDB-server ~]# lsof -i:27001
[root@MongoDB-server ~]#
  
啓動後發現27017端口沒有起來,查看日誌:
[root@MongoDB-server src]# tail -f /usr/local/mongodb/log/mongo.log
......
2018-09-20T22:55:46.236+0800 I NETWORK  [initandlisten] waiting for connections on port 27017
2018-09-20T22:55:46.290+0800 W NETWORK  [HostnameCanonicalizationWorker] Failed to obtain address information for hostname MongoDB-server: Name or service not known
2018-09-20T22:55:47.014+0800 I FTDC     [ftdc] Unclean full-time diagnostic data capture shutdown detected, found interim file, some metrics may have been lost. OK
  
緣由:獲取不到地址對應的主機名,這通常與HOSTS有關
  
解決辦法:
[root@MongoDB-server ~]# ifconfig|grep "inet addr"|grep Bcast|awk -F":" '{print $2}'|awk '{print $1}'
192.168.10.205
[root@MongoDB-server ~]# hostname
MongoDB-server
[root@MongoDB-server ~]# vim /etc/hosts
[root@MongoDB-server ~]# echo "192.168.10.205 MongoDB-server" >> /etc/hosts
[root@MongoDB-server ~]# cat /etc/hosts
......
192.168.10.205 MongoDB-server
  
再次啓動
[root@MongoDB-server ~]# ps -ef|grep mongodb
root     17789     1  0 22:55 pts/0    00:00:01 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb.conf
root     18933 16606  0 23:00 pts/0    00:00:00 grep mongodb
[root@MongoDB-server ~]# kill -9 16890
[root@MongoDB-server ~]# ps -ef|grep mongodb
root     18979 16606  0 23:00 pts/0    00:00:00 grep mongodb
[root@MongoDB-server ~]# /etc/init.d/mongodb start
MongoDB is running background...
  
[root@MongoDB-server ~]# ps -ef|grep mongodb
root     17789     1  0 22:55 pts/0    00:00:01 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb.conf
root     19132 16606  0 23:00 pts/0    00:00:00 grep mongodb
[root@MongoDB-server ~]# lsof -i:27017
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
mongod  17789 root    6u  IPv4 4289555      0t0  TCP *:27017 (LISTEN)
  
鏈接MongoDB服務
[root@MongoDB-server src]# mongo 127.0.0.1:27017    或者直接使用mongo命令進行鏈接,默認鏈接的就是127.0.0.1:27017
MongoDB shell version: 3.2.17-34-g4c1bae566c
connecting to: 127.0.0.1:27017/test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
Server has startup warnings:
2018-09-20T22:55:46.232+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten]
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten]
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten]
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2018-09-20T22:55:46.233+0800 I CONTROL  [initandlisten]
> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce
  
        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell
> show dbs
local  0.000GB
>

2、MongoDB認證mongodb

MongoDB Roles(內置角色)
- 數據庫用戶角色:read、readWrite;
- 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
- 集羣管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 備份恢復角色:backup、restore;
- 全部數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超級用戶角色:root 
- 這裏還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
- 內部角色:__systemshell

具體角色
- Read:容許用戶讀取指定數據庫
- readWrite:容許用戶讀寫指定數據庫
- dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile
- userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶
- clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。
- readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限
- readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限
- userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限
- dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。
- root:只在admin數據庫中可用。超級帳號,超級權限數據庫

認證操做實例以下
初始化數據庫的時候,必定要先禁止用戶驗證功能,而後在建立管理用戶,以後就能夠開啓驗證,操做數據庫了。vim

MongoDB認證前須要添加帳號,添加管理員帳號(默認狀況下系統中沒有用戶)
 
謹記:先在不開啓認證的狀況下,建立用戶,以後關閉服務,而後再開啓認證,才生效!!!!
 
[root@MongoDB-server src]# mongo 127.0.0.1:27017
......
 
切換到admin庫
> use admin                        
switched to db admin

添加超級用戶
> use admin
switched to db admin
> db.system.users.find(); 
> db.addUser("admin","1234!@#$qwer");
2018-09-21T09:59:56.125+0800 E QUERY    [thread1] TypeError: db.addUser is not a function :
@(shell):1:1

如上建立用戶報錯:報錯addUser is not a function
通過排查緣由,因爲MongDB3.x版本已經再也不支持addUser()方法,用createUser()方法取而代之。
特別注意的是:建立用戶以及設置密碼時,role角色裏面必定要跟role、db參數,認證時對應的庫必定要搞清楚!

admin管理員受權時,role角色最好設置成root,不然認證後可能會有些命令執行不了。

> db.createUser({user: "admin",pwd: "1234!@#$qwer",roles:[{"role":"root","db":"admin"}]});
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}
> 

查詢添加的用戶(必需要先切換到admin庫下進行查看)
> db.system.users.find();
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : 
"tnnpiLjweUJWR1mQzC/cuw==", "storedKey" : "Q7G7KqfYQa3eKcHOSsSkxGs2Ci0=", "serverKey" : "GKOG66hhf6DkXNrTmHWGoFHxXFo=" } }, "roles" 
: [ { "role" : "root", "db" : "admin" } ] }

添加普通帳號
切換到kevin庫添加普通用戶(readWrite有讀寫權限;read有讀權限)
> use kevin;
switched to db kevin
> db.createUser({user: "kevin",pwd: "kevin@123456",roles:[{"role":"readWrite","db":"kevin"}]});
Successfully added user: {
        "user" : "kevin",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "kevin"
                }
        ]
}

> use grace;
switched to db grace
> db.createUser({user: "grace",pwd: "grace@123",roles:[{"role":"read","db":"grace"}]});
Successfully added user: {
        "user" : "grace",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "grace"
                }
        ]
}

查詢添加的用戶(必需要先切換到admin庫下進行查看)
> use admin;
switched to db admin
> db.system.users.find();
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "tnnpiLjweUJWR1mQzC/cuw==", "storedKey" : "Q7G7KqfYQa3eKcHOSsSkxGs2Ci0=", "serverKey" : "GKOG66hhf6DkXNrTmHWGoFHxXFo=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "kevin.kevin", "user" : "kevin", "db" : "kevin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "u3RgCHmt3AfigOIVNKy7OA==", "storedKey" : "Je7SP6SohGPZSb3VBXOJkNlXz20=", "serverKey" : "5laXjac6NfpYuivcmK3SK0GohRo=" } }, "roles" : [ { "role" : "readWrite", "db" : "kevin" } ] }
{ "_id" : "grace.grace", "user" : "grace", "db" : "grace", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "9xLjmg7Q8YsZ1Y9vF71P6g==", "storedKey" : "tID4qA9AaJ4IIOgbC1oHZZYqVdg=", "serverKey" : "ayvaN6QkDUOz1KUs+SG3S8IyvAo=" } }, "roles" : [ { "role" : "read", "db" : "grace" } ] }
> 

刪除用戶
> use admin;
switched to db admin
> db.system.users.remove({user:"admin"})
WriteResult({ "nRemoved" : 1 })
> db.system.users.remove({user:"kevin"})
WriteResult({ "nRemoved" : 1 })
> db.system.users.remove({user:"grace"})
WriteResult({ "nRemoved" : 1 })
> db.system.users.find();
> 

修改用戶密碼,能夠利用db.changeUserPassword進行密碼重置!!!!!
> use grace;
switched to db grace
> db.changeUserPassword("grace","grace@1986");
> 

以--auth啓動mongodb開啓認證(或者在配置文件中添加"auth=true")
[root@MongoDB-server ~]# vim /usr/local/mongodb/mongodb.conf
#表明端口號,若是不指定則默認爲27017
port=27017
#綁定ip
bind_ip=0.0.0.0
#MongoDB數據文件目錄
dbpath=/usr/local/mongodb/data
#MongoDB日誌文件目錄
logpath=/usr/local/mongodb/log/mongo.log
#日誌文件自動累加
logappend=true
#開啓MongoDB認證
auth=true            
 
[root@MongoDB-server ~]# cat /etc/init.d/mongodb
......
    $CMD -f $INITFILE --auth &
......
 
重啓mongodb
[root@MongoDB-server ~]# ps -ef|grep mongodb
root     17789     1  0 22:55 pts/0    00:00:06 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb.conf
root     25161 16606  0 23:24 pts/0    00:00:00 grep mongodb
[root@MongoDB-server ~]# kill -9 17789
[root@MongoDB-server ~]# ps -ef|grep mongodb               
root     25190 16606  0 23:24 pts/0    00:00:00 grep mongodb
 
[root@MongoDB-server ~]# /etc/init.d/mongodb start
MongoDB is running background...
[root@MongoDB-server ~]# ps -ef|grep mongodb     
root      1687     1 12 23:58 pts/0    00:00:00 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/mongodb.conf --auth
root      1713 16606  0 23:58 pts/0    00:00:00 grep mongodb
[root@MongoDB-server ~]# lsof -i:27017           
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
mongod  25342 root    6u  IPv4 4330699      0t0  TCP *:27017 (LISTEN)

驗證安全認證:
[root@MongoDB-server ~]# mongo 127.0.0.1:27017
MongoDB shell version: 3.2.17-34-g4c1bae566c
connecting to: 127.0.0.1:27017/test
> use admin;
switched to db admin
> show dbs
2018-09-21T10:11:46.582+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1

> 

如上因爲沒有認證,因此查看不到。須要認證後再次查看才能夠。須要注意:認證時括號裏面的用戶名和密碼用雙引號,不然可能會認證失敗!!
> db.auth("admin","1234!@#$qwer");
1
> show dbs
admin  0.000GB
local  0.000GB
> 

普通用戶認證也是同樣
> use grace;
switched to db grace
> db.stats();
{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { serverStatus: 1.0 }",
        "code" : 13
}
> db.auth("grace","grace@1986");
1
> db.stats();
{
        "db" : "grace",
        "collections" : 0,
        "objects" : 0,
        "avgObjSize" : 0,
        "dataSize" : 0,
        "storageSize" : 0,
        "numExtents" : 0,
        "indexes" : 0,
        "indexSize" : 0,
        "fileSize" : 0,
        "ok" : 1
}
> 

以上就代表了該mongodb啓用了認證功能,而且認證成功了!
相關文章
相關標籤/搜索