DolphinDB database 提供了強大、靈活、安全的權限控制系統。控制節點(controller)做爲權限管理中心,使用RSA加密方式對用戶關鍵信息進行加密。web
主要功能:數據庫
1.1 用戶和組跨域
用戶和組是承載權限的實體。一個用戶能夠屬於多個組,一個組也能夠包括多個用戶。瀏覽器
引入組的概念,能夠方便的對具備相同權限的用戶進行權限配置和管理,用戶最終的實際權限是用戶自己的權限,加上所屬組的權限的結果。安全
1.2 系統管理員服務器
DolphinDB集羣第一次啓動時,會自動建立用戶名爲"admin",密碼爲"123456"的系統管理員。此管理員擁有全部的權限,例如建立或刪除數據庫,可讀寫全部表,在數據庫中建立或刪除數據表,可以使用全部的函數視圖,可執行或測試腳本。此管理員能夠建立或刪除其餘管理員。其餘管理員剛被建立後,可建立或刪除其餘管理員,用戶,或組,但除此以外沒有任何權限。管理員可自我受權,亦可互相受權。請注意管理員"admin"沒法被刪除。app
管理員可以使用函數或命令createUser, deleteUser, createGroup, ddeleteGroup, addGroupMember, dlelteGroupMember, getUserAccess, getUserList, getGroupList, resetPwd 對用戶和組進行方便的操做。分佈式
1.3 權限類別ide
DolphinDB提供如下8種權限類別:函數
其中前面5種須要提供操做對象,後面3種不須要提供操做對象。
請注意,權限配置中涉及到的數據庫及數據表均爲在分佈式文件系統(DFS)中創建的。
1.4 權限設置
只有管理員纔可設置權限,且只能在控制節點上執行權限類操做。剛建立的用戶或組沒有被賦予或被禁止任何權限。管理員可以使用grant/deny/revoke 命令來設置用戶或者組的權限。在1.3種的8種權限,可做爲這三個命令的accessType參數值。
如下經過兩個例子,說明權限設置的操做。
管理員登陸:
login(`admin, `123456)
建立用戶 NickFoles:
createUser("NickFoles","AB123!@")
賦予用戶 NickFoles 可讀任何DFS數據表的權限:
grant("NickFoles",TABLE_READ,"*")
禁止用戶 NickFoles 建立或刪除數據庫:
deny("NickFoles",DB_MANAGE)
建立 SBMVP 組,而且把用戶 NickFoles 加入到該組:
createGroup("SBMVP", "NickFoles")
賦予 SBMVP 組可在數據庫"dfs://db1"和"dfs://db2"中建立數據表的權限:
grant("SBMVP",DBOBJ_CREATE,["dfs://db1","dfs://db2"])
最後用戶 NickFoles 的權限爲:能夠訪問全部的數據表,不能建立或刪除數據庫,能夠對dfs://db1和dfs://db2進行建立數據表的操做。
經過組能夠方便的設置用戶權限:
createUser("EliManning", "AB123!@") createUser("JoeFlacco","CD234@#") createUser("DeionSanders","EF345#$") createGroup("football", ["EliManning","JoeFlacco","DeionSanders"]) grant("football", TABLE_READ, "dfs://TAQ/quotes") grant("DeionSanders", DB_MANAGE)
該例子建立了3個用戶和1個組,而且這三個用戶屬於該組。賦予此組可讀數據表dfs://TAQ?quotes的權限,同時只賦予用戶DeionSanders建立和刪除數據庫的權限。
可使用grant或deny對全部對象(以*表明)賦予或禁止權限。例如,賦予用戶 JoeFlacco 可讀任何DFS數據表的權限:
grant("JoeFlacco",TABLE_READ,"*")
當使用grant或deny全部對象後,只能夠對全部對象使用revoke,若對某個單一對象使用revoke無效:
revoke("JoeFlacco",TABLE_READ,"dfs://db1/t1")
以上命令無效。
revoke("JoeFlacco",TABLE_READ,"*")
以上命令取消了用戶 JoeFlacco 可讀任何DFS數據表的權限。
與之相似,使用grant或deny對組賦予或禁止權限後,只能對改組使用revoke來取消該權限設置。若對某個組員使用revoke來取消該權限設置則無效。
1.5 權限肯定規則
用戶的最終權限由用戶自己的權限與其所屬的全部組的權限共同決定。不一樣的組有可能對某用戶某權限的規定有衝突。如下爲權限肯定規則:
createUser("user1","123456") createUser("user2","123456") createGroup("group1") createGroup("group2") addGroupMember(["user1","user2"],"group1") addGroupMember(["user1","user2"],"group2") grant("user1",TABLE_READ,"*") deny("group1",TABLE_READ,"dfs://db1/t1") deny("group2",TABLE_READ,"dfs://db1/t2")
以上三行的結果爲,用戶user1能夠讀取除"dfs://db1/t1"和"dfs://db1/t2"之外的全部數據表。
grant("user2",TABLE_WRITE,"*") deny("group1",TABLE_WRITE,"*") grant("group2",TABLE_WRITE,"dfs://db1/t2")
以上三行的結果爲,用戶user1和user2不能寫數據到任何數據表。
1.6 基於函數視圖(function view)的權限控制
函數視圖提供了一種靈活的方式來控制用戶訪問數據表,在不給予用戶能夠閱讀數據表全部原始數據的權限的狀況下,讓用戶能夠獲取由函數視圖產生的信息。只有系統管理員有建立和刪除函數視圖的權限。
管理員定義一個函數視圖:
def countTradeAll(){ return exec count(*) from loadTable("dfs://TAQ","Trades") } addFunctionView(countTradeAll) grant("NickFoles",VIEW_EXEC,"countTradeAll")
以用戶名NickFoles登陸,執行視圖countTradeAll
countTradeAll()
雖然用戶NickFoles沒有訪問表"dfs://TAQ/Trades"的權限,可是能夠運行函數視圖在此例中來獲取表的行數。
函數視圖也能夠帶參數。用戶在使用的時候能夠輸入參數獲取相應的結果。下面的例子,咱們建立一個函數視圖,獲取某一個股票在某一天的全部交易記錄。
def getTrades(s, d){ return select * from loadTable("dfs://TAQ","Trades") where sym=s, date=d } addFunctionView(getTrades) grant("NickFoles",VIEW_EXEC,"getTrades")
以用戶名NickFoles登陸,並在執行視圖getTrades指定股票代碼和日期:
getTrades("IBM", 2018.07.09)
程序調度和流計算在後臺運行,不少狀況下,沒有顯式登陸,所以權限驗證跟用戶顯式登陸的狀況有些不一樣。這兩類後臺任務都是以建立該任務的用戶身份來運行。
程序調度是指用戶指定在特定的時間,以特定的頻率執行一系列任務,多用於適合批處理類業務場景。
login("NickFoles","AB123!@") def readTable(){ read_t1=loadTable("dfs://db1","t1") return exec count(*) from read_t1 } scheduleJob("readTableJob","read DFS table",readTable,minute(now()),date(now()),date(now())+1,'D');
無論NickFoles有沒有讀"dfs://db1/t1"的權限,readTable任務都能設置成功。
在readTable任務實際運行時,若是用戶NickFoles有讀"dfs://db1/t1"的權限,則成功執行,不然鑑權失敗。
另外,使用dedleteScheduleJob命令的的時候,系統管理員能夠刪除其餘用戶制定的任務,非管理員用戶只能刪除本身建立的任務。
當用戶使用subscribeTable函數從一個流數據表中訂閱實時數據存入數據表時,應當確認其有寫入此數據表的權限。
login("NickFoles","AB123!@") def saveTradesToDFS(mutable dfsTrades, msg): dfsTrades.append!(select today() as date, * from msg) subscribeTable("NODE1", "trades_stream", "trades", 0, saveTradesToDFS{trades}, true, 1000, 1)
在上例中,流數據處理任務把接收到的數據保存到數據表dfsTrades中。在此流數據處理任務執行的時候,系統會動態地鑑定NickFoles是否有寫入數據表dfsTrades的權限,若是沒有則鑑權失敗。
DolphinDB支持使用HTTPS安全協議與web進行通訊。
兩種配置HTTPS的方法:
DolphinDB使用服務端證書驗證的安全策略。默認狀況下,會生成自制證書,客戶須要安裝服務端的證書,不然瀏覽器提示不安全鏈接。每臺物理server須要一份證書,所以控制節點和代理節點須要生成證書,數據節點使用同一個物理服務器上代理節點生成的證書。用戶也可購買通過第三方認證的證書。
將第三方證書重命名爲 server.crt,而且拷貝到控制節點和代理節點的home目錄下的keys文件夾中,若keys文件夾不存在,則需手動建立。因爲第三方證書通過公認的權威受權機構頒佈,因此瀏覽器默認信任該證書,不須要再手動安裝。絕大部分應用場景適合使用此方式。
在小型封閉集羣內部通訊時,用戶也可使用自制證書進行OPENSSL安全通訊,不過安裝自制證書稍微繁瑣,具體過程以下:
./dolphindb -enableHTTPS true -home master -publicName www.ABCD.com -mode controller -localSite 192.168.1.30:8500:rh8500 -logFile ./log/master.log
2. 查看證書是否正確生成
啓動控制節點, 在home目錄下的keys文件夾中,查看是否有自制證書文件server.crt和私鑰文件serverPrivate.key。
3. 安裝自制證書到瀏覽器的授信證書中心 不一樣的瀏覽器安裝選項稍有不一樣,以Google Chrome爲例,選擇Settings->Advanced->Manage certificates->AUTHORITIES->Import,導入上面生成的server.crt文件。
在瀏覽器中輸入https://www.XXXX.com:8500/以訪問集羣管理器。若瀏覽器地址欄顯示綠色的小鎖,說明證書安裝成功,能夠進行HTTPS訪問。
在集羣管理界面中,能夠點擊任意數據節點,連接到該節點的notebook上。從控制節點跳轉到數據節點,有多是訪問了不一樣的物理服務器(跨域訪問)。DolphinDB提供了SSO使得用戶無須在集羣操做中訪問不一樣的物理服務器時從新登錄系統。
DolphinDB提供兩個用於SSO的API函數:
DolphinDB的開發者能夠方便安全的使用這些接口來對系統進行擴展。