적용 대상: Windows의 SQL Server 2016(13.x) 이상 버전
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에서는 도메인 컨트롤러라고 함)
Hadoop 클러스터에서 Kerberos를 구성하는 경우 각 Hadoop 보안 리소스를 KDC(키 배포 센터)에 고유한 SPN(서비스 사용자 이름)으로 등록합니다. 클라이언트는 액세스하려는 특정 SPN에 대해 KDC에서 ST(서비스 티켓)라는 또 다른 임시 티켓을 요청할 수 있도록 TGT(티켓 부여 티켓)라는 임시 사용자 티켓을 가져와야 합니다.
PolyBase에서 Kerberos 보안 리소스에 대한 인증을 요청할 때 다음 4회 왕복 핸드셰이크가 수행됩니다.
SQL Server는 KDC에 연결하고 사용자에 대한 TGT를 가져옵니다. KDC 프라이빗 키는 TGT를 암호화합니다.
SQL Server가 Hadoop 보안 리소스인 HDFS를 호출하고 ST가 필요한 SPN을 확인합니다.
SQL Server가 KDC로 돌아가고, TGT를 다시 전달하고, ST를 요청하여 해당하는 특정 보안 리소스에 액세스합니다. 보안 서비스의 프라이빗 키는 ST를 암호화합니다.
SQL Server는 ST를 Hadoop에 전달하고 해당 서비스에 대해 세션을 만들도록 인증됩니다.
인증 관련 문제는 이전 단계 중 하나 이상에 해당합니다. 더 빠른 디버깅을 돕기 위해 PolyBase는 실패 지점을 식별하는 데 도움이 되는 통합 진단 도구를 제공합니다.
문제 해결
PolyBase는 다음 구성 XML 파일을 사용하여 Hadoop 클러스터의 속성을 저장합니다.
core-site.xmlhdfs-site.xmlhive-site.xmljaas.confmapred-site.xmlyarn-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(15.x) 이상 버전에서 PolyBase 기능을 설치할 때 기존 Java 런타임 환경을 참조하거나 AZUL-OpenJDK-JRE를 설치할 수 있습니다. AZUL-OpenJDK-JRE java.exe 를 선택하는 경우 환경 변수의 $PATH 일부가 아니고 오류가 발생할 수 있습니다.
'java' isn't recognized as an internal or external command, operable program or batch file.
이 오류가 발생하면 세션 java.exe 환경 변수에 $PATH 경로를 추가해야 합니다. 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입니다. Transact-SQL의 "LOCATION" CREATE EXTERNAL DATA SOURCE 인수를 참조합니다.
참고: 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개뿐입니다. 앞에서 설명한 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.AccessControlExceptionSIMPLE authentication is not enabled. Available:[TOKEN, KERBEROS] |
core-site.xml 파일이 hadoop.security.authentication 속성을 KERBEROS로 설정하지 않습니다. |
javax.security.auth.login.LoginExceptionClient not found in Kerberos database (6) - CLIENT_NOT_FOUND |
관리자 서비스 주체가 에 지정된 core-site.xml영역에 없습니다. |
javax.security.auth.login.LoginExceptionChecksum failed |
관리 서비스 주체가 있지만 잘못된 암호입니다. |
Native config name: C:\Windows\krb5.iniLoaded from native config |
이 메시지는 Java의 krb5LoginModule이 컴퓨터에서 사용자 지정 클라이언트 구성을 감지했음을 나타냅니다. 사용자 지정 클라이언트 설정이 문제를 일으킬 수 있는지 확인합니다. |
javax.security.auth.login.LoginExceptionjava.lang.IllegalArgumentExceptionIllegal principal name <admin_user@CONTOSO.COM>: org.apache.hadoop.security.authentication.util.KerberosName$NoMatchingRule: No rules applied to <admin_user@CONTOSO.COM> |
Hadoop 클러스터의 규칙에 따라 hadoop.security.auth_to_local에 core-site.xml 속성을 추가합니다. |
java.net.ConnectExceptionAttempting to access external filesystem at URI: hdfs://10.193.27.230:8020Call From IAAS16981207/10.107.0.245 to 10.193.27.230:8020 failed on connection exception |
KDC에 대한 인증은 성공하지만 Hadoop 이름 노드에 액세스하지 못합니다. 이름 노드 IP 및 포트를 확인합니다. Hadoop에서 방화벽이 비활성화되었는지 확인합니다. |
java.io.FileNotFoundExceptionFile does not exist: /test/data.csv |
인증에 성공하지만 지정된 위치가 없습니다. 경로를 확인하거나 루트 / 를 사용하여 먼저 테스트합니다. |
디버깅 팁
MIT KDC
KDC 호스트 또는 구성된 KDC 클라이언트에서 kadmin.local> (관리자 계정) >listprincs를 실행하여 KDC에 등록된 모든 SPN을 관리자를 포함하여 볼 수 있습니다. Hadoop 클러스터에서 Kerberos를 올바르게 구성하는 경우 클러스터에서 사용할 수 있는 각 서비스에 대해 하나의 SPN이 있어야 합니다(예: nn, dn, rm, yarnspnego등). 기본적으로 해당 keytab 파일(암호 대체)을 아래에서 /etc/security/keytabs볼 수 있습니다. KDC 프라이빗 키는 이러한 파일을 암호화합니다.
KDC에서 관리자 자격 증명을 로컬로 확인하려면 kinit을(를) 사용하십시오. 예를 들어 실행할 수 있습니다 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에서 제어판>Active Directory 사용자 및 컴퓨터로 이동한 다음, 이동하여 <MyRealm> 선택하여 SPN을 볼 수 있습니다 <MyOrganizationalUnit>. Hadoop 클러스터에서 Kerberos를 올바르게 구성하는 경우 클러스터에서 사용할 수 있는 각 서비스에 대해 하나의 SPN이 있습니다(예: nn, , dnrm, yarnspnego등).
일반 디버깅 팁
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, 사용자 이름 및 암호화 유형이 올바른지 확인합니다.KDC가 AES-256만 지원할 수 있는 경우 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 오류 및 가능한 해결 방법