すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:MIT Kerberos 認証の設定

最終更新日:Jan 11, 2025

このトピックでは、HDFS にアクセスする際の MIT Kerberos 認証の設定方法について説明します。

前提条件

EMR V3.40、EMR V4.10.1、または EMR 3.40 もしくは EMR 4.10.1 より前のマイナーバージョンの Hadoop クラスタが作成されていること。詳細については、クラスタの作成をご参照ください。

hadoop コマンドを実行して HDFS にアクセスする

次の例は、test ユーザーとして HDFS にアクセスする方法を示しています。

  1. EMR クラスタに関連付けられているゲートウェイクラスタで次のコマンドを実行して、krb5.conf ファイルを設定します。
    scp root@emr-header-1:/etc/krb5.conf /etc/
  2. hadoop.security.authentication.use.has パラメータを false に設定します。
    1. クラスタの emr-header-1 ノードに接続します。
      説明 高可用性(HA)EMR クラスタを使用する場合は、クラスタの emr-header-1 ノードにも接続する必要があります。

      ノードへの接続方法の詳細については、クラスタへのログオンをご参照ください。

    2. 次のコマンドを実行して、core-site.xml ファイルを編集します。
      vim /etc/ecm/hadoop-conf/core-site.xml
    3. hadoop.security.authentication.use.has パラメータの値を確認します。
      • 値が true の場合は、false に変更します。
      • 値が false の場合は、手順 3 に進みます。
  3. プリンシパルを追加します。
    1. 次のコマンドを実行して、Kerberos 管理ツールを起動します。
      • EMR V3.30.0 以降の V3.X.X、および EMR V4.5.1 以降の V4.X.X:
        sh /usr/lib/has-current/bin/admin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
      • V3.30.0 より前の EMR V3.X.X、および V4.5.1 より前の EMR V4.X.X:
        sh /usr/lib/has-current/bin/hadmin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
    2. 次のコマンドを実行して、test という名前のプリンシパルを追加します。

      この例では、パスワードは 123456 です。

      addprinc -pw 123456 test
      // パスワードを指定してプリンシパルを追加します
    3. 次のコマンドを実行して、keytab ファイルをエクスポートします。
      ktadd -k /root/test.keytab test
      // keytab ファイルを生成します
  4. チケットを取得します。
    hadoop コマンドを実行するクライアントで次のコマンドを実行します。この例では、ゲートウェイクラスタが使用されます。
    1. test という名前の Linux アカウントを作成します。
      useradd test
    2. MIT Kerberos クライアントをインストールします。

      MIT Kerberos クライアントを使用して、kinit や klist などの関連操作を実行できます。詳細については、MIT Kerberos をご参照ください。

      yum install krb5-libs krb5-workstation -y
    3. test アカウントに切り替えて、kinit コマンドを実行します。
      su test
      • keytab ファイルが存在しない場合は、kinit コマンドを実行します。Enter キーを押した後、test アカウントのパスワード 123456 を入力します。
      • keytab ファイルが存在する場合は、次のコマンドを実行します。
        # 特定の keytab ファイルの特定のプリンシパルを使用して認証します。
        kinit -kt test.keytab test
        # チケットのライフサイクルを表示します。
        klist
        klist と入力して Enter キーを押した後、test アカウントのパスワード 123456 を入力します。次のような情報が出力されます。
        Valid starting       Expires              Service principal
        03/30/2021 10:48:47  03/31/2021 10:48:47  krbtgt/EMR.209749.COM@EMR.209749.COM
                renew until 03/31/2021 10:48:47
    4. オプション:チケットのライフサイクルを設定する場合は、次の操作を実行します。
      1. チケットのライフサイクルを設定します。
        kinit -l 5d
        // チケットのライフサイクルを 5 日間に設定します
      2. klist コマンドを実行して、チケットのライフサイクルを表示します。
        Valid starting       Expires              Service principal
        03/30/2021 10:50:51  04/04/2021 10:50:51  krbtgt/EMR.209749.COM@EMR.209749.COM
                renew until 04/01/2021 10:50:51
  5. ゲートウェイクラスタで次のコマンドを実行して、環境変数をインポートします。
    export HADOOP_CONF_DIR=/etc/has/hadoop-conf
  6. 次の hadoop コマンドを実行します。
    hadoop fs -ls /
    次のような情報が出力されます。
    Found 6 items
    drwxr-xr-x   - hadoop    hadoop          0 2021-03-29 11:16 /apps
    drwxrwxrwx   - flowagent hadoop          0 2021-03-29 11:18 /emr-flow
    drwxr-x---   - has       hadoop          0 2021-03-29 11:16 /emr-sparksql-udf
    drwxrwxrwt   - hadoop    hadoop          0 2021-03-29 11:17 /spark-history
    drwxr-x---   - hadoop    hadoop          0 2021-03-29 11:16 /tmp
    drwxrwxrwt   - hadoop    hadoop          0 2021-03-29 11:17 /user

Java コードを使用して HDFS にアクセスする

  • ローカルチケットキャッシュを使用する
    説明 事前に kinit コマンドを実行してチケットを取得する必要があります。アプリケーションが期限切れのチケットにアクセスしようとすると、エラーが発生します。
    public static void main(String[] args) throws IOException {
       Configuration conf = new Configuration();
       // HDFS の設定を読み込みます。EMR クラスタから設定のコピーを取得できます。
       conf.addResource(new Path("/etc/ecm/hadoop-conf/hdfs-site.xml"));
       conf.addResource(new Path("/etc/ecm/hadoop-conf/core-site.xml"));
       // Linux アカウントを使用して、事前に kinit コマンドを実行してチケットを取得します。
       UserGroupInformation.setConfiguration(conf);
       UserGroupInformation.loginUserFromSubject(null);
       FileSystem fs = FileSystem.get(conf);
       FileStatus[] fsStatus = fs.listStatus(new Path("/"));
       for(int i = 0; i < fsStatus.length; i++){
           System.out.println(fsStatus[i].getPath().toString());
       }
    }
  • (推奨) keytab ファイルを使用する
    説明 keytab ファイルは永続的に有効です。 keytab ファイルの有効性は、ローカルチケットとは無関係です。
    public static void main(String[] args) throws IOException {
      String keytab = args[0];
      String principal = args[1];
      Configuration conf = new Configuration();
      // HDFS の設定を読み込みます。EMR クラスタから設定のコピーを取得できます。
      conf.addResource(new Path("/etc/ecm/hadoop-conf/hdfs-site.xml"));
      conf.addResource(new Path("/etc/ecm/hadoop-conf/core-site.xml"));
      // keytab ファイルを使用します。コマンドを実行することで、EMR クラスタの emr-header-1 ノードから keytab ファイルを取得できます。
      UserGroupInformation.setConfiguration(conf);
      UserGroupInformation.loginUserFromKeytab(principal, keytab);
      FileSystem fs = FileSystem.get(conf);
      FileStatus[] fsStatus = fs.listStatus(new Path("/"));
      for(int i = 0; i < fsStatus.length; i++){
          System.out.println(fsStatus[i].getPath().toString());
      }
      }
    pom.xml ファイルの依存関係:
    <dependencies>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>x.x.x</version>
      </dependency>
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>x.x.x</version>
       </dependency>
    </dependencies>
    説明 x.x.x は、EMR クラスタの Hadoop バージョンを示します。