적용 대상:SQL Server on Linux
이 문서는 SQL Server on Linux 및 컨테이너에서 Active Directory Domain Services 인증 문제를 해결하는 데 도움이 됩니다. 여기에는 성공적인 Active Directory 구성을 위한 필수 구성 요소 확인 및 팁과 일반적인 오류 및 문제 해결 단계 목록이 포함됩니다.
현재의 구성 유효성 검사
문제 해결을 시작하기 전에 현재 사용자, mssql.conf서비스 주체명(SPN), 그리고 영역 설정을 검증하세요.
Kerberos TGT(승차권 발급 티켓)를 받거나 갱신하려면 다음을 통해
kinit신청할 수 있습니다:kinit privilegeduser@CONTOSO.COM다음 명령을 실행하고, 실행 중인 사용자가 다음 명령
mssql.keytab어에 접근할 수 있는지 확인하세요:/opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab명령
/opt/mssql/bin/mssql-conf validate-ad-config --help어에validate-ad-config대한 자세한 정보는 .
DNS 및 역방향 DNS 조회
도메인 이름 및 NetBIOS 이름에 대한 DNS 조회는 일반적으로 DC(도메인 컨트롤러)의 IP 주소와 일치하는 동일한 IP 주소를 반환해야 합니다. SQL Server 호스트 컴퓨터에서 이러한 명령을 실행합니다.
nslookup contoso nslookup contoso.comIP 주소가 일치하지 않는 경우 Linux 호스트의 SQL Server를 Active Directory 도메인에 추가하여 DNS 조회 및 DC와의 통신 문제를 해결하십시오.
이전 결과의 각 IP 주소에 대해 역DNS(rDNS) 조회를 수행합니다. 해당되는 경우 IPv4 및 IPv6 주소를 포함하세요.
nslookup <IPs returned from the above commands>모두
<hostname>.contoso.com을 반환해야 합니다. 그렇지 않으면 Active Directory의 PTR(포인터) 레코드를 확인하세요.rDNS가 작동하려면 도메인 관리자와 함께 작업해야 할 수 있습니다. 반환된 모든 IP 주소에 대해 PTR 항목을 추가할 수 없다면, SQL Server를 도메인 컨트롤러의 일부 집합으로 제한할 수도 있습니다. 이 변경 내용은
krb5.conf호스트에서 사용하는 다른 모든 서비스에 영향을 줍니다.역방향 DNS에 대한 자세한 내용은 역방향 DNS란?을 참조하세요.
keytab 파일 및 사용 권한 확인
키탭(키 테이블) 파일을 만들었는지, 그리고 적절한 권한과 함께 올바른 파일을 사용하도록 설정
mssql-conf했는지 확인하세요. keytab은mssql사용자 계정에 액세스할 수 있어야 합니다. 자세한 내용은 adutil을 사용하여 Linux에서 SQL Server Active Directory 인증 구성을 참조하세요.keytab의 내용을 나열하고 올바른 SPN, 포트, 암호화 유형 및 사용자 계정을 추가했는지 확인합니다. SPN과 키탭 항목을 생성할 때 비밀번호를 올바르게 입력하지 않으면, Active Directory 인증으로 로그인하려 할 때 오류가 발생합니다.
klist -kte /var/opt/mssql/secrets/mssql.keytab작동하는 keytab의 예는 다음과 같습니다. 이 예제에서는 두 가지 암호화 유형을 사용하지만 사용자 환경에서 지원되는 암호화 유형에 따라 하나 이상의 암호화만 사용할 수 있습니다. 이 예에서
sqluser@CONTOSO.COM는 권한 있는 계정이며(network.privilegedadaccount의mssql-conf설정과 일치함), SQL Server의 호스트 이름은sqllinux.contoso.com이고 기본 포트1433에서 수신 대기 중입니다.$ kinit privilegeduser@CONTOSO.COM Password for privilegeduser@CONTOSO.COM: $ klist Ticket cache: FILE:/tmp/krb5cc_1000 Default principal: privilegeduser@CONTOSO.COM Valid starting Expires Service principal 01/26/22 20:42:02 01/27/22 06:42:02 krbtgt/CONTOSO.COM@CONTOSO.COM renew until 01/27/22 20:41:57 $ klist -kte /var/opt/mssql/secrets/mssql.keytab Keytab name: FILE:/var/opt/mssql/secrets/mssql.keytab KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux:1433@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:47 MSSQLSvc/sqllinux.contoso.com:5533@CONTOSO.COM (aes128-cts-hmac-sha1-96) 2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes256-cts-hmac-sha1-96) 2 01/13/22 13:19:55 sqluser@CONTOSO.COM (aes128-cts-hmac-sha1-96)
krb5.conf에서 영역 정보의 유효성을 검사합니다.
(
krb5.conf에/etc/krb5.conf있음) 기본 영역, 영역 정보 및 도메인에 대한 값을 영역 매핑에 제공하는지 확인합니다. 다음 샘플krb5.conf파일을 검토해 보세요. 자세한 내용은 Linux 및 컨테이너의 SQL Server에 대한 Active Directory 인증 이해(Understand Active Directory Authentication)를 참조 하세요.[libdefaults] default_realm = CONTOSO.COM default_keytab_name = /var/opt/mssql/secrets/mssql.keytab default_ccache_name = "" [realms] CONTOSO.COM = { kdc = adVM.contoso.com admin_server = adVM.contoso.com default_domain= contoso.com } [domain_realm] .contoso.com = CONTOSO.COM contoso.com = CONTOSO.COM도메인 컨트롤러의 하위 집합에 연결하도록 SQL Server를 제한할 수 있습니다. 연결해야 하는 SQL Server보다 DNS 구성에서 더 많은 도메인 컨트롤러를 반환하는 경우에 유용합니다. SQL Server on Linux에서는 경량 디렉터리 접근 프로토콜(LDAP) 조회를 수행할 때 SQL Server가 라운드로빈 방식으로 접촉하는 도메인 컨트롤러 목록을 지정할 수 있습니다.
이 두 단계를 완료하세요. 먼저, 필요한 도메인 컨트롤러를 접두사로
kdc =추가하여 수정krb5.conf하세요.[realms] CONTOSO.COM = { kdc = kdc1.contoso.com kdc = kdc2.contoso.com .. .. }이
krb5.conf파일은 일반적인 Kerberos 클라이언트 구성 파일이므로, 이 파일에 변경하는 모든 사항은 SQL Server 외에도 다른 서비스에도 영향을 줍니다. 변경 전에 도메인 관리자와 상담하세요.와 함께
mssql-conf설정을 활성화한 후 SQL Server를 재시작하세요network.enablekdcfromkrb5conf:sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true sudo systemctl restart mssql-server
Kerberos 문제 해결
다음 세부 사항은 Active Directory 인증 문제를 해결하고 특정 오류 메시지를 식별하는 데 도움이 됩니다.
Kerberos 추적
사용자, SPN, 키탭을 생성하고 설정을 mssql-conf마친 후, Active Directory 구성을 확인하세요.
리눅스에서 SQL Server on Linux 설정을 확인하려면 특권 계정을 사용해 Kerberos TGT를 구매하거나 갱신하세요. 이 명령을 실행하여 콘솔에서 Kerberos 추적 메시지를 보여주세요 (stdout):
root@sqllinux mssql# KRB5_TRACE=/dev/stdout kinit -kt /var/opt/mssql/secrets/mssql.keytab sqluser
문제가 없는 경우 아래 샘플과 유사한 출력이 표시됩니다. 만약 그렇지 않다면, 추적은 어떤 단계를 검토해야 하는지에 대한 맥락을 제공합니다.
3791545 1640722276.100275: Getting initial credentials for sqluser@CONTOSO.COM
3791545 1640722276.100276: Looked up etypes in keytab: aes256-cts, aes128-cts
3791545 1640722276.100278: Sending unauthenticated request
3791545 1640722276.100279: Sending request (202 bytes) to CONTOSO.COM
3791545 1640722276.100280: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100281: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100282: Received answer (185 bytes) from stream 10.0.0.4:88
3791545 1640722276.100283: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100284: Response was from master KDC
3791545 1640722276.100285: Received error from KDC: -1765328359/Additional pre-authentication required
3791545 1640722276.100288: Preauthenticating using KDC method data
3791545 1640722276.100289: Processing preauth types: PA-PK-AS-REQ (16), PA-PK-AS-REP_OLD (15), PA-ETYPE-INFO2 (19), PA-ENC-TIMESTAMP (2)
3791545 1640722276.100290: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100291: Retrieving sqluser@CONTOSO.COM from /var/opt/mssql/secrets/mssql.keytab (vno 0, enctype aes256-cts) with result: 0/Success
3791545 1640722276.100292: AS key obtained for encrypted timestamp: aes256-cts/E84B
3791545 1640722276.100294: Encrypted timestamp (for 1640722276.700930): plain 301AA011180F32303231313XXXXXXXXXXXXXXXXXXXXXXXXXXXXX, encrypted 333109B95898D1B4FC1837DAE3E4CBD33AF8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3791545 1640722276.100295: Preauth module encrypted_timestamp (2) (real) returned: 0/Success
3791545 1640722276.100296: Produced preauth for next request: PA-ENC-TIMESTAMP (2)
3791545 1640722276.100297: Sending request (282 bytes) to CONTOSO.COM
3791545 1640722276.100298: Initiating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100299: Sending TCP request to stream 10.0.0.4:88
3791545 1640722276.100300: Received answer (1604 bytes) from stream 10.0.0.4:88
3791545 1640722276.100301: Terminating TCP connection to stream 10.0.0.4:88
3791545 1640722276.100302: Response was from master KDC
3791545 1640722276.100303: Processing preauth types: PA-ETYPE-INFO2 (19)
3791545 1640722276.100304: Selected etype info: etype aes256-cts, salt "CONTOSO.COMsqluser", params ""
3791545 1640722276.100305: Produced preauth for next request: (empty)
3791545 1640722276.100306: AS key determined by preauth: aes256-cts/E84B
3791545 1640722276.100307: Decrypted AS reply; session key is: aes256-cts/05C0
3791545 1640722276.100308: FAST negotiation: unavailable
3791545 1640722276.100309: Initializing KCM:0:37337 with default princ sqluser@CONTOSO.COM
3791545 1640722276.100310: Storing sqluser@CONTOSO.COM -> krbtgt/CONTOSO.COM@CONTOSO.COM in KCM:0:37337
3791545 1640722276.100311: Storing config in KCM:0:37337 for krbtgt/CONTOSO.COM@CONTOSO.COM: pa_type: 2
3791545 1640722276.100312: Storing sqluser@CONTOSO.COM -> krb5_ccache_conf_data/pa_type/krbtgt/CONTOSO.COM@CONTOSO.COM@X-CACHECONF: in KCM:0:37337
$ sudo klist
Ticket cache: KCM:0:37337
Default principal: sqluser@CONTOSO.COM
Valid starting Expires Service principal
12/28/2021 20:11:16 12/29/2021 06:11:16 krbtgt/CONTOSO.COM@CONTOSO.COM
renew until 01/04/2022 20:11:16
Kerberos 및 보안 기반 PAL 로깅 사용
PAL(플랫폼 추상화 계층)에서 특정 오류 메시지를 식별하기 위해 활성화 security.kerberos 하고 security.ldap 로그를 기록합니다. 다음 내용/var/opt/mssql/의 파일을 생성 logger.ini 한 후 초기화 오류를 캡처하기 위해 SQL Server를 재시작하세요. 실패를 재현합니다. PAL은 Active Directory 오류 및 디버그 메시지를 기록합니다./var/opt/mssql/log/security.log
[Output:security]
Type = File
Filename = /var/opt/mssql/log/security.log
[Logger]
Level = Silent
[Logger:security.kerberos]
Level = Debug
Outputs = security
[Logger:security.ldap]
Level = Debug
Outputs = security
SQL Server 재시작 없이 로 logger.ini 거 변경 사항을 감지하지만, 시작 시 서비스 초기화 중 Active Directory 실패는 그렇지 않으면 SQL Server 감지되지 않습니다. SQL Server를 재시작하면 모든 오류 메시지가 캡처됩니다.
보안 로그는 logger.ini의 변경 내용을 제거할 때까지 드라이브에 계속 기록됩니다. 문제를 확인하고 해결한 후에는 비활성화하고 security.ldap 기록을 남 security.kerberos 겨 드라이브 공간 부족을 막으세요.
PAL 로거는 다음 형식으로 로그 파일을 생성합니다.
<DATETIME> <Log level> [<logger>] <<process/thread identifier>> <message>
예를 들어 로그의 샘플 줄은 다음과 같습니다.
12/28/2021 13:56:31.609453055 Error [security.kerberos] <0003753757/0x00000324> Request ticket server MSSQLSvc/sql.contoso.com:1433@CONTOSO.COM kvno 3 enctype aes256-cts found in keytab but cannot decrypt ticket
PAL 로깅을 활성화하고 문제를 재현하면, 로그 레벨이 . Error인 첫 번째 메시지를 찾아보세요. 다음 표를 참고하여 오류를 찾고 문제 해결을 위한 지침과 권고사항을 따르세요.
일반적인 오류 메시지
오류 메시지: “로그인하지 못했습니다. 로그인은 신뢰할 수 없는 도메인에서 왔으며 통합 인증과 함께 사용할 수 없습니다."
가능한 원인
Active Directory 인증을 설정한 후 Active Directory 계정으로 로그인하려 할 때 이 오류가 발생합니다.
안내
이 일반 오류 메시지를 사용하려면 PAL 로깅을 사용하도록 설정하여 특정 오류를 식별해야 합니다.
다음 흔한 오류 목록을 참고하여 각 오류의 가능한 원인을 파악하고, 문제 해결 가이드를 따라 해결해 주세요.
오류 메시지: Windows NT 사용자 또는 그룹인 ‘CONTOSO\user’를 찾을 수 없음
가능한 원인
Windows 로그인을 만들거나 그룹을 새로 고치는 동안 이 오류가 발생할 수 있습니다.
안내
문제를 확인하려면 "로그인 실패"라는 안내를 따르세요. 신뢰할 수 없는 도메인의 로그인이며 Windows 인증과 함께 사용할 수 없습니다. (Microsoft SQL Server, 오류: 18452)" 그리고 PAL 로깅을 활성화하여 특정 오류를 식별하고 그에 따라 문제 해결을 할 수 있습니다.
오류 메시지: “오류로 인해 짧은 도메인 이름을 조회할 수 없음”
가능한 원인
Active Directory 로그인을 만드는 Transact-SQL 구문은 다음과 같습니다.
CREATE LOGIN [CONTOSO\user]
FROM WINDOWS;
명령어에는 NetBIOS 이름(CONTOSO)이 필요하지만, LDAP 연결을 수행할 때 도메인contoso.com()의 FQDN()은 백엔드에서 제공되어야 합니다. 이 변환을 수행하려면 CONTOSO에서 DNS 조회를 수행하여 도메인 컨트롤러의 IP를 확인합니다. 그러면 LDAP 쿼리에 바인딩할 수 있습니다.
안내
"Could not search up short domain name due to error"라는 오류 메시지는 nslookup 도메인 contoso 컨트롤러의 IP 주소로 해석되지 않음을 시사합니다.
DNS와 리버스 DNS 조회를 통해 NetBIOS와 도메인 이름 모두 일치하는지 확인 nslookup 해 보세요.
오류 메시지: "오류로 인해 호스트 <호스트 이름> 에 대해 rDNS 조회를 수행할 수 없습니다." 또는 "rDNS 조회에서 반환되지 않은 FQDN"
가능한 원인
이러한 오류 메시지는 보통 모든 도메인 컨트롤러에 역방향 DNS 레코드(PTR 레코드)가 존재하지 않음을 나타냅니다.
안내
DNS 및 역방향 DNS 조회를 확인합니다. rDNS 항목이 없는 도메인 컨트롤러를 확인한 후에는 두 가지 선택지가 있습니다:
모든 도메인 컨트롤러에 대한 rDNS 항목 추가
이 설정은 SQL Server 설정이 아니며, 도메인 수준에서 설정해야 합니다. 도메인 관리 팀과 협력하여 도메인 이름에 반환되는 모든 도메인 컨트롤러
nslookup에 대한 필요한 PTR 레코드를 만들어야 할 수도 있습니다.SQL Server를 도메인 컨트롤러의 하위 집합으로 제한
반환된 모든 도메인 컨트롤러에 대해 PTR 레코드를 추가할 수 없다면, SQL Server를 일부 도메인 컨트롤러로 제한할 수 있습니다.
오류 메시지: “LDAP 서버에 바인딩하지 못했습니다 ldap://CONTOSO.COM:3268: 로컬 오류”
가능한 원인
OpenLDAP의 이 일반적인 오류는 일반적으로 다음 두 가지 중 하나를 의미합니다.
- 자격 증명 사용 안 함
- rDNS 문제
다음은 오류 메시지의 예입니다.
12/09/2021 14:32:11.319933684 Error [security.ldap] <0000000142/0x000001c0> Failed to bind to LDAP server ldap://[CONTOSO.COM:3268]: Local error
안내
자격 증명 사용 안 함
LDAP 연결에서 자격 증명이 로드되지 않으면 다른 오류 메시지가 먼저 나타납니다. PAL 로깅을 활성화 하고 이 메시지 전에 오류 로그를 확인하세요. 다른 오류가 없는 경우 자격 증명 문제가 아닐 수 있습니다. 오류를 발견하면 바로 고치고 넘어가세요. 대부분의 경우, 이 글에서 다루는 오류 메시지 중 하나입니다.
rDNS 문제
DNS 및 역방향 DNS 조회를 확인합니다.
OpenLDAP 라이브러리가 도메인 컨트롤러에 연결될 때, 이 예
contoso.com시에서는 완전 정식 도메인 이름(FQDN)이나 DC의 FQDN(kdc1.contoso.com)을 제공합니다. 연결을 확립한 후(성공 여부를 호출자에게 반환하기 전), OpenLDAP 라이브러리는 연결된 서버의 IP를 확인합니다. 그 후 역DNS 조회를 수행하고, 연결된kdc1.contoso.com서버의 이름()이 요청된 도메인contoso.com()과 일치하는지 확인합니다. 일치하지 않으면 OpenLDAP 라이브러리가 보안 기능으로 연결에 실패합니다. 이러한 불일치가 SQL Server on Linux에서 rDNS 설정이 중요한 이유 중 하나이며, 이 글의 초점입니다.
오류 메시지: “키 테이블 항목을 찾을 수 없음”
가능한 원인
이 오류는 키탭 파일의 접근 문제나 키탭 내 항목 누락을 의미합니다.
안내
keytab 파일에 올바른 액세스 수준 및 권한이 있는지 확인합니다. 키탭 파일의 기본 위치와 이름은 /var/opt/mssql/secrets/mssql.keytab입니다. secrets 폴더 내 모든 파일의 현재 권한을 확인하려면 다음 명령을 실행하세요:
sudo ls -lrt /var/opt/mssql/secrets
Keytab 파일의 권한과 접근 수준을 설정하려면 다음 명령어를 사용하세요:
sudo chown mssql /var/opt/mssql/secrets/mssql.keytab
sudo chmod 440 /var/opt/mssql/secrets/mssql.keytab
keytab 항목을 나열하고 올바른 권한을 설정하는 방법에 대한 자세한 내용은 이전 키 탭 파일 및 권한 확인 섹션을 참조하세요 . 해당 섹션의 조건을 충족하지 못하면 이 오류 또는 이에 상응하는 오류가 나타납니다: "Key table entry not found".
오류 메시지: “<principal>에 대한 키 테이블 항목을 찾을 수 없음”
가능한 원인
키탭에서 해당 <principal> 자격 증명을 검색하려 해도 해당 항목이 없습니다.
안내
keytab의 모든 항목을 나열하려면 이 문서의 키탭 파일 및 사용 권한 확인 섹션을 따릅니다.
<principal>인지 확인합니다. 이 경우, 보통 network.privilegedadaccount SPN을 등록하는 본금 계좌가 됩니다. 만약 그렇지 않다면, 명령어와 함께 adutil 추가하세요. 자세한 내용은 adutil을 사용하여 Linux에서 SQL Server Active Directory 인증 구성을 참조하세요.
오류 메시지: “keytab(ticket kvno <KVNO>)에서 요청 티켓 서버 <principal>을 찾을 수 없음”
가능한 원인
이 오류는 SQL Server가 지정된 키 버전 번호(KVNO)를 가진 요청 티켓의 키탭 항목을 찾을 수 없음을 나타냅니다.
안내
keytab의 모든 항목을 나열하려면 이 문서의 키탭 파일 및 사용 권한 확인 섹션을 따릅니다. 만약 KVNO와 일치 <principal> 하는 오류 메시지를 찾지 못하면, 해당 섹션의 단계를 따라 키탭 파일을 업데이트해 이 항목을 추가하세요.
다음 명령을 실행하여 DC에서 최신 KVNO를 가져올 수도 있습니다. 이 명령을 실행하기 전에 명령어와 함께 kinit 케르베로스 TGT를 획득하거나 갱신하세요. 자세한 내용은 adutil 도구를 사용하여 SQL Server의 Active Directory 사용자 만들기 및 SPN 설정을 참조하세요.
kvno MSSQLSvc/<hostname>
오류 메시지: “요청 티켓 서버 <principal> kvno <KVNO>가 keytab에 있지만 암호화 타입이 <encryption type>에 해당하지 않음”
가능한 원인
이 오류는 SQL Server의 키탭에 클라이언트가 요청하는 암호화 타입이 포함되어 있지 않다는 것을 의미합니다.
안내
검증을 위해서는 이 글의 'Check keytab 파일'과 권한 섹션을 따라 키탭 내 모든 항목을 나열하세요. 주체, KVNO, 암호화 유형에 맞는 오류 메시지를 찾지 못하면, 해당 섹션의 단계를 따라 키탭 파일을 업데이트해 이 항목을 추가하세요.
오류 메시지: “요청 티켓 서버 <principal> kvno <KVNO> enctype <encryption type>이 keytab에 있지만 티켓을 암호 해독할 수 없음”
가능한 원인
이 오류 메시지는 SQL Server가 키탭 파일의 자격 증명을 사용해 들어오는 인증 요청을 복호화할 수 없음을 나타냅니다. 잘못된 비밀번호가 종종 이 오류를 일으킵니다.
안내
올바른 비밀번호로 키탭을 다시 만드세요. 만약 을 사용adutil한다면, 올바른 비밀번호로 키탭을 만들고 튜토리얼의 단계를 따르세요: adutil을 사용해 SQL Server on Linux에서 Active Directory 인증을 설정하세요.
공통 포트
이 표는 SQL Server on Linux가 Active Directory 인증을 구성하고 관리하는 데 사용하는 일반적인 포트를 보여줍니다.
| Active Directory 서비스 | 항구 |
|---|---|
| DNS | 53 |
| LDAP | 389 |
| LDAPS | 636 |
| 커베로스 | 88 |