複数のプロジェクトにアクセスできるユーザーは、プロジェクト間でデータを移動させることでセキュリティリスクを生じさせる可能性があります。MaxCompute は、データ流出を制御し、プロジェクトデータを保護するためのプロジェクトデータ保護機能を提供します。このトピックでは、プロジェクトデータ保護機能と、データ流出を管理するためのポリシーについて説明します。
背景情報
一部の企業では、データセキュリティ要件が高く、機密データの漏えいを防ぐためにさまざまな対策を講じています。たとえば、従業員は職場でのみ業務を行うことができ、仕事の資料をオフィス外に持ち出すことは許可されていません。オフィスコンピューターのすべての USB ポートは無効化されています。ユーザーがプロジェクトから別のプロジェクトへデータを転送するセキュリティ上の問題が発生する可能性があります。
たとえば、ユーザー Alice は Project1 と Project2 へのアクセス権限を持っています。Alice は Project1 の table1 テーブルに対する Select 権限と、Project2 に対する CreateTable 権限を持っています。この場合、プロジェクトデータ保護機能が無効になっていると、Alice は次のステートメントを実行して、table1 のデータを Project1 から Project2 に転送できます。この操作は、機密データの漏えいリスクを引き起こします。
CREATE TABLE project2.table2 AS SELECT * FROM project1.table1;上記の例は、複数の MaxCompute プロジェクトへのアクセス権限を同時に持つユーザーが、プロジェクト間でデータを転送できることを示しています。MaxCompute はプロジェクトデータ保護機能を提供します。プロジェクトに機密性の高いデータが存在する場合、プロジェクトオーナーはプロジェクトデータ保護機能を有効にする必要があります。
デフォルトでは、プロジェクトデータ保護は無効になっています。プロジェクトオーナーは、 set projectProtection=true; コマンドを実行して有効にできます。有効にすると、データフローは制限され、データはプロジェクトに流入することのみが可能で、流出はできません。
注意事項
プロジェクトデータ保護を有効にした後、次の点に注意してください。
プロジェクト間のデータアクセス操作は、データ保護ルールに違反するためブロックされます。特定のデータが他のプロジェクトに流出することを許可するなどの例外を作成するために、MaxCompute は2つの戦略を提供します。 データ流出戦略 1: 例外ポリシーの設定 と データ流出戦略 2: 信頼できるプロジェクトの設定 です。
プロジェクトデータ保護機能はデータフローを制御しますが、データへのアクセス権限は制御しません。データフロー制御は、ユーザーがデータへのアクセス権限を持っている場合にのみ意味があります。
MaxCompute では、プロジェクト間のパッケージベースのリソース共有 機能は、プロジェクトデータ保護機能とは独立しています。これらの機能の効果は相互排他です。パッケージベースのリソース共有は、プロジェクトデータ保護よりも優先されます。たとえば、Project B のユーザーがパッケージベースのリソース共有を使用して Project A のオブジェクトへのアクセス権限を付与されている場合、プロジェクトデータ保護機能はそのオブジェクトには適用されません。
データ流出ポリシー 1: 例外ポリシーの構成
プロジェクト間のデータアクセス操作が必要な場合、プロジェクトオーナーは、指定されたユーザーが指定されたオブジェクトのデータを現在のプロジェクトから指定されたプロジェクトに転送できるように、事前に例外ポリシーを構成する必要があります。例外ポリシーが構成されると、プロジェクトデータ保護機能が有効になっていても、オブジェクトのデータを指定されたプロジェクトに転送できます。
セットアップ
MaxCompute クライアント
プロジェクトデータ保護を有効にするのと同時に例外ポリシーを構成します。構成後、SHOW SecurityConfiguration; コマンドを実行してポリシーの詳細を表示します。例外ポリシーを設定するには、次のコマンドを使用します。
SET ProjectProtection=true with exception <policyfile>;policyfile は例外ポリシーファイルであり、MaxCompute クライアントのインストールパスの bin ディレクトリに TXT 形式で保存する必要があります。コンテンツ形式は次のとおりです。
{
"Version": "1",
"Statement":
[{
"Effect":"Allow",
"Principal":"<Principal>",
"Action":["odps:<Action1>[, <Action2>, ...]"],
"Resource":"acs:odps:*:<Resource>",
"Condition":{
"StringEquals": {
"odps:TaskType":["<Tasktype>"]
}
}
}]
}パラメーター | 説明 |
Effect | データの流出を許可するかどうかを指定します。値を Allow に設定します。この値は、データの流出が許可されることを示します。 |
Principal | プロジェクトからのデータ転送を許可される Alibaba Cloud アカウントまたは RAM ユーザー。 |
Action | 許可されるデータ流出操作。 さまざまな種類のオブジェクトのアクションについては、「MaxCompute 権限」をご参照ください。 |
Resource | データ流出が許可されるプロジェクトとオブジェクト。形式: |
Tasktype | データの流出が許可されるジョブのタイプ。有効な値: DT、SQL、および MapReduce。DT は Tunnel を示します。 |
MaxCompute コンソール
MaxCompute コンソール にログインし、左上隅でリージョンを選択します。
左側のナビゲーションウィンドウで、 を選択します。
[プロジェクト管理]ページで、対象のプロジェクトを見つけ、[管理]を[操作]列でクリックします。
[プロジェクト設定] ページで、[パラメーター設定] タブを選択できます。
[権限属性] セクションで、[編集] をクリックします。
「プロジェクトスペースのデータ保護」を有効化し、右側の「例外」をクリックしてから、「例外の設定」ダイアログボックスに例外ポリシーを入力します。
{ "Version": "1", "Statement": [{ "Effect":"Allow", "Principal":"<Principal>", "Action":["odps:<Action1>[, <Action2>, ...]"], "Resource":"acs:odps:*:<Resource>", "Condition":{ "StringEquals": { "odps:TaskType":["<Tasktype>"] } } }] }パラメーター
説明
Effect
データの流出を許可するかどうかを指定します。値を Allow に設定します。この値は、データの流出が許可されることを示します。
Principal
プロジェクトからのデータ転送を許可される Alibaba Cloud アカウントまたは RAM ユーザー。
Action
許可されるデータ流出操作。 さまざまな種類のオブジェクトのアクションについては、「MaxCompute 権限」をご参照ください。
Resource
データ流出が許可されるプロジェクトとオブジェクト。形式:
projects/<project_name>/{tables|resources|functions|instances}/<name>。 オブジェクト値の詳細については、「MaxCompute 権限」をご参照ください。Tasktype
データの流出が許可されるジョブのタイプ。有効な値: DT、SQL、および MapReduce。DT は Tunnel を示します。
例
-- プロジェクトデータ保護を有効にし、例外ポリシーを設定します。
-- policy_file は MaxCompute クライアントのインストールパスの bin ディレクトリに保存されます。
set ProjectProtection=true with exception policy_file;
-- 次のコードは policy_file の内容を示しています。
{
"Version": "1",
"Statement":
[{
"Effect":"Allow",
"Principal":"ALIYUN$Alice@aliyun.com",
"Action":["odps:Select"],
"Resource":"acs:odps:*:projects/project_test/tables/table_test",
"Condition":{
"StringEquals": {
"odps:TaskType":["DT", "SQL"]
}
}
}]
}上記の例は、Alice が SQL ジョブで project_test.table_test テーブルに対して Select 操作を実行し、project_test プロジェクトから他のプロジェクトにデータを転送することを許可されていることを示しています。
Alice が project_test.table_test テーブルに対する Select 権限を持っていない場合、例外ポリシーが構成されていても、Alice はプロジェクトからデータを転送できません。
考慮事項
この方法では、Time-of-Check to Time-of-Use (TOCTOU) エラー (競合状態とも呼ばれます) によりデータ漏えいが発生する可能性があります。
問題の説明
次の例は、ユーザーがプロジェクトからデータを転送する方法を示しています。
TOC フェーズ: ユーザー A は、t1 テーブルのデータをエクスポートするアプリケーションをプロジェクトオーナーに提出します。プロジェクトオーナーは、t1 テーブルに機密データが含まれていないことを確認した後、ユーザー A が t1 テーブルのデータをエクスポートできるように例外ポリシーを構成します。
TOU フェーズが開始される前に、他のユーザーが機密データを t1 テーブルに書き込みます。
TOU フェーズ: ユーザー A は t1 テーブルのデータをエクスポートします。しかし、エクスポートされた t1 テーブルのデータには、他のユーザーによって書き込まれた機密データが含まれています。
ソリューション
この問題を防止するために、プロジェクトオーナーは、他のユーザーがテーブルを更新する Update アクションを実行したり、テーブルを削除して同じ名前のテーブルを作成する Drop および CreateTable アクションを実行したりできないようにすることを推奨します。上記の例では、プロジェクトオーナーが TOC フェーズで t1 テーブルのスナップショットを作成し、そのスナップショットを使用して例外ポリシーを構成することを推奨します。さらに、他のユーザーに Admin ロールが割り当てられていないことを確認してください。
データ流出ポリシー 2: 信頼できるプロジェクトの構成
現在のプロジェクトでプロジェクトデータ保護機能が有効になっているが、データ流出が必要な場合、プロジェクトオーナーは送信先プロジェクトを現在のプロジェクトの信頼できるプロジェクトとして構成できます。これにより、プロジェクトのデータを信頼できるプロジェクトに転送できます。複数のプロジェクトが互いに信頼できるプロジェクトとして指定されている場合、これらのプロジェクトは信頼できるプロジェクトグループを形成します。これらのプロジェクトのデータは、グループ内でのみ転送できます。
管理
プロジェクトオーナーは、次のコマンドを実行して信頼できるプロジェクトを管理できます。
現在のプロジェクトに信頼できるプロジェクトを追加するには、次のコマンドを実行します。
add trustedproject <project_name>;現在のプロジェクトから信頼できるプロジェクトを削除するには、次のコマンドを実行します。
remove trustedproject <project_name>;現在のプロジェクトのすべての信頼できるプロジェクトをクエリするには、次のコマンドを実行します。
list trustedprojects;
ベストプラクティス
プロジェクトからのデータ流出を厳密に防止するには、 set projectProtection=true; を実行して保護を有効にした後、次の設定も確認する必要があります。
list trustedprojects;コマンドを実行して、信頼できるプロジェクトが追加されていないことを確認します。信頼できるプロジェクトが存在する場合は、潜在的なリスクを評価し、不要なものがあればremove trustedproject <project_name>;コマンドを実行して削除します。show packages;コマンドを実行して、データ共有にパッケージが使用されていないことを確認します。パッケージが存在する場合は、機密データが含まれていないことを確認するか、不要なものがあればdelete package <package_name>;コマンドを実行して削除します。プロジェクトデータ保護機能をプロジェクトに対して有効にすることで、プロジェクトからのデータのエクスポートを防ぐことができます。プロジェクトデータ保護機能の使用は、プロジェクト間でデータを移行するために使用される機能の使用と似ています。次のシナリオがサポートされています。
create table <table_in_another_project> as select * from <table_in_a_protected_project>insert overwrite table <table_in_another_project> select * from <table_in_a_protected_project>Spark ジョブ、MapReduce ジョブ、Graph ジョブ、Proxima CE、および Machine Learning Platform for AI (PAI) ジョブを実行して、テーブルデータを別のプロジェクトのテーブルに書き込みます。
Tunnel ダウンロードコマンドを実行して、MaxCompute テーブルデータをオンプレミス環境のマシンにダウンロードします。SDK Tunnel を呼び出すか、Java Database Connectivity (JDBC) ドライバーを使用して Tunnel を呼び出すことができます。
clone tableコマンドを使用して、テーブルデータを別のプロジェクトのテーブルにコピーします。ユーザー定義関数 (UDF) を呼び出して、テーブルデータを他のプロジェクトのテーブルに書き込みます。
UDF を呼び出して、テーブルデータを MaxCompute 外部テーブルに書き込みます。
プロジェクトデータ保護機能とダウンロードアクセスの制御は、プロジェクトからのデータダウンロードに使用できます。プロジェクトからデータをダウンロードする場合は、プロジェクトに対する関連する権限があるかどうかを確認する必要があります。
プロジェクトに対してプロジェクトデータ保護機能とダウンロードアクセスの制御を有効にしている場合、プロジェクトに対する Download および Describe 権限があるときに、プロジェクトからデータをダウンロードできます。Tunnel ダウンロードコマンドを実行する前に Describe 認証がトリガーされます。
プロジェクトに対してプロジェクトデータ保護機能を有効にし、ダウンロードアクセスの制御を無効にしている場合、プロジェクトに対する Select 権限があり、ダウンロード動作の例外ポリシーを構成しているときに、プロジェクトからデータをダウンロードできます。
プロジェクトに対してプロジェクトデータ保護機能を無効にし、ダウンロードアクセスの制御を有効にしている場合、プロジェクトに対する Download および Describe 権限があるときに、プロジェクトからデータをダウンロードできます。
プロジェクトに対してプロジェクトデータ保護機能とダウンロードアクセスの制御を無効にしている場合、プロジェクトに対する Select 権限があるときに、プロジェクトからデータをダウンロードできます。