

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EMR on EKS を使用した Apache Livy のセキュリティ
<a name="job-runs-apache-livy-security"></a>

Amazon EMR on EKS で Apache Livy のセキュリティを設定する方法の詳細については、以下のトピックを参照してください。これらのオプションには、トランスポートレイヤーセキュリティ、ロールベースのアクセス制御 (組織内のユーザーロールに基づいたアクセス)、および IAM ロールの使用 (付与されたアクセス権限に基づいたリソースへのアクセスの提供) が含まれます。

**Topics**
+ [TLS/SSL を使用した安全な Apache Livy エンドポイントの設定](job-runs-apache-livy-secure-endpoint.md)
+ [ロールベースのアクセスコントロール (RBAC) による Apache Livy および Spark のアプリケーションアクセス権限の設定](job-runs-apache-livy-rbac.md)
+ [サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する](job-runs-apache-livy-irsa.md)

# TLS/SSL を使用した安全な Apache Livy エンドポイントの設定
<a name="job-runs-apache-livy-secure-endpoint"></a>

エンドツーエンドの TLS および SSL 暗号化を使用した Amazon EMR on EKS 用の Apache Livy の設定について詳しくは、以下のセクションを参照してください。

## TLS および SSL 暗号化の設定
<a name="job-runs-apache-livy-security-tls"></a>

Apache Livy エンドポイントで SSL 暗号化を設定するには、次の手順に従います。
+ [Secrets Store CSI ドライバーと AWS Secrets and Configuration Provider (ASCP)](https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_csi_driver.html) をインストールする – Secrets Store CSI ドライバーと ASCP は、Livy サーバーポッドが SSL を有効にするために必要な Livy の JKS 証明書とパスワードを安全に保存します。Secrets Store CSI Driver のみをインストールし、サポートされている他のシークレットプロバイダーを使用することもできます。
+ [ACM 証明書の作成](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html) – この証明書は、クライアントと ALB エンドポイント間の接続を保護するために必要です。
+ ALB エンドポイントと Livy サーバー間の接続を保護するために AWS Secrets Manager 必要な JKS 証明書、キーパスワード、およびキーストアパスワードを に設定します。
+ からシークレットを取得するアクセス許可を Livy サービスアカウントに追加します AWS Secrets Manager 。Livy サーバーには、ASCP からシークレットを取得し、Livy サーバーを保護するための Livy 設定を追加するためのこれらのアクセス許可が必要です。サービスアカウントに IAM アクセス権限を追加するには、「サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する」を参照してください。

### のキーとキーストアパスワードを使用して JKS 証明書を設定する AWS Secrets Manager
<a name="job-runs-apache-livy-jks-certificate"></a>

キーとキーストアパスワードを使用して JKS 証明書を設定するには、次の手順に従います。

1. Livy サーバーのキーストアファイルを生成します。

   ```
   keytool -genkey -alias <host> -keyalg RSA -keysize 2048 –dname CN=<host>,OU=hw,O=hw,L=<your_location>,ST=<state>,C=<country> –keypass <keyPassword> -keystore <keystore_file> -storepass <storePassword> --validity 3650
   ```

1. 証明書を作成します。

   ```
   keytool -export -alias <host> -keystore mykeystore.jks -rfc -file mycertificate.cert -storepass <storePassword>
   ```

1. トラストストアファイルを作成します。

   ```
   keytool -import -noprompt -alias <host>-file <cert_file> -keystore <truststore_file> -storepass <truststorePassword>
   ```

1. JKS 証明書を に保存します AWS Secrets Manager。`livy-jks-secret` をシークレットに置き換え、`fileb://mykeystore.jks` をキーストア JKS 証明書へのパスに置き換えます。

   ```
   aws secretsmanager create-secret \ 
   --name livy-jks-secret \
   --description "My Livy keystore JKS secret" \
   --secret-binary fileb://mykeystore.jks
   ```

1. Secrets Manager にキーストアとキーパスワードを保存します。必ず独自のパラメータを使用してください。

   ```
   aws secretsmanager create-secret \
   --name livy-jks-secret \
   --description "My Livy key and keystore password secret" \
   --secret-string "{\"keyPassword\":\"<test-key-password>\",\"keyStorePassword\":\"<test-key-store-password>\"}"
   ```

1. 次のコマンドで Livy サーバーの名前空間を作成します。

   ```
   kubectl create ns <livy-ns>
   ```

1. JKS 証明書とパスワードを持つ Livy サーバーの `ServiceProviderClass` オブジェクトを作成します。

   ```
   cat >livy-secret-provider-class.yaml << EOF
   apiVersion: secrets-store.csi.x-k8s.io/v1
   kind: SecretProviderClass
   metadata:
     name: aws-secrets
   spec:
     provider: aws
     parameters:
       objects: |
           - objectName: "livy-jks-secret"
             objectType: "secretsmanager"
           - objectName: "livy-passwords"
             objectType: "secretsmanager"
                        
   EOF
   kubectl apply -f livy-secret-provider-class.yaml -n <livy-ns>
   ```

## SSL 対応の Apache Livy の使用開始
<a name="job-runs-apache-livy-ssl-enabled-getting-started"></a>

Livy サーバーで SSL を有効にしたら、 AWS Secrets Managerで `keyStore` シークレットと `keyPasswords` シークレットにアクセスできるように `serviceAccount` を設定する必要があります。

1. Livy サーバーの名前空間を作成します。

   ```
   kubectl create namespace <livy-ns>
   ```

1. Secrets Manager のシークレットにアクセスできるように Livy のサービスアカウントを設定します。IRSA のセットアップの詳細については、「[Apache Livy のインストール中に IRSA を設定する](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-irsa.html#job-runs-apache-livy-irsa)」を参照してください。

   ```
   aws ecr get-login-password \--region region-id | helm registry login \
   --username AWS \
   --password-stdin ECR-registry-account.dkr.ecr.region-id.amazonaws.com
   ```

1. Livy をインストールします。Helm チャートのバージョンパラメータには、`7.1.0` などの Amazon EMR リリースラベルを使用します。また、Amazon ECR レジストリのアカウント ID とリージョン ID を独自の ID に置き換える必要があります。の対応する`ECR-registry-account`値は、Amazon ECR レジストリアカウント AWS リージョン からリージョン別に確認できます。 [https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR)

   ```
   helm install <livy-app-name> \
     oci://895885662937.dkr.ecr.region-id.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-namespace-name \
     --set image=<ECR-registry-account.dkr.ecr>.<region>.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=spark-namespace \
     --set ssl.enabled=true
     --set ssl.CertificateArn=livy-acm-certificate-arn
     --set ssl.secretProviderClassName=aws-secrets
     --set ssl.keyStoreObjectName=livy-jks-secret
     --set ssl.keyPasswordsObjectName=livy-passwords
     --create-namespace
   ```

1. [Amazon EMR on EKS への Apache Livy のインストール](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html#job-runs-apache-livy-install)のステップ 5 から続けます。

# ロールベースのアクセスコントロール (RBAC) による Apache Livy および Spark のアプリケーションアクセス権限の設定
<a name="job-runs-apache-livy-rbac"></a>

Livy をデプロイするために、Amazon EMR on EKS はサーバーのサービスアカウントとロール、および Spark のサービスアカウントとロールを作成します。これらのロールには、Spark アプリケーションの設定と実行を完了するために必要な RBAC アクセス権限が必要です。

**サーバーのサービスアカウントとロールのための RBAC アクセス権限**

Amazon EMR on EKS は、Spark ジョブの Livy セッションを管理し、イングレスやその他のリソースとの間でトラフィックをルーティングするための Livy サーバーのサービスアカウントとロールを作成します。

このサービスアカウントのデフォルト名は `emr-containers-sa-livy` です。次のアクセス権限が必要です。

```
rules:
- apiGroups:
  - ""
  resources:
  - "namespaces"
  verbs:
  - "get"
- apiGroups:
  - ""
  resources:
  - "serviceaccounts"
    "services"
    "configmaps"
    "events"
    "pods"
    "pods/log"
  verbs:
  - "get"
    "list"
    "watch"
    "describe"
    "create"
    "edit"
    "delete"
    "deletecollection"
    "annotate"
    "patch"
    "label"
 - apiGroups:
   - ""
   resources:
   - "secrets"
   verbs:
   - "create"
     "patch"
     "delete"
     "watch"
 - apiGroups:
   - ""
   resources:
   - "persistentvolumeclaims"
   verbs:
   - "get"
     "list"
     "watch"
     "describe"
     "create"
     "edit"
     "delete"
     "annotate"
     "patch"
     "label"
```

**Spark のサービスアカウントとロールのための RBAC アクセス権限**

Spark ドライバーポッドには、ポッドと同じ名前空間にある Kubernetes サービスアカウントが必要です。このサービスアカウントには、エグゼキュターポッドとドライバーポッドに必要なリソースを管理するためのアクセス権限が必要です。名前空間のデフォルトサービスアカウントに必要なアクセス権限がなければ、ドライバーは失敗して終了します。以下の RBAC アクセス権限が必要です。

```
rules:
- apiGroups:
  - ""
    "batch"
    "extensions"
    "apps"
  resources:
  - "configmaps"
    "serviceaccounts"
    "events"
    "pods"
    "pods/exec"
    "pods/log"
    "pods/portforward"
    "secrets"
    "services"
    "persistentvolumeclaims"
    "statefulsets"
  verbs:
  - "create"
    "delete"
    "get"
    "list"
    "patch"
    "update"
    "watch"
    "describe"
    "edit"
    "deletecollection"
    "patch"
    "label"
```

# サービスアカウント用 IAM ロール (IRSA、IAM roles for service accounts) でアクセス権限を設定する
<a name="job-runs-apache-livy-irsa"></a>

デフォルトでは、Livy サーバーと Spark アプリケーションのドライバーとエグゼキュターは AWS リソースにアクセスできません。サーバーサービスアカウントと spark サービスアカウントは、Livy サーバーと spark アプリケーションのポッドの AWS リソースへのアクセスを制御します。アクセスを許可するには、サービスアカウントを、必要な AWS アクセス許可を持つ IAM ロールにマッピングする必要があります。

Apache Livy のインストール前、インストール中、インストール終了後のいずれにおいても IRSA マッピングを設定できます。

## Apache Livy インストール中の IRSA の設定 (サーバーのサービスアカウント用)
<a name="job-runs-apache-livy-irsa"></a>

**注記**  
このマッピングは、サーバーのサービスアカウントでのみサポートされています。

1. [Amazon EMR on EKS の Apache Livy の設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)が終了し、[Amazon EMR on EKS による Apache Livy のインストール](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)の途中であることを確認します。

1. Livy サーバー用に、Kubernetes 名前空間を作成します。この例では、名前空間の名前は `livy-ns` です。

1. ポッドがアクセス AWS のサービス する のアクセス許可を含む IAM ポリシーを作成します。次の例では、Spark エントリポイントの Amazon S3 リソースを取得する IAM ポリシーを作成します。

   ```
   cat >my-policy.json <<EOF{
   "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
   "Effect": "Allow",
               "Action": "s3:GetObject",
               "Resource": "arn:aws:s3:::my-spark-entrypoint-bucket"
           }
       ]
   }
   EOF
   
   aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
   ```

1. 次のコマンドを使用して、 AWS アカウント ID を変数に設定します。

   ```
   account_id=$(aws sts get-caller-identity --query "Account" --output text)
   ```

1. クラスターの OpenID Connect (OIDC) ID プロバイダーを環境変数に設定します。

   ```
   oidc_provider=$(aws eks describe-cluster --name my-cluster --region $AWS_REGION --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
   ```

1. サービスアカウントの名前空間と名前の変数を設定します。必ず独自の値を使用してください。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. 次のコマンドを使用して信頼ポリシーファイルを作成します。名前空間内のすべてのサービスアカウントにロールへのアクセス権を付与する場合は、次のコマンドをコピーして、`StringEquals` を `StringLike` に、`$service_account` を `*` に置き換えます。

   ```
   cat >trust-relationship.json <<EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   EOF
   ```

1. ロールを作成します。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 次の Helm インストールコマンドを使用して、`serviceAccount.executionRoleArn` を IRSA をマッピングするように設定します。Helm インストールコマンドの例を次に示します。の対応する`ECR-registry-account`値は、Amazon ECR レジストリアカウント AWS リージョン からリージョン別に確認できます。 [https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-tag.html#docker-custom-images-ECR)

   ```
   helm install livy-demo \
     oci://895885662937.dkr.ecr.us-west-2.amazonaws.com/livy \
     --version 7.12.0 \
     --namespace livy-ns \
     --set image=ECR-registry-account.dkr.ecr.region-id.amazonaws.com/livy/emr-7.12.0:latest \
     --set sparkNamespace=spark-ns \
     --set serviceAccount.executionRoleArn=arn:aws:iam::123456789012:role/my-role
   ```

## IRSA の Spark サービスアカウントへのマッピング
<a name="job-runs-apache-livy-irsa-spark"></a>

IRSA を Spark サービスアカウントにマッピングする前に、次の項目が完了していることを確認してください。
+ [Amazon EMR on EKS の Apache Livy の設定](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-setup.html)が終了し、[Amazon EMR on EKS による Apache Livy のインストール](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/job-runs-apache-livy-install.html)の途中であることを確認します。
+ クラスターの既存 IAM OpenID Connect (OIDC) プロバイダーが必要です。既にあるかどうか、または作成する方法を確認するには、「[クラスターの IAM OIDC プロバイダーを作成する](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)」を参照してください。
+ バージョン 0.171.0 以降の `eksctl` CLI または AWS CloudShellがインストールされていることを確認します。`eksctl` をインストールまたはアップグレードするには、`eksctl` ドキュメントの「[インストール](https://eksctl.io/installation/)」を参照してください。

IRSA を Spark サービスアカウントにマッピングするには、次の手順に従います。

1. 次のコマンドを実行して Spark サービスアカウントを取得します。

   ```
   SPARK_NAMESPACE=<spark-ns>
   LIVY_APP_NAME=<livy-app-name>
   kubectl --namespace $SPARK_NAMESPACE describe sa -l "app.kubernetes.io/instance=$LIVY_APP_NAME" | awk '/^Name:/ {print $2}'
   ```

1. サービスアカウントの名前空間と名前の変数を設定します。

   ```
   export namespace=default
   export service_account=my-service-account
   ```

1. IAM ロール用の信頼ポリシーファイルを作成するには、次のコマンドを使用します。次の例では、名前空間内のすべてのサービスアカウントにロールを使用するアクセス権限を付与します。これを行うには、`StringEquals` を `StringLike` に、`$service_account` を \$1 に置き換えます。

   ```
   cat >trust-relationship.json <<EOF
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::$account_id:oidc-provider/$oidc_provider"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "$oidc_provider:aud": "sts.amazonaws.com",
             "$oidc_provider:sub": "system:serviceaccount:$namespace:$service_account"
           }
         }
       }
     ]
   }
   EOF
   ```

1. ロールを作成します。

   ```
   aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
   ```

1. 次の `eksctl` コマンドを使用して、サーバーまたは Spark のサービスアカウントをマッピングします。必ず独自の値を使用してください。

   ```
    eksctl create iamserviceaccount --name spark-sa \
    --namespace spark-namespace --cluster livy-eks-cluster \
    --attach-role-arn arn:aws:iam::0123456789012:role/my-role \
    --approve --override-existing-serviceaccounts
   ```