ユーザーアクセスをきめ細かく制御する
このページは英語版のページが機械翻訳されたものです。英語版との間に矛盾または不一致がある場合は、英語版を正としてください。
ScalarDB Cluster は、属性ベースのアクセ ス制御 (ABAC) と呼ばれるメカニズムを使用して、ユーザーをきめ細かく認証できます。このページでは、ScalarDB Cluster で ABAC を使用する方法について説明します。
ABAC とは?
ABAC は ScalarDB Cluster のきめ細かいアクセス制御メカニズムであり、単純な認証によって実行されるテーブルレベルのアクセス制御だけでなく、レコードレベルのアクセス制御を可能にします。ABAC を使用すると、ユーザーは、ユーザーの属性とレコードの属性が一致する場合にのみ、特定のレコードにアクセスできます。たとえば、機密性の高いレコードへのアクセスを、必要な権限を持つユーザーのみに制限できます。このメカニズムは、複数のアプリケーションが同じテーブルを共有しているが、それぞれの権限に基づいて異なるセグメントにアクセスする必要がある場合にも役立ちます。
ABAC を使用する理由
エンタープライズデータベースでは、多くの場合、行レベルのセキュリティまたは同様の代替手段が提供され、データベーステーブル内の行へのアクセスを制御できます。ただし、システムが複数のデータベースで構成されている場合は、各データベースを1つずつ同じ方法で設定する必 要があります。異なる種類のデータベースを使用する場合は、各データベースの機能の違いを理解した上で各データベースを設定する必要があります。このような設定は負担が大きすぎ、エラーが発生しやすくなります。ABAC を使用すると、ScalarDB で複数のデータベースを管理する場合でも、1回設定するだけで済みます。
ほとんどのデータベースの行レベルのセキュリティ機能では、ストアドプロシージャなどの関数を使用してマッチングロジックを実装する必要があります。これにより、必要なロジックを実現するために大量のコードを記述することになり、負担が大きくなることがあります。対照的に、ABAC では、タグと呼ばれる属性を使用してマッチングロジックを設定できます。ABAC では、これらのタグを定義してユーザーとレコードに割り当てるだけでよいため、コーディングの必要がありません。タグは、柔軟かつ簡単な方法でマッチングロジックを指定できる複数のコンポーネントで構成されています。
コンポーネント
ABAC には、タグやポリシーなどのいくつかのコンポーネントがあります。
タグ
タグは、レベル、コンパートメント、グループの3つのコンポーネントで構成される単一の属性であり、ユーザーやデータに割り当てることがで きます。ユーザーに割り当てられたタグは ユーザータグ と呼ばれ、データに割り当てられたタグは データタグ と呼ばれます。
レベル
レベルコンポーネントはデータの機密性を示します。すべてのユーザータグとデータタグにはレベルが必要です。たとえば、ユーザーは 機密、機密性の高い、非常に機密性の高い などのレベルを定義できます。
各レベルについて、スーパーユーザーは次の属性を定義します。
| 属性 | 説明 |
|---|---|
| 短い名前 | レベルの短い識別子。この名前は最大30文字まで含めることができます。 |
| 長い名前 | レベルの長く説明的な名前。 |
| レベル番号 | レベルのランクを表す数値。 |
スーパー ユーザーは各レベル (および他のタグコンポーネント) の長い名前と短い名前の両方を定義しますが、ABAC の下で行を取得する際に表示されるのは短い名前のみです。ユーザーがタグを操作する際には、コンポーネントの短い名前のみを使用する必要があります。
コンパートメント
コンパートメントコンポーネントはオプションであり、コンパートメントは互いに独立しています。通常、1つ以上のコンパートメントが定義され、データを異なるカテゴリに分類します。コンパートメントは、特定のデータタイプ、知識領域、地理的地域、または特別な承認が必要なプロジェクトを表すことがあります。たとえば、HR、Finance、Accounting などです。
各コンパートメントについて、スーパーユーザーは次の属性を定義します。
| 属性 | 説明 |
|---|---|
| 短い名前 | コンパートメントの短い識別子。この名前は最大30文字まで含めることができます。 |
| 長い名前 | コンパートメントの長く説明的な名前。 |
グループ
グループコンポーネントもオプションであり、コンパートメントと似ていますが、1つの重要な違いがあります。グルー プは親子関係を持つことができます。通常、1つ以上のグループが定義され、データを整理します。グループは、組織構造や地域ごとにデータをセグメント化するために最もよく使用されます。たとえば、EU には子グループ France と Italy があり、North America には子グループ US と Canada があります。
各グループについて、スーパーユーザーは次の属性を定義します。
| 属性 | 説明 |
|---|---|
| 短い名前 | グループの短い識別子。この名前は最大30文字まで含めることができます。 |
| 長い名前 | グループの長く説明的な名前。 |
タグ構文
タグは、レベル、コンパートメント、およびグループで構成される文字列として表されます。タグの構文は次のとおりです。
LEVEL:COMPARTMENT1,...,COMPARTMENTn:GROUP1,...,GROUPn
コロン (:) はコンポーネント間の区切り文字として使用されます。末尾の区切り文字は省略可能です。
たとえば、レベルが SENSITIVE、コンパートメント が HR と FINANCIAL、グループが EU と NA のタグは次のようになります。
SENSITIVE:HR,FINANCIAL:EU,NA
コンパートメントやグループがない場合、タグは次のようになります。
SENSITIVE
コンパートメントがあり、グループがない場合、タグは次のようになります。
SENSITIVE:HR,FINANCIAL
グループがあり、コンパートメントがない場合、タグは次のようになります。
SENSITIVE::EU,NA
ポリシー
ABAC ポリシーは、アクセス制御の動作を定義するメタデータを格納するコンテナです。このコンテナには、ポリシー名と、保護されたテーブルに ABAC が追加する列の名前 (データタグ列) が指定されます。この列には、テーブル内の各行に割り当てられたデータタグが格納されます。
スーパーユーザーは、固有の名前を持つ複数のポリシーを作成できます。各ポリシーには1つのデータタグ列しか持つことができず、データタグ列の名前はすべてのポリシーで一意である必要があります。
データタグ列は非表示の列であり、デフォルトでは表示されません。データタグ列を操作するには、クエリに明示的に含める必要があります。
名前空間ポリシーとテーブルポリシー
名前空間ポリシーは、名前空間に適用される ABAC ポリシーです。名前空間に名前空間ポリシーがある場合、その名前空間のすべ てのテーブルは適用されたポリシーを使用します。同様に、テーブルポリシーはテーブルに適用される ABAC ポリシーです。
名前空間またはテーブルポリシーが作成されると、データタグ列は自動的に名前空間内のすべてのテーブルまたは指定されたテーブルに追加されます。さらに、名前空間に名前空間ポリシーが既にある場合、その名前空間に後で追加されたテーブルにもデータタグ列が自動的に追加されます。
ユーザーおよびデータタグを使用してユーザーアクセスを制御する
ABAC は、ユーザーおよびデータのタグを定義し、それらが一致するかどうかを確認することでユーザーアクセスを制御します。
ABAC ポリシーがデータへのアクセスを制御するために使用する2つの主要なコンポーネントがあります。
- ユーザータグ: ユーザータグは、ユーザーの機密性レベルと、タグ付けされたデータへのアクセスを制約するコンパートメントおよびグループを定義します。
- データタグ: 各行に割り当てられたデータタグは、その行の機密性レベルを示し、ユーザーがその行にアクセスするために認可される必要があるコンパートメントおよびグループ を含みます。
ABAC で保護されたデータにアクセスするには、ユーザーはポリシーで定義されたタグに基づいて適切な認可を持っている必要があります。
ユーザータグ
各 ABAC ユーザーには、次のコンポーネントを含む認可が設定されています。
- 最大レベル
- 認可されたコンパートメントのセット
- 認可されたグループのセット
- 各コンパートメントおよびグループごとに、読み取り専用アクセスまたは読み取り/書き込みアクセスの指定
読み取りおよび書き込みタグ
読み取りタグは、ユーザーが読み取りを許可されたレベル、コンパートメント、およびグループの特定の組み合わせであり、ユーザーがデータを読み取るときに使用されます。書き込みタグは、ユーザーが書き込みを許可されたレベル、コンパートメント、およびグループの特定の組み合わせであり、ユーザーがデータを書き込むときに使用されます。
ユーザーは、各操作の読み取りおよび書き込みタグを指定してデータへのアクセスをさらに制限できますが、デフォルトの読み取りおよび書き込みタグがデフォルトで使用されます。 詳細については、各操作のユーザータグを調整するを参照してください。
行タグ
行タグは、ユーザーが書き込みを許可されたレベル、コンパートメント、およびグループの特定の組み合わせであり、新しく挿入されたデータのデータタグとして使用されます。
ユーザーは、INSERT および UPSERT 操作の行タグを指定できますが、デフォルトの行タグがデフォルトで使用されます。詳細については、各操作のユーザータグを調整するを参照してください。
ユーザータグ情報
スーパーユーザーは、ユーザーに対してレベル、コンパートメント、およびグループの認可を明示的に設定します。これをユーザータグ情報と呼びます。
- レベル
- レベル
- ユーザーが読み取りおよび書き込み操作中にアクセスできる最大の機密性レベル。
- デフォルトレベル
- ユーザーのデフォルトタグで使用されるレベル 。
- 行レベル
- ユーザーのデフォルト行タグで使用されるレベル。
- レベル
- コンパートメント
- アクセスモード:
READ_ONLYまたはREAD_WRITE- ユーザーがタグにコンパートメントを含むデータに書き込みを許可されているかどうかを決定します。
- デフォルト
- コンパートメントがユーザーのデフォルトタグに追加されるかどうかを決定します。
- 行
- コンパートメントがユーザーのデフォルト行タグに追加されるかどうかを決定します。
- アクセスモード:
- グループ
- アクセスモード:
READ_ONLYまたはREAD_WRITE- ユーザーがタグにグループを含むデータに書き込みを許可されているかどうかを決定します。
- デフォルト
- グループがユーザーのデフォルトタグに追加されるかどうかを決定します。
- 行
- グループがユーザーのデフォルト行タグに追加されるかどうかを決定します。
- アクセスモード:
計算されたユーザータグ
ABAC は、ユーザータグ情報に基づいていくつかのユーザータグを自動的に計算します。
| 計算されたユーザータグ | 説明 |
|---|---|
| 最大読み取りタグ | ユーザーのレベルと、ユーザーがアクセスできるすべての認可されたコンパートメントおよびグループの組み合わせ。 |
| 最大書き込みタグ | ユーザーのレベルと、ユーザーが書き込みアクセス権を持つすべてのコンパートメントおよびグループの組み合わせ。 |
| デフォルト読み取りタグ | ユーザーのデフォルトレベルと、ユーザーにデフォルトとして指定されたコンパートメントおよびグループの組み合わせ。 |
| デフォルト書き込みタグ | デフォルト読み取りタグのサブセットであり、ユーザーが書き込みアクセス権を持つコンパートメントおよびグループのみを含む。 |
| デフォルト行タグ | ユーザーの書き込みタグのコンポーネントの組み合わせであり、デフォルトで新しく挿入されたデータのデータタグとして使用される。 |
データタグ
データタグは各行に割り当てられ、その行の機密性レベルを示し、ユーザーがその行にアクセスするために認可される必要があるコンパートメントおよびグループを含みます。新しいデータが挿入されると、行タグがデータタグとして使用されます。既存の行のデータタグを更新することもできます。詳細については、データタグを更新するを参照してください。
マッチングアルゴリズム
このセクションでは、読み取りおよび書き込みのマッチングアルゴリズムについて説明します。
読み取りのマッチングアルゴリズム
このフローチャートは、読み取りのマッチングアルゴリズムを示しています。このアルゴリズムは、SELECT、UPSERT、UPDATE、および DELETE ステートメントで使用されます。
- ユーザーのレベルがデータのレベル以上であるかどうかを確認します。
- はいの場合、かつデータにグループがある場合、ユーザーがデータタグに含まれるグループの少なくとも1つにアクセスできるかどうかを確認します。
- はいの場合、かつデータにコンパートメントがある場合、ユーザーがデータタグに含まれるすべてのコンパートメントにアクセスできるかどうかを確認します。
- すべての条件が満たされている場合、ユーザーはデータにアクセスできます。いずれかの条件が満たされない場合、ScalarDB はデータへのアク セスを拒否します。
書き込みのマッチングアルゴリズム
このフローチャートは、書き込みのマッチングアルゴリズムを示しており、読み取りのアルゴリズムと似ています。違いは、書き込みのアルゴリズムは、コンパートメントとグループに書き込みアクセスがあるかどうかも確認することです。このアルゴリズムは、UPSERT、UPDATE、および DELETE ステートメントで使用されます。
- ユーザーのレベルがデータのレベル以上であるかどうかを確認します。
- はいの場合、かつデータにグループがある場合、ユーザーがデータタグに含まれるグループの少なくとも1つに対して書き込みアクセス権を持っているかどうかを確認します。
- はいの場合、かつデータにコンパートメントがある場合、ユーザーがデータタグに含まれるすべてのコンパートメントに対して書き込みアクセス権を持っているかどうかを確認します。
- すべての条件が満たされている場合、ユーザーはデータにアクセスできます。いずれかの条件が満たされない場合、ScalarDB はデータへのアクセスを拒否します。
グループの読み取り/書き込み認可の伝播
ユーザーが親グループに読み取り/書き込みアクセス権を持っている場合、自動的にその子グループにも読み取り/書き込みアクセス権を継承します。さらに、スーパーユーザーは、親グループのアクセス権に影響を与えずに、子グループに書き込みアクセス権を独立して付与できます。
ユーザータグとデータタグの連携方法
ユーザーは、自分のタグ認可の範囲内でのみデータにアクセスできます。
たとえば、ポリシーで次のレベル、コンパートメント、およびグループが定義されているとします。
レベル:
HS(HIGHLY_SENSITIVE)、レベル番号は 4000S(SENSITIVE)、レベル番号は 3000C(CONFIDENTIAL)、レベル番号は 2000P(PUBLIC)、レベル番号は 1000
コンパートメント:
HRFINLEG
グループ:
EUFRA(EUの子)ITA(EUの子)NAUS(NAの子)
次に、以下のテーブルがあるとします。
| 行 | データタグ |
|---|---|
| 1 | S:HR:EU |
| 2 | C:HR,FIN:FRA |
| 3 | HS:HR,FIN:EU |
| 4 | C:HR:NA |
| 5 | P:LEG:EU |
| 6 | P:FIN:ITA |
| 7 | P:HR:US |
読み取りタグ S:HR,FIN:EU を使用してテーブルで読み取り操作を行うと、行 1、2、および 6 にアクセスできます。以下はその理由です。
- 読み取りタグに
Sレベルが含まれているため、S、C、およびPレベルの行にアクセスできます。認可されたレベルよりも高いHSレベルのデータにはアクセスできません。したがって、HSレベルの行3を読み取ることはできません。 - 読み取りタグに
HRおよびFINコンパートメントが含まれているため、これらのコンパートメントのいずれかまたは両方を持つ行にアクセスできます。したがって、LEGコンパートメントを持つ行5を読み取ることはできません。 - 読み取りタグに
EUグループが含まれているため、EUグループまたはその子グループFRAおよびITAに属する行にアクセスできます。したがって、NAおよびUSグループを持つ行4および7を読み取ることはできません。
書き込みタグ C:HR:NA を使用してテーブルで書き込み操作を行うと、行 4 および 7 に書き込むことができます。以下はその理由です。
- 書き込みタグに
Cレベルが含まれているため、CおよびPレベルのデータに書き込むことができます。認可されたレベルよりも高いSおよびHSレベルのデータには書き込むことができません。したがって、1および3の行に書き込むことはできません。 - 書き込みタグに
HRコンパートメントが含まれているため、このコンパートメントを持つデータに書き込むことができます。したがって、FINおよびLEGコンパートメントを持つ行2、3、5、および6に書き込むことはできません。 - 書き込みタグに
NAグループが含まれているため、NAグループまたはその子グループUSに属するデータに書き込むことができます。したがって、EU、FRA、およびITAグループを持つ行1、2、3、5、および6に書き込むことはできません。
各操作のユーザータグを調整する
デフォルトでは、ABAC は各操作に対してデフォルトの計算されたユ ーザータグを使用します。ただし、ユーザーは各操作のタグを調整してデータへのアクセスをさらに制限できます。
読み取りタグを調整する
ユーザーがデータを読み取るとき、デフォルトではユーザータグ情報からのデフォルトの読み取りタグが使用されます。データの読み取りは、SELECT、UPSERT、UPDATE、および DELETE 操作を行うときに発生します。
ただし、ユーザーは操作ごとに読み取りタグを指定してデータへのアクセスをさらに制限できます。このタグのレベルは、ユーザータグ情報のレベルまで設定できます。そして、コンパートメントとグループは、ユーザータグ情報に含まれるコンパートメントとグループに設定できます。
指定された読み取りタグを使用してデータを読み取る構文は次のとおりです。
SELECT の場合:
SELECT * FROM table_name WHERE ... WITH ABAC_READ_TAG '<READ_TAG>' FOR POLICY '<POLICY_NAME>';
UPSERT の場合:
UPSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...) WITH ABAC_READ_TAG '<READ_TAG>' FOR POLICY '<POLICY_NAME>';
UPDATE の場合:
UPDATE table_name SET column1 = value1, column2 = value2, column3 = value3, ... WHERE ... WITH ABAC_READ_TAG '<READ_TAG>' FOR POLICY '<POLICY_NAME>';
DELETE の場合:
DELETE FROM table_name WHERE ... WITH ABAC_READ_TAG '<READ_TAG>' FOR POLICY '<POLICY_NAME>';
書き込みタグを調整する
ユーザーがデータを書き込む場合、デフォルトではユーザータグ情報からのデフォルトの書き込みタグが使用されます。これは、UPSERT、UPDATE、および DELETE 操作に適用され、これらには何らかの形で書き込み操作が含まれます。
ただし、ユーザーは操作ごとにタグを設定してデータへのアクセスをさらに制限することができます。このタグのレベルは、ユーザータグ情報のレベルまで設定できます。ただし、このタグのコンパートメントとグループはより制限されています。このタグには、ユーザータグ情報に含まれる コンパートメントとグループのみを含めることができ、その中でもユーザーが書き込みアクセス権を持つものだけを含めることができます。
書き込みタグを指定してデータを書き込む構文は次のとおりです。
UPSERT の場合:
UPSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...) WITH ABAC_WRITE_TAG '<WRITE_TAG>' FOR POLICY '<POLICY_NAME>';
UPDATE の場合:
UPDATE table_name SET column1 = value1, column2 = value2, column3 = value3, ... WHERE ... WITH ABAC_WRITE_TAG '<WRITE_TAG>' FOR POLICY '<POLICY_NAME>';
DELETE の場合:
DELETE FROM table_name WHERE ... WITH ABAC_WRITE_TAG '<WRITE_TAG>' FOR POLICY '<POLICY_NAME>';
行タグを調整する
ユーザーがデータを挿入する際にデータタグを指定しない場合、デフォルトでユーザータグ情報からのデフォルトの行タグが自動的に割り当てられます。
ただし、ユーザーは書き込まれる行のデータタグをユーザータグ情報の特定の制限内で設定できます。このタグのレベルは、ユーザータグ情報のレベルまで設定できます。ただし、この行の新しいタグのコンパートメントとグループはより制限されています。新しいタグには、ユーザータグ情報に含まれるコンパートメントとグループのみを含めることができ、その中でもユーザーが書き込みアクセス権を持つものだけを含めることができます。
データタグを指定してデータを挿入する構文は次のとおりです。
INSERT の場合:
INSERT INTO table_name (column1, column2, column3, ..., <DATA_TAG_COLUMN>) VALUES (value1, value2, value3, ..., '<DATA_TAG>');
UPSERT の場合:
UPSERT INTO table_name (column1, column2, column3, ..., <DATA_TAG_COLUMN>) VALUES (value1, value2, value3, ..., '<DATA_TAG>');
データを挿入する際に、列リストにデータタグ列を含め、値リストにデータタグ値を提供することで、データタグを指定できます。
データタグ列は本質的に非表示の列であるため、データタグを設定または調整する場合は、列リストにデータタグ列を明示的に含める必要があります。