Sdílet prostřednictvím


Řešení potíží s připojením PolyBase Kerberos

Platí pro: SQL Server 2016 (13.x) a novější verze ve Windows

Při řešení potíží s ověřováním při používání PolyBase s clusterem Hadoop zabezpečeným protokolem Kerberos použijte interaktivní diagnostiku integrovanou do PolyBase.

Tento článek slouží jako průvodce procesem ladění těchto problémů pomocí těchto integrovaných diagnostických nástrojů.

Návod

Místo postupu v této příručce můžete spustit tester kerberos HDFS pro řešení potíží s připojeními Kerberos HDFS pro PolyBase, když při vytváření externí tabulky v clusteru HDFS zabezpečeném systémem HDFS dojde k selhání protokolu KERBEROS.

Tento nástroj pomáhá vyloučit problémy s jiným než SQL Serverem, které vám pomůžou soustředit se na řešení problémů s nastavením protokolu Kerberos systému HDFS, konkrétně identifikace problémů s chybnou konfigurací uživatelského jména a hesla a chybné konfigurace nastavení protokolu Kerberos clusteru.

Tento nástroj je nezávislý na SQL Serveru. Je k dispozici jako jupyter Notebook a vyžaduje Azure Data Studio.

Požadavky

  1. SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) nebo novější s nainstalovaným PolyBase

  2. Cluster Hadoop (Cloudera nebo Hortonworks) zabezpečený protokolem Kerberos (Active Directory nebo MIT)

Úvod

Pomáhá nejprve pochopit protokol Kerberos na vysoké úrovni. Jsou zapojeni tři aktéři:

  1. Klient Kerberos (SQL Server)
  2. Zabezpečený prostředek (HDFS, MR2, YARN, Job History, atd.)
  3. Distribuční centrum klíčů (označované jako řadič domény ve službě Active Directory)

Při konfiguraci protokolu Kerberos v clusteru Hadoop zaregistrujete každý prostředek zabezpečený systémem Hadoop v Centru distribuce klíčů (KDC) s jedinečným hlavním názvem služby (SPN). Klient potřebuje získat dočasný lístek uživatele, nazývaný lístek udělující oprávnění (TGT), aby mohl požádat o další dočasný lístek, nazývaný lístek služby (ST), od KDC pro konkrétní hlavní název služby (SPN), ke kterému chce získat přístup.

Když v PolyBase požádáte o ověření vůči jakémukoli prostředku zabezpečenému protokolem Kerberos, proběhne následující čtyřkolový handshake:

  1. SQL Server se připojí k KDC a získá TGT pro uživatele. Privátní klíč KDC šifruje TGT.

  2. SQL Server volá zabezpečený prostředek Hadoop, HDFS a určuje, pro který SPN potřebuje token zabezpečení.

  3. SQL Server se vrátí ke KDC, předá zpět TGT a požádá o ST pro přístup k danému zabezpečenému prostředku. Privátní klíč zabezpečené služby zašifruje ST.

  4. SQL Server předá st do Hadoopu a ověří se, aby byla vytvořena relace pro danou službu.

Diagram PolyBase na SQL Serveru

Problémy s ověřováním spadají do jednoho nebo několika předchozích kroků. Pro usnadnění rychlejšího ladění poskytuje PolyBase integrovaný diagnostický nástroj, který pomáhá identifikovat bod selhání.

Řešení problémů

PolyBase používá k ukládání vlastností clusteru Hadoop následující konfigurační soubory XML:

  • core-site.xml
  • hdfs-site.xml
  • hive-site.xml
  • jaas.conf
  • mapred-site.xml
  • yarn-site.xml

Tyto soubory najdete v následující cestě:

[System Drive]:{install path}{MSSQL##.INSTANCENAME}\MSSQL\Binn\PolyBase\Hadoop\conf

Například výchozí cesta pro SQL Server 2016 (13.x) je C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.

Upravte core-site.xml a přidejte tyto vlastnosti. Nastavte hodnoty podle vašeho prostředí:

<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>

Poznámka:

Hodnota vlastnosti polybase.kerberos.realm musí být napsána velkými písmeny.

Pokud chcete povolit operace propagace, musíte aktualizovat ostatní soubory XML. K systému souborů HDFS se dostanete jenom s nakonfigurovaným souborem.

Nástroj běží nezávisle na SQL Serveru, takže nemusí být spuštěný. Pokud aktualizujete konfigurační soubory XML, nemusíte ho restartovat. Pokud chcete nástroj spustit, spusťte na hostiteli s nainstalovaným SQL Serverem následující příkazy:

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)}

V SQL Serveru 2019 (15.x) a novějších verzích můžete při instalaci funkce PolyBase odkazovat na existující prostředí Java Runtime Environment nebo nainstalovat AZUL-OpenJDK-JRE. Pokud vyberete AZUL-OpenJDK-JRE, java.exe není součástí proměnné prostředí $PATH a může dojít k chybě.

'java' isn't recognized as an internal or external command, operable program or batch file.

Pokud k této chybě dojde, musíte přidat cestu k proměnné prostředí relace java.exe$PATH. Výchozí instalační cesta spustitelného souboru Java je C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin. Pokud je to cesta, musíte před spuštěním příkazu java spustit následující příkaz k provozu nástroje pro řešení potíží s připojením prostřednictvím protokolu Kerberos.

set PATH=%PATH%;C:\Program Files\Microsoft SQL Server\MSSQL15.{instance name}\AZUL-OpenJDK-JRE\bin

Arguments

Argument Description
Adresa uzlu názvu IP adresa nebo plně kvalifikovaný doménový název jmenného uzlu. Odkazuje na argument „LOCATION“ v jazyce Transact-SQL CREATE EXTERNAL DATA SOURCE. Poznámka: Verze nástroje SQL Server 2019 musí hdfs:// předcházet IP adrese nebo plně kvalifikovanému názvu domény.
NameNode port Port jmenného uzlu. Odkazuje na argument LOCATION v příkazu CREATE EXTERNAL DATA SOURCE T-SQL. Například 8020.
Hlavní služba Principál služby správce vašeho KDC. Odpovídá argumentu IDENTITY v T-SQL CREATE DATABASE SCOPED CREDENTIAL .
Heslo služby Místo zadání hesla do konzoly ho uložte do souboru a předejte zde cestu k souboru. Obsah souboru by se měl shodovat s argumentem SECRET v CREATE DATABASE SCOPED CREDENTIAL T-SQL.
Vzdálená cesta k souboru HDFS (volitelné) Cesta ke stávajícímu souboru ke kterému se přistupuje. Pokud není zadána, použije se kořenová složka (/).

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

Výstup je podrobný pro vylepšené ladění, ale existují pouze čtyři hlavní kontrolní body, které můžete hledat bez ohledu na to, jestli používáte MIT nebo AD. Odpovídají výše uvedeným čtyř krokům.

Následující výňatky pocházejí z MIT KDC. Podívejte se na kompletní ukázkové výstupy z MIT i AD na konci tohoto článku v souvisejícím obsahu.

Kontrolní bod 1

Měl by být k dispozici hexadecimální výpis ticketu s Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Indikuje, že SQL Server byl úspěšně ověřen prostřednictvím KDC a obdržel TGT. Pokud ne, problém spočívá výhradně mezi SQL Serverem a KDC, a ne Hadoop.

PolyBase nepodporuje vztahy důvěryhodnosti mezi AD a MIT a musí být nakonfigurované proti stejnému KDC, který je nakonfigurovaný v clusteru Hadoop. V takových prostředích ručně vytvořte účet služby v daném KDC a použijte ho k ověření.

>>> 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.

Kontrolní bod 2

PolyBase se pokusí o přístup k HDFS a selže, protože požadavek neobsahoval potřebný lístek služby.

[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

Kontrolní bod 3

Druhý šestnáctkový výpis ukazuje, že SQL Server úspěšně používá TGT a získá správný servisní lístek pro SPN jmenného uzlu z 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 .

Kontrolní bod 4

Nakonec se vlastnosti cílové cesty souboru zobrazí spolu s potvrzovací zprávou. Vlastnosti souboru potvrzují, že SQL Server ověřuje pomocí Hadoop a ST a poskytuje relaci pro přístup k zabezpečenému prostředku.

Dosažení tohoto bodu potvrdí, že: (i) tři aktéři správně komunikují, (ii) core-site.xml a jaas.conf jsou správné a (iii) váš KDC rozpozná vaše přihlašovací údaje.

[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.

Běžné chyby

Pokud nástroj spustíte a vlastnosti souboru cílové cesty se nevytisknou (Kontrolní bod 4), měla by se v polovině zobrazit výjimka. Zkontrolujte ho a zvažte kontext toho, kde v toku ve čtyřech krocích došlo k jeho výskytu. Zvažte následující běžné problémy, ke kterým může dojít v daném pořadí:

Výjimky a zprávy Příčina
org.apache.hadoop.security.AccessControlException
SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
Soubor core-site.xml nenastavuje vlastnost hadoop.security.authentication na KERBEROS hodnotu.
javax.security.auth.login.LoginException
Client not found in Kerberos database (6) - CLIENT_NOT_FOUND
Instanční objekt správce služby neexistuje v oblasti zadané v core-site.xml.
javax.security.auth.login.LoginException
Checksum failed
Administrační objekt služby existuje, ale chybné heslo.
Native config name: C:\Windows\krb5.ini
Loaded from native config
Tato zpráva udává, že java krb5LoginModule zjistila vlastní konfigurace klienta na vašem počítači. Zkontrolujte vlastní nastavení klienta, protože můžou problém způsobovat.
javax.security.auth.login.LoginException
java.lang.IllegalArgumentException
Illegal principal name <admin_user@CONTOSO.COM>: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to <admin_user@CONTOSO.COM>
Přidejte vlastnost hadoop.security.auth_to_local k core-site.xml s odpovídajícími pravidly pro cluster Hadoop.
java.net.ConnectException
Attempting to access external filesystem at URI: hdfs://10.193.27.230:8020
Call From IAAS16981207/10.107.0.245 to 10.193.27.230:8020 failed on connection exception
Ověření vůči službě KDC je úspěšné, ale přístup k názevovému uzlu Hadoopu se nezdaří. Zkontrolujte IP adresu a port uzlu názvu. Ověřte, že je brána firewall na Hadoopu vypnutá.
java.io.FileNotFoundException
File does not exist: /test/data.csv
Ověření proběhne úspěšně, ale zadané umístění neexistuje. Nejprve zkontrolujte cestu nebo testujte s kořenem / .

Tipy pro odstraňování chyb

MIT KDC

Všechny hlavní názvy služby (SPN) zaregistrované v KDC, včetně správců, můžete zobrazit spuštěním příkazu kadmin.local> (admin účet) >listprincs na serveru KDC nebo libovolném nakonfigurovaném klientovi KDC. Pokud správně nakonfigurujete Protokol Kerberos v clusteru Hadoop, měl by existovat jeden hlavní název služby pro každou službu dostupnou v clusteru (například: nn, dn, rm, yarn, spnegoatd.). Ve výchozím nastavení můžete jejich odpovídající soubory keytab (náhražky hesel) zobrazit pod /etc/security/keytabs. Privátní klíč KDC tyto soubory šifruje.

Pokud chcete ověřit přihlašovací údaje správce v místním KDC, použijte kinit. Můžete například spustit kinit identity@MYREALM.COM. Pokud identita existuje, zobrazí se výzva k zadání hesla.

Protokoly služby KDC jsou ve výchozím nastavení k dispozici /var/log/krb5kdc.log. Protokoly zahrnují všechny požadavky na lístky, včetně IP adresy klienta, která požadavek provedla. Z IP adresy počítače s SQL Serverem, kde jste spustili nástroj, by měly být dva požadavky: nejprve pro TGT z ověřovacího serveru jako AS_REQ, následované požadavkem pro ST ze serveru udělujícího lístky.

[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**

služba Active Directory

Ve službě Active Directory můžete hlavní názvy služeb zobrazit tak, že přejdete do Ovládací panely>Uživatelé a počítače služby Active Directory, poté přejdete na <MyRealm> a vyberete <MyOrganizationalUnit>. Pokud správně nakonfigurujete Kerberos v clusteru Hadoop, je v clusteru k dispozici jeden jednotný název služby (například: nn, dn, rm, yarn, spnego, a tak dále).

Obecné tipy pro odlaďování

Je užitečné mít zkušenosti s javou, abyste se podívali na protokoly a ladili problémy s Kerberos, které jsou nezávislé na funkci PolyBase SQL Serveru.

Pokud stále máte problémy s přístupem k Kerberos, postupujte podle těchto kroků k ladění:

  1. Ujistěte se, že máte přístup k datům HDFS protokolu Kerberos mimo SQL Server. Máte tyto možnosti:

    • Napište vlastní program Java nebo použijte HdfsBridge třídu z instalační složky PolyBase. Například:

      -classpath ".\Hadoop\conf;.\Hadoop\*;.\Hadoop\HDP2_2\*" com.microsoft.polybase.client.HdfsBridge 10.193.27.232 8020 admin_user C:\temp\kerberos_pass.txt
      

    V předchozím příkladu admin_user zahrnuje pouze uživatelské jméno – nikoli žádnou část domény.

  2. Pokud nemáte přístup k datům Kerberos HDFS mimo PolyBase:

    • Existují dva typy ověřování Kerberos: ověřování Kerberos v Active Directory a ověřování MIT Kerberos.

    • Ujistěte se, že uživatel existuje v účtu domény, a při pokusu o přístup k HDFS použijte stejný uživatelský účet.

  3. V případě protokolu Kerberos služby Active Directory se ujistěte, že pomocí příkazu klist ve Windows vidíte lístek uložený v mezipaměti.

    Připojte se k počítači PolyBase a spusťte klist a klist tgt na příkazovém řádku zkontrolujte, jestli jsou správné typy KDC, uživatelského jména a šifrování.

  4. Pokud služba KDC podporuje jenom AES-256, ujistěte se, že jsou nainstalované soubory zásad JCE .