Felsöka služba Active Directory-autentisering för SQL Server på Linux och containrar

Gäller för:SQL Server i Linux

Den här artikeln hjälper dig att felsöka problem med Doménové služby Active Directory-autentisering med SQL Server i Linux och containrar. Den innehåller nödvändiga kontroller och tips för en lyckad služba Active Directory-konfiguration och en lista över vanliga fel och felsökningssteg.

Verifiera den aktuella konfigurationen

Innan du börjar felsöka, validera den aktuella användaren, mssql.conf, Service Principal Name (SPN) och realm-inställningarna.

  1. Skaffa eller förnya Kerberos TGT (biljettgivande biljett) med kinit:

    kinit privilegeduser@CONTOSO.COM
    
  2. Kör följande kommando och se till att användaren som kör det har tillgång till mssql.keytab:

    /opt/mssql/bin/mssql-conf validate-ad-config /var/opt/mssql/secrets/mssql.keytab
    

    För mer information om kommandot validate-ad-config , kör /opt/mssql/bin/mssql-conf validate-ad-config --help.

DNS- och omvända DNS-sökningar

  1. DNS-sökningar på domännamnet och NetBIOS-namnet ska returnera samma IP-adress, som normalt matchar IP-adressen för domänkontrollanten (DC). Kör dessa kommandon från SQL Server-värddatorn.

    nslookup contoso
    nslookup contoso.com
    

    Om IP-adresserna inte matchar kan du läsa Ansluta SQL Server på en Linux-värd till en služba Active Directory-domän för att åtgärda DNS-sökningar och kommunikation med domänkontrollanten.

  2. Utför en omvänd DNS (rDNS) sökning för varje IP-adress från tidigare resultat. Inkludera IPv4- och IPv6-adresser där det är tillämpligt.

    nslookup <IPs returned from the above commands>
    

    Alla bör returnera <hostname>.contoso.com. Annars, kontrollera PTR-posterna (pekaren) i služba Active Directory.

    Du kan behöva arbeta med domänadministratören för att få rDNS att fungera. Om du inte kan lägga till PTR-poster för alla returnerade IP-adresser kan du också begränsa SQL Server till en delmängd domänkontroller. Den här ändringen påverkar andra tjänster som använder krb5.conf på servern.

    Mer information om omvänd DNS finns i Vad är omvänd DNS?

Kontrollera nyckelflikens fil och behörigheter

  1. Kontrollera att du har skapat keytab (nyckeltabellen) och att du konfigurerat mssql-conf att använda rätt fil med lämpliga behörigheter. Nyckelfliken måste vara tillgänglig för mssql användarkonto. Mer information finns i Använd adutil för att konfigurera služba Active Directory-autentisering med SQL Server på Linux.

  2. Se till att du kan lista innehållet i nyckelfliken och att du har lagt till rätt SPN, port, krypteringstyp och användarkonto. Om du inte skriver in lösenorden korrekt när du skapar SPN:er och keytab-poster stöter du på fel när du försöker logga in med služba Active Directory-autentisering.

    klist -kte /var/opt/mssql/secrets/mssql.keytab
    

    Ett exempel på en fungerande nyckelflik följer. I exemplet används två krypteringstyper, men du kan bara använda en eller flera beroende på vilka krypteringstyper som stöds i din miljö. I exemplet sqluser@CONTOSO.COM är det privilegierade kontot (som matchar network.privilegedadaccount inställningen i mssql-conf) och värdnamnet för SQL Server sqllinux.contoso.com lyssnar på standardporten 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)
    

Verifiera domäninformation i krb5.conf

  1. I krb5.conf (finns på /etc/krb5.conf) kontrollerar du att du anger värden för standardsfär, sfärinformation och domän till sfärmappning. Gå igenom följande exempelfil krb5.conf . Mer information finns i Förstå služba Active Directory-autentisering för SQL Server på Linux och containrar.

    [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
    
  2. Du kan begränsa SQL Server till att kontakta en delmängd domänkontrollanter, vilket är användbart om DNS-konfigurationen returnerar fler domänkontrollanter än vad SQL Server behöver kontakta. SQL Server on Linux låter dig specificera en lista över domänkontrollanter som SQL Server kontaktar i en rund-robin-metod när du utför en Lightweight Directory Access Protocol (LDAP)-uppslagning.

    Slutför dessa två steg. Först, ändra krb5.conf genom att lägga till de domänkontrollanter du behöver, med prefixet kdc =.

    [realms]
    CONTOSO.COM = {
      kdc = kdc1.contoso.com
      kdc = kdc2.contoso.com
      ..
      ..
    }
    

    Filen krb5.conf är en vanlig Kerberos-klientkonfigurationsfil, så alla ändringar du gör i denna fil påverkar andra tjänster utöver SQL Server. Innan du gör några ändringar, rådgör du med din domänadministratör.

    Aktivera inställningen network.enablekdcfromkrb5conf med mssql-conf, och starta sedan om SQL Server:

    sudo /opt/mssql/bin/mssql-conf set network.enablekdcfromkrb5conf true
    sudo systemctl restart mssql-server
    

Att felsöka Kerberos

Följande detaljer hjälper dig att felsöka autentiseringsproblem i služba Active Directory och identifiera specifika felmeddelanden.

Spåra Kerberos

Efter att du skapat användaren, SPN:erna och keytabs, och konfigureratmssql-conf, verifiera služba Active Directory-konfigurationen.

För att verifiera konfigurationen för SQL Server on Linux, använd det privilegierade kontot för att hämta eller förnya Kerberos TGT. Kör detta kommando för att visa Kerberos-spårningsmeddelandena i konsolen (stdout):

root@sqllinux mssql# KRB5_TRACE=/dev/stdout kinit -kt /var/opt/mssql/secrets/mssql.keytab sqluser

Om det inte finns några problem bör du se utdata som liknar följande exempel. Om inte, ger spårningen kontext om vilka steg som ska granskas.

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

Aktivera Kerberos och säkerhetsbaserad PAL-loggning

För att identifiera specifika felmeddelanden i PAL (Platform Abstraction Layer), aktivera security.kerberos och security.ldap logga. Skapa en logger.ini fil med följande innehåll vid /var/opt/mssql/, och starta sedan om SQL Server för att fånga eventuella initialiseringsfel. Återskapa misslyckandet. PAL loggar služba Active Directory-fel- och felsökningsmeddelanden till /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 registrerar loggerändringar utan logger.ini omstart, men fel under služba Active Directory-tjänstinitiering vid SQL Server-start går annars obemärkt förbi. Omstart av SQL Server fångar alla felmeddelanden.

Säkerhetsloggen fortsätter att skriva till enheten tills du tar bort ändringarna i logger.ini. Inaktivera security.kerberos och security.ldap logga när du identifierat och löst problemet, för att undvika att få slut på utrymme på disken.

PAL-loggaren genererar loggfiler i följande format:

<DATETIME> <Log level> [<logger>] <<process/thread identifier>> <message>

Till exempel följer en exempelrad från loggen:

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

När du aktiverar PAL-loggning och återskapar problemet, leta efter det första meddelandet med en loggnivå på Error. Använd följande tabell för att hitta felet och följ instruktionerna och rekommendationerna för att felsöka och lösa problemet.

Vanliga felmeddelanden

Felmeddelande: "Inloggningen misslyckades. Inloggningen kommer från en icke betrodd domän och kan inte användas med integrerad autentisering"

Möjlig orsak

Du stöter på detta fel när du försöker logga in med ett služba Active Directory-konto efter att du konfigurerat služba Active Directory-autentisering.

Vägledning

Det här allmänna felmeddelandet kräver att du aktivera PAL-loggning för att identifiera det specifika felet.

Se följande lista över vanliga fel för att identifiera den möjliga orsaken till varje fel, och följ sedan felsökningsguiden för att lösa problemet.

Felmeddelanden
Windows NT-användare eller -gruppen "CONTOSO\user" hittades inte
Det gick inte att söka efter ett kort domännamn på grund av fel
Det gick inte att utföra rDNS-sökning efter värd <värdnamn> på grund av fel
FQDN returneras inte av rDNS-sökning
Det gick inte att binda till LDAP-server
nyckeltabellposten hittades inte
Det finns ingen nyckeltabellspost för <huvudman>
Begärandebiljettservern <huvudnamn> hittades inte i nyckelfliken (<KVNO->)
Request ticket server <principal> kvno <KVNO> finns i nyckelfliken men inte med enctype <krypteringstyp>
Begär biljettserver <huvudnamn> kvno <KVNO> enctype <krypteringstyp> finns i keytab men kan inte dekryptera biljetten

Felmeddelande: Windows NT-användaren eller gruppen "CONTOSO\user" hittades inte

Möjlig orsak

Du kan stöta på det här felet när du försöker skapa Windows-inloggningen eller under gruppuppdatering.

Vägledning

För att validera problemet, följ instruktionerna för "Inloggning misslyckades. Inloggningen kommer från en domän som inte är betrodd och kan inte användas med integrerad autentisering. (Microsoft SQL Server, fel: 18452)" och aktivera PAL-loggning för att identifiera det specifika felet och felsöka därefter.

Felmeddelande: "Det gick inte att söka efter ett kort domännamn på grund av fel"

Möjlig orsak

Den Transact-SQL syntaxen för att skapa en služba Active Directory-inloggning är:

CREATE LOGIN [CONTOSO\user]
    FROM WINDOWS;

NetBIOS-namnet (CONTOSO) krävs i kommandot, men domänens FQDN (contoso.com) måste anges i backend vid en LDAP-anslutning. För att göra den här konverteringen utförs en DNS-sökning på CONTOSO för att matcha till IP-adressen för en domänkontrollant, som sedan kan bindas till för LDAP-frågor.

Vägledning

Felmeddelandet "Kunde inte slå upp kort domännamn på grund av fel" antyder att nslookup för contoso inte löses till domänkontrollantens IP-adress. Granska DNS och omvända DNS-uppslagningar för att bekräfta att nslookup både NetBIOS och domännamn stämmer överens.

Felmeddelanden: "Det gick inte att utföra rDNS-sökning efter värd <värdnamn> på grund av fel" eller "FQDN returneras inte av rDNS-sökning"

Möjlig orsak

Dessa felmeddelanden indikerar vanligtvis att reverse DNS-poster (PTR-poster) inte finns för alla domänkontrollanter.

Vägledning

Kontrollera DNS- och omvända DNS-sökningar. Efter att du identifierat domänkontrollerna som inte har rDNS-poster har du två alternativ:

  • Lägg till rDNS-poster för alla domänkontrollanter

    Denna inställning är inte en SQL Server-inställning, och du måste konfigurera den på domännivå. Du kan behöva samarbeta med ditt domänadministrationsteam för att skapa de nödvändiga PTR-posterna för alla domänkontrollanter som nslookup returnerar för domännamnet.

  • Begränsa SQL Server till en delmängd domänkontrollanter

    Om du inte kan lägga till PTR-poster för alla returnerade domänkontrollanter kan du begränsa SQL Server till en delmängd av domänkontroller.

Felmeddelande: "Det gick inte att binda till LDAP-servern ldap://CONTOSO.COM:3268: Lokalt fel"

Möjlig orsak

Det här allmänna felet från OpenLDAP innebär normalt en av två saker:

  • Inga autentiseringsuppgifter
  • rDNS-problem

Här är ett exempel på felmeddelandet:

12/09/2021 14:32:11.319933684 Error [security.ldap] <0000000142/0x000001c0> Failed to bind to LDAP server ldap://[CONTOSO.COM:3268]: Local error

Vägledning

  • Inga autentiseringsuppgifter

    Andra felmeddelanden dyker upp först om inloggningsuppgifter inte laddas för LDAP-anslutningar. Aktivera PAL-loggning och kontrollera felloggen för felmeddelanden före denna. Om det inte finns några andra fel är det troligtvis inte ett problem med autentiseringsuppgifterna. Om du hittar ett fel, åtgärda det innan du går vidare. I de flesta fall är det ett av felmeddelandena som denna artikel behandlar.

  • rDNS-problem

    Kontrollera DNS- och omvända DNS-sökningar.

    När OpenLDAP-biblioteket ansluter till en domänkontrollant tillhandahåller det antingen det fullt kvalificerade domännamnet (FQDN), vilket i detta exempel är contoso.com, eller DC:ns FQDN (kdc1.contoso.com). Efter att anslutningen har upprättats (men innan framgången returnerats till anroparen) kontrollerar OpenLDAP-biblioteket IP-adressen på servern den anslutit sig till. Den utför sedan en omvänd DNS-uppslagning och kontrollerar att namnet på servern den anslutit sig till (kdc1.contoso.com) matchar den begärda domänen (contoso.com). Om det inte stämmer, misslyckas anslutningen i OpenLDAP-biblioteket som en säkerhetsfunktion. Denna mismatch är en del av varför rDNS-inställningarna är viktiga för SQL Server on Linux, och är fokus för denna artikel.

Felmeddelande: "Nyckeltabellposten hittades inte"

Möjlig orsak

Detta fel indikerar åtkomstproblem med keytab-filen eller saknade poster i keytab.

Vägledning

Kontrollera att nyckelfliksfilen har rätt åtkomstnivå och behörigheter. Standardplatsen och namnet på keytab-filen är /var/opt/mssql/secrets/mssql.keytab. För att se de aktuella behörigheterna för alla filer under mappen hemligheter, kör detta kommando:

sudo ls -lrt /var/opt/mssql/secrets

Använd dessa kommandon för att ställa in behörigheter och åtkomstnivå på keytab-filen:

sudo chown mssql /var/opt/mssql/secrets/mssql.keytab
sudo chmod 440 /var/opt/mssql/secrets/mssql.keytab

Mer information om hur du listar nyckelfliksposterna och anger rätt behörigheter finns i föregående Kontrollera nyckelfliksfil och behörigheter avsnittet. Om du inte uppfyller något av villkoren i den sektionen ser du detta fel eller ett motsvarande fel: "Key table entry not found".

Felmeddelande: "Ingen nyckeltabellpost hittades för <huvudnamn>"

Möjlig orsak

När du försöker hämta inloggningsuppgifterna från <principal> keytabben hittar du inga relevanta poster.

Vägledning

Om du vill visa en lista över alla poster i nyckelfliken följer du avsnittet Kontrollera nyckelfliksfil och behörigheter i den här artikeln. Kontrollera att <principal> finns. I det här fallet är det vanligtvis huvudkontot network.privilegedadaccount som du registrerar SPN:arna på. Om det inte är det, lägg till det med kommandot adutil . Mer information finns i Använd adutil för att konfigurera služba Active Directory-autentisering med SQL Server på Linux.

Felmeddelande: "Begärandebiljettserver <principal> hittades inte i keytabet (biljett kvno <KVNO>)"

Möjlig orsak

Detta fel indikerar att SQL Server inte kan hitta en keytab-post för det begärda ärendet med det angivna Key Version Number (KVNO).

Vägledning

Om du vill visa en lista över alla poster i nyckelfliken följer du avsnittet Kontrollera nyckelfliksfil och behörigheter i den här artikeln. Om du inte hittar ett felmeddelande som matchar <principal> och KVNO, uppdatera keytab-filen för att lägga till denna post och följ stegen i den sektionen.

Du kan också köra följande kommando för att hämta den senaste KVNO:en från domänkontrollanten. Innan du kör detta kommando, skaffa eller förnya Kerberos TGT med kommandot kinit . Mer information finns i Använd adutil för att skapa en služba Active Directory-användare för SQL Server och ange tjänstens huvudnamn (SPN).

kvno MSSQLSvc/<hostname>

Felmeddelande: "Begäran biljettserver <huvudbetrodd> kvno <KVNO> finns i nyckeltabell men inte med krypteringstyp <krypteringstyp>."

Möjlig orsak

Detta fel innebär att SQL Server:s keytab inte innehåller den krypteringstyp som klienten begär.

Vägledning

För att validera, följ avsnittet Kontrollera keytab-fil och behörigheter i denna artikel för att lista alla poster i keytabben. Om du inte hittar ett felmeddelande som matchar principal, KVNO och krypteringstyp, uppdatera keytab-filen för att lägga till denna post, enligt stegen i den sektionen.

Felmeddelande: "Begäran biljettserver <huvudnamn> kvno <KVNO> enctype <krypteringstyp> hittades i nyckeltabellen men kan inte dekryptera biljetten"

Möjlig orsak

Detta felmeddelande indikerar att SQL Server inte kan använda en legitimation från keytab-filen för att dekryptera den inkommande autentiseringsförfrågan. Ett felaktigt lösenord orsakar ofta detta fel.

Vägledning

Skapa om keytabben med rätt lösenord. Om du använder adutil, skapa keytab med rätt lösenord och följ stegen i Tutorial: Använd adutil för att konfigurera služba Active Directory-autentisering med SQL Server on Linux.

Vanliga portar

Denna tabell visar de vanliga portarna som SQL Server on Linux använder för att konfigurera och administrera služba Active Directory-autentisering.

služba Active Directory-tjänsten Hamn
DNS 53
LDAP 389
LDAPS 636
Kerberos 88