PolyBase Kerberos 연결 문제 해결
적용 대상: SQL Server(Windows에만 해당) Azure SQL Database Azure Synapse Analytics PDW(Analytics Platform System)
Kerberos 보안 Hadoop 클러스터에 대해 PolyBase를 사용하는 경우 PolyBase에 기본 제공된 대화형 진단을 사용하여 인증 문제를 해결할 수 있습니다.
이 문서는 기본 제공 진단을 활용하여 이러한 문제의 디버깅 프로세스를 살펴보기 위한 가이드입니다.
팁
이 가이드의 단계를 수행하는 대신, Kerberos 보안 HDFS 클러스터에 외부 테이블을 만드는 중 HDFS Kerberos 오류가 발생할 경우 PolyBase에 대한 HDFS Kerberos 연결 문제를 해결하기 위해 HDFS Kerberos 테스터를 실행하도록 선택할 수 있습니다. .
이 도구는 비 SQL Server 문제를 배제하여 HDFS Kerberos 설정 문제 해결, 즉 사용자 이름/암호 잘못된 구성 문제 식별 및 클러스터 Kerberos 설치 잘못된 구성을 해결하는 데 도움이 됩니다.
이 도구는 SQL Server와 완전히 독립적입니다. Jupyter Notebook으로 사용할 수 있으며 Azure Data Studio가 필요합니다.
필수 조건
- PolyBase가 설치된 SQL Server 2016(13.x) RTM CU6 / SQL Server 2016(13.x) SP1 CU3/ SQL Server 2017(14.x) 이상
- Kerberos(Active Directory 또는 MIT)로 보호되는 Hadoop 클러스터(Cloudera 또는 Hortonworks)
소개
먼저 높은 수준에서 Kerberos 프로토콜을 이해하는 데 도움이 됩니다. 관련된 세 가지 행위자가 있습니다.
- Kerberos 클라이언트(SQL Server)
- 보안 리소스(HDFS, MR2, YARN, 작업 기록 등)
- 키 배포 센터(Active Directory에서는 도메인 컨트롤러라고 함)
Kerberos가 Hadoop 클러스터에 구성된 경우 각 Hadoop 보안 리소스는 고유한 SPN(서비스 사용자 이름)을 사용하여 KDC(키 배포 센터)에 등록됩니다. 목표는 클라이언트가 액세스하려는 특정 SPN에 대해 KDC에서 ST(서비스 티켓)라는 다른 임시 티켓을 요청하기 위해 TGT(티켓 부여 티켓)라는 임시 사용자 티켓을 얻는 것입니다.
PolyBase에서 Kerberos 보안 리소스에 대해 인증이 요청되면 다음과 같은 4라운드 핸드셰이크가 수행됩니다.
- SQL Server가 KDC에 연결하고 사용자의 TGT를 가져옵니다. TGT는 KDC의 프라이빗 키를 사용하여 암호화됩니다.
- SQL Server가 Hadoop 보안 리소스인 HDFS를 호출하고 ST가 필요한 SPN을 확인합니다.
- SQL Server가 KDC로 돌아가고, TGT를 다시 전달하고, ST를 요청하여 해당하는 특정 보안 리소스에 액세스합니다. ST는 서비스 보안 서비스의 프라이빗 키를 사용하여 암호화됩니다.
- SQL Server는 ST를 Hadoop에 전달하고 해당 서비스에 대해 세션을 만들도록 인증됩니다.
인증 관련 문제는 위 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 Runtime Environment을 참조하거나 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 입니다. 이 경로가 Kerberos 연결 문제 해결 도구 명령을 실행하기 전에 Java 명령을 실행해야 합니다.
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 버전의 도구를 사용하려면 hdfs://가 IP 또는 FQDN 앞에 와야 합니다. |
이름 노드 포트 | 이름 노드의 포트입니다. CREATE EXTERNAL DATA SOURCE T-SQL의 "LOCATION" 인수를 참조합니다. 예를 들면 8020과 같습니다. |
서비스 주체 | KDC의 관리 서비스 주체입니다. CREATE DATABASE SCOPED CREDENTIAL T-SQL의 "IDENTITY" 인수와 일치합니다. |
서비스 암호 | 콘솔에서 암호를 입력하는 대신 파일에 저장하고 여기에 파일 경로를 전달합니다. 파일의 내용이 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개 단계에 해당합니다.
다음은 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) 중간에 예외가 발생되어야 합니다. 이를 검토하고 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 클러스터별로 적절한 규칙이 포함된 “hadoop.security.auth_to_local” 속성을 core-site.xml에 추가합니다. |
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> (관리자 로그인) >listprincs를 실행하여 확인할 수 있습니다. Hadoop 클러스터에서 Kerberos가 제대로 구성된 경우 클러스터에서 사용할 수 있는 각 서비스(예: nn
, dn
, rm
, yarn
, spnego
등)에 대해 하나의 SPN이 있어야 합니다. 해당 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에서 SPN은 제어판 > Active Directory 사용자 및 컴퓨터>MyRealm>MyOrganizationalUnit으로 이동하여 확인할 수 있습니다. Hadoop 클러스터에서 Kerberos가 제대로 구성된 경우 사용 가능한 각 서비스(예: nn
, dn
, rm
, yarn
, spnego
등)에 대해 하나의 SPN이 있습니다
일반 디버깅 팁
SQL Server PolyBase 기능과 무관하게 로그를 살펴보고 Kerberos 문제를 디버그하는 몇 가지 Java 경험을 사용하는 것이 유용합니다.
Kerberos를 액세스하는 문제가 여전히 발생하는 경우 아래 단계를 수행하여 디버그하세요.
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
은 도메인 부분이 아닌 사용자 이름만 포함합니다.PolyBase 외부에서 Kerberos HDFS 데이터에 액세스할 수 없는 경우:
- Kerberos 인증에는 Active Directory Kerberos 인증 및 MIT Kerberos 인증의 두 가지 유형이 있습니다.
- 사용자가 도메인 계정에 있고 HDFS에 액세스하는 동안 동일한 사용자 계정을 사용하는지 확인합니다.
Active Directory Kerberos의 경우 Windows에서
klist
명령을 사용하여 캐시된 티켓을 볼 수 있는지 확인합니다.- PolyBase 컴퓨터에 로그인하고 명령 프롬프트에서
klist
및klist tgt
를 실행하여 KDC, 사용자 이름 및 암호화 유형이 올바른지 확인합니다.
- PolyBase 컴퓨터에 로그인하고 명령 프롬프트에서
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 오류 및 가능한 해결 방법