Memecahkan masalah konektivitas PolyBase Kerberos

Berlaku untuk: SQL Server (khusus Windows) Not supported. Azure SQL DatabaseNot supported.Azure Synapse Analytics Analytics Not supported. Platform System (PDW)

Anda dapat menggunakan diagnostik interaktif yang telah dibangun ke dalam PolyBase untuk membantu memecahkan masalah autentikasi, saat menggunakan PolyBase terhadap kluster Hadoop yang diamankan Kerberos.

Artikel ini berfungsi sebagai panduan untuk menelusuri proses penelusuran kesalahan masalah tersebut dengan memanfaatkan diagnostik bawaan ini.

Tip

Alih-alih mengikuti langkah-langkah dalam panduan ini, Anda dapat memilih untuk menjalankan HDFS Kerberos Tester untuk memecahkan masalah koneksi HDFS Kerberos untuk PolyBase, ketika Anda mengalami kegagalan HDFS Kerberos saat membuat tabel eksternal di kluster HDFS aman Kerberos. Alat ini akan membantu mengatasi masalah non-SQL Server, untuk membantu Anda berkonsentrasi dalam menyelesaikan masalah penyiapan HDFS Kerberos, yaitu mengidentifikasi masalah dengan kesalahan konfigurasi nama pengguna/kata sandi, dan kesalahan konfigurasi penyiapan Kluster Kerberos.
Alat ini sepenuhnya independen dari SQL Server. Ini tersedia sebagai Jupyter Notebook dan memerlukan Azure Data Studio.

Prasyarat

  1. SQL Server 2016 (13.x) RTM CU6 / SQL Server 2016 (13.x) SP1 CU3 / SQL Server 2017 (14.x) atau lebih tinggi dengan PolyBase diinstal
  2. Kluster Hadoop (Cloudera atau Hortonworks) diamankan dengan Kerberos (Direktori Aktif atau MIT)

Pendahuluan

Ini membantu untuk terlebih dahulu memahami protokol Kerberos pada tingkat tinggi. Ada tiga aktor yang terlibat:

  1. Klien Kerberos (SQL Server)
  2. Sumber daya aman (HDFS, MR2, YARN, Riwayat Pekerjaan, dll.)
  3. Pusat distribusi utama (disebut sebagai pengendali domain di Direktori Aktif)

Setiap sumber daya aman Hadoop terdaftar di Key Distribution Center (KDC) dengan Nama Prinsipal Layanan (SPN) yang unik ketika Kerberos dikonfigurasi pada kluster Hadoop. Tujuannya adalah agar klien mendapatkan tiket pengguna sementara, yang disebut Tiket Pemberian Tiket (TGT), untuk meminta tiket sementara lainnya, yang disebut Tiket Layanan (ST), dari KDC terhadap SPN tertentu yang ingin diaksesnya.

Di PolyBase, ketika autentikasi diminta terhadap sumber daya yang diamankan Kerberos, jabat tangan empat kali perjalanan berikut terjadi:

  1. SQL Server terhubung ke KDC dan mendapatkan TGT untuk pengguna. TGT dienkripsi menggunakan kunci privat KDC.
  2. SQL Server memanggil sumber daya aman Hadoop, HDFS, dan menentukan SPN mana yang dibutuhkan ST.
  3. SQL Server kembali ke KDC, meneruskan TGT kembali, dan meminta ST untuk mengakses sumber daya aman tertentu. ST dienkripsi menggunakan kunci privat layanan aman.
  4. SQL Server meneruskan ST ke Hadoop dan diautentikasi agar sesi dibuat terhadap layanan tersebut.

Polybase SQL Server

Masalah dengan autentikasi termasuk dalam satu atau beberapa langkah di atas. Untuk membantu penelusuran kesalahan yang lebih cepat, PolyBase telah memperkenalkan alat diagnostik terintegrasi untuk membantu mengidentifikasi titik kegagalan.

Pemecahan Masalah

PolyBase memiliki file XML konfigurasi berikut yang berisi properti kluster Hadoop:

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

File-file ini terletak di bawah:

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

Misalnya, default untuk SQL Server 2016 (13.x) adalah C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\PolyBase\Hadoop\conf.

Perbarui core-site.xml, tambahkan tiga properti di bawah ini. Atur nilai sesuai dengan lingkungan:

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

Catatan

Nilai untuk polybase.kerberos.realm properti harus semua huruf besar.

XML lainnya nantinya perlu diperbarui juga jika operasi pushdown diinginkan, tetapi hanya dengan file ini yang dikonfigurasi, sistem file HDFS setidaknya harus dapat diakses.

Alat ini berjalan secara independen dari SQL Server, sehingga tidak perlu berjalan, juga tidak perlu dimulai ulang jika pembaruan dilakukan pada XML konfigurasi. Untuk menjalankan alat, jalankan perintah berikut pada host dengan SQL Server terinstal:

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

Catatan

Dimulai dengan SQL Server 2019, ketika Anda menginstal fitur PolyBase, Anda dapat mereferensikan Java Runtime Environment yang ada, atau menginstal AZUL-OpenJDK-JRE. Jika AZUL-OpenJDK-JRE dipilih, java.exe tidak akan menjadi bagian dari variabel lingkungan $PATH dan Anda mungkin mengalami kesalahan "'java' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dioperasikan, atau file batch." Jika ini terjadi, Anda harus menambahkan jalur ke java.exe ke sesi $PATH variabel lingkungan. Jalur penginstalan default dari java executable adalah C:\Program Files\Microsoft SQL Server\MSSQL15. {instance name}\AZUL-OpenJDK-JRE\bin. Jika itu adalah jalurnya, maka Anda harus menjalankan yang berikut ini sebelum menjalankan perintah java untuk menjalankan perintah alat Pemecahan Masalah Koneksi ivitas Kerberos.

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

Argumen

Argumen Deskripsi
Alamat Node Nama IP atau FQDN dari node nama. Mengacu pada argumen "LOCATION" di CREATE EXTERNAL DATA SOURCE T-SQL Anda. Catatan: Alat versi SQL Server 2019 memerlukan hdfs:// untuk mendahului IP atau FQDN.
Port Node Nama Port node nama. Mengacu pada argumen "LOCATION" di CREATE EXTERNAL DATA SOURCE T-SQL Anda. Misalnya, 8020.
Perwakilan Layanan Perwakilan layanan admin ke KDC Anda. Cocok dengan argumen "IDENTITY" di T-SQL Anda CREATE DATABASE SCOPED CREDENTIAL .
Kata Sandi Layanan Alih-alih mengetik kata sandi Anda di konsol, simpan dalam file dan lewati jalur file di sini. Konten file harus cocok dengan apa yang Anda gunakan sebagai argumen "SECRET" di T-SQL Anda CREATE DATABASE SCOPED CREDENTIAL .
Jalur file HDFS jarak jauh (opsional) Jalur file yang ada untuk diakses. Jika tidak ditentukan, akar "/" akan digunakan.

Contoh

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

Outputnya adalah verbose untuk penelusuran kesalahan yang ditingkatkan, tetapi hanya ada empat titik pemeriksaan utama yang harus dicari terlepas dari apakah Anda menggunakan MIT atau AD. Mereka sesuai dengan empat langkah yang diuraikan di atas.

Kutipan berikut berasal dari MIT KDC. Anda dapat merujuk ke output sampel lengkap dari MIT dan AD di akhir artikel ini di Referensi.

Titik pemeriksaan 1

Harus ada cadangan hex tiket dengan Server Principal = krbtgt/MYREALM.COM@MYREALM.COM. Ini menunjukkan bahwa SQL Server berhasil diautentikasi terhadap KDC dan menerima TGT. Jika tidak, masalahnya terletak secara ketat antara SQL Server dan KDC, dan bukan Hadoop.

PolyBase tidak mendukung hubungan kepercayaan antara AD dan MIT dan harus dikonfigurasi terhadap KDC yang sama seperti yang dikonfigurasi di kluster Hadoop. Di lingkungan seperti itu, membuat akun layanan secara manual pada KDC tersebut dan menggunakannya untuk melakukan autentikasi akan berfungsi.

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

Titik pemeriksaan 2

PolyBase akan mencoba mengakses HDFS dan gagal karena permintaan tidak berisi Tiket Layanan yang diperlukan.

 [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 

Titik pemeriksaan 3

Cadangan hex kedua menunjukkan bahwa SQL Server berhasil menggunakan TGT dan memperoleh Tiket Layanan yang berlaku untuk SPN simpul nama dari 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 . 

Titik pemeriksaan 4

Terakhir, properti file dari jalur target harus dicetak bersama dengan pesan konfirmasi. Properti file mengonfirmasi bahwa SQL Server diautentikasi oleh Hadoop menggunakan ST dan sesi diberikan untuk mengakses sumber daya aman.

Mencapai titik ini menegaskan bahwa: (i) ketiga pelaku dapat berkomunikasi dengan benar, (ii) core-site.xml dan jaas.conf benar, dan (iii) KDC Anda mengenali kredensial Anda.

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

Kesalahan umum

Jika alat dijalankan dan properti file jalur target tidak dicetak (Titik pemeriksaan 4), harus ada pengecualian yang dilemparkan di tengah jalan. Tinjau dan pertimbangkan konteks di mana dalam alur empat langkah itu terjadi. Pertimbangkan masalah umum berikut yang mungkin telah terjadi, secara berurutan:

Pengecualian dan pesan Penyebab
org.apache.hadoop.security.AccessControlException
Autentikasi SIMPLE tidak diaktifkan. Tersedia:[TOKEN, KERBEROS]
core-site.xml tidak memiliki properti hadoop.security.authentication yang diatur ke "KERBEROS".
javax.security.auth.login.LoginException
Klien tidak ditemukan di database Kerberos (6) - CLIENT_NOT_FOUND
Perwakilan Layanan admin yang disediakan tidak ada di ranah yang ditentukan dalam core-site.xml.
javax.security.auth.login.LoginException
Checksum gagal
Perwakilan Layanan Admin ada, tetapi kata sandi buruk.
Nama konfigurasi asli: C:\Windows\krb5.ini
Dimuat dari konfigurasi asli
Pesan ini menunjukkan bahwa krb5LoginModule Java mendeteksi konfigurasi klien kustom di komputer Anda. Periksa pengaturan klien kustom Anda karena mungkin menyebabkan masalah.
javax.security.auth.login.LoginException
java.lang.IllegalArgumentException
Nama admin_user@CONTOSO.COMutama ilegal : org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: Tidak ada aturan yang diterapkan pada admin_user@CONTOSO.COM
Tambahkan properti "hadoop.security.auth_to_local" ke core-site.xml dengan aturan yang sesuai per kluster Hadoop.
java.net. Koneksi Exception
Mencoba mengakses sistem file eksternal di URI: hdfs://10.193.27.230:8020
Panggilan Dari IAAS16981207/10.107.0.245 ke 10.193.27.230:8020 gagal pada pengecualian koneksi
Autentikasi terhadap KDC berhasil, tetapi gagal mengakses simpul nama Hadoop. Periksa IP dan port node nama. Verifikasi bahwa firewall dinonaktifkan pada Hadoop.
java.io.FileNotFoundException
File tidak ada: /test/data.csv
Autentikasi berhasil, tetapi lokasi yang ditentukan tidak ada. Periksa jalur atau uji dengan akar "/" terlebih dahulu.

Tips men-debug

MIT KDC

Semua SPN yang terdaftar di KDC, termasuk admin, dapat dilihat dengan menjalankan listprinc kadmin.local> (login admin)> pada host KDC atau klien KDC yang dikonfigurasi. Jika Kerberos dikonfigurasi dengan benar pada kluster Hadoop, harus ada satu SPN untuk setiap layanan yang tersedia di kluster (misalnya: nn, , rmdn, yarn, spnego, dll.) File keytab yang sesuai (pengganti kata sandi) dapat dilihat di bawah /etc/security/keytabs, secara default. Mereka dienkripsi menggunakan kunci privat KDC.

Pertimbangkan juga untuk menggunakan kinit untuk memverifikasi kredensial admin pada KDC secara lokal. Contoh penggunaannya adalah: kinit identity@MYREALM.COM. Permintaan kata sandi menunjukkan adanya identitas.
Log KDC tersedia di /var/log/krb5kdc.log, secara default, yang mencakup semua permintaan tiket termasuk IP klien yang membuat permintaan. Harus ada dua permintaan dari IP komputer SQL Server tempat alat dijalankan: pertama untuk TGT dari Server Autentikasi sebagai AS_REQ, diikuti oleh TGS_REQ untuk ST dari Server Pemberian Tiket.

 [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

Di Direktori Aktif, SPN dapat dilihat dengan menelusuri Panel Kontrol > Pengguna Direktori Aktif dan Komputer >MyRealm>MyOrganizationalUnit. Jika Kerberos dikonfigurasi dengan benar pada kluster Hadoop, ada satu SPN untuk setiap layanan yang tersedia (misalnya: nn, , dnrm, yarn, , spnegodll.)

Tips penelusuran kesalahan umum

Sangat membantu untuk memiliki beberapa pengalaman java untuk melihat ke dalam log dan men-debug masalah Kerberos, yang independen dari fitur SQL Server PolyBase.

Jika Anda masih mengalami masalah saat mengakses Kerberos, ikuti langkah-langkah di bawah ini untuk men-debug:

  1. Pastikan Anda dapat mengakses data HDFS Kerberos dari luar SQL Server. Anda dapat:

    • Menulis program java Anda sendiri atau

    • Gunakan HdfsBridge kelas dari folder penginstalan PolyBase. Misalnya:

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

    Dalam contoh di atas, admin_user hanya menyertakan nama pengguna - bukan bagian domain apa pun.

  2. Jika Anda tidak dapat mengakses data HdFS Kerberos dari luar PolyBase:

    • Ada dua jenis autentikasi Kerberos: Autentikasi Kerberos direktori aktif, dan autentikasi MIT Kerberos.
    • Pastikan pengguna ada di akun domain dan gunakan akun pengguna yang sama saat mencoba mengakses HDFS.
  3. Untuk direktori aktif Kerberos, pastikan Anda dapat melihat tiket cache menggunakan klist perintah di Windows.

    • Masuk ke mesin PolyBase dan jalankan klist dan klist tgt di perintah untuk melihat apakah jenis KDC, nama pengguna, dan enkripsi sudah benar.
  4. Jika KDC hanya dapat mendukung AES256, pastikan file kebijakan JCE diinstal.

Baca juga

Mengintegrasikan PolyBase dengan Cloudera menggunakan Autentikasi Direktori Aktif
Panduan Cloudera untuk menyiapkan Kerberos untuk CDH
Panduan Hortonworks untuk Menyiapkan Kerberos untuk HDP
Pemecahan masalah PolyBase
Kesalahan PolyBase dan kemungkinan solusi