適用対象: Windows 上の SQL Server 2016 (13.x) 以降のバージョン
Kerberos で保護された Hadoop クラスターで PolyBase を使用する場合の認証の問題をトラブルシューティングするには、PolyBase に組み込まれている対話型診断を使用します。
この記事は、これらの組み込みの診断を使用して、このような問題のデバッグ プロセスを説明するガイドとして機能します。
ヒント
Kerberos でセキュリティが強化された HDFS クラスター内に外部テーブルを作成しているときに HDFS Kerberos エラーが発生した場合は、このガイドの手順に従うのでなく、 HDFS Kerberos Tester を実行して PolyBase に対する HDFS Kerberos 接続のトラブルシューティングを行うこともできます。
このツールは、SQL Server 以外の問題を排除するのに役立ちます。これにより、HDFS Kerberos セットアップの問題の解決、つまり、ユーザー名/パスワードの構成ミス、クラスターの Kerberos セットアップの誤った構成に関する問題の特定に集中できます。
このツールは SQL Server から独立しています。 Jupyter Notebook として使用でき、Azure Data Studio が必要です。
前提条件
PolyBase がインストールされた SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) またはそれ以降
Kerberos (Active Directory または MIT) によるセキュリティで保護された Hadoop クラスター (Cloudera または Hortonworks)
はじめに
まず Kerberos プロトコルの概要を理解することが役に立ちます。 次の 3 つのアクターが関係します。
- Kerberos クライアント (SQL Server)
- セキュリティで保護されたリソース (HDFS、MR2、YARN、ジョブ履歴など)
- キー配布センター (Active Directory のドメイン コント ローラーと呼ばれる)
Hadoop クラスターで Kerberos を構成する場合は、キー配布センター (KDC) の各 Hadoop セキュリティで保護されたリソースを一意のサービス プリンシパル名 (SPN) に登録します。 クライアントは、チケット付与チケット (TGT) と呼ばれる一時的なユーザー チケットを取得する必要があります。そのため、アクセスする特定の SPN について、サービス チケット (ST) と呼ばれる別の一時的なチケットを KDC から要求できます。
PolyBase では、Kerberos で保護されたリソースに対して認証を要求すると、次の 4 ラウンド トリップ ハンドシェイクが行われます。
SQL Server は KDC に接続し、ユーザーの TGT を取得します。 KDC 秘密キーは TGT を暗号化します。
SQL Server は、Hadoop によるセキュリティで保護されたリソース (HDFS) を呼び出し、どの SPN の ST が必要なのかを判別します。
SQL Server は、KDC に戻って TGT を渡し、セキュリティで保護されたその特定のリソースにアクセスするための ST を要求します。 セキュリティで保護されたサービスの秘密キーによって ST が暗号化されます。
SQL Server は ST を Hadoop に転送し、そのサービスに対してセッションが作成されるように認証を取得します。
認証に関する問題は、前の手順の 1 つ以上に分類されます。 デバッグの高速化に役立つ PolyBase には、障害点の特定に役立つ統合診断ツールが用意されています。
トラブルシューティング
PolyBase は、次の構成 XML ファイルを使用して Hadoop クラスターのプロパティを格納します。
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-site.xml
これらのファイルは、次のパスにあります。
[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf
たとえば、SQL Server 2016 (13.x) の既定のパスは C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf。
core-site.xmlを編集し、これらのプロパティを追加します。 環境に応じて値を設定します。
<property>
<name>polybase.kerberos.realm</name>
<value>CONTOSO.COM</value>
</property>
<property>
<name>polybase.kerberos.kdchost</name>
<value>kerberos.contoso.com</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>KERBEROS</value>
</property>
Note
polybase.kerberos.realmプロパティの値はすべて大文字である必要があります。
プッシュダウン操作を有効にする場合は、他の XML ファイルを更新する必要があります。 このファイルを構成するだけで、HDFS ファイル システムにアクセスできます。
このツールは SQL Server とは独立して実行されるため、実行する必要はありません。 構成 XML ファイルを更新する場合は、再起動する必要はありません。 ツールを実行するには、SQL Server がインストールされているホストで次のコマンドを実行します。
cd C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase
java -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge {Name Node Address} {Name Node Port} {Service Principal} {Filepath containing Service Principal's Password} {Remote HDFS file path (optional)}
SQL Server 2019 (15.x) 以降のバージョンでは、PolyBase 機能をインストールするときに、既存の Java ランタイム環境を参照するか、AZUL-OpenJDK-JRE をインストールできます。 AZUL-OpenJDK-JRE を選択した場合、 java.exe は $PATH 環境変数の一部ではなく、エラーが発生する可能性があります
'java' isn't recognized as an internal or external command, operable program or batch file.
このエラーが発生した場合は、セッションjava.exe環境変数に$PATHするパスを追加する必要があります。 Java 実行可能ファイルの既定のインストール パスは C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin。 これがパスの場合は、 java コマンドを実行して Kerberos 接続トラブルシューティング ツールを実行する前に、次のコマンドを実行する必要があります。
set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin
引数
| Argument | 説明 |
|---|---|
| 名前ノードのアドレス | 名前ノードの IP または FQDN です。
CREATE EXTERNAL DATA SOURCE Transact-SQL の "LOCATION" 引数を参照します。
注: SQL Server 2019 バージョンのツールでは、IP または FQDN の前に hdfs:// が必要です。 |
| 名前ノードのポート | 名前ノードのポートです。 CREATE EXTERNAL DATA SOURCE T-SQL の "LOCATION" 引数を参照します。 例: 8020。 |
| サービス プリンシパル | KDC に対する管理サービス プリンシパルです。
CREATE DATABASE SCOPED CREDENTIAL T-SQL の "IDENTITY" 引数と一致します。 |
| サービスのパスワード | コンソールにパスワードを入力するのではなく、パスワードをファイルに保存し、そのファイルのパスをここに指定します。
CREATE DATABASE SCOPED CREDENTIAL T-SQL で "SECRET" 引数として使用するプリンシパルと一致する必要があります。 |
| リモート HDFS ファイル パス (省略可能) | アクセスする対象である既存のファイルのパスです。 指定しない場合は、ルート フォルダー (/) が使用されます。 |
例示
java -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
出力はデバッグを強化するために詳細ですが、MIT と AD のどちらを使用しているかに関係なく、検索する主要なチェックポイントは 4 つのみです。 これらは、前に説明した 4 つの手順に対応します。
MIT KDC からの抜粋を以下に示します。 関連コンテンツのこの記事の最後にある MIT と AD の両方からの完全なサンプル出力を参照してください。
チェックポイント 1
Server Principal = krbtgt/MYREALM.COM@MYREALM.COM のチケットの 16 進数ダンプが存在する必要があります。 これは、SQL Server が KDC に対して認証され、TGT を受け取ったことを示します。 それ以外の場合は、問題は Hadoop ではなく厳密に SQL Server と KDC の間に存在します。
PolyBase は 、AD と MIT の間の信頼関係をサポートしていないため、Hadoop クラスターで構成されているのと同じ KDC に対して構成する必要があります。 このような環境では、その KDC にサービス アカウントを手動で作成し、それを使用して認証を実行します。
>>> KrbAsReq creating message
>>> KrbKdcReq send: kdc=kerberos.contoso.com UDP:88, timeout=30000, number of retries =3, #bytes=143
>>> KDCCommunication: kdc=kerberos.contoso.com UDP:88, timeout=30000,Attempt =1, #bytes=143
>>> KrbKdcReq send: #bytes read=646
>>> KdcAccessibility: remove kerberos.contoso.com
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
>>> KrbAsRep cons in KrbAsReq.getReply myuser
[2017-04-25 21:34:33,548] INFO 687[main] - com.microsoft.polybase.client.KerberosSecureLogin.secureLogin(KerberosSecureLogin.java:97) - Subject:
Principal: admin_user@CONTOSO.COM
Private Credential: Ticket (hex) =
0000: 61 82 01 48 30 82 01 44 A0 03 02 01 05 A1 0E 1B a..H0..D........
0010: 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D A2 21 30 .CONTOSO.COM.!0
0020: 1F A0 03 02 01 02 A1 18 30 16 1B 06 6B 72 62 74 ........0...krbt
0030: 67 74 1B 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D gt..CONTOSO.COM
0040: A3 82 01 08 30 82 01 04 A0 03 02 01 10 A1 03 02 ....0...........
*[...Condensed...]*
0140: 67 6D F6 41 6C EB E0 C3 3A B2 BD B1 gm.Al...:...
Client Principal = admin_user@CONTOSO.COM
Server Principal = krbtgt/CONTOSO.COM@CONTOSO.COM
*[...Condensed...]*
[2017-04-25 21:34:34,500] INFO 1639[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1579) - Successfully authenticated against KDC server.
チェックポイント 2
PolyBase は HDFS へのアクセスを試行し、要求に必要なサービス チケットが含まれていないため失敗します。
[2017-04-25 21:34:34,501] INFO 1640[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1584) - Attempting to access external filesystem at URI: hdfs://10.193.27.232:8020
Found ticket for admin_user@CONTOSO.COM to go to krbtgt/CONTOSO.COM@CONTOSO.COM expiring on Wed Apr 26 21:34:33 UTC 2017
Entered Krb5Context.initSecContext with state=STATE_NEW
Found ticket for admin_user@CONTOSO.COM to go to krbtgt/CONTOSO.COM@CONTOSO.COM expiring on Wed Apr 26 21:34:33 UTC 2017
Service ticket not found in the subject
チェックポイント 3
2 番目の 16 進ダンプは、SQL Server が TGT を正常に使用し、KDC から名前ノードの SPN の適切なサービス チケットを取得したことを示しています。
>>> KrbKdcReq send: kdc=kerberos.contoso.com UDP:88, timeout=30000, number of retries =3, #bytes=664
>>> KDCCommunication: kdc=kerberos.contoso.com UDP:88, timeout=30000,Attempt =1, #bytes=664
>>> KrbKdcReq send: #bytes read=669
>>> KdcAccessibility: remove kerberos.contoso.com
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
>>> KrbApReq: APOptions are 00100000 00000000 00000000 00000000
>>> EType: sun.security.krb5.internal.crypto.Des3CbcHmacSha1KdEType
Krb5Context setting mySeqNumber to: 1033039363
Created InitSecContextToken:
0000: 01 00 6E 82 02 4B 30 82 02 47 A0 03 02 01 05 A1 ..n..K0..G......
0010: 03 02 01 0E A2 07 03 05 00 20 00 00 00 A3 82 01 ......... ......
0020: 63 61 82 01 5F 30 82 01 5B A0 03 02 01 05 A1 0E ca.._0..[.......
0030: 1B 0C 41 50 53 48 44 50 4D 53 2E 43 4F 4D A2 26 ..CONTOSO.COM.&
0040: 30 24 A0 03 02 01 00 A1 1D 30 1B 1B 02 6E 6E 1B 0$.......0...nn.
0050: 15 73 68 61 73 74 61 2D 68 64 70 32 35 2D 30 30 .hadoop-hdp25-00
0060: 2E 6C 6F 63 61 6C A3 82 01 1A 30 82 01 16 A0 03 .local....0.....
0070: 02 01 10 A1 03 02 01 01 A2 82 01 08 04 82 01 04 ................
*[...Condensed...]*
0240: 03 E3 68 72 C4 D2 8D C2 8A 63 52 1F AE 26 B6 88 ..hr.....cR..&..
0250: C4 .
チェックポイント 4
最後に、ターゲット パスのファイル プロパティが確認メッセージと共に出力されます。 ファイルのプロパティは、SQL Server が ST を使用して Hadoop によって認証され、セキュリティで保護されたリソースにアクセスするためのセッションを許可することを確認します。
この時点に達すると、(i) 3 つのアクターが正しく通信し、(ii) core-site.xml と jaas.conf が正しいこと、(iii) KDC が資格情報を認識していることを確認します。
[2017-04-25 21:34:35,096] INFO 2235[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1586) - File properties for "/": FileStatus{path=hdfs://10.193.27.232:8020/; isDirectory=true; modification_time=1492028259862; access_time=0; owner=hdfs; group=hdfs; permission=rwxr-xr-x; isSymlink=false}
[2017-04-25 21:34:35,098] INFO 2237[main] - com.microsoft.polybase.client.HdfsBridge.main(HdfsBridge.java:1587) - Successfully accessed the external file system.
一般的なエラー
ツールを実行してターゲット パスのファイル プロパティが出力されない場合(チェックポイント 4)、例外が途中で発生します。 例外を確認し、4 ステップのフローで例外が発生したコンテキストを検討します。 発生する可能性がある次の一般的な問題を順番に検討してください。
| 例外とメッセージ | 原因 |
|---|---|
org.apache.hadoop.security.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
core-site.xml ファイルでは、hadoop.security.authentication プロパティはKERBEROSに設定されません。 |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
管理サービス プリンシパルは、 core-site.xmlで指定された領域に存在しません。 |
javax.security.auth.login.LoginExceptionChecksum failed |
管理者のサービス プリンシパルは存在しますが、パスワードが正しくありません。 |
Native config name: C:\Windows\krb5.iniLoaded from native config |
このメッセージは、Java の krb5LoginModule でコンピューター上にカスタム クライアント構成が検出されたことを示しています。 問題の原因となっている可能性があるため、カスタム クライアント設定を確認します。 |
javax.security.auth.login.LoginExceptionjava.lang.IllegalArgumentExceptionIllegal principal name <admin_user@CONTOSO.COM>: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to <admin_user@CONTOSO.COM> |
Hadoop クラスターに応じた適切な規則に従って、hadoop.security.auth_to_local に core-site.xml プロパティを追加します。 |
java.net.ConnectExceptionAttempting to access external filesystem at URI: hdfs://10.193.27.230:8020Call From IAAS16981207/10.107.0.245 to 10.193.27.230:8020 failed on connection exception |
KDC に対する認証は成功しますが、Hadoop 名ノードへのアクセスに失敗します。 名前ノードの IP とポートを確認してください。 Hadoop 上のファイアウォールが無効になっていることを確認します。 |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
認証は成功しますが、指定された場所は存在しません。 パスを確認するか、最初にルート / を使用してテストします。 |
デバッグのヒント
MIT KDC
KDC ホストまたは構成されている KDC クライアントで kadmin.local> (管理者アカウント) >listprincs を実行することで、KDC に登録されているすべての SPN (管理者を含む) を表示できます。 Hadoop クラスターで Kerberos を適切に構成する場合は、クラスターで使用できるサービスごとに 1 つの SPN が必要です (たとえば、 nn、 dn、 rm、 yarn、 spnegoなど)。 既定では、 /etc/security/keytabsの下に対応する keytab ファイル (パスワードの置き換え) が表示されます。 KDC 秘密キーは、これらのファイルを暗号化します。
KDC の管理者資格情報をローカルで確認するには、 kinitを使用します。 たとえば、 kinit identity@MYREALM.COMを実行できます。 ID が存在する場合は、パスワードの入力を求められます。
既定では、KDC ログは /var/log/krb5kdc.log で使用できます。 ログには、要求を行ったクライアント IP を含め、チケットのすべての要求が含まれます。 ツールを実行した SQL Server マシンの IP から 2 つの要求が必要です。最初に、認証サーバーから TGT を AS_REQとして、次にチケット許可サーバーからの ST の TGS_REQ が続きます。
[root@MY-KDC log]# tail -2 /var/log/krb5kdc.log
May 09 09:48:26 MY-KDC.local krb5kdc[2547](info): **AS_REQ** (3 etypes {17 16 23}) 10.107.0.245: ISSUE: authtime 1494348506, etypes {rep=16 tkt=16 ses=16}, admin_user@CONTOSO.COM for **krbtgt/CONTOSO.COM@CONTOSO.COM**
May 09 09:48:29 MY-KDC.local krb5kdc[2547](info): **TGS_REQ** (3 etypes {17 16 23}) 10.107.0.245: ISSUE: authtime 1494348506, etypes {rep=16 tkt=16 ses=16}, admin_user@CONTOSO.COM for **nn/hadoop-hdp25-00.local@CONTOSO.COM**
Active Directory
Active Directory では、 コントロール パネル>Active Directory のユーザーとコンピューターに移動し、 <MyRealm> に移動し、 <MyOrganizationalUnit>を選択することで、SPN を表示できます。 Hadoop クラスターで Kerberos を適切に構成した場合、クラスターで使用できるサービスごとに 1 つの SPN があります (たとえば、 nn、 dn、 rm、 yarn、 spnegoなど)。
一般的なデバッグのヒント
SQL Server PolyBase 機能とは無関係に、ログを調び、Kerberos の問題をデバッグする Java エクスペリエンスがあると便利です。
Kerberos へのアクセスで問題が解決しない場合は、次の手順に従ってデバッグします。
SQL Server の外部から Kerberos HDFS データにアクセスできることを確認します。 次のいずれかを実行できます。
独自の Java プログラムを記述するか、PolyBase インストール フォルダー
HdfsBridgeクラスを使用します。 次に例を示します。-classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
前の例では、
admin_userにはユーザー名のみが含まれますが、ドメイン部分は含まれません。PolyBase の外部から Kerberos HDFS データにアクセスできない場合:
Kerberos 認証には、Active Directory Kerberos 認証と MIT Kerberos 認証の 2 種類があります。
ドメイン アカウントにユーザーが存在することを確認し、HDFS へのアクセス試行時に同じユーザー アカウントを使用します。
Active Directory Kerberos の場合は、Windows で
klistコマンドを使用して、キャッシュされたチケットを表示できることを確認します。PolyBase マシンに接続し、コマンド プロンプトで
klistとklist tgtを実行して、KDC、ユーザー名、暗号化の種類が正しいかどうかを確認します。KDC で AES-256 のみをサポートできる場合は、 JCE ポリシー ファイル がインストールされていることを確認します。