このトピックでは、HDFS にアクセスする際の MIT Kerberos 認証の設定方法について説明します。
前提条件
EMR V3.40、EMR V4.10.1、または EMR 3.40 もしくは EMR 4.10.1 より前のマイナーバージョンの Hadoop クラスタが作成されていること。詳細については、クラスタの作成をご参照ください。
hadoop コマンドを実行して HDFS にアクセスする
次の例は、test ユーザーとして HDFS にアクセスする方法を示しています。
- EMR クラスタに関連付けられているゲートウェイクラスタで次のコマンドを実行して、krb5.conf ファイルを設定します。
scp root@emr-header-1:/etc/krb5.conf /etc/ - hadoop.security.authentication.use.has パラメータを false に設定します。
- クラスタの emr-header-1 ノードに接続します。説明 高可用性(HA)EMR クラスタを使用する場合は、クラスタの emr-header-1 ノードにも接続する必要があります。
ノードへの接続方法の詳細については、クラスタへのログオンをご参照ください。
- 次のコマンドを実行して、core-site.xml ファイルを編集します。
vim /etc/ecm/hadoop-conf/core-site.xml - hadoop.security.authentication.use.has パラメータの値を確認します。
- 値が true の場合は、false に変更します。
- 値が false の場合は、手順 3 に進みます。
- クラスタの emr-header-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
- EMR V3.30.0 以降の V3.X.X、および EMR V4.5.1 以降の V4.X.X:
- 次のコマンドを実行して、test という名前のプリンシパルを追加します。
この例では、パスワードは 123456 です。
// パスワードを指定してプリンシパルを追加しますaddprinc -pw 123456 test - 次のコマンドを実行して、keytab ファイルをエクスポートします。
// keytab ファイルを生成しますktadd -k /root/test.keytab test
- 次のコマンドを実行して、Kerberos 管理ツールを起動します。
- チケットを取得します。hadoop コマンドを実行するクライアントで次のコマンドを実行します。この例では、ゲートウェイクラスタが使用されます。
- test という名前の Linux アカウントを作成します。
useradd test - MIT Kerberos クライアントをインストールします。
MIT Kerberos クライアントを使用して、kinit や klist などの関連操作を実行できます。詳細については、MIT Kerberos をご参照ください。
yum install krb5-libs krb5-workstation -y - test アカウントに切り替えて、kinit コマンドを実行します。
su test- keytab ファイルが存在しない場合は、
kinitコマンドを実行します。Enter キーを押した後、test アカウントのパスワード 123456 を入力します。 - keytab ファイルが存在する場合は、次のコマンドを実行します。
# 特定の keytab ファイルの特定のプリンシパルを使用して認証します。 kinit -kt test.keytab test # チケットのライフサイクルを表示します。 klistklistと入力して 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
- keytab ファイルが存在しない場合は、
- オプション:チケットのライフサイクルを設定する場合は、次の操作を実行します。
- チケットのライフサイクルを設定します。
// チケットのライフサイクルを 5 日間に設定しますkinit -l 5d 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
- チケットのライフサイクルを設定します。
- test という名前の Linux アカウントを作成します。
- ゲートウェイクラスタで次のコマンドを実行して、環境変数をインポートします。
export HADOOP_CONF_DIR=/etc/has/hadoop-conf - 次の 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 バージョンを示します。