close

本文介紹在centos 7上簡單的安裝Mongodb 3.2,

並使用Role-Based Access Control (RBAC)來作權限管理,

設定遠端使用者.

 

寫此文時,mongodb最新版為3.2,

安裝部分

配置安裝repository

vi /etc/yum.repos.d/mongodb-org-3.2.repo

[mongodb-org-3.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
gpgcheck=1
enabled=1

gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc

安裝指令,安裝mongodb-org就會自動安裝其他4個套件(mongodb-org-server, mongodb-org-mongos, mongodb-org-shell, mongodb-org-tools)

sudo yum install -y mongodb-org

安裝完成後,避免系統不小心更新時也update mongodb,可以把mongodb加入更新例外

vi /etc/yum.conf

exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

參考官網文件

 

配置使用者部分

首先啟動服務

systemctl start mongod

這時候很隨便的就能登入資料庫,打mongo
MongoDB shell version: 3.2.10
connecting to: test
Server has startup warnings:
2016-11-15T17:25:04.186+0800 I CONTROL  [initandlisten]
2016-11-15T17:25:04.186+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-11-15T17:25:04.186+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-11-15T17:25:04.186+0800 I CONTROL  [initandlisten]
2016-11-15T17:25:04.186+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 4096 processes, 64000 files. Number of processes should be at least 32000 : 0.5 times number of files.
2016-11-15T17:25:04.186+0800 I CONTROL  [initandlisten]
>
直接就進入資料庫了....真是歡樂啊.XD

聽說之前的版本在權限上一直有不斷改進,所以我直接學3.2版的了,以前的就歲風去吧.

權限整裡的部分

1. mongo db 沒有預設管理員,所以必須先新增後,才能開啟權限認証.

2. 在admin資料庫下新增的帳號才是管理員

3. 使用者僅可在使用者所在的資料庫登入(含管理員)

4. 管理員必須先在admin資料庫認証後才可以管理其他資料庫

 

新增管理員

切換到admin資料庫
use admin

新增使用者
db.createUser(
   {
     user: "
帳號",
     pwd: "
密碼",
     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
   }
)

啟用驗証

前景執行
mongod --auth --port 27017 --dbpath /var/lib/mongo

或者

背景執行
vi /etc/mongod.conf
#security:後加入
security.authorization : enabled
systemctl restart mongod  

#如果使用reload,再次登入(mongo)時,會出現
2016-12-07T12:01:44.903+0800 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2016-12-07T12:01:44.903+0800 E QUERY    [thread1] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed :

connect@src/mongo/shell/mongo.js:229:14
@(connect):1:6

 

發生問題 : 

使用command(mongod --auth --port 27017 --dbpath /var/lib/mongo)方式執行mongod後,再使用daemon(systemctl restart mongod)執行,服務無法開啟

查找Log : /var/log/mongodb/mongod.log

2016-12-07T10:53:03.951+0800 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=1G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),
2016-12-07T10:53:03.984+0800 E STORAGE  [initandlisten] WiredTiger (13) [1481079183:984380][1611:0x7ff4b5b68dc0], file:WiredTiger.wt, connection: /var/lib/mongo/WiredTiger.turtle: handle-open: open: Permission denied
2016-12-07T10:53:03.989+0800 I -        [initandlisten] Assertion: 28595:13: Permission denied
2016-12-07T10:53:04.075+0800 I STORAGE  [initandlisten] exception in initAndListen: 28595 13: Permission denied, terminating

實地探勘 : 

列出相關檔案群組與擁有者 : ls -laR /var/lib/mongo

-rw-r--r--   1 root   root     946 12月  6 18:21 WiredTiger.turtle

解法 : 修改擁有者與群組

chgrp -R mongod /var/lib/mongo
chown -R mongod /var/lib/mongo

系統重啟(作者是重啟後才正常,邏輯上應該是改完權限後即可)
reboot

參考

Mongo not starting after upgrading to 3.0.7: extraneous permissions in journal file or group ownership problem
mongoDB因root启动关闭数据库导致mongo普通用户无法启动

 

驗証權限機制是否取用

mongo
> use admin
> db.auth('帳號','密碼')

或者登入時直接驗証

mongo -u "帳號" -p "密碼" --authenticationDatabase "admin"

> show dbs

成功

admin  0.000GB
local  0.000GB

失敗 - 以啟用驗証,但登入帳號授權失敗

2016-12-07T12:02:38.427+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
} :


新增使用者

以管理者登入並驗證後,

use test
db.createUser(
  {
    user: "mongo-user",
    pwd: "
密碼",
    roles: [ { role: "readWrite", db: "test" },
             { role: "read", db: "reporting" } ]
  }
)

Successfully added user: {
        "user" : "mongo-user",
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "test"
                },
                {
                        "role" : "read",
                        "db" : "reporting"
                }
        ]
}

各種內建的Role,請參考Built-In Roles

改換mongo-user登入並驗證

mongo -u "mongo-user" -p "密碼" --authenticationDatabase "test"

> db.foo.insert( { x: 1, y: 1 } )
WriteResult({ "nInserted" : 1 })
> show collections
foo

可以看到mongo-user可在test db下建立 foo collection並寫入資料.

權限機制

帳號能執行哪些行為,完全是看該帳號在當前db的role,

上面的mongo-user就分別在reporting db有read的權限;test db有readWrite的權限.

內鍵的role都是基於db-level作設定的,對於正常使用來說已經足夠,

如果要能限制collection-level權限,

就需要使用自定義角色(User-Defined Role)的Privileges,

首先使用admin登入,新增一個自定義角色與使用者,並且該自定義角色僅可操作test db foo collection

use test
switched to db test

> db.createRole(
    {
      role: "UserDefineRole",
      privileges: [
        { resource: { db: "test", collection: "foo" }, actions: [ "find", "update", "insert" ] }
      ],
      roles: []
    }
 )

{
        "role" : "UserDefineRole",
        "privileges" : [
                {
                        "resource" : {
                                "db" : "test",
                                "collection" : "foo"
                        },
                        "actions" : [
                                "find",
                                "update",
                                "insert"
                        ]
                }
        ],
        "roles" : [ ]
}

> db.createUser(
   {
     user: "mongo-user-2",
     pwd: "
密碼",
     roles: [ { role: "UserDefineRole", db: "test" } ]
   }
 )

Successfully added user: {
        "user" : "mongo-user-2",
        "roles" : [
                {
                        "role" : "UserDefineRole",
                        "db" : "test"
                }
        ]
}

改用mongo-user-2登入,可讀可寫,但要另外建立foo3 collection就會出現錯誤

> db.foo.find()
{ "_id" : ObjectId("5847a3f5f65079eedc37d872"), "x" : 1, "y" : 1 }

> db.foo.insert( { x: 1, y: 3 } )
WriteResult({ "nInserted" : 1 })

> db.foo3.insert( { x: 3, y: 1 } )
WriteResult({
        "writeError" : {
                "code" : 13,
                "errmsg" : "not authorized on test to execute command { insert: \"foo3\", documents: [ { _id: ObjectId('5847da93b073544e13d59aea'), x: 3.0, y: 1.0 } ], ordered: true }"
        }
})

關於privileges Resource的說明,可參考Resource Document

提供遠端連線

官網有許多的GUI推薦,

這邊使用Robomongo免安裝版本,

修改/etc/mongod.conf

# bindIp 127.0.0.1   # 註解起來會開啟所以eth介面
或 
bindIp 127.0.0.1, IP
systemctl restart mongod

開啟防火牆(27017, 27018, 27019,後兩者為cluster用)

firewall-cmd --zone=public --permanent --add-port=27017/tcp
firewall-cmd --reload
firewall-cmd --zone=public --list-all

Robomongo連線如下

Robomongo-1.png

Robomongo-2.png

 

參考

Enable Auth

如何对MongoDB 3.2.7进行用户权限管理配置

Security Checklist

Configure Linux iptables Firewall for MongoDB

 

 

arrow
arrow

    abcg5 發表在 痞客邦 留言(1) 人氣()