Pivotal Knowledge Base

フォローする

KerberosによるセキュアHDFSへのアクセスが失敗する

環境

製品 バージョン
Pivotal HD 3.0.x
OS RHEL 6.x

事象

Kerberosのパラメータがすべて正しく設定されているにも関わらずKerberosによるセキュリティ設定を行ったHadoop Distributed File System(HDFS)へのアクセスが"SIMPLE authentication is not enabled"というエラーメッセージで失敗する。 

エラーメッセージ:

# hdfs dfs -ls /
ls: Failed on local exception: java.io.IOException: Couldn't setup connection for hdfs@EXAMPLE.COM to node01.example.com/172.28.21.2:8020; Host Details : local host is: "node01.example.com/172.28.21.2"; destination host is: "node01.example.com":8020; 

Namenode ログ:

2015-11-25 16:15:34,792 INFO ipc.Server (Server.java:doRead(771)) - Socket Reader #1 for port 8020: readAndProcess from client 172.28.21.2 threw exception [org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]]
org.apache.hadoop.security.AccessControlException: SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
at org.apache.hadoop.ipc.Server$Connection.initializeAuthContext(Server.java:1554)
at org.apache.hadoop.ipc.Server$Connection.readAndProcess(Server.java:1510)
at org.apache.hadoop.ipc.Server$Listener.doRead(Server.java:762)
at org.apache.hadoop.ipc.Server$Listener$Reader.doRunLoop(Server.java:636)
at org.apache.hadoop.ipc.Server$Listener$Reader.run(Server.java:607)

原因

KDCサーバとHadoopクラスタサーバ間とでシステム時刻が大きく異なっている。

根本原因解析

HADOOP DEBUGを有効にし、以下のHadoopクライアントコマンドを実行すると"Clock skew too great"というエラーが表示される。

# HADOOP_ROOT_LOGGER=DEBUG,console hdfs dfs -ls /
......
15/11/26 13:15:54 DEBUG security.UserGroupInformation: hadoop login
15/11/26 13:15:54 DEBUG security.UserGroupInformation: hadoop login commit
15/11/26 13:15:54 DEBUG security.UserGroupInformation: using kerberos user:hdfs@EXAMPLE.COM
15/11/26 13:15:54 DEBUG security.UserGroupInformation: Using user: "hdfs@EXAMPLE.COM" with name hdfs@EXAMPLE.COM
15/11/26 13:15:54 DEBUG security.UserGroupInformation: User entry: "hdfs@EXAMPLE.COM"
15/11/26 13:15:54 DEBUG security.UserGroupInformation: UGI loginUser:hdfs@EXAMPLE.COM (auth:KERBEROS)
......
15/11/26 13:16:11 DEBUG security.UserGroupInformation: PrivilegedActionException as:hdfs@EXAMPLE.COM (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Clock skew too great (37) - PROCESS_TGS)]
15/11/26 13:16:11 DEBUG security.UserGroupInformation: PrivilegedAction as:hdfs@EXAMPLE.COM (auth:KERBEROS) from:org.apache.hadoop.ipc.Client$Connection.handleSaslConnectionFailure(Client.java:644)
15/11/26 13:16:11 WARN ipc.Client: Couldn't setup connection for hdfs@EXAMPLE.COM to node01.example.com/172.28.21.2:8020
15/11/26 13:16:11 DEBUG security.UserGroupInformation: PrivilegedActionException as:hdfs@EXAMPLE.COM (auth:KERBEROS) cause:java.io.IOException: Couldn't setup connection for hdfs@EXAMPLE.COM to node01.example.com/172.28.21.2:8020
15/11/26 13:16:11 DEBUG ipc.Client: closing ipc connection to node01.example.com/172.28.21.2:8020: Couldn't setup connection for hdfs@EXAMPLE.COM to node01.example.com/172.28.21.2:8020
java.io.IOException: Couldn't setup connection for hdfs@EXAMPLE.COM to node01.example.com/172.28.21.2:8020
......
at org.apache.hadoop.fs.FsShell.main(FsShell.java:340)
Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Clock skew too great (37) - PROCESS_TGS)]
at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:212)

以下のコマンドにて、KDCサーバとHadoopクラスタのサーバが時刻同期していないことが分かる。

KDCサーバでのシステム時刻:

# date
Thu Nov 26 05:20:54 GMT+8 2015

Hadoopクラスタのサーバでのシステム時刻:

# date
Thu Nov 26 13:20:41 SGT 2015

kinitコマンドにてKerberosのチケット取得に成功するが、有効期間がシステム時刻を大幅に超えているのでHDFSへのアクセスができなくなっている。

# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: hdfs@SMARTHUB.COM

Valid starting Expires Service principal
11/27/15 06:28:31 11/27/15 14:28:31 krbtgt/SMARTHUB.COM@SMARTHUB.COM

# date
Thu Nov 26 14:29:19 SGT 2015

解決方法

1. NTPを利用して、KDCサーバとHadoopクラスタのサーバを時刻同期させる。

2. UTC時刻が全サーバ(KDC及びHadoopクラスタのサーバ)で同期されていることを確認する。なぜなら、これが実際のKerberosクレデンシャル有効期間を決定するためである。事実、KDCはまずUTC時刻でチケットの有効期間を設定し、その後Kerberosクライアントがローカルタイムゾーンに応じて調整する。

コメント

Powered by Zendesk