デフォルトでは、AnalyticDB クラスター上のすべての Spark ジョブは、単一の権限セットを共有します。この共有セットには、あらゆるジョブが必要とするすべての権限が含まれている必要があり、監査が困難な過度に広範な権限付与が作成されます。このドキュメントでは、Spark ジョブを送信する権限と、Spark エンジンがランタイム時にクラウドリソースにアクセスするために使用する権限を分離し、各ジョブが必要とするアクセスのみで動作するようにする方法を示します。
AnalyticDB Spark は、同じアカウント内のリソースに対して迅速な権限付与機能を提供します。厳格な権限管理を必要とするエンタープライズ環境では、このドキュメントで説明されているカスタム権限ポリシーのアプローチを使用して、きめ細かなアクセス制御を実装し、デフォルトの権限昇格を防ぎます。
仕組み
この設定では、それぞれ異なる責任を持つ 2 つの ID を使用します。
RAM ユーザーは、AnalyticDB クラスターに Spark ジョブを送信します。
RAM ロールは、ランタイム時に Spark エンジンによって引き受けられ、Object Storage Service (OSS) およびその他のクラウドリソースにアクセスします。
RAM ユーザーは OSS に直接アクセスできません。Spark エンジンは、ジョブで spark.adb.roleArn パラメーターが設定されている場合にのみ、RAM ロールを引き受けます。
ID とポリシーの概要
| ID | タイプ | ポリシー | 目的 |
|---|---|---|---|
adb-spark-ramuser-test | RAM ユーザー | adb-spark-ramuser-test-adbpolicy (ポリシー A) | Spark ジョブの送信、クラスターの管理 |
adb-spark-ramrole-test | RAM ロール | adb-spark-ramuser-test-datapolicy (ポリシー B) | ランタイム時の OSS アクセス (Spark エンジンによって引き受けられる) |
前提条件
開始する前に、以下があることを確認してください。
RAM ユーザー、ロール、およびポリシーを作成する権限を持つ RAM 管理者アカウント
AnalyticDB for MySQL クラスター
データストレージとして使用する 1 つ以上の OSS バケット
ステップ 1: RAM ID とポリシーの構成
RAM 管理者として RAM コンソールにログインします。
RAM ユーザーを作成します。この例では、ユーザー名を
adb-spark-ramuser-testとします。信頼できる Alibaba Cloud サービス用の RAM ロールを作成します。
プリンシパル名: [AnalyticDB for MySQL] を選択します。
ロール名:
adb-spark-ramrole-test
2 つのカスタム権限ポリシーを作成します。
ポリシー A: AnalyticDB 管理権限
ポリシー A は、RAM ユーザーに AnalyticDB Spark アプリケーションを管理し、RAM ロールを Spark エンジンに渡す権限を付与します。
[権限] > [ポリシー] に移動し、[ポリシーの作成] をクリックします。
[JSON] を選択し、次のコンテンツを貼り付けます。
${AliyunAccount}をご利用の Alibaba Cloud アカウント ID に置き換えます。ポリシー名を
adb-spark-ramuser-test-adbpolicyとします。
ram:PassRole操作は、RAM ユーザーがどのロールを Spark エンジンに渡すことができるかを制御します。Resourceの値を、adb-spark-ramrole-testの ARN に置き換えます。ARN を見つけるには、[アイデンティティ] > [ロール] に移動してロール名をクリックし、基本情報セクションから ARN をコピーします。ARN を保存します。この ARN はジョブを送信するときに必要になります。
{
"Version": "1",
"Statement": [
{
"Action": [
"adb:Get*",
"adb:List*",
"adb:Kill*",
"adb:Cancel*",
"adb:Submit*",
"adb:Allocate*",
"adb:Describe*",
"adb:Lock*",
"adb:Copy*",
"adb:Query*",
"adb:Show*",
"adb:Test*",
"adb:Export*",
"adb:Execute*",
"adb:*Project",
"adb:*Directory",
"adb:*ProcessDefinition",
"adb:*ProcessDefinitions",
"adb:*ProcessDefinitionAttribute",
"adb:*ProcessInstance",
"adb:*ProcessInstances",
"adb:*ProcessInstanceAttribute",
"adb:*ProcessInstanceTasks",
"adb:*TaskDefinition",
"adb:*TaskDefinitions",
"adb:*TaskDefinitionCode",
"adb:*TaskDefinitionAttribute",
"adb:*TaskInstance",
"adb:*TaskInstances",
"adb:*Notebook",
"adb:*Notebooks",
"adb:*NotebookKernel",
"adb:*NotebookAttribute",
"adb:*NotebookConfiguration",
"adb:*NotebookParagraph",
"adb:*NotebookParagraphs",
"adb:*JupyterInstance",
"adb:*JupyterInstances",
"adb:*JupyterSpecifications",
"adb:*JupyterInstanceAttribute",
"adb:*Schedule",
"adb:BindAccount",
"adb:UnbindAccount",
"adb:Authentication",
"adb:Check*",
"adb:Load*",
"adb:Stat*",
"adb:*SparkTemplate*",
"adb:Download*"
],
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "ram:ListUserBasicInfos",
"Effect": "Allow",
"Resource": "*"
},
{
"Action": "ram:PassRole",
"Resource": "acs:ram::${AliyunAccount}:role/adb-spark-ramrole-test",
"Effect": "Allow"
}
]
}ポリシー B: データアクセス権限
ポリシー B は、Spark エンジンがランタイム時にアクセスできる OSS バケットを制御し、特定の IP CIDR ブロックに制限します。
プレースホルダーの値を実際の値に置き換えます。
プレースホルダー 説明 例 ${bucket-1},${bucket-2}OSS バケット名 my-spark-data${AliyunAccount}Alibaba Cloud アカウント ID 123456789012${IPv4 CIDR Block1},${IPv4 CIDR Block2}許可されたソース IP CIDR ブロック 192.168.1.0/24ポリシー名を
adb-spark-ramuser-test-datapolicyとします。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": [
"acs:oss:oss-*:${AliyunAccount}:${bucket-1}",
"acs:oss:oss-*:${AliyunAccount}:${bucket-2}",
"acs:oss:oss-*:${AliyunAccount}:${bucket-1}/*",
"acs:oss:oss-*:${AliyunAccount}:${bucket-2}/*"
],
"Condition": {
"IpAddress": {
"acs:SourceIp": [
"${IPv4 CIDR Block1}",
"${IPv4 CIDR Block2}"
]
}
}
}
]
}ポリシーの付与
ポリシー A を RAM ユーザーにアタッチします。
[ID] > [ユーザー] に移動し、
adb-spark-ramuser-testを見つけて、その名前をクリックします。[権限] > [権限付与] をクリックし、
adb-spark-ramuser-test-adbpolicyを追加します。
ポリシー B を RAM ロールにアタッチします。
[ID] > [ロール] に移動し、
adb-spark-ramrole-testを見つけて、その名前をクリックします。[権限] > [権限の付与] をクリックし、
adb-spark-ramuser-test-datapolicyを追加します。
ステップ 2: RAM ユーザー用の AnalyticDB for MySQL アカウントの作成
管理者として AnalyticDB for MySQL コンソールにログインします。
[クラスター] をクリックし、ご利用のクラスターを選択します。
[アカウント] > [アカウント作成] をクリックします。[アカウントタイプ] を [標準アカウント] に設定します。
アカウントが作成されたら、[RAM 関連付けの管理] をクリックし、RAM ユーザー
adb-spark-ramuser-testをアタッチします。[権限] > [権限の編集] をクリックし、ユーザーが必要とする権限 (例: グローバルな作成、クエリ、変更権限) を付与します。
ステップ 3: RAM ユーザーとしてジョブを送信
RAM ユーザー adb-spark-ramuser-test は、クラスターに Spark ジョブを送信できるようになりました。OSS データにアクセスするには、ジョブで spark.adb.roleArn を介して RAM ロールを指定する必要があります。その後、Spark エンジンはすべての OSS 操作に対してそのロールを引き受け、ポリシー B の権限のみを使用します。
RAM ユーザーは OSS に直接アクセスできません。spark.adb.roleArn パラメーターが設定されている場合、Spark エンジンは adb-spark-ramrole-test を引き受け、ポリシー B を使用して OSS にアクセスします。RAM ユーザー自身の権限はデータアクセスには使用されません。
adb-spark-ramuser-testとして AnalyticDB for MySQL コンソールにログインします。[クラスター] をクリックし、クラスターを選択して、[ジョブ開発] > [SQL 開発] に移動します。
エディターの上で、[Spark エンジン] と対応する リソースグループを選択します。
ジョブを記述して送信します。以下の例では、
spark.adb.roleArnを使用して、Spark エンジンがランタイム時に引き受ける RAM ロールを指定しています。
-- Set the ARN of the RAM role for the Spark engine to assume at runtime.
-- This role has been granted OSS read and write permissions in Policy B.
set spark.adb.roleArn=acs:ram::${AliyunAccount}:role/adb-spark-ramrole-test;
-- Create a database that points to an OSS path.
-- Make sure bucket-1 is in the list of allowed resources in Policy B.
create database if not exists test_db_01 location 'oss://bucket-1/path/to/test_db_01/';
-- Create a table.
create table if not exists test_db_01.test_tbl_01(id int, name string);
-- Write data. The Spark engine uses the RAM role to write to OSS.
insert into test_db_01.test_tbl_01 values(1, 'a');
-- Query data. The Spark engine uses the RAM role to read from OSS.
select * from test_db_01.test_tbl_01;ログパスを構成するには、spark.app.log.rootPath パラメーターを設定します。詳細については、「Spark アプリケーション設定パラメーター」をご参照ください。
[実行] をクリックします。正常に実行されると、きめ細かなアクセス制御の構成が機能していることが確認されます。RAM ユーザーがジョブを送信し、Spark エンジンが指定された RAM ロールを引き受けて OSS にアクセスしました。
次のステップ
ポリシー A およびポリシー B の権限を確認し、ご利用の組織の最小権限の要件に合わせます。
OSS アクセスを特定の IP 範囲に制限するには、ポリシー B の
acs:SourceIp条件を本番環境の CIDR ブロックで更新します。ジョブの送信と OSS アクセスイベントを監査するには、ご利用の Alibaba Cloud アカウントで ActionTrail を有効にします。