完璧なデータベースシステムでは、ユーザーの管理に加えて、一般ユーザーがデータベースオブジェクトを操作できるように設定する必要があります。ただし、一般ユーザーは対応するデータベースオブジェクトへのアクセスおよび操作権限を持っていなければなりません。そうでない場合、ユーザーは一切の操作を行うことができません。
Oracleモードの権限
権限の種類
Oracleモードの権限は、次の2つに分類されます:
オブジェクト権限:特定のオブジェクトに対する操作権限。例えば、あるテーブルオブジェクトに対するAlter、Select、Updateなどの権限がこれに該当します。
システム権限:ユーザーが特定のデータベース操作を実行できるようにする権限。これは、あるSchemaまたは任意のSchemaに対して付与されます。
システム権限は、オブジェクト権限よりもはるかに広範な権限を提供します。
権限の委任
権限の委任は、権限付与者が集中するという問題を解決します。権限付与時に「with admin/grant option」を指定することで、ユーザーに対し、付与された権限を他のユーザーに委任する権限を同時に付与できます。オブジェクト権限を回収する際には、そのユーザーが他のユーザーに委任した権限も同時に回収されます。例えば、AがBに権限を付与し、BがCに権限を付与した場合、AがBの権限を回収すると、Cの権限も回収されます。一方、システム権限を回収する際には、委任された権限は自動的に回収されません。
ロール
権限管理を容易にするために、ロールが設定されています。ロールとは、システム権限とオブジェクト権限の組み合わせであり、ロール内には他のロールを含むことも可能です。ロールをユーザーに付与すると、ユーザーはそのロールに含まれるすべての権限を持つことになります。システムは新しいテナントを作成する際に、以下のデフォルトロールを組み込んでいます:
DBA:ほとんどすべてのシステム権限を持っています。RESOURCE:Resourceロールを持つユーザーは、自身のSchema内でのみデータベースオブジェクトを作成できます。CONNECT:Connect権限を持つユーザーは、データベースにログインできます。PUBLIC:このロールはテナント全体のユーザーに適用されます。デフォルトでは権限は付与されていません。STANDBY_REPLICATION:このロールは主にネットワークベースのフィジカル・スタンバイ・データベースシナリオで使用されます。
間接権限
ユーザーの権限には、直接付与されたシステム権限やオブジェクト権限に加えて、ロールを付与された後にそのロールを通じて取得する権限も含まれます。ほとんどの操作に必要な権限は、直接付与されたものであっても、ロールを通じて間接的に持つものであっても、条件を満たすことができます。ただし、以下のシナリオでは直接権限が必要です:
ビューを作成する際に、ビュー内のオブジェクトにアクセスするために必要な権限。
定義者権限を持つ有名PLブロック内のステートメントを実行するために必要な権限。
権限チェック
Resolverフェーズでは、SQL文に必要なすべての権限を解析し、ユーザーがそれぞれの権限を持っているかどうかを個別にチェックします。システム操作に関する権限については、権限が不足している場合は直接エラーとして権限不足が報告されます。オブジェクトへのアクセス権限については、ユーザーがそのオブジェクトに対して一切の権限を持っていない場合は、エラーとしてオブジェクトが存在しないと報告されます。ユーザーがそのオブジェクトに対して他の権限を持っている場合でも、必要な権限がない場合は、権限不足としてエラーが報告されます。
MySQLモードの権限
Oracleモードとの違いと共通点
MySQLモードもロールをサポートしていますが、現時点ではシステムに組み込まれたデフォルトのロールはありません。権限チェックのロジックはOracleと一致しています。
権限の種類
MySQLモードの権限は、3つのレベルに分類されます:
グローバル権限:テナント全体に影響を与える権限。例えば、システム設定の変更やすべてのテーブルへのアクセスなどの権限がこれに該当します。
データベース権限:特定のデータベース内のすべてのオブジェクトに影響を与える権限。例えば、対応するデータベース内でテーブルの作成・削除やテーブルへのアクセスなどの権限がこれに該当します。
オブジェクト権限:特定のオブジェクトに影響を与える権限。例えば、特定のテーブル、ビュー、またはインデックスへのアクセス権限がこれに該当します。
ネットワークセキュリティアクセス制御
OceanBaseデータベースはアローリストポリシーを提供し、ネットワークセキュリティアクセス制御を実現します。テナントのアローリストは、システム変数ob_tcp_invited_nodesで制御され、リスト形式の値をサポートしており、リスト値の前には英語のカンマ(,)を使用して区切ります。例:A,B,C,D。
ユーザーがログインする際、OBServerノードはユーザーのIPアドレスを順番にA、B、C、Dと照合検証します。すべて一致しない場合はアクセスを拒否します。いずれか一つでも一致すれば、アローリストを通過したことになります。
リスト値は以下の値をサポートします:
IPアドレス。例:192.168.1.1。照合時には等価照合を採用し、ユーザーClient IPがそのIP値と等しい場合にのみ一致とみなされます。
パーセント記号(%)またはアンダースコア()を含むIPアドレス。例:192.168.1.%または192.168.1.。照合時にはあいまい一致を採用し、LIKE構文に似た仕様となります。
IP/NETMASKアドレス。例:192.168.x.x/24または192.168.x.x/255.255.xxx.x。照合時にはマスク照合を採用し、Client_IP & NetMask == IPを満たす場合にのみ一致とみなされます。これはMySQLのマスク照合に似ています。
ラインレベルのアクセス権限制御
OceanBaseデータベースはOracleのラベルセキュリティ機能と互換性があり、行レベルでアクセスを制御し、読み書きデータの安全性を確保できます。
ラベルセキュリティは強制的なアクセス制御の一種であり、テーブルにラベル列を追加して各行のラベル値を記録し、アクセス時にユーザーのラベルとデータのラベルを比較することで、主体(ユーザー)による客体(テーブル内のデータ)へのアクセスを制約する目的を達成します。
OceanBaseデータベースは、この機能を管理・利用するための組み込みのセキュリティ管理者LBACSYSを提供しています。セキュリティ管理者は、セキュリティポリシーの作成、ポリシー内のラベルの定義、ユーザーのラベル設定を通じて、独自のセキュリティポリシーをカスタマイズできます。1つのセキュリティポリシーを複数のテーブルに適用したり、1つのテーブルに複数のセキュリティポリシーを適用したりできます。セキュリティポリシーが適用されるたびに、そのポリシーのアクセス制御用に自動的に1列が追加されます。
注意
現在、ラベルセキュリティはOracleモードのみでサポートされています。