Aracılığıyla paylaş


PolyBase Kerberos bağlantısı sorunlarını giderme

Şunlar için geçerlidir: Windows'da SQL Server 2016 (13.x) ve sonraki sürümleri

PolyBase'i Kerberos güvenlikli hadoop kümesiyle kullanırken karşılaşılan kimlik doğrulama sorunlarını gidermek için PolyBase'de yerleşik olarak bulunan etkileşimli tanılamayı kullanın.

Bu makale, bu yerleşik tanılamaları kullanarak bu tür sorunların hata ayıklama işleminde yol gösteren bir kılavuz görevi görür.

Tavsiye

Bu kılavuzdaki adımları takip etmek yerine, Kerberos güvenli HDFS kümesinde dış tablo oluştururken HDFS Kerberos hatasıyla karşılaştığınızda PolyBase için HDFS Kerberos bağlantılarında sorun gidermek üzere HDFS Kerberos Sınayıcısı'nı çalıştırmayı seçebilirsiniz.

Bu araç, HDFS Kerberos kurulum sorunlarını çözmeye, kullanıcı adı/parola yanlış yapılandırmalarıyla ve küme Kerberos kurulumu yanlış yapılandırmalarıyla ilgili sorunları belirlemeye odaklanmanıza yardımcı olmak için SQL Server dışı sorunları elemeye yardımcı olur.

Bu araç SQL Server'dan bağımsızdır. Jupyter Notebook olarak kullanılabilir ve Azure Data Studio gerektirir.

Önkoşullar

  1. POLYBase yüklü SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) veya üzeri

  2. Kerberos (Active Directory veya MIT) ile güvenliği sağlanan hadoop kümesi (Cloudera veya Hortonworks)

Giriş

Öncelikle Kerberos protokollerini üst düzeyde anlamanıza yardımcı olur. Üç aktör dahil edilir:

  1. Kerberos istemcisi (SQL Server)
  2. Güvenli kaynak (HDFS, MR2, YARN, İş Geçmişi vb.)
  3. Anahtar dağıtım merkezi (Active Directory'de etki alanı denetleyicisi olarak adlandırılır)

Hadoop kümesinde Kerberos yapılandırdığınızda, her Hadoop güvenli kaynağını Anahtar Dağıtım Merkezi'ne (KDC) benzersiz bir Hizmet Asıl Adı (SPN) ile kaydedersiniz. İstemcinin erişmek istediği SPN için KDC'den Hizmet Bileti (ST) adlı başka bir geçici bilet isteyebilmesi için Bilet Verme Bileti (TGT) adlı geçici bir kullanıcı bileti alması gerekir.

PolyBase'de, Kerberos ile güvenli herhangi bir kaynağa karşı kimlik doğrulaması istediğinizde aşağıdaki dört gidiş dönüşlü el sıkışma gerçekleşir:

  1. SQL Server KDC'ye bağlanır ve kullanıcı için bir TGT alır. KDC özel anahtarı TGT'yi şifreler.

  2. SQL Server Hadoop güvenli kaynağı olan HDFS'yi çağırır ve ST'ye ihtiyaç duyduğu SPN'yi belirler.

  3. SQL Server KDC'ye geri döner, TGT'yi geri geçirir ve belirli bir güvenli kaynağa erişmek için st isteğinde bulunur. Güvenli hizmetin özel anahtarı ST'yi şifreler.

  4. SQL Server ST'yi Hadoop'a iletir ve bu hizmette bir oturum oluşturulması için kimlik doğrulaması yapılır.

SQL Server'da PolyBase diyagramı.

Kimlik doğrulamasıyla ilgili sorunlar önceki adımlardan birine veya daha fazlasına girer. Daha hızlı hata ayıklamaya yardımcı olmak için PolyBase, hata noktasını belirlemeye yardımcı olan tümleşik bir tanılama aracı sağlar.

Sorun giderme

PolyBase, Hadoop kümesinin özelliklerini depolamak için aşağıdaki yapılandırma XML dosyalarını kullanır:

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

Bu dosyaları aşağıdaki yolda bulabilirsiniz:

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

Örneğin, SQL Server 2016 (13.x) için varsayılan yol şeklindedir C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.

Bu özellikleri düzenleyin core-site.xml ve ekleyin. Değerleri ortamınıza göre ayarlayın:

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

Uyarı

Özelliğin polybase.kerberos.realm değerinin tamamı büyük harf olmalıdır.

Gönderme işlemlerini etkinleştirmek istiyorsanız diğer XML dosyalarını güncelleştirmeniz gerekir. HDFS dosya sistemine yalnızca bu dosya yapılandırılmış olarak erişebilirsiniz.

Araç SQL Server'da bağımsız olarak çalıştığından çalışması gerekmez. Yapılandırma XML dosyalarını güncelleştirirseniz yeniden başlatmanız gerekmez. Aracı çalıştırmak için SQL Server'ın yüklü olduğu konakta aşağıdaki komutları yürütebilirsiniz:

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) ve sonraki sürümlerinde PolyBase özelliğini yüklediğinizde, var olan bir Java Çalışma Zamanı Ortamına başvurabilir veya AZUL-OpenJDK-JRE yükleyebilirsiniz. AZUL-OpenJDK-JRE'yi seçerseniz ortam java.exe değişkeninin $PATH bir parçası değildir ve hatayla karşılaşabilirsiniz

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

Bu hata oluşursa, oturum java.exe ortam değişkenine $PATH yolunu eklemeniz gerekir. Java yürütülebilir dosyasının varsayılan yükleme yolu şeklindedir C:\Program Files\Microsoft SQL Server\MSSQL15.<instance name>\AZUL-OpenJDK-JRE\bin. Yol buysa, Kerberos Bağlantı Sorunlarını Giderme aracını çalıştırmak için komutunu yürütmeden java önce aşağıdaki komutu yürütmeniz gerekir.

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

Arguments

Argument Description
İsim Düğümü Adresi Ad düğümünün IP adresi veya FQDN'si. Transact-SQL'inizdeki CREATE EXTERNAL DATA SOURCE "LOCATION" bağımsız değişkenine başvurur. Not: Aracın SQL Server 2019 sürümünde, IP veya FQDN'nin önünde hdfs:// gelmesi gerekir.
İsim Düğümü Bağlantı Noktası Ad düğümünün bağlantı noktası. T-SQL içindeki CREATE EXTERNAL DATA SOURCE ifadenizde "LOCATION" argümanına başvurur. Örneğin, 8020.
Hizmet Sorumlusu KDC'nizin yönetici hizmet sorumlusu. T-SQL'inizdeki CREATE DATABASE SCOPED CREDENTIAL "IDENTITY" bağımsız değişkeniyle eşleşir.
Hizmet Parolası Parolanızı konsola yazmak yerine bir dosyada depolayın ve dosya yolunu buraya geçirin. Dosyanın içeriği, T-SQL'inizde CREATE DATABASE SCOPED CREDENTIAL "SECRET" bağımsız değişkeni olarak kullandığınız değerle eşleşmelidir.
Uzak HDFS dosya yolu (isteğe bağlı) Erişilecek mevcut dosyanın yolu. Belirtilmezse, kök klasör (/) kullanılır.

Örnekler

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

Gelişmiş hata ayıklama için çıkış ayrıntılıdır, ancak MIT veya AD kullanıp kullanmadığınıza bakılmaksızın aranacak yalnızca dört ana denetim noktası vardır. Bunlar daha önce açıklanan dört adıma karşılık gelir.

Aşağıdaki alıntılar bir MIT KDC'sinden alınıyor. İlgili içerikte bu makalenin sonunda hem MIT hem de AD'den alınan tam örnek çıkışlara bakın.

Denetim Noktası 1

Bir biletin Server Principal = krbtgt/MYREALM.COM@MYREALM.COM onaltılık dökümü olmalı. SQL Server'ın KDC'de başarıyla kimlik doğrulamasından geçirildiğini ve bir TGT aldığını gösterir. Aksi takdirde, sorun Kesinlikle SQL Server ile KDC arasında yatıyor, Hadoop değil.

PolyBase, AD ve MIT arasındaki güven ilişkilerini desteklemez ve Hadoop kümesinde yapılandırılan aynı KDC'ye göre yapılandırılmalıdır. Bu tür ortamlarda, söz konusu KDC üzerinde el ile bir hizmet hesabı oluşturun ve kimlik doğrulaması gerçekleştirmek için bu hesabı kullanın.

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

Denetim Noktası 2

PolyBase, HDFS'ye erişme girişiminde bulunur ve istek gerekli Hizmet Biletini içermediğinden başarısız olur.

[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

Denetim Noktası 3

İkinci onaltılık döküm, SQL Server'ın TGT'yi başarıyla kullandığını ve KDC'den ad düğümüne ait SPN'nin doğru hizmet biletini aldığını gösterir.

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

Denetim Noktası 4

Son olarak, hedef yolun dosya özellikleri bir onay iletisiyle birlikte yazdırılır. Dosya özellikleri, SQL Server'ın HADOop tarafından ST kullanarak kimlik doğrulaması yaptığını onaylar ve güvenli kaynağa erişmek için bir oturum verir.

Bu noktaya ulaşmak şunu doğrular: (i) üç aktör doğru iletişim kurar, (ii) core-site.xml ve jaas.conf doğrudur ve (iii) KDC'niz kimlik bilgilerinizi tanır.

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

Yaygın hatalar

Aracı çalıştırırsanız ve hedef yolun dosya özellikleri görüntülenmezse (Checkpoint 4), bir istisna fırlatılmalıdır. Gözden geçirin ve dört adımlı akışın nerede oluştuğunun bağlamını göz önünde bulundurun. Aşağıdaki yaygın sorunları sırayla göz önünde bulundurun:

Özel durum ve iletiler Nedeni
org.apache.hadoop.security.AccessControlException
SIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS]
core-site.xml dosyası hadoop.security.authentication özelliğini KERBEROS olarak ayarlamıyor.
javax.security.auth.login.LoginException
Client not found in Kerberos database (6) - CLIENT_NOT_FOUND
Yönetici Hizmet Sorumlusu, içinde core-site.xmlbelirtilen bölgede yok.
javax.security.auth.login.LoginException
Checksum failed
Yönetici Hizmet Sorumlusu var, ancak parola hatalı.
Native config name: C:\Windows\krb5.ini
Loaded from native config
Bu ileti Java'nın krb5LoginModule uygulamasının makinenizde özel istemci yapılandırmaları algıladığını gösterir. Soruna neden olabilecek özel istemci ayarlarınızı denetleyin.
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>
hadoop.security.auth_to_local'e Hadoop kümesine uygun kurallarla core-site.xml özelliğini ekleyin.
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
KDC'ye karşı kimlik doğrulaması başarılı olur, ancak Hadoop ad düğümüne erişemiyor. Ad düğümü IP'sini ve bağlantı noktasını denetleyin. Hadoop'ta güvenlik duvarının devre dışı olduğunu doğrulayın.
java.io.FileNotFoundException
File does not exist: /test/data.csv
Kimlik doğrulaması başarılı olur, ancak belirtilen konum yok. Yolu kontrol edin veya önce root ile / test edin.

Hata ayıklama ipuçları

MIT KDC

KDC ana bilgisayarında veya yapılandırılmış herhangi bir KDC istemcisinde kadmin.local> (yönetici hesabı) >liste ayrıcalıklarını çalıştırarak, yöneticiler de dahil olmak üzere KDC'ye kayıtlı tüm SPN'leri görüntüleyebilirsiniz. Hadoop kümesinde Kerberos'ı düzgün yapılandırdıysanız, kümede kullanılabilen her hizmet için bir SPN olmalıdır (örneğin: nn, dn, rm, yarn, , spnegovb.). Varsayılan olarak altında ilgili tuş sekme dosyalarını (parola yerine) /etc/security/keytabs görebilirsiniz. KDC özel anahtarı bu dosyaları şifreler.

KDC'de yönetici kimlik bilgilerini yerel olarak doğrulamak için kullanın kinit. Örneğin, komutunu çalıştırabilirsiniz kinit identity@MYREALM.COM. Kimlik mevcutsa bir parola girmeniz istenir.

KDC günlükleri varsayılan olarak /var/log/krb5kdc.log içinde kullanılabilir. Günlükler, isteği yapan istemci IP'si de dahil olmak üzere bilet isteklerinin tümünü içerir. SQL Server sunucusunun IP'sinden aracı çalıştırdığınızda iki istek olmalıdır: önce TGT almak için Kimlik Doğrulama Sunucusu'ndan bir AS_REQ olarak ve ardından Anahtar Verme Sunucusu'ndan ST almak için bir 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'de, Denetim Masası>Active Directory Kullanıcıları ve Bilgisayarları'na<MyRealm> gidip öğesini seçerek <MyOrganizationalUnit>SPN'leri görüntüleyebilirsiniz. Hadoop kümesinde Kerberos'ı düzgün yapılandırdıysanız, kümede kullanılabilen her hizmet için bir SPN vardır (örneğin: nn, dn, rm, yarnvb spnego.).

Genel hata ayıklama ipuçları

Sql Server PolyBase özelliğinden bağımsız olarak günlükleri incelemek ve Kerberos sorunlarının hatalarını ayıklamak için biraz Java deneyimine sahip olmak yararlı olur.

Kerberos'a erişme konusunda sorun yaşamaya devam ediyorsanız hata ayıklamak için şu adımları izleyin:

  1. Kerberos HDFS verilerine SQL Server dışından erişebildiğinizden emin olun. Şunlardan birini yapabilirsiniz:

    • Kendi Java programınızı yazın veya PolyBase yükleme klasöründen sınıfını kullanın HdfsBridge . Örneğin:

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

    Önceki örnekte, admin_user herhangi bir etki alanı bölümü değil, yalnızca kullanıcı adını içerir.

  2. PolyBase dışından Kerberos HDFS verilerine erişemiyorsanız:

    • İki tür Kerberos kimlik doğrulaması vardır: Active Directory Kerberos kimlik doğrulaması ve MIT Kerberos kimlik doğrulaması.

    • Kullanıcının etki alanı hesabında var olduğundan emin olun ve HDFS'ye erişmeye çalışırken aynı kullanıcı hesabını kullanın.

  3. Active Directory Kerberos için, Windows'ta klist komutunu kullanarak önbelleğe alınmış bileti görebildiğinizden emin olun.

    PolyBase makinesine bağlanın ve komut isteminde klist ve klist tgt komutlarını çalıştırarak KDC, kullanıcı adı ve şifreleme türlerinin doğru olup olmadığını kontrol edin.

  4. KDC yalnızca AES-256'yı destekleyebilirse JCE ilke dosyalarının yüklü olduğundan emin olun.