ラベルベースのセキュリティ (LabelSecurity) は、プロジェクトスペースレベルで必須の MaxCompute アクセス制御 (MAC) ポリシーです。これにより、プロジェクト管理者は列レベルで機密データへのユーザーアクセスを柔軟に制御できます。

MaxCompute における MAC と DAC の違い

MaxCompute では、MAC は Discretionary Access Control (DAC) から独立しています。 MAC と DAC の違いを説明するために 2 つの例を示します。

自動車を運転するには、まず有効な運転免許証を申請して取得する必要があります。同様に、MaxCompute プロジェクトでデータを読み取る必要があるユーザーは、まず SELECT 権限を申請する必要があります。 権限申請は DAC のスコープ内です。

事故率が高い国なので、飲酒運転は厳しく制限されています。 これを規制するために、すべての運転手は運転免許証を持っている必要があり、飲酒して運転してはいけません。 同様に、MaxCompute では、機密度の高いデータを読み取ることは、飲酒運転に対する法律と似ています。 読み取り禁止は MAC のスコープ内です。

データ機密度分類

LabelSecurity は、データとそのデータにアクセスするユーザーにセキュリティレベルを割り当てます。 政府および金融部門では、データの機密度を通常 0 (未分類)、1 (秘密)、2 (機密)、3 (極秘) の 4 つのレベルに分類しています。MaxCompute は同様の分類を採用しています。 プロジェクト所有者は、データ機密度分類とアクセスレベル分類の基準を定義する必要があります。 すべてのユーザーのデフォルトのアクセスレベルは 0、データのデフォルトの機密度レベルは 0 です。

LabelSecurity は列レベルでデータの機密度の分類をサポートします。 管理者は、テーブルのすべての列に機密度ラベルを設定できます。 テーブルには、異なる機密度レベルの列があります。

管理者はビューに機密度ラベルを設定することもできます。 ビューとそのベーステーブルには、独立した機密度ラベルがあります。 新しいビューのデフォルトの機密度レベルは 0 です。

LabelSecurity のデフォルトセキュリティポリシー

LabelSecurity は、機密度ラベルまたはセキュリティラベルを割り当てられたデータおよびユーザーに、次のデフォルトのセキュリティポリシーを適用します。
  • No-ReadUp: 明示的に権限付与されていない限り、ユーザーレベルより高い機密度レベルのデータを読み取ることは許可されません。
  • Trusted-User: ユーザーはすべての機密度レベルのデータを書き込むことが許可されます。 新規データのデフォルトの機密度レベルは 0 (未分類) です。
  • 従来の一部の MAC システムでは、プロジェクト内での不正なデータ配信を防ぐために、他の複雑なセキュリティポリシーが適用されています。 たとえば、No-WriteDown ポリシーは、ユーザーがユーザーレベル以下の機密度レベルでデータを書き込むことを禁止します。 プロジェクト管理者のデータ機密度レベルの管理に伴うコストを考慮して、MaxCompute はデフォルトでは No-WriteDown をサポートしません。 プロジェクトのセキュリティ設定を変更することで (Set ObjectCreatorHasGrantPermission = false)、No-WriteDown 効果を得られます。
  • 異なるプロジェクト間でのデータ転送を禁止するには、プロジェクトを保護状態に設定します (ProjectProtection)。 この設定では、ユーザーは自分のプロジェクト内のデータにのみアクセスできます。 これにより、プロジェクト外でのデータ転送やデータ共有が防止されます。

デフォルトでは、プロジェクトは LabelSecurity を無効にしています。 プロジェクト所有者は、必要に応じて有効にすることができます。

LabelSecurity が有効になると、デフォルトのセキュリティポリシーが実行されます。 ユーザーがデータテーブルにアクセスする場合、SELECT 権限と機密データの読み取りに必要なアクセスレベルを持っていなければなりません。 LabelSecurity への準拠は必須ですが、CheckPermission を付与するのに十分な条件ではありません。

LabelSecurity 操作

  • LabelSecurity を有効または無効にする
     Set LabelSecurity=true|false; 
       -- Enables or disables LabelSecurity. The default value is false.
       -- LabelSecurity can be enabled or disabled only by the project owner. Other operations can be performed by the project administrator.
  • ユーザーのセキュリティラベルを設定する
     SET LABEL <number> TO USER <username>;-- Value range of "number": [0, 9]. This operation can be performed only by the project owner or administrator.
     -Example:
     ADD USER aliyun$yunma@aliyun.com; --Adds a user with the default security label 0.
     ADD USER ram$yunma@aliyun.com:Allen; --Adds user Allen, which is a RAM subaccount of yunma@aliyun.com.
     SET LABEL 3 TO USER aliyun$yunma@aliyun.com; 
       -- Sets the security label of yunma to 3 to allow this user to access only the data with a sensitivity level not higher than 3.
     SET LABEL 1 TO USER ram$yunma@aliyun.com:Allen;  
       -- Sets the security label of subaccount Allen to 1 to allow this user to access only the data with a sensitivity level not higher than 1.
    
  • データの機密度ラベルを設定する
     SET LABEL <number> TO TABLE tablename(column_list); -- Value range of "number": [0, 9]. This operation can be performed only by the project owner or administrator.
     -Example:
     SET LABEL 1 TO TABLE t1;  --Sets the sensitivity label of table t1 to 1.
     SET LABEL 2 TO TABLE t1(mobile, addr); --Sets the sensitivity labels of the "mobile" and "addr" columns of table t1 to 2.
     SET LABEL 3 TO TABLE t1;  --Sets the sensitivity label of table t1 to 3.  The sensitivity labels of the "mobile" and "addr" columns are still 2.
    
    列に明示的に設定された機密度ラベルは、ラベルの設定順序や機密度レベルを考慮せずに、テーブルの機密度ラベルセットを上書きします。
  • 低レベルのユーザーに、機密度レベルの高いデータテーブルへのアクセスを明示的に許可する
     --Grant permissions:
     GRANT LABEL <number> ON TABLE <tablename>[(column_list)] TO USER <username> [WITH EXP <days>]; --The default validity period is 180 days. 
     -- Revoke the permissions:
     REVOKE LABEL ON TABLE <tablename>[(column_list)] FROM USER <username>; 
     -- Clear the expired permissions:
     CLEAR EXPIRED GRANTS;
     -Example:
     GRANT LABEL 2 ON TABLE t1 TO USER ram$yunma@aliyun.com:Allen WITH EXP 1; --Explicitly authorizes Allen to access the data of table t1 with a sensitivity level not higher than 2 for a period of 1 day.
     GRANT LABEL 3 ON TABLE t1(col1, col2) TO USER ram$yunma@aliyun.com:Allen WITH EXP 1; --Explicitly authorizes Allen to access the data in col1 and col2 of table t1 with a sensitivity level not higher than 3 for a period of 1 day.
     REVOKE LABEL ON TABLE t1 FROM USER ram$yunma@aliyun.com:Allen; --Revokes the permission of Allen to access the sensitive data in table t1.
    
    ユーザーがテーブルにアクセスするためのラベル権限が取り消されると、そのユーザーのテーブルへのアクセス権限も取り消されます。
  • ユーザーがアクセスできる機密データセットを一覧表示する
     SHOW LABEL [<level>] GRANTS [FOR USER <username>]; 
        --When [FOR USER <username>] is unspecified, the system lists the sensitive data sets that the current user can access.
       --When <level> is unspecified, the system lists the permissions granted by all label levels.When <level> is specified, the system lists only the permissions granted by a specific label level.
    
  • 機密データを含むテーブルにアクセスできるユーザーを一覧表示する
     SHOW LABEL [<level>] GRANTS ON TABLE <tablename>;
       --Displays the label-authorized permissions on the specified table.
    
  • データテーブルにアクセスするために全レベルでのユーザーのラベル権限を一覧表示する
     SHOW LABEL [<level>] GRANTS ON TABLE <tablename> FOR USER <username>;
       --Displays the label-authorized permissions of the specified user to access the columns of a specific table.
    
  • テーブルのすべての列の機密度レベルを一覧表示する
    DESCRIBE <tablename>;
    
  • パッケージの機密リソースに関するパッケージインストーラのアクセスレベルを制御する
     ALLOW PROJECT <prjName> TO INSTALL PACKAGE <pkgName> [USING LABEL <number>]; 
       --The package creator grants an access level to the package installer regarding the sensitive resources of the package.
    
    • [USING LABEL <number>] が指定されていない場合、デフォルトのアクセスレベルは 0 です。 パッケージインストーラは、機密データ以外のデータにのみアクセスできます。
    • プロジェクト間で機密データにアクセスする場合、このコマンドで定義されたアクセスレベルは、パッケージインストーラのプロジェクト内のすべてのユーザーに適用されます。

LabelSecurity のユースケース

  • プロジェクト内のすべてのユーザー (プロジェクト管理者を除く) が、テーブルの機密列を読み取ることを禁止する

    説明:

    user_profile は、プロジェクト内の機密データを含むテーブルです。 100 列あり、そのうちの5列には機密データが含まれています (id_card、credit_card、mobile、user_addr、birthday)。 DAC は、このテーブルに対する SELECT 権限をすべてのユーザーに付与します。 プロジェクト所有者は、プロジェクト管理者を除くすべてのプロジェクトユーザーがテーブルの機密列を読み取ることを禁止したいと考えています。
    この目的を達成するために、プロジェクト所有者は以下の操作を実行できます。
     set LabelSecurity=true; 
       --Enables LabelSecurity.
     set label 2 to table user_profile(mobile, user_addr, birthday); 
       --Sets the sensitivity level of the specified columns to 2.
     set label 3 to table user_profile(id_card, credit_card); 
       --Sets the sensitivity level of the specified columns to 3.
    上記の操作後、管理者以外のユーザーは 5 列のデータにアクセスできません。 業務目的で機密データにアクセスするには、プロジェクト所有者または管理者の承認が必要です。

    ソリューション:

    Alice はプロジェクトのメンバーです。 公的な目的のため、テーブル user_profile の mobile 列のデータへのアクセスを 1 週間という期間で申請したいと考えています。 Alice に権限付与するため、プロジェクト管理者は次の操作を実行できます。
    GRANT LABEL 2 ON TABLE user_profile TO USER ALIYUN$alice@aliyun.com WITH EXP 7;
    mobile、user_addr、birthday の各列には、機密度レベル 2 のデータが含まれています。 権限付与後、Alice はこれら 3 つの列のデータにアクセスできます。 権限付与により、過剰な権限付与の問題が生じます。 プロジェクト管理者が機密度の高い列を正しく設定すると、この問題を回避できます。
  • 機密データへのアクセス権を持つプロジェクトユーザーが、権限付与なしにプロジェクト内の機密データをコピーし配布することを禁止する

    説明:

    上記のユースケースでは、Alice は公的な目的のために機密度レベル 2 のデータに対するアクセス権限を与えられています。 プロジェクト管理者は、Alice が自分で作成したテーブル user_profile_copy にテーブル user_profile のデータをコピーし、user_profile_copy に対するアクセス権限を Bob に付与する可能性があることを心配しています。 プロジェクト管理者には、Alice の操作を制限する方法が必要です。

    ソリューション:

    セキュリティの利便性と管理コストを考慮して、LabelSecurity は WriteDown を許可するデフォルトのセキュリティポリシーを採用します。 ユーザーは、ユーザーレベル以下の機密度レベルの列にデータを書き込むことができます。 MaxCompute は、プロジェクト管理者の前述の要件を満たすことはできません。ただし、プロジェクト管理者は、自分が作成したデータにのみアクセスできるようにし、他のユーザーにデータアクセス権限を付与できないようにすることで、Alice の権限付与操作を制限できます。 手順は次のとおりです:。
     SET ObjectCreatorHasAccessPermission=true; 
       --Allows the object creator to operate objects.
     SET ObjectCreatorHasGrantPermission=false; 
       --Prohibits the object creator from granting the object access permission to other users.