PolyBase Kerberos 연결 문제 해결

적용 대상: SQL Server(Windows에만 해당) Not supported. Azure SQL Database Not supported. Azure Synapse Analytics Not supported. Analytics Platform System(PDW)

PolyBase에 기본 제공된 대화형 진단 사용하여 Kerberos 보안 Hadoop 클러스터에 대해 PolyBase를 사용하는 경우 인증 문제를 해결할 수 있습니다.

이 문서는 기본 제공 진단을 활용하여 이러한 문제의 디버깅 프로세스를 살펴보기 위한 가이드입니다.

이 가이드의 단계를 수행하는 대신, Kerberos 보안 HDFS 클러스터에 외부 테이블을 만드는 중 HDFS Kerberos 오류가 발생할 경우 PolyBase에 대한 HDFS Kerberos 연결 문제를 해결하기 위해 HDFS Kerberos 테스터를 실행하도록 선택할 수 있습니다. . 이 도구는 비 SQL Server 문제를 배제하여 HDFS Kerberos 설정 문제 해결, 즉 사용자 이름/암호 잘못된 구성 문제 식별 및 클러스터 Kerberos 설치 잘못된 구성을 해결하는 데 도움이 됩니다.
이 도구는 SQL Server와 완전히 독립적입니다. Jupyter Notebook으로 사용할 수 있으며 Azure Data Studio가 필요합니다.

필수 조건

  1. PolyBase가 설치된 SQL Server 2016(13.x) RTM CU6 / SQL Server 2016(13.x) SP1 CU3/ SQL Server 2017(14.x) 이상
  2. Kerberos(Active Directory 또는 MIT)로 보호되는 Hadoop 클러스터(Cloudera 또는 Hortonworks)

소개

먼저 높은 수준에서 Kerberos 프로토콜을 이해하는 데 도움이 됩니다. 관련된 세 가지 행위자가 있습니다.

  1. Kerberos 클라이언트(SQL Server)
  2. 보안 리소스(HDFS, MR2, YARN, 작업 기록 등)
  3. 키 배포 센터(Active Directory에서는 도메인 컨트롤러라고 함)

Kerberos가 Hadoop 클러스터에 구성된 경우 각 Hadoop 보안 리소스는 고유한 SPN(서비스 사용자 이름)을 사용하여 KDC(키 배포 센터)에 등록됩니다. 목표는 클라이언트가 액세스하려는 특정 SPN에 대해 KDC에서 ST(서비스 티켓)라는 다른 임시 티켓을 요청하기 위해 TGT(티켓 부여 티켓)라는 임시 사용자 티켓을 얻는 것입니다.

PolyBase에서 Kerberos 보안 리소스에 대해 인증이 요청되면 다음 4라운드 핸드셰이크가 수행됩니다.

  1. SQL Server는 KDC에 연결하고 사용자에 대한 TGT를 가져옵니다. TGT는 KDC 프라이빗 키를 사용하여 암호화됩니다.
  2. SQL Server는 Hadoop 보안 리소스인 HDFS를 호출하고 ST가 필요한 SPN을 결정합니다.
  3. SQL Server는 KDC로 돌아가서 TGT를 다시 전달하고 ST에 특정 보안 리소스에 액세스하도록 요청합니다. ST는 보안 서비스의 프라이빗 키를 사용하여 암호화됩니다.
  4. SQL Server는 ST를 Hadoop에 전달하고 해당 서비스에 대해 세션을 만들도록 인증됩니다.

Polybase SQL Server

인증 관련 문제는 위 4단계 중 하나 이상에 속합니다. 더 빠른 디버깅을 돕기 위해 PolyBase는 실패 지점을 식별하는 데 도움이 되는 통합 진단 도구를 도입했습니다.

문제 해결

PolyBase에는 Hadoop 클러스터의 속성이 포함된 다음과 같은 구성 XML 파일이 있습니다.

  • core-site.xml
  • hdfs-site.xml
  • hive-site.xml
  • jaas.conf
  • mapred-site.xml
  • yarn-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>

참고 항목

속성 값 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부터 PolyBase 기능을 설치할 때 기존 Java 런타임 환경을 참조하거나 AZUL-OpenJDK-JRE를 설치할 수 있습니다. AZUL-OpenJDK-JRE를 선택한 경우 java.exe $PATH 환경 변수의 일부가 아니며 "'java'는 내부 또는 외부 명령, 작동 가능한 프로그램 또는 일괄 처리 파일로 인식되지 않습니다." 오류가 발생할 수 있습니다. 이 경우 세션 $PATH 환경 변수에 java.exe 경로를 추가해야 합니다. Java 실행 파일의 기본 설치 경로는 C:\Program Files\Microsoft SQL Server\MSSQL15. {instance name}\AZUL-OpenJDK-JRE\bin. 경로인 경우 Java 명령을 실행하기 전에 다음을 실행하여 Kerberos 커넥트ivity 문제 해결 도구 명령을 실행해야 합니다.

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

인수

Argument 설명
Name Node Address 이름 노드의 IP 또는 FQDN입니다. CREATE EXTERNAL DATA SOURCE T-SQL의 "LOCATION" 인수를 참조합니다. 참고: SQL Server 2019 버전의 도구에는 IP 또는 FQDN 앞에 hdfs:// 필요합니다.
이름 노드 포트 이름 노드의 포트입니다. CREATE EXTERNAL DATA SOURCE T-SQL의 "LOCATION" 인수를 참조합니다. 예를 들어 8020입니다.
서비스 주체 KDC의 관리 서비스 주체입니다. T-SQL의 "IDENTITY" 인수와 일치합니다 CREATE DATABASE SCOPED CREDENTIAL .
서비스 암호 콘솔에서 암호를 입력하는 대신 파일에 저장하고 여기에 파일 경로를 전달합니다. 파일의 내용이 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진수 덤프가 있어야합니다. KDC에 인증되고 TGT를 받은 SQL Server를 나타냅니다. 그렇지 않은 경우 문제는 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

두 번째 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) 세 행위자가 제대로 통신할 수 있고, (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) 중간에 예외가 throw되어야 합니다. 이를 검토하고 4단계 흐름에서 발생한 위치의 컨텍스트를 고려합니다. 발생할 수 있는 다음과 같은 일반적인 문제를 순서대로 고려합니다.

예외 및 메시지 원인
org.apache.hadoop.security.AccessControlException
SIMPLE 인증을 사용할 수 없습니다. 사용 가능:[토큰, KERBEROS]
core-site.xml hadoop.security.authentication 속성이 "KERBEROS"로 설정되어 있지 않습니다.
javax.security.auth.login.LoginException
Kerberos 데이터베이스에서 클라이언트를 찾을 수 없음 (6) - CLIENT_NOT_FOUND
제공된 관리 서비스 주체가 core-site.xml 지정된 영역에 존재하지 않습니다.
javax.security.auth.login.LoginException
체크섬 실패
관리 서비스 주체가 있지만 잘못된 암호입니다.
네이티브 구성 이름: C:\Windows\krb5.ini
기본 구성에서 로드됨
이 메시지는 Java의 krb5LoginModule이 컴퓨터에서 사용자 지정 클라이언트 구성을 검색했음을 나타냅니다. 사용자 지정 클라이언트 설정이 문제를 일으킬 수 있는지 확인합니다.
javax.security.auth.login.LoginException
java.lang.IllegalArgumentException
잘못된 보안 주체 이름 admin_user@CONTOSO.COM: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: 규칙이 적용되지 않음 admin_user@CONTOSO.COM
Hadoop 클러스터당 적절한 규칙을 사용하여 core-site.xml 속성 "hadoop.security.auth_to_local"을 추가합니다.
java.net.ConnectException
다음 URI의 외부 파일 시스템에 액세스하려는 중: hdfs://10.193.27.230:8020
연결 예외에서 IAAS16981207/10.107.0.245에서 10.193.27.230:8020으로 전화하지 못했습니다.
KDC에 대한 인증에 성공했지만 Hadoop 이름 노드에 액세스하지 못했습니다. 이름 노드 IP 및 포트를 확인합니다. Hadoop에서 방화벽이 비활성화되었는지 확인합니다.
java.io.FileNotFoundException
파일이 없습니다. /test/data.csv
인증에 성공했지만 지정된 위치가 없습니다. 경로를 확인하거나 먼저 루트 “/”를 사용하여 테스트합니다.

디버깅 팁

MIT KDC

관리자를 포함하여 KDC에 등록된 모든 SPN은 KDC 호스트 또는 구성된 KDC 클라이언트에서 kadmin.local>(관리자 로그인) >목록을 실행하여 볼 수 있습니다. Hadoop 클러스터에서 Kerberos가 제대로 구성된 경우 클러스터에서 사용할 수 있는 각 서비스에 대해 하나의 SPN이 있어야 합니다(예: nn,, dnrm, yarnspnego등). 해당 keytab 파일(암호 대체)은 기본적으로 /etc/security/keytabs에서 볼 수 있습니다. KDC 프라이빗 키를 사용하여 암호화됩니다.

kinit를 사용하여 KDC에서 로컬로 관리자 자격 증명을 확인하는 것도 좋습니다. 사용 예는 다음과 kinit identity@MYREALM.COM같습니다. 암호에 대한 프롬프트는 ID가 있음을 나타냅니다.
KDC 로그는 기본적으로 /var/log/krb5kdc.log 사용할 수 있으며, 여기에는 요청을 수행한 클라이언트 IP를 포함하여 티켓에 대한 모든 요청이 포함됩니다. 도구가 실행된 SQL Server 컴퓨터의 IP에서 두 가지 요청이 있어야 합니다. 먼저 인증 서버의 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에서 myRealm MyOrganizationalUnit을 Active Directory 사용자 및 컴퓨터 제어판 >>검색하여 SPN을 볼 수 있습니다.> Hadoop 클러스터에서 Kerberos가 제대로 구성된 경우 사용 가능한 각 서비스(예: nn,, dnrm, yarnspnego등)에 대해 하나의 SPN이 있습니다.

일반 디버깅 팁

SQL Server PolyBase 기능과 무관하게 로그를 살펴보고 Kerberos 문제를 디버그하는 몇 가지 Java 환경을 사용하는 것이 유용합니다.

Kerberos를 액세스하는 문제가 여전히 발생하는 경우 아래 단계를 수행하여 디버그하세요.

  1. 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 예제에서는 사용자 이름만 포함하며 어떤 기본 부분도 포함하지 않습니다.

  2. PolyBase 외부에서 Kerberos HDFS 데이터에 액세스할 수 없는 경우:

    • Kerberos 인증에는 Active Directory Kerberos 인증 및 MIT Kerberos 인증의 두 가지 유형이 있습니다.
    • 사용자가 도메인 계정에 있고 HDFS에 액세스하는 동안 동일한 사용자 계정을 사용하는지 확인합니다.
  3. Active Directory Kerberos의 경우 Windows에서 명령을 사용하여 klist 캐시된 티켓을 볼 수 있는지 확인합니다.

    • PolyBase 컴퓨터에 로그인하고 실행 klistklist tgt 명령 프롬프트에서 KDC, 사용자 이름 및 암호화 유형이 올바른지 확인합니다.
  4. KDC가 AES256만 지원할 수 있는 경우 JCE 정책 파일이 설치되어 있는지 확인합니다.

참고 항목

Integrating PolyBase with Cloudera using Active Directory Authentication(Active Directory 인증을 사용하여 PolyBase와 Cloudera 통합)
Cloudera’s Guide to setting up Kerberos for CDH(CDH의 Kerberos 설정에 대한 Cloudera 가이드)
HDP용 Kerberos 설정에 대한 Hortonworks 가이드
PolyBase 문제 해결
PolyBase 오류 및 가능한 해결 방법