乾物丨DolphinDBの権限管理とセキュリティ

DolphinDBデータベースは、強力で柔軟かつ安全なアクセス制御システムを提供します。コントローラは、権限管理センターとして、RSA暗号化を使用して主要なユーザー情報を暗号化します。

主な機能:

  • アクセス制御を容易にするためにユーザーとグループの役割を提供する
  • さまざまなシナリオに適応するために、8種類の権限制御を提供します
  • 豊富なアクセス制御機能
  • 関数ビューは、データのプライバシーを保護し、分析結果を提供します
  • システムのセキュリティを確保するためのタスクスケジューリングとストリーミングデータタスクの動的認証
  • RSAを使用して主要なユーザー情報を暗号化する
  • SSOをサポートし、ログインを簡素化し、システム拡張を容易にします


1.許可の概要


1.1ユーザーとグループ

ユーザーとグループは、権限を持つエンティティです。ユーザーは複数のグループに属することができ、グループには複数のユーザーを含めることもできます。

グループの概念を導入すると、同じアクセス許可を持つユーザーのアクセス許可を簡単に構成および管理できます。ユーザーの最終的な実際のアクセス許可は、ユーザー自身のアクセス許可と、ユーザーが属するグループのアクセス許可です。


1.2システム管理者

DolphinDBクラスターを初めて起動すると、ユーザー名「admin」、パスワード「123456」のシステム管理者が自動的に作成されます。この管理者は、データベースの作成または削除、すべてのテーブルの読み取りと書き込み、データベース内のデータテーブルの作成または削除、すべての関数ビュー、実行可能またはテストスクリプトの使用など、すべての権限を持っています。この管理者は、他の管理者を作成または削除できます。他の管理者が作成された後、他の管理者、ユーザー、またはグループを作成または削除できますが、他の権限はありません。管理者は、自分自身またはお互いを承認できます。管理者「admin」は削除できませんのでご注意ください。

管理者は、関数またはコマンドcreateUser、deleteUser、createGroup、ddeleteGroup、addGroupMember、dlelteGroupMember、getUserAccess、getUserList、getGroupList、resetPwdを使用して、ユーザーおよびグループに対して便利な操作を実行できます。


1.3許可カテゴリ

DolphinDBは、次の8種類の権限を提供します。

  1. TABLE_READ:指定されたデータテーブルからデータを読み取ります
  2. TABLE_WRITE:指定されたデータテーブルにデータを書き込みます
  3. DBOBJ_CREATE:指定されたデータベースにオブジェクト(データテーブル)を作成します
  4. DBOBJ_DELETE:指定されたデータベース内のオブジェクト(データテーブル)を削除します
  5. VIEW_EXEC:関数ビューを実行します
  6. DB_MANAGE:データベースの作成と削除
  7. SCRIPT_EXEC:スクリプトファイルを実行します
  8. TEST_EXEC:単体テストを実行します

その中で、最初の5つのタイプは操作オブジェクトを提供する必要があり、後の3つのタイプは操作オブジェクトを提供する必要はありません。

アクセス許可の構成に関係するデータベースとデータテーブルはすべて、分散ファイルシステム(DFS)で確立されていることに注意してください。


1.4権限設定

管理者のみが権限を設定でき、コントロールノードでのみ権限操作を実行できます。新しく作成されたユーザーまたはグループには、権限が付与または禁止されていません。管理者は、grant / deny / revokeコマンドを使用して、ユーザーまたはグループのアクセス許可を設定できます。1.3の8つの権限は、これら3つのコマンドのaccessTypeパラメーター値として使用できます。

次の2つの例は、権限設定の操作を示しています。

例1

管理者ログイン:

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にデータテーブルを作成できます。

例2

ユーザー権限は、グループを介して簡単に設定できます。

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つのグループを作成し、これら3人のユーザーはグループに属しています。この読み取り可能なデータテーブルのグループにdfs:// TAQ?quotes権限を付与し、データベースを作成および削除する権限のみをユーザーDeionSandersに付与します。


例3

許可または拒否を使用して、すべてのオブジェクト(*で表される)へのアクセス許可を付与または拒否できます。たとえば、ユーザーJoeFlaccoにDFSデータテーブルを読み取る権限を与えるには、次のようにします。

grant("JoeFlacco",TABLE_READ,"*")  

すべてのオブジェクトの許可または拒否を使用する場合、すべてのオブジェクトに対してのみ取り消しを使用できます。単一のオブジェクトに対して取り消しが無効な場合:

revoke("JoeFlacco",TABLE_READ,"dfs://db1/t1")

上記のコマンドは無効です。

revoke("JoeFlacco",TABLE_READ,"*")

上記のコマンドは、DFSデータテーブルを読み取るためのユーザーJoeFlaccoの許可をキャンセルします。

同様に、grantまたはdenyを使用してグループへのアクセス許可を付与または禁止した後は、再グループ化で取り消しを使用してアクセス許可の設定をキャンセルすることしかできません。グループメンバーが権限設定をキャンセルするために取り消しを使用した場合、それは無効です。

 

1.5権限決定規則

ユーザーの最終的な権限は、ユーザー自身の権限と、ユーザーが属するすべてのグループの権限によって決定されます。異なるグループは、特定のユーザーおよび特定の権限のルールと競合する可能性があります。権限を決定するためのルールは次のとおりです。

  • ユーザーに少なくとも1つのグループで特定のアクセス許可が付与されていて、そのアクセス許可がどのグループでも禁止されていない場合、ユーザーにはこのアクセス許可があります。
  • ユーザーが少なくとも1つのグループで特定のアクセス許可を持って禁止されている場合、そのユーザーが他のグループでこのアクセス許可を与えられていても、そのアクセス許可も禁止されます。この場合、ユーザーがこの権限を取得する場合、管理者は、これらの権限の禁止を取り消す権限を禁止するすべてのグループで取り消しまたは付与を使用する必要があり、ユーザーには少なくとも1つのグループでこの権限が付与されます。上記のルールでは、説明の便宜上、ユーザー自身も特別なグループと見なすことができます。
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")  

上記の3行の結果、ユーザーuser1は「dfs:// db1 / t1」と「dfs:// db1 / t2」を除くすべてのデータテーブルを読み取ることができます。

grant("user2",TABLE_WRITE,"*")  
deny("group1",TABLE_WRITE,"*")  
grant("group2",TABLE_WRITE,"dfs://db1/t2")  

上記の3行の結果、ユーザーuser1とuser2はどのデータテーブルにもデータを書き込むことができません。

 

1.6関数ビューに基づく権限制御

関数ビューは、データテーブルへのユーザーアクセスを制御する柔軟な方法を提供し、ユーザーがデータテーブル内のすべての元のデータを読み取る許可をユーザーに与えることなく、関数ビューによって生成された情報を取得できるようにします。システム管理者のみが、関数ビューを作成および削除する権限を持っています。

管理者は関数ビューを定義します。

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)


2.ストリームコンピューティングにおけるプログラムのスケジューリングと許可の制御

プログラムのスケジューリングとストリームコンピューティングはバックグラウンドで実行されます。多くの場合、明示的なログインがないため、権限の検証はユーザーの明示的なログインの場合とは多少異なります。どちらのタイプのバックグラウンドタスクも、タスクを作成したユーザーとして実行されます。

2.1ジョブの権限設定をスケジュールする

プログラムのスケジューリングとは、ユーザーが特定の時間と特定の頻度で一連のタスクを実行するように指定することを意味します。これは主に、ビジネスシナリオのバッチ処理に使用されます。

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」を読み取る権限を持っている場合、タスクは正常に実行されます。そうでない場合、認証は失敗します。

また、deleteScheduleJobコマンドを使用すると、システム管理者は他のユーザーが作成したタスクを削除でき、管理者以外のユーザーは自分で作成したタスクのみを削除できます。

2.2ストリーミング許可の設定

ユーザーが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に書き込む権限を持っているかどうかを動的に識別します。そうでない場合、認証は失敗します。


3.HTTPSを使用して安全な通信を実現します

DolphinDBは、HTTPSセキュリティプロトコルを使用してWebと通信することをサポートしています。

3.1HTTPS構成を有効にする

HTTPSを構成する2つの方法:

  • 制御ノードの構成ファイルにenableHTTPS = trueを追加します
  • コマンドラインに-enableHTTPStrueを追加して、制御ノードを開始します

3.2HTTPS証明書の設定

DolphinDBは、サーバー側の証明書検証のセキュリティポリシーを使用します。デフォルトでは、自作の証明書が生成され、クライアントはサーバー証明書をインストールする必要があります。そうしないと、ブラウザーは安全でない接続を要求します。各物理サーバーには証明書が必要であるため、制御ノードとプロキシノードは証明書を生成する必要があり、データノードは同じ物理サーバー上のプロキシノードによって生成された証明書を使用します。ユーザーは、サードパーティによって認定された証明書を購入することもできます。

3.2.1サードパーティの認証

サードパーティの証明書の名前をserver.crtに変更し、コントロールノードとエージェントノードのホームディレクトリにあるkeysフォルダーにコピーします。keysフォルダーが存在しない場合は、手動で作成する必要があります。サードパーティの証明書は承認された機関によって発行されるため、ブラウザはデフォルトで証明書を信頼し、手動でインストールする必要はありません。この方法は、ほとんどのアプリケーションシナリオに適しています。

3.2.2自作の証明書をインストールする

小さな閉じたクラスター内で通信​​する場合、ユーザーはOPENSSLの安全な通信に自作の証明書を使用することもできますが、自作の証明書のインストールは少し面倒です。具体的なプロセスは次のとおりです。

  1. 証明書を生成するにはコンピューターのドメイン名を知っている必要があるため、このオプションを、証明書を生成する必要のある物理サーバーのコンピューターのドメイン名に設定します。これは、コマンドラインまたは構成ファイルで設定できます。 。以下は、Linuxでコントロールノードを起動するためのコマンドラインの例です。ここでhttp://www.ABCD.com は、制御ノードが配置されているコンピューターのドメイン名です。
./dolphindb -enableHTTPS true -home master -publicName www.ABCD.com -mode controller -localSite 192.168.1.30:8500:rh8500 -logFile  ./log/master.log

2.証明書が正しく生成されている
かどうかを確認しますコントロールノードを起動し、ホームディレクトリの下のkeysフォルダーに自作の証明書ファイルserver.crtと秘密鍵ファイルserverPrivate.keyがあるかどうかを確認します

3.自作の証明書をブラウザのクレジット証明書センターにインストールします。ブラウザのインス​​トールオプションは少し異なります。例としてGoogleChromeを取り上げます。[設定]-> [詳細設定]-> [証明書の管理]-> [認証局]-> [生成されたサーバーのインポートとインポート]を選択します。上記。crtファイル。

ブラウザhttps://www.XXXX.com:8500/と入力して、クラスタマネージャにアクセスします。ブラウザのアドレスバーに小さな緑色のロックが表示されている場合は、証明書が正常にインストールされ、HTTPSアクセスが可能であることを意味します。


4. SSO(シングルサインオン)をサポートします

クラスタ管理インターフェイスでは、任意のデータノードをクリックして、そのノードのノートブックにリンクできます。制御ノードからデータノードにジャンプすると、別の物理サーバーにアクセスする可能性があります(クロスドメインアクセス)。DolphinDBはSSOを提供するため、ユーザーはクラスター操作中に別の物理サーバーにアクセスするときにシステムに再度ログインする必要がありません。

DolphinDBは、SSO用に2つのAPI関数を提供します。

  • getAuthenticatedUserTicket()現在ログインしているユーザーの暗号化されたチケットを取得します
  • authenticateByTicket(ticket)上記で取得したチケットを使用してシステムにログインします

DolphinDB開発者は、これらのインターフェースを簡単かつ安全に使用してシステムを拡張できます。

おすすめ

転載: blog.csdn.net/qq_41996852/article/details/112505980