本文介紹在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), |
實地探勘 : 列出相關檔案群組與擁有者 : ls -laR /var/lib/mongo -rw-r--r-- 1 root root 946 12月 6 18:21 WiredTiger.turtle |
解法 : 修改擁有者與群組 chgrp -R mongod /var/lib/mongo 系統重啟(作者是重啟後才正常,邏輯上應該是改完權限後即可) 參考 Mongo not starting after upgrading to 3.0.7: extraneous permissions in journal file or group ownership problem |
驗証權限機制是否取用
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
提供遠端連線
這邊使用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連線如下
參考
Configure Linux iptables Firewall for MongoDB
留言列表