Amazon Web Services ブログ

Kerberos、Microsoft Active Directory インテグレーションおよび EMRFS の IAM ロールを使用したマルチテナントの Amazon EMR クラスターの構築

特に高度な規制のある業界における顧客が直面する課題の一つは、セキュリティと柔軟性のバランスをとることです。この記事では、EMRFS (EMR ファイルシステム) 認証Amazon S3 ストレージレベルの認証をAmazon EMRで使用して、マルチテナンシーを有効にして、セキュリティを増強する方法をとり上げます。

Amazon EMR は容易で高速、スケール可能な分析プラットフォームで、大規模なデータ処理を可能にします。EMRFS 認証の IAM ロールでは、複数の IAM ロールで EMRFS を構成することにより、 Amazon S3 ストレージレベルの認証を提供します。これを機能的に有効にすることで、異なるユーザーとグループは同じクラスターを共有し、独自の IAM ロールをそれぞれ想定することができます。

単に Amazon EMR に置くことで、クラスターレベルの 1 つの一般的な EC2 ロールの代わりに、ランタイムに想定されるユーザーごとに 1 つのAmazon EC2 ロールをもつことができるようになりました。ユーザーが Amazon S3 リソースにアクセスしようとすると、Amazon EMR は EMRFS 構成で事前定義されたマッピングリストに対して評価し、ユーザーの適切なロールを選択します。

この記事では、EMRFS の IAM ロールとは何か (Amazon S3 ストレージレベルのアクセス制御) について話し合い 、また詳細な例でロールマッピングを構成する方法を示します。ユーザーはその後、マルチテナント環境で希望の権限をもつことになります。また、HDFS コマンドライン、Apache Hive on Hue、および Apache Spark から Amazon S3 のアクセスをデモンストレーションします。

EMRFS の IAM ロール

以下のとおり、この機能を使用するための 2 つの基本設定があります。

  1. EMRFS は事前定義されたユーザー/グループ/プレフィックスにマッピングする必要があるため、ユーザーは認証されなければなりません。いくつかの認証オプションがあります。この記事では、マスターノードで Key Distribution Center (KDC) を管理するKerberos対応のクラスターを開始し、KDC から Microsoft Active Directory ドメインに一方向の信頼を有効にします。
  2. アプリケーションは、現時点で独自の S3FileSystem API (たとえば、Presto) がサポートされていないアプリケーションを経由して、Amazon S3 へのアクセスをサポートしなければなりません。

EMRFS はユーザー、グループ、および Amazon S3 プレフィックスの 3 種類のマッピング エントリをサポートしています。これが動作する方法を示す例を使用してみましょう。

組織に次の 3 つアイデンティティがあり、それらは Active Directory で定義されていると想定します。

これらのすべてのグループとユーザーが EMR クラスターを共有するために、以下の IAM ロールを定義する必要があります。

この場合、Amazon S3 に権限を与えない別の Amazon EC2 を作成します。そのロールを基本ロール (EMR クラスターにアタッチされた EC2 ロール) と呼びましょう。この例では、EMR_EC2_RestrictedRoleという名前が付けられます。次に、独自のロールで特定のユーザーまたはグループに対するすべての Amazon S3 権限を定義します。制約付きのロールは、ユーザーがどこのユーザー/グループにも属さないか、ユーザーがリストに定義されたリスト済みの Amazon S3 プレフィックスにもアクセスしない場合に、フェイルバックロールとしての役割を果たします。

重要: ほかのすべてのロールの場合、emrfs_auth_group_role_data_eng のように、基本ロール (EMR_EC2_RestrictedRole) を信頼済みのエンティティとして追加して、他のロールを想定することができます。以下の例を参照してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::511586466501:role/EMR_EC2_RestrictedRole"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

以下は、管理ユーザーロールのポリシーの例です (emrfs_auth_user_role_admin_user):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

この例で、すべてのバケットに管理ユーザーがアクセスできることを想定しています。

以下はデータ科学グループロールのポリシーの例です (emrfs_auth_group_role_data_sci):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::emrfs-auth-data-science-bucket-demo/*",
                "arn:aws:s3:::emrfs-auth-data-science-bucket-demo"
            ],
            "Action": [
                "s3:*"
            ]
        }
    ]
}

このロールはすべての Amazon S3 権限を emrfs-auth-data-science-bucket-demo バケットとその中のすべてのオブジェクトに付与します。同様に、ロール emrfs_auth_group_role_data_eng のポリシーは以下のとおりです

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::emrfs-auth-data-engineering-bucket-demo/*",
                "arn:aws:s3:::emrfs-auth-data-engineering-bucket-demo"
            ],
            "Action": [
                "s3:*"
            ]
        }
    ]
}

ロールマッピング構成例

EMRFS 認証を構成するために、EMR セキュリティ構成を使用します。この投稿で使用する構成は、以下のとおりです

以下のようなシナリオを想定してください。

まず、管理ユーザーadmin1がログインを試み、コマンドを実行して EMRFS を通じて、Amazon S3 データにアクセスします。マッピングリストの最初のロール emrfs_auth_user_role_admin_user は、ユーザーロールですが、マッピングされ選択されます。次に、admin1 はこのロールで定義されている Amazon S3 ロケーションへのアクセスができます。

次に、データエンジニアグループ (grp_data_engineering) からのユーザーが、いくつかのジョブを実行するためにデータバケットへのアクセスを試みます。EMRFS がユーザーが grp_data_engineering グループであることを確認すると、グループロール emrfs_auth_group_role_data_eng が想定され、ユーザーはemrfs_auth_group_role_data_eng ロールで定義される Amazon S3 に適切なアクセス権を持ちます。

次に、管理者ではないが、どのグループにも属さない 3 番目のユーザーになります。上位 3 つのエントリの評価に失敗した後で、EMRFS は最後のマッピング エントリで定義された特定の Amazon S3 プレフィックスにアクセスしようとするかどうか評価します。このタイプのマッピングエントリは、プレフィックスタイプと呼ばれます。ユーザーがs3://emrfs-auth-default-bucket-demo/にアクセスしようとすると、プレフィックスマッピングが有効になり、プレフィックスロールemrfs_auth_prefix_role_default_s3_prefixが想定されます。

ユーザーがリストで定義されている任意の Amazon S3 パスにアクセスしようとしない場合、つまり、すべてのエントリの評価に失敗した場合、EMR_EC2RestrictedRole で定義された権限のみを持ちます。このロールは、クラスターの EC2 インスタンスにより想定されます。

このプロセスで、定義されるすべてのマッピングが定義された順番で評価され、マッピングされた最初のロールが想定され、リストの残りがスキップされます。

EMR クラスターのセットアップと Active Directory ユーザーとグループのマッピング

EMRFS ロールの IAM ロールがどのように機能するのかがわかりましたので、次に考えなければならないことは、この機能をいかに容易で管理可能な方法で使用することができるかということです。

Active Directory のセットアップ

多くの顧客は Microsoft Active Directory またはその他の OpenLDAP のようなツールを使用してユーザーとグループを管理します。この記事では、Windows Server を実行する Amazon EC2 インスタンスで Active Directory を作成し、以下の例で使用するユーザーとグループを作成します。Active Directory を設定した後で、EC2 インスタンスの Active Directory ドメインに EMR マスタノードで実行中の KDC から一方向の信頼を設定するために、アマゾン 絵MRKerberos 自動結合機能を使用します。LDAP (Lightweight Directory Access Protocol) とやりとりする限り、自分のディレクトリサービスを使用できます。

Amazon EMR への Active Directory を作成して結合するためには、ブログ記事 Microsoft Active Directory と Amazon EMR を統合するために Kerberos 認証の使用 の手順に従います。

Active Directory を構成した後で、Active Directory ツールを使用してすべてのユーザーとグループを作成し、適切なグループにユーザーを追加できます。この例では、admin1dataeng1datascientist1grp_data_engineering、およびgrp_data_scienceなどのユーザーを作成し、ユーザーを適切なグループに追加します。

EMR クラスターの Active Directory ドメインへの結合

Kerberos をもつクラスターの場合、Amazon EMR は自動化された Active Directory ドメインの結合をサポートするようになりました。セキュリティ構成を使用して、KDC から Active Directory ドメインに一方向の信頼を構成するために、セキュリティ構成を使用できます。同じセキュリティの構成で EMRFS ロールマッピングも構成します。

以下は信頼済みの Active Directory ドメイン EMRKRB.TEST.COM EMR セキュリティ構成と前述の EMRFS ロールマッピングの例です。

EMRFS ロールマッピング構成は、この例に示されています。

実行できる AWS CLI コマンドの例も提供します。

EMR クラスターの開始とテストの実行

EMRFS に対して Keberos と IAM ロールを構成しました。

さらに、以前に作成した AD ユーザーを使用してログインするために、Amazon EMR 構成 API を使用して Active Directory で Hue を構成する必要があります。以下は Hue AD 構成の例です。

[
  {
    "Classification":"hue-ini",
    "Properties":{

    },
    "Configurations":[
      {
        "Classification":"desktop",
        "Properties":{

        },
        "Configurations":[
          {
            "Classification":"ldap",
            "Properties":{

            },
            "Configurations":[
              {
                "Classification":"ldap_servers",
                "Properties":{

                },
                "Configurations":[
                  {
                    "Classification":"AWS",
                    "Properties":{
                      "base_dn":"DC=emrkrb,DC=test,DC=com",
                      "ldap_url":"ldap://emrkrb.test.com",
                      "search_bind_authentication":"false",
                      "bind_dn":"CN=adjoiner,CN=users,DC=emrkrb,DC=test,DC=com",
                      "bind_password":"Abc123456",
                      "create_users_on_login":"true",
                      "nt_domain":"emrkrb.test.com"
                    },
                    "Configurations":[

                    ]
                  }
                ]
              }
            ]
          },
          {
            "Classification":"auth",
            "Properties":{
              "backend":"desktop.auth.backend.LdapBackend"
            },
            "Configurations":[

            ]
          }
        ]
      }
    ]
  }

注: 前述の構成 JSON ファイルで、必要な値を変更してから、Amazon EMR コンソールのソフトウェア設定セクションにそれを貼り付けてください。

ここで、この構成と作成したセキュリティ構成を使用して、クラスターを開始します。

Amazon EMR コンソール で [クラスターの作成] を選択します。次に、[アドバンスドオプションに進む] を選択します。ステップ1: ソフトウェアと手順 ページで、[ソフトウェア設定の編集 (オプション)] の下のボックスに構成を貼り付けます。

残りの設定は、[セキュリティオプション] セクションを除き、通常のクラスター設定と同じです。手順 4: セキュリティの [許可] の下で、[カスタム] を選択して、以前作成した RestrictedRole を選択します。

適切なサブネット (これらは正常に結合された Active Direcotory に対して順番に基本要件を満たさなければなりませんー詳細については、Amazon EMR 管理ガイドを参照) を選択し、適切なセキュリティ グループを選択して、Active Directory に確実に伝達します。ログインし、クラスターを構成できるキーを選択します。

最も重要なことは、Amazon S3 に対する EMRFS の Kerberos と IAM ロールを有効にするために、以前作成したセキュリティ構成を選択します。

以下の AWS CLI コマンドを使用して クラスターを作成できます。

aws emr create-cluster --name "TestEMRFSAuthorization" \ 
--release-label emr-5.10.0 \ --instance-type m3.xlarge \ 
--instance-count 3 \ 
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2KeyPair \ --service-role EMR_DefaultRole \ 
--security-configuration MyKerberosConfig \ 
--configurations file://hue-config.json \
--applications Name=Hadoop Name=Hive Name=Hue Name=Spark \ 
--kerberos-attributes Realm=EC2.INTERNAL, \ KdcAdminPassword=<YourClusterKDCAdminPassword>, \ ADDomainJoinUser=<YourADUserLogonName>,ADDomainJoinPassword=<YourADUserPassword>, \ 
CrossRealmTrustPrincipalPassword=<MatchADTrustPwd>

注: CLI を使用してクラスターを作成した場合、Hue の JSON 構成を hue-config.json という名前のファイルに保存し、それを CLI コマンドを実行するサーバーに配置する必要があります。

クラスターが 待機 状態になった後で、Active Directory ユーザー名とパスワードを使用して SSH を クラスターに接続しようとします。

ssh -l aduser@ad.domain <EMR IP or DNS name>

迅速に 2 つのコマンドを実行して、Active Directory の結合が正常に行われたことを示します。

  1. id [user name] は Linux でマッピングされた AD ユーザーとグループを示します。
  2. hdfs groups [user name] は Hadoop でマッピングされたグループを示します。

両方とも、設定が正しい場合は、現在の Active Directory ユーザーとグループの情報を返します。

ここで、ユーザーのマッピングを最初にテストできます。admin1 ユーザーでログインし、次の Hadoop リストディレクトリコマンドを実行します。

hadoop fs -ls s3://emrfs-auth-data-science-bucket-demo/

ここで、データエンジニアグループからユーザーに切り替えます。

管理者のバケットにアクセスするために、前のコマンドを再度試みます。Amazon S3 アクセス拒否 例外をスローしなければなりません。

データエンジニアグループメンバーにアクセス県がある Amazon S3 バケットをリストしようとするとき、グループマッピングをトリガーします。

hadoop fs -ls s3://emrfs-auth-data-engineering-bucket-demo/

リスト結果が正常に返されます。次に、Apache Hive をテストした後で、Apache Spark をテストします。

 

ジョブを正常に実行するために、/user/<username> の下でデータをステージングするためも HDFS の各ユーザーに対してホームディレクトリを作成する必要があります。ユーザーはクラスターにアクセスすることができる各ユーザーのクラスター開始時にホームディレクトリを作成するための手順を構成できます。この例では、Hue は最初のログインでユーザーに HDFS noホームディレクトリを作成するため、Hue を使用します。ここで、Hue はまた、前述の構成例で説明されているものと同じ Active Directory と統合することも必要です。

まず、Hue にデータエンジニアユーザーとしてログインし、Hive ノートブックを Hue で開きます。次に、クエリを実行して、データエンジニアバケット s3://emrfs-auth-data-engineering-bucket-demo/table1_data_eng/ をポイントする新しい表を作成します。

テーブルが正常に作成されたことを確認できます。データ科学グループのバケットをポイントする別の表を作成しようと試みます。ここでデータエンジニアグループはアクセスできません。

失敗し、Amazon S3 アクセス拒否エラーをスルーしました。

ここで、1 行のデータを挿入して、正常な表を作成します。

次に、ログアウトして、データ科学グループユーザーに切り替え、別の表 test2_datasci_tb を作成します。

作成が正常に行われます。

最後のタスクは Spark をテストすることです (ユーザーディレクトリが必要ですが、Hue は前のステップで作成しました)。

ここで、コマンドラインに戻り、いくつかの Spark コマンドを実行します。

datascientist1 ユーザーを使用してマスタノードにログインします。

SparkSQL interactive シェルをspark-sqlを入力して開始して、show tablesコマンドを実行します。Hive を使用して作成した表をリストするはずです。

データ科学ユーザーとして、両方の表で select を試します。グループがアクセスできる場所に定義された表のみを選択することができることがわかります。

結論

EMRFS の IAM ロールは、同じクラスターに複数のロールをもち、より良い効率を達成するために、さまざまなチームに共有するクラスターを構成する柔軟性を備えています。Active Directory のインテグレーションとグループマッピングにより、ユーザーとグループの管理が大幅に容易になり、マルチテナント環境でより良い監査可能性が得られます。


その他の参考資料

この記事が役立つと感じた場合は、Microsoft Active Directory と Amazon EMR を統合するために Kerberos 認証の使用VPC 内部での Amazon EMR クラスターの開始と実行 をご確認ください。


著者について

Songzhi Liu は、AWS プロフェッショナルサービスのビッグデータコンサルタントです。 彼は、AWS 顧客と密接に協力して、ビッグデータと Machine Learning ソリューションと Amazon クラウドのベストプラクティスを提供しています。