ユーザー偽装 - Amazon EMR

ユーザー偽装

Jupyter Notebook 内で実行されている Spark ジョブは、Amazon EMR での実行中に、複数のアプリケーションを走査します。たとえば、Jupyter 内でユーザーが実行する PySpark3 コードが、HTTP POST リクエストを使用してそのコードを Livy に送信する Sparkmagic によって受信されます。それにより、YARN を使用してクラスターで実行する Spark ジョブが作成されます。

デフォルトでは、このように送信された YARN ジョブは、ジョブを開始したユーザーとは関係なく、ユーザー livy として実行されます。ユーザー偽装を設定することで、ノートブックユーザーのユーザー ID を、YARN ジョブに関連付けられているユーザーとすることができます。各ユーザーによって開始されるジョブは、ユーザー shirley と関連付けられた diegolivy の両方によって開始するのではなく、それぞれ shirley および diego に関連付けられます。これにより、Jupyter の使用を監査し、組織内でアプリケーションを管理できます。

この設定がサポートされるのは、Sparkmagic から Livy への呼び出しが認証されていない場合のみです。Hadoop アプリケーションと Livy (Apache Knox Gateway など) 間で認証またはプロキシレイヤーを提供するアプリケーションはサポートされません。このセクションでユーザー偽装を設定するステップでは、JupyterHub と Livy が同じマスターノードで実行されていることを前提としています。アプリケーションに別々のクラスターがある場合、ステップ 3: ユーザーの HDFS ホームディレクトリを作成する を変更し、HDFS ディレクトリが Livy マスターノードで作成されるようにする必要があります。

ステップ 1: Livy を設定する

次の例に示すように、クラスターを作成して Livy のユーザー偽装を有効にする場合は、livy-conf および core-site 設定分類を使用します。設定分類を JSON として保存し、クラスターの作成時にその分類を参照するか、インラインで指定します。詳細については、「アプリケーションの設定」を参照してください。

[ { "Classification": "livy-conf", "Properties": { "livy.impersonation.enabled": "true" } }, { "Classification": "core-site", "Properties": { "hadoop.proxyuser.livy.groups": "*", "hadoop.proxyuser.livy.hosts": "*" } } ]

ステップ 2: ユーザーを追加する

PAM または LDAP を使用して JupyterHub ユーザーを追加します。詳細については、PAM 認証の使用 および LDAP 認証の使用 を参照してください。

ステップ 3: ユーザーの HDFS ホームディレクトリを作成する

ユーザーを作成するため、マスターノードに接続しました。マスターノードに接続中に、次のコンテンツをコピーして、スクリプトファイルに保存します。スクリプトにより、マスターノードの各 JupyterHub ユーザーごとに、HDFS ホームディレクトリが作成されます。このスクリプトでは、デフォルトの管理者ユーザー ID jovyan を使用することが前提となっています。

#!/bin/bash CURL="curl --silent -k" HOST=$(curl -s http://169.254.169.254/latest/meta-data/local-hostname) admin_token() { local user=jovyan local pwd=jupyter local token=$($CURL https://$HOST:9443/hub/api/authorizations/token \ -d "{\"username\":\"$user\", \"password\":\"$pwd\"}" | jq ".token") if [[ $token != null ]]; then token=$(echo $token | sed 's/"//g') else echo "Unable to get Jupyter API Token." exit 1 fi echo $token } # Get Jupyter Admin token token=$(admin_token) # Get list of Jupyter users users=$(curl -XGET -s -k https://$HOST:9443/hub/api/users \ -H "Authorization: token $token" | jq '.[].name' | sed 's/"//g') # Create HDFS home dir for user in ${users[@]}; do echo "Create hdfs home dir for $user" hadoop fs -mkdir /user/$user hadoop fs -chmod 777 /user/$user done