MongoDB開啓shard操做最小權限用戶受權

MongoDB開啓shard操做最小權限用戶受權

 (2018-01-25 15:52:29)html

轉載mongodb

標籤: 

mongodb

 

shard

 

最小權限

 

shardcollection

 

privileges

分類: 數據庫

背景

操做需求是爲程序用戶提供一個最小權限,知足如下操做需求:數據庫

  • 容許徹底操做指定數據庫
  • 容許對指定數據庫中的collection開啓shard

經過這樣限制,最多隻會影響到指定的數據庫,
避免由於程序問題或者其餘外部因素致使數據處理邏輯出問題而影響到整個集羣。ide


規劃

myDb.myCollection爲例,對collection開啓shard,須要進行如下操做:測試

  1. 若是數據庫沒有開啓分片功能,須要先開啓:ui

    sh.enableSharding("myDb")
  2. 若是collection裏面已經有數據,須要先建立對應的shardkey索引:this

    use myDb
     db.myCollection.createIndex( {"shard_key_field": "hashed"} )
  3. 對指定collection開啓shard:spa

    sh.shardCollection("myDb.myCollection", {"shard_key_field": "hashed"})

因此須要相應的權限來運行以上3個操做命令。
參考官網文檔描述,須要給用戶提供兩個權限:code


操做

由於原來項目用戶關於業務數據庫的角色就已是dbOwner
所以,再建立一個具備開啓shard相關操做權限的角色,授予項目數據庫用戶便可實現最小權限控制。

首先建立新的角色,提供上述的兩個操做權限。
這裏命名爲opShardRole,能夠根據實際需求更改:

use myDb;
db.createRole({
        role: "opShardRole",
        privileges:[
            {
                resource:{db:"myDb", collection:""},
                actions:["enableSharding, "createIndex"]
            }
        ],
        roles:[]
    }
)

而後將opShardRole角色grant給項目用戶,這裏假設用戶名爲project_user

db.grantRolesToUser("project_user",[{role:"opShardRole", db:"myDb"}])

至此,操做完成,能夠經過項目用戶進行測試開啓shard相關操做有無問題。


檢查相關用戶權限

切換到業務db,並檢查相關的用戶及角色:

  • 查看角色相關操做權限:

    mongos> db.getRole("opShardRole",{showPrivileges: true})
      {
          "role" : "opShardRole",
          "db" : "myDb",
          "isBuiltin" : false,
          "roles" : [ ],
          "inheritedRoles" : [ ],
          "privileges" : [
              {
                  "resource" : {
                      "db" : "myDb",
                      "collection" : ""
                  },
                  "actions" : [
                      "createIndex",
                      "enableSharding",
                      "shardCollection"
                  ]
              }
          ],
          ...
      }
  • 查看用戶關聯的角色:

    mongos> show users;
      {
          "_id" : "myDb.project_user",
          "user" : "project_user",
          "db" : "myDb",
          "roles" : [
              {
                  "role" : "opShardRole",
                  "db" : "myDb"
              },
              {
                  "role" : "dbOwner",
                  "db" : "myDb"
              }
          ]
      }

能夠看到,opShardRole這個角色確實已經有了對業務數據庫myDb的所需shard操做權限,
同時,project_user這個用戶也已經有了opShardRole角色受權。

分享:

相關文章
相關標籤/搜索