優れたデータベースシステムでは、ユーザーの管理に加えて、一般ユーザーを設定してデータベースオブジェクトの操作を実行させる必要があります。ただし、一般ユーザーは対象となるデータベースオブジェクトへのアクセスおよび操作権限を持っていなければならず、それがなければいかなる操作も実行できません。
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のLabel Security機能に対応しており、行レベルでアクセスを制御することで、データの読み書きのセキュリティを確保します。
Label Securityは強制アクセス制御の一方式であり、テーブルにLabel列を追加して各行のLabel値を記録し、アクセス時にユーザーのLabelとデータのLabelを比較することで、主体(ユーザー)が客体(テーブル内のデータ)にアクセスすることを制約する目的を達成します。
OceanBaseデータベースは、この機能の管理と使用を担う組み込みのセキュリティ管理者LBACSYSを提供しています。セキュリティ管理者は、セキュリティポリシーの作成、ポリシー内のLabelの定義、ユーザーのLabel設定を通じて、独自のセキュリティポリシーをカスタマイズできます。一つのセキュリティポリシーを複数のテーブルに適用することも、一つのテーブルに複数のセキュリティポリシーを適用することも可能です。セキュリティポリシーが適用されるたびに、そのテーブルには自動的に、当該セキュリティポリシーのアクセス制御に使用される列が追加されます。
注意
現在、Label SecurityはOracleモードのみでサポートされています。