Förstå Active Directory-autentisering för SQL Server i Linux och containrar
gäller för:SQL Server – Linux
Den här artikeln innehåller information om hur Active Directory-autentisering fungerar för SQL Server som distribueras i Linux eller containrar.
Begrepp
Protokoll för lättviktskatalogåtkomst (LDAP)
LDAP är ett programprotokoll för att arbeta med olika katalogtjänster, inklusive Active Directory. Katalogtjänster lagrar användar- och kontoinformation samt säkerhetsinformation som lösenord. Den informationen krypteras och delas sedan med andra enheter i nätverket.
Mer information om hur du skyddar LDAP finns i Så här aktiverar du LDAP-inloggning i Windows Server.
Kerberos
Kerberos är ett autentiseringsprotokoll som används för att verifiera identiteten för en användare eller värddator. Du kan se det som ett sätt att verifiera klienten och servern.
När du arbetar i en heterogen (blandad) miljö där du har Windows- och icke-Windows-servrar och -klienter finns det två typer av filer som du behöver arbeta med Active Directory-baserade katalogtjänster:
- Keytab-filer (förkortning för "nyckeltabeller")
- Kerberos-konfigurationsfiler (
krb5.conf
ellerkrb5.ini
)
Vad är en nyckelfliksfil?
Serverprocesser i Linux- eller Unix-system kan inte konfigureras för att köra processer med ett Windows-tjänstkonto. När du vill att ett Linux- eller Unix-system automatiskt ska logga in på Active Directory vid start måste du använda en nyckelflik fil.
En nyckelflik är en kryptografisk fil som innehåller en representation av en Kerberos-skyddad tjänst och dess långsiktiga nyckel dess associerade tjänsthuvudnamn i Nyckeldistributionscenter (KDC). Nyckeln är inte själva lösenordet.
Nyckelflikar används för att antingen:
- autentisera själva tjänsten till en annan tjänst i nätverket, eller
- dekryptera Kerberos-tjänstbiljetten för en inkommande kataloganvändare till tjänsten.
Vad är en krb5.conf
fil?
Den /etc/krb5.conf
filen (kallas även krb5.ini
) innehåller konfigurationsindata för Biblioteken Kerberos v5 (KRB5) och GNU Simple Authentication and Security Layer API (GSSAPI).
Den här informationen innehåller standarddomänen, egenskaperna för varje domän (till exempel Nyckeldistributionscenter) och standardlivslängden för Kerberos-biljetter.
Den här filen är nödvändig för att Active Directory-autentisering ska fungera.
krb5.conf
är en INI-fil, men varje värde i nyckel/värde-paret kan vara en undergrupp omgiven av {
och }
.
Mer information om filen krb5.conf
finns i dokumentationen MIT Kerberos Consortium.
Konfigurera Kerberos för SQL Server i Linux
Det här är de värden du behöver på värdservern som kör SQL Server på Linux. Om du har andra (icke-SQL Server)-tjänster som körs på samma värd kan din krb5.conf
fil behöva flera poster.
Här är ett exempel krb5.conf
fil som referens:
[libdefaults]
default_realm = CONTOSO.COM
[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
libdefaults
– värdet fördefault_realm
måste finnas. Det här värdet anger den domän som värddatorn tillhör.realms
(valfritt) – För varje sfär kan detkdc
värdet anges för att ange vilka nyckeldistributionscenter som datorn ska kontakta när du letar upp Active Directory-konton. Om du har angett mer än en KDC kommer KDC för varje anslutning att väljas i tur och ordning.domain_realm
(valfritt) – Mappningar för varje sfär kan tillhandahållas. Annars förutsätter SQL Server på Linux att domänencontoso.com
mappar till sfärenCONTOSO.COM
.
Kerberos-autentiseringsprocessen
Precis som med Kerberos-autentisering i Windows är de två första stegen för att få en biljettbeviljande biljett (TGT) desamma:
En klient påbörjar inloggningsprocessen genom att skicka sitt användarnamn och lösenord (krypterat) till domänkontrollanten (DC).
Efter att användarnamnet och lösenordet har kontrollerats mot dess interna lagring returnerar domänkontrollanten en TGT för användaren till klienten.
SQL Server i Linux använder nyckelfliksfilen för att läsa lösenordet för tjänstens huvudnamn (SPN) och dekrypterar sedan den krypterade bloben, som används för att auktorisera anslutningen. Nästa steg beskriver den här processen.
När användaren har TGT startar klienten en anslutning till SQL Server genom att ange värdnamnet och porten för SQL Server-instansen.
SQL-klienten skapar internt ett tjänsthuvudnamn i formatet
MSSQLSvc/<host>:<port>
. Det här är ett hårdkodat format i de flesta SQL Server-klienter.Klienten påbörjar Kerberos-handskakningen genom att begära en sessionsnyckel från domänkontrollanten (DC) för den SPN. Både TGT och SPN skickas till domänkontrollanten.
- När domänkontrollanten har verifierat TGT och SPN skickar den sessionsnyckeln till klienten för att ansluta till SQL Server SPN.
- Den krypterade bloben från sessionsnyckeln skickas till servern.
SQL Server läser lösenordet för SPN från dess nyckelflik (
mssql.keytab
), som är en fil på disk som innehåller krypterade tupplar (SPN, lösenord).SQL Server dekrypterar den krypterade bloben från klienten med det lösenord som den precis har letat upp för att hämta klientens användarnamn.
SQL Server letar upp klienten i tabellen
sys.syslogins
för att kontrollera om klienten har behörighet att ansluta.Anslutningen accepteras eller nekas.
Konfigurera Kerberos för SQL Server-containrar
Active Directory-autentisering för SQL Server i containrar är i stort sett samma som SQL Server i Linux. Den enda skillnaden är SQL Server-värd-SPN. I föregående scenario var SPN MSSQLSvc/<host>:<port>
eftersom vi anslöt via SQL Server-värdnamnet. Nu måste vi dock ansluta till containern.
För SQL Server-containrar kan du skapa krb5.conf
-filen i containern. Värdnoden som kör containern behöver inte vara en del av domänen, men bör kunna nå den domänkontrollant som containern försöker ansluta till.
Eftersom vi ansluter till en container kan servernamnet i klientanslutningen skilja sig från bara värdnamnet. Det kan vara värdnamnet, containernamnet eller ett annat alias. Dessutom finns det en god chans att den exponerade porten för SQL Server inte är standard 1433
.
Du måste använda det SPN som lagras i mssql.keytab
för att ansluta till SQL Server-containern. Om SPN i mssql.keytab
till exempel är MSSQLSvc/sqlcontainer.domain.com:8000
använder du sqlcontainer.domain.com,8000
som anslutningssträng i klienten (inklusive sqlcmd, SQL Server Management Studio och Azure Data Studio).
Uppdatering av SQL Server-grupp
Du kanske undrar varför det finns ett användarkonto på nyckelfliken om du bara behöver ett tjänsthuvudnamn för att autentisera.
Anta att du har en användare adUser, som är medlem i en grupp adGroup. Om adGroup läggs till som en inloggning till SQL Server innebär det att adUser också har behörighet att logga in på SQL Server-instansen. Även om adUser fortfarande är ansluten till SQL Server kan en domänadministratör ta bort adUser från adGroup. Nu ska adUser inte längre ha behörighet att logga in på SQL Server, men de har redan godkänt Kerberos-autentiseringsprocessen och är anslutna.
Vi kör regelbundet en process som kallas gruppuppdatering för att skydda mot ett scenario där en ansluten användare inte längre tillåts utföra en privilegierad åtgärd (till exempel att skapa en inloggning eller ändra en databas).
SQL Server har ett privilegierat Active Directory-konto som används för gruppuppdatering. Det här kontot konfigureras antingen med hjälp av mssql-conf med inställningen network.privilegedadaccount eller standardinställningen för datorkontot för värddatorn (<hostname>$
).
Autentiseringsuppgifterna för det privilegierade kontot i mssql.keytab
används för att personifiera klienten (adUser i det här exemplet). SQL Server gör en Kerberos-handskakning med sig själv för att identifiera gruppmedlemskapsinformationen och jämför den med sys.syslogins
för att kontrollera om adUser fortfarande har de behörigheter som krävs för att ansluta och köra de begärda Transact-SQL kommandona. Om adUser har tagits bort från adGroupavslutas anslutningen av SQL Server.
Gruppuppdatering kräver följande två villkor:
- Nätverksanslutning mellan SQL Server-instansen och den lokala Active Directory-domänen.
- Dubbelriktat förtroende mellan domänen som SQL Server är ansluten till och det lokala nätverkets Active Directory-domän. Mer information finns i Understanding Active Directory.