Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
S’applique à : SQL Server 2016 (13.x) et versions ultérieures sur Windows
Pour résoudre les problèmes d’authentification lors de l’utilisation de PolyBase avec un cluster Hadoop sécurisé par Kerberos, utilisez les diagnostics interactifs intégrés à PolyBase.
Cet article sert de guide pour parcourir le processus de débogage de ces problèmes à l’aide de ces diagnostics intégrés.
Conseil
Au lieu de suivre les étapes de ce guide, vous pouvez choisir d’exécuter HDFS Kerberos Tester pour dépanner les connexions Kerberos HDFS pour PolyBase, quand vous rencontrez un échec de Kerberos HDFS lors de la création d’une table externe dans un cluster HDFS sécurisé par Kerberos.
Cet outil vous aide à exclure les problèmes non-SQL Server, pour vous aider à vous concentrer sur la résolution des problèmes d’installation Kerberos HDFS, à savoir l’identification des problèmes liés aux configurations incorrectes de nom d’utilisateur/mot de passe et aux configurations incorrectes du programme d’installation kerberos du cluster.
Cet outil est indépendant de SQL Server. Il est disponible en tant que notebook Jupyter et nécessite Azure Data Studio.
Prérequis
SQL Server 2016 (13.x) RTM mise à jour cumulative 6 / SQL Server 2016 (13.x) SP1 mise à jour cumulative 3 / SQL Server 2017 (14.x) ou version ultérieure avec PolyBase installé
Un cluster Hadoop (Cloudera ou Hortonworks) sécurisé avec Kerberos (Active Directory ou MIT)
Introduction
Vous devez tout d’abord avoir quelques notions élémentaires du protocole Kerberos. Trois acteurs sont impliqués :
- Client Kerberos (SQL Server)
- Ressource sécurisée (HDFS, MR2, YARN, historique des travaux, etc.)
- Centre de distribution de clés (également appelé contrôleur de domaine dans Active Directory)
Lorsque vous configurez Kerberos sur le cluster Hadoop, vous inscrivez chaque ressource sécurisée Hadoop dans le Centre de distribution de clés (KDC) avec un nom de principal de service (SPN) unique. Le client doit obtenir un ticket d’utilisateur temporaire, appelé ticket d’octroi de ticket (TGT), afin qu’il puisse demander un autre ticket temporaire, appelé ticket de service (ST), à partir du KDC pour le SPN spécifique auquel il souhaite accéder.
Dans PolyBase, lorsque vous demandez l'authentification sur n’importe quelle ressource sécurisée par Kerberos, le dialogue en quatre allers-retours suivant a lieu :
SQL Server se connecte au KDC et obtient un TGT pour l’utilisateur. La clé privée KDC chiffre le TGT.
SQL Server appelle la ressource sécurisée de Hadoop, HDFS, et détermine le nom de principal du service pour lequel il a besoin d’un ticket de service.
SQL Server revient au centre KDC, renvoie le ticket TGT et demande un ticket de service pour accéder à cette ressource sécurisée particulière. La clé privée du service sécurisé crypte le ST.
SQL Server transfère le ticket de service à Hadoop et est authentifié pour qu’une session soit créée sur ce service.
Les problèmes liés à l’authentification se trouvent dans une ou plusieurs des étapes précédentes. Pour faciliter le débogage plus rapide, PolyBase fournit un outil de diagnostic intégré pour vous aider à identifier le point de défaillance.
Dépannage
PolyBase utilise les fichiers XML de configuration suivants pour stocker les propriétés du cluster Hadoop :
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-site.xml
Vous trouverez ces fichiers dans le chemin d’accès suivant :
[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf
Par exemple, le chemin d’accès par défaut pour SQL Server 2016 (13.x) est C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.
Modifiez core-site.xml et ajoutez ces propriétés. Définissez les valeurs en fonction de votre environnement :
<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>
Remarque
La valeur de la propriété polybase.kerberos.realm doit être en majuscules.
Vous devez mettre à jour les autres fichiers XML si vous souhaitez activer les opérations pushdown. Vous pouvez accéder au système de fichiers HDFS avec uniquement ce fichier configuré.
L’outil s’exécute indépendamment de SQL Server. Il n’a donc pas besoin d’être en cours d’exécution. Vous n’avez pas besoin de le redémarrer si vous mettez à jour les fichiers XML de configuration. Pour exécuter l’outil, exécutez les commandes suivantes sur l’hôte avec SQL Server installé :
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)}
Dans SQL Server 2019 (15.x) et versions ultérieures, lorsque vous installez la fonctionnalité PolyBase, vous pouvez référencer un environnement Java Runtime existant ou installer AZUL-OpenJDK-JRE. Si vous sélectionnez AZUL-OpenJDK-JRE, java.exe ne fait pas partie de la $PATH variable d’environnement et que vous risquez de rencontrer l’erreur
'java' isn't recognized as an internal or external command, operable program or batch file.
Si cette erreur se produit, vous devez ajouter le chemin d'accès à java.exe dans la variable d'environnement de session $PATH. Le chemin d’installation par défaut de l’exécutable Java est C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin. Si c’est le chemin d’accès, vous devez exécuter la commande suivante avant d’exécuter la java commande pour exécuter l’outil de résolution des problèmes de connectivité Kerberos.
set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin
Arguments
| Argument | Description |
|---|---|
| Nom de l’adresse du nœud | Adresse IP ou nom de domaine complet du nœud de nom. Fait référence à l’argument « LOCATION » dans votre CREATE EXTERNAL DATA SOURCE transact-SQL.
Remarque : la version SQL Server 2019 de l’outil nécessite hdfs:// de précéder l’adresse IP ou le nom de domaine complet. |
| Port du NameNode | Port du nœud de nom. Fait référence à l’argument « LOCATION » dans votre instruction T-SQL CREATE EXTERNAL DATA SOURCE. Par exemple, 8020. |
| Principal du service | Principal du service d’administration pour votre centre KDC. Correspond à l’argument « IDENTITY » dans votre instruction T-SQL CREATE DATABASE SCOPED CREDENTIAL. |
| Mot de passe du service | Au lieu de taper votre mot de passe sur la console, stockez-le dans un fichier et indiquez le chemin du fichier ici. Le contenu du fichier doit correspondre à ce que vous utilisez comme argument « SECRET » dans votre instruction T-SQL CREATE DATABASE SCOPED CREDENTIAL. |
| Remote HDFS file path (facultatif) | Chemin d’un fichier existant auquel accéder. S’il n’est pas spécifié, le dossier racine (/) est utilisé. |
Examples
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
La sortie est détaillée pour le débogage amélioré, mais il n’y a que quatre points de contrôle principaux à rechercher, que vous utilisiez MIT ou AD. Ils correspondent aux quatre étapes décrites précédemment.
Les extraits suivants proviennent d’un centre KDC MIT. Reportez-vous aux exemples de sorties complets de MIT et AD à la fin de cet article dans le contenu associé.
Point de contrôle 1
Il doit y avoir un vidage hexadécimal d’un ticket avec Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Cette opération indique que SQL Server a été correctement authentifié auprès du centre KDC et a reçu un ticket TGT. Si ce n’est pas le cas, le problème se situe strictement entre SQL Server et le centre KDC, et non Hadoop.
PolyBase ne prend pas en charge les relations d’approbation entre AD et MIT et doit être configurée sur le même KDC que celui configuré dans le cluster Hadoop. Dans de tels environnements, créez manuellement un compte de service sur ce KDC et utilisez-le pour effectuer l’authentification.
>>> 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.
Point de contrôle 2
PolyBase tente d’accéder à HDFS et échoue, car la requête ne contient pas le ticket de service nécessaire.
[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
Point de contrôle 3
Un deuxième vidage hexadécimal montre que SQL Server utilise correctement le TGT et obtient le ticket de service approprié pour le SPN du nœud de nom à partir du KDC.
>>> 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 .
Point de contrôle 4
Enfin, les propriétés du fichier du chemin cible sont imprimées avec un message de confirmation. Les propriétés du fichier confirment que SQL Server s’authentifie par Hadoop à l’aide de la st et accorde une session pour accéder à la ressource sécurisée.
Atteindre ce point confirme que : (i) les trois acteurs communiquent correctement, (ii) le core-site.xml et jaas.conf sont corrects, et (iii) votre KDC reconnaît vos informations d’identification.
[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.
Erreurs courantes
Si vous exécutez l’outil et que les propriétés du fichier du chemin cible ne s'affichent pas (Point de contrôle 4), une exception doit être levée à mi-chemin. Examinez-la et étudiez le contexte de l’endroit dans le flux des quatre étapes où elle s’est produite. Tenez compte des problèmes courants suivants qui peuvent se produire, dans l’ordre :
| Exception et messages | Cause |
|---|---|
org.apache.hadoop.security.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
Le core-site.xml fichier ne définit pas la hadoop.security.authentication propriété sur KERBEROS. |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
Le principal du service d’administration n’existe pas dans le domaine spécifié dans core-site.xml. |
javax.security.auth.login.LoginExceptionChecksum failed |
Le principal du service d’administration existe, mais le mot de passe est incorrect. |
Native config name: C:\Windows\krb5.iniLoaded from native config |
Ce message indique que le module krb5LoginModule de Java a détecté des configurations clientes personnalisées sur votre ordinateur. Vérifiez les paramètres de votre client personnalisé, car ils peuvent provoquer le problème. |
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> |
Ajoutez la propriété hadoop.security.auth_to_local à core-site.xml avec les règles appropriées pour le cluster Hadoop. |
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 |
L’authentification par rapport au KDC réussit, mais elle ne parvient pas à accéder au nœud de nom Hadoop. Vérifiez l’adresse IP et le port du nœud de nom. Vérifiez que le pare-feu est désactivé sur Hadoop. |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
L’authentification réussit, mais l’emplacement spécifié n’existe pas. Vérifiez d’abord le chemin d’accès ou testez avec root /. |
Conseils de débogage
Centre KDC MIT
Vous pouvez afficher tous les SPNs inscrits auprès du KDC, y compris les administrateurs, en exécutant kadmin.local>> sur l'hôte KDC ou sur n'importe quel client KDC configuré. Si vous configurez correctement Kerberos sur le cluster Hadoop, il doit y avoir un SPN pour chaque service disponible dans le cluster (par exemple : nn, , dn, rmyarn, , spnegoetc.). Vous pouvez voir leurs fichiers keytab correspondants (substituts de mot de passe) sous /etc/security/keytabs, par défaut. La clé privée KDC chiffre ces fichiers.
Pour vérifier les informations d’identification de l’administrateur sur le KDC localement, utilisez kinit. Par exemple, vous pouvez exécuter kinit identity@MYREALM.COM. Si l’identité existe, vous êtes invité à entrer un mot de passe.
Les journaux du KDC sont disponibles par défaut dans /var/log/krb5kdc.log. Les journaux contiennent l'ensemble des demandes de tickets, ainsi que l'adresse IP du client ayant effectué la demande. Il doit y avoir deux requêtes à partir de l’adresse IP de l’ordinateur SQL Server où vous avez exécuté l’outil : d’abord pour le TGT depuis le serveur d’authentification sous la forme d’un AS_REQ, suivi d’un TGS_REQ pour le ST depuis le serveur d’octroi de tickets.
[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
Dans Active Directory, vous pouvez afficher les SPN en accédant au Panneau> de configurationUtilisateurs et ordinateurs Active Directory, puis en accédant à <MyRealm> et en sélectionnant <MyOrganizationalUnit>. Si vous configurez correctement Kerberos sur le cluster Hadoop, il existe un SPN pour chaque service disponible dans le cluster (par exemple : nn, , dn, rmyarn, , spnegoetc.).
Conseils généraux relatifs au débogage
Il est utile d’avoir une expérience Java pour examiner les journaux d’activité et déboguer les problèmes Kerberos, qui sont indépendants de la fonctionnalité PolyBase DE SQL Server.
Si vous rencontrez toujours des problèmes d’accès à Kerberos, procédez comme suit pour déboguer :
Vérifiez que vous pouvez accéder aux données HDFS Kerberos en dehors du Serveur SQL. Vous pouvez :
Écrivez votre propre programme Java ou utilisez
HdfsBridgela classe à partir du dossier d’installation de PolyBase. Par exemple :-classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
Dans l’exemple précédent,
admin_userinclut uniquement le nom d’utilisateur , et non aucune partie de domaine.Si vous ne pouvez pas accéder aux données HDFS Kerberos depuis l’extérieur de PolyBase :
Il existe deux types d’authentification Kerberos : l’authentification Kerberos Active Directory et l’authentification Kerberos MIT.
Vérifiez que l’utilisateur existe dans le compte de domaine et utilisez le même compte d’utilisateur lors de la tentative d’accès à HDFS.
Pour Kerberos Active Directory, vérifiez que vous pouvez voir le ticket mis en cache à l’aide de la commande
klistsur Windows.Connectez-vous à l’ordinateur PolyBase et exécutez
klistetklist tgtdans l’invite de commandes pour voir si le KDC, le nom d’utilisateur et les types de chiffrement sont corrects.Si KDC peut uniquement prendre en charge AES-256, vérifiez que les fichiers de stratégie JCE sont installés.