Udostępnij za pośrednictwem


Samouczek: używanie uwierzytelniania usługi Active Directory z programem SQL Server w systemie Linux

Dotyczy:SQL Server — Linux

W tym samouczku wyjaśniono, jak skonfigurować program SQL Server w systemie Linux w celu obsługi uwierzytelniania usługi Active Directory, znanego również jako zintegrowane uwierzytelnianie. Aby zapoznać się z omówieniem, zobacz uwierzytelnianie usługi Active Directory dla programu SQL Server w systemie Linux.

Ten samouczek składa się z następujących zadań:

  • Dołączanie hosta programu SQL Server do domeny usługi Active Directory
  • Tworzenie użytkownika usługi Active Directory dla programu SQL Server i ustawianie nazwy SPN
  • Konfigurowanie keytab usługi programu SQL Server
  • Zabezpieczanie pliku keytab
  • Konfigurowanie programu SQL Server do korzystania z pliku keytab na potrzeby uwierzytelniania Kerberos
  • Tworzenie logowania opartego na Active Directory w Transact-SQL
  • Nawiązywanie połączenia z programem SQL Server przy użyciu uwierzytelniania usługi Active Directory

Wymagania wstępne

Przed skonfigurowaniem uwierzytelniania usługi Active Directory należy:

Dołączanie hosta programu SQL Server do domeny usługi Active Directory

Połącz host SQL Server z systemem Linux z kontrolerem domeny Active Directory. Aby uzyskać informacje na temat dołączania do domeny usługi Active Directory, zobacz Dołączanie programu SQL Server na hoście z systemem Linux do domeny usługi Active Directory.

Tworzenie użytkownika usługi Active Directory dla programu SQL Server i ustawianie nazwy SPN

Uwaga / Notatka

W poniższych krokach jest używana w pełni kwalifikowana nazwa domeny (FQDN). Jeśli korzystasz z platformy Azure, przed kontynuowaniem musisz utworzyć nazwę FQDN .

  1. Na kontrolerze domeny uruchom polecenie New-ADUser programu PowerShell, aby utworzyć nowego użytkownika usługi Active Directory z hasłem, które nigdy nie wygasa. W poniższym przykładzie nazwa konta to sqlsvc, ale może być dowolna. Zostanie wyświetlony monit o wprowadzenie nowego hasła dla konta.

    Import-Module ActiveDirectory
    
    New-ADUser sqlsvc -AccountPassword (Read-Host -AsSecureString "Enter Password") -PasswordNeverExpires $true -Enabled $true
    

    Najlepszym rozwiązaniem w zakresie zabezpieczeń jest posiadanie dedykowanego konta usługi Active Directory dla programu SQL Server, dzięki czemu poświadczenia wystąpienia programu SQL Server nie są udostępniane innym usługom przy użyciu tego samego konta. Możesz jednak opcjonalnie ponownie użyć istniejącego konta usługi Active Directory, jeśli znasz hasło konta (które jest wymagane do wygenerowania pliku keytab w następnym kroku). Ponadto konto powinno być włączone w celu obsługi 128-bitowego i 256-bitowego szyfrowania Kerberos AES (msDS-SupportedEncryptionTypes atrybutu) na koncie użytkownika. Aby sprawdzić, czy konto jest włączone na potrzeby szyfrowania AES, znajdź konto w narzędziu Użytkownicy i komputery usługi Active Directory , a następnie wybierz pozycję Właściwości. Znajdź kartę Konta we właściwościach i sprawdź, czy zaznaczono dwa poniższe pola wyboru.

    1. To konto obsługuje szyfrowanie 128-bitowe Kerberos AES
    2. To konto obsługuje szyfrowanie 256-bitowe protokołu Kerberos AES
  2. Ustaw nazwę ServicePrincipalName (SPN) dla tego konta przy użyciu narzędzia setspn.exe . Nazwa SPN musi być sformatowana dokładnie tak, jak określono w poniższym przykładzie. Możesz znaleźć w pełni kwalifikowaną nazwę domeny maszyny hosta programu SQL Server, uruchamiając polecenie hostname --all-fqdns na hoście programu SQL Server. Port TCP powinien mieć wartość 1433, chyba że skonfigurowano program SQL Server do używania innego numeru portu.

    setspn -A MSSQLSvc/<fully qualified domain name of host machine>:<tcp port> sqlsvc
    setspn -A MSSQLSvc/<netbios name of the host machine>:<tcp port> sqlsvc
    

    Uwaga / Notatka

    Jeśli wystąpi błąd, Insufficient access rightssprawdź, czy administrator domeny ma wystarczające uprawnienia, aby ustawić nazwę SPN na tym koncie. Konto używane do rejestrowania głównej nazwy usługi będzie potrzebować Write servicePrincipalName uprawnień. Aby uzyskać więcej informacji, zobacz Rejestrowanie głównej nazwy usługi dla połączeń Kerberos.

    Jeśli w przyszłości zmienisz port TCP, musisz ponownie uruchomić polecenie setspn przy użyciu nowego numeru portu. Należy również dodać nową nazwę SPN do pliku keytab usługi SQL Server, wykonując kroki opisane w następnej sekcji.

Aby uzyskać więcej informacji, zobacz Rejestrowanie głównej nazwy usługi dla połączeń Kerberos.

Konfigurowanie pliku keytab usługi SQL Server

Skonfigurowanie uwierzytelniania usługi Active Directory dla programu SQL Server w systemie Linux wymaga konta użytkownika usługi Active Directory i nazwy SPN utworzonej w poprzedniej sekcji.

Ważne

Jeśli hasło do konta Active Directory zostanie zmienione lub zostanie zmienione hasło do konta, do którego przypisano nazwy SPN, należy zaktualizować keytab przy użyciu nowego hasła i wersji numeru klucza (KVNO). Niektóre usługi mogą również automatycznie obracać hasła. Przejrzyj wszelkie zasady rotacji haseł dla kont, o których mowa, i dostosuj je do zaplanowanych działań konserwacyjnych, aby uniknąć nieoczekiwanych przestojów.

Wpisy w pliku keytab dla SPN

  1. Sprawdź numer wersji klucza (KVNO) dla konta usługi Active Directory utworzonego w poprzednim kroku. Zazwyczaj jest to wartość 2, ale może to być inna liczba całkowita, jeśli hasło konta było zmieniane wielokrotnie. Na maszynie hosta programu SQL Server uruchom następujące polecenia:

    • Poniższe przykłady zakładają, że user znajduje się w domenie @CONTOSO.COM. Zmodyfikuj nazwę użytkownika i domeny na swoją własną nazwę użytkownika i domeny.
    kinit user@CONTOSO.COM
    kvno user@CONTOSO.COM
    kvno MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM
    

    Uwaga / Notatka

    Propagacja nazw SPN za pośrednictwem domeny może potrwać kilka minut, zwłaszcza jeśli domena jest duża. Jeśli wystąpi błąd, kvno: Server not found in Kerberos database while getting credentials for MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COMzaczekaj kilka minut i spróbuj ponownie. Poprzednie polecenia działają tylko wtedy, gdy serwer został przyłączony do domeny usługi Active Directory, która została omówiona we wcześniejszej sekcji.

  2. Za pomocą narzędzia ktpass dodaj wpisy keytab dla każdego SPN przy użyciu następujących poleceń w wierszu polecenia w systemie Windows.

    • <DomainName>\<UserName> - Konto użytkownika usługi Active Directory
    • @CONTOSO.COM — Użyj nazwy domeny
    • /kvno <#> - Zamień <#> na KVNO uzyskany we wcześniejszym kroku
    • <password> — Hasło powinno być zgodne z domyślnymi zasadami haseł programu SQL Server. Domyślnie hasło musi mieć długość co najmniej ośmiu znaków i zawierać znaki z trzech z następujących czterech zestawów: wielkie litery, małe litery, cyfry podstawowe-10 i symbole. Hasła mogą mieć długość maksymalnie 128 znaków. Używaj haseł, które są tak długie i złożone, jak to możliwe.
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ MSSQLSvc/<fully qualified domain name of host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ MSSQLSvc/<netbios name of the host machine>:<tcp port>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto aes256-sha1 /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    
    ktpass /princ <UserName>@CONTOSO.COM /ptype KRB5_NT_PRINCIPAL /crypto rc4-hmac-nt /mapuser <DomainName>\<UserName> /in mssql.keytab /out mssql.keytab -setpass -setupn /kvno <#> /pass <password>
    

    Poprzednie polecenia umożliwiają szyfrowanie AES i RC4 na potrzeby uwierzytelniania usługi Active Directory. RC4 to starszy szyfr szyfrowania, a jeśli wymagany jest wyższy stopień zabezpieczeń, możesz utworzyć wpisy na karcie kluczy tylko przy użyciu szyfru szyfrowania AES.

    Uwaga / Notatka

    Ostatnie dwa UserName wpisy muszą mieć małe litery lub uwierzytelnianie uprawnień może zakończyć się niepowodzeniem.

  3. Po wykonaniu poprzednich poleceń powinien znajdować się plik keytab o nazwie mssql.keytab. Skopiuj plik na maszynę z programem SQL Server w folderze /var/opt/mssql/secrets.

  4. Zabezpiecz ten plik keytab.

    Każda osoba mająca dostęp do pliku keytab może podszywać się pod SQL Server w domenie, dlatego upewnij się, że ograniczysz dostęp do pliku, tak aby tylko konto mssql miało dostęp do odczytu.

    sudo chown mssql:mssql /var/opt/mssql/secrets/mssql.keytab
    sudo chmod 400 /var/opt/mssql/secrets/mssql.keytab
    
  5. Poniższa opcja konfiguracji musi być ustawiona za pomocą narzędzia mssql-conf , aby określić konto, które ma być używane podczas uzyskiwania dostępu do pliku keytab.

    sudo mssql-conf set network.privilegedadaccount <username>
    

    Uwaga / Notatka

    Uwzględnij tylko nazwę użytkownika, a nie nazwę domeny\nazwę użytkownika lub username@domain. Program SQL Server wewnętrznie dodaje nazwę domeny do tej nazwy użytkownika, gdy jest to wymagane.

  6. Wykonaj poniższe kroki, aby skonfigurować program SQL Server do rozpoczęcia korzystania z pliku karty kluczy na potrzeby uwierzytelniania Kerberos.

    sudo mssql-conf set network.kerberoskeytabfile /var/opt/mssql/secrets/mssql.keytab
    sudo systemctl restart mssql-server
    

    Opcjonalnie można wyłączyć połączenia UDP z kontrolerem domeny w celu zwiększenia wydajności. W wielu przypadkach połączenia UDP stale kończą się niepowodzeniem podczas nawiązywania połączenia z kontrolerem domeny, dzięki czemu można ustawić opcje konfiguracji, /etc/krb5.conf aby pominąć wywołania protokołu UDP. Edytuj /etc/krb5.conf i ustaw następujące opcje:

    /etc/krb5.conf
    [libdefaults]
    udp_preference_limit=0
    

Na tym etapie możesz używać logowań opartych na Active Directory w programie SQL Server.

Utwórz konta logowania oparte na usłudze Active Directory w Transact-SQL

  1. Połącz się z programem SQL Server i utwórz nowe logowanie oparte na usłudze Active Directory:

    CREATE LOGIN [CONTOSO\user]
        FROM WINDOWS;
    
  2. Sprawdź, czy identyfikator logowania znajduje się teraz w widoku katalogu systemu sys.server_principals :

    SELECT name
    FROM sys.server_principals;
    

Nawiązywanie połączenia z programem SQL Server przy użyciu uwierzytelniania usługi Active Directory

Zaloguj się do komputera klienckiego przy użyciu poświadczeń domeny. Teraz możesz nawiązać połączenie z programem SQL Server bez konieczności wprowadzania hasła przy użyciu uwierzytelniania usługi Active Directory. Jeśli utworzysz identyfikator logowania dla grupy usługi Active Directory, każdy użytkownik usługi Active Directory, który jest członkiem tej grupy, może połączyć się w ten sam sposób.

Określony parametr parametrów połączenia dla klientów korzystających z uwierzytelniania usługi Active Directory zależy od używanego sterownika. Zapoznaj się z przykładami w poniższych sekcjach.

sqlcmd na komputerze klienckim z systemem Linux przyłączonym do domeny

Zaloguj się do klienta systemu Linux przyłączonego do domeny przy użyciu protokołu SSH i poświadczeń domeny:

ssh -l user@contoso.com client.contoso.com

Upewnij się, że zainstalowano pakiet mssql-tools , a następnie połącz się przy użyciu narzędzia sqlcmd bez określania poświadczeń:

sqlcmd -S mssql-host.contoso.com

Połączenie lokalne w SQL Linux wykorzystuje uwierzytelnianie Kerberos, które różni się od tego w SQL w Windows. Jednak nadal trzeba podać nazwę FQDN hosta z systemem SQL Linux, a uwierzytelnianie usługi Active Directory nie będzie działać, jeśli spróbujesz nawiązać połączenie z ., localhost, 127.0.0.1, itp.

Program SSMS na kliencie systemu Windows przyłączonym do domeny

Zaloguj się do klienta systemu Windows przyłączonego do domeny przy użyciu poświadczeń domeny. Upewnij się, że program SQL Server Management Studio jest zainstalowany, a następnie połącz się z instancją SQL Server (na przykład mssql-host.contoso.com), wybierając uwierzytelnianie systemu Windows w oknie dialogowym Połącz z serwerem.

Uwierzytelnianie usługi Active Directory przy użyciu innych sterowników klienta

W poniższej tabeli opisano zalecenia dotyczące innych sterowników klienta:

Sterownik klienta Rekomendacja
JDBC Użyj zintegrowanego uwierzytelniania Kerberos, aby nawiązać połączenie z programem SQL Server.
ODBC Użyj zintegrowanego uwierzytelniania.
ADO.NET Składnia łańcucha połączenia.

Dodatkowe opcje konfiguracji

Jeśli używasz narzędzi innych firm, takich jak PBIS, VAS lub Centrify , aby dołączyć hosta systemu Linux do domeny usługi Active Directory i chcesz wymusić, aby program SQL Server używał biblioteki OpenLDAP bezpośrednio, możesz skonfigurować disablesssd opcję za pomocą mssql-conf w następujący sposób:

sudo mssql-conf set network.disablesssd true
systemctl restart mssql-server

Uwaga / Notatka

Istnieją narzędzia, takie jak realmd, które konfigurują SSSD, podczas gdy inne narzędzia, takie jak PBIS, VAS i Centrify, nie konfigurują SSSD. Jeśli narzędzie używane do dołączania do domeny Active Directory nie konfiguruje usługi SSSD, należy ustawić opcję disablesssd na true. Chociaż nie jest to wymagane, ponieważ program SQL Server podejmie próbę użycia usługi SSSD dla usługi Active Directory przed powrotem do mechanizmu OpenLDAP, bardziej wydajne byłoby skonfigurowanie go, aby program SQL Server wykonuje wywołania OpenLDAP bezpośrednio pomijając mechanizm SSSD.

Jeśli kontroler domeny obsługuje protokół LDAPS, możesz wymusić, że wszystkie połączenia z programu SQL Server do kontrolerów domeny mają być za pośrednictwem protokołu LDAPS. Aby sprawdzić, czy klient może skontaktować się z kontrolerem domeny za pośrednictwem protokołu LDAPS, uruchom następujące polecenie powłoki bash. ldapsearch -H ldaps://contoso.com:3269 Aby ustawić program SQL Server tak, aby używał tylko protokołu LDAPS, uruchom następujące polecenie:

sudo mssql-conf set network.forcesecureldap true
systemctl restart mssql-server

Spowoduje to użycie protokołu LDAPS za pośrednictwem usługi SSSD, jeśli przyłączenie do domeny usługi Active Directory na hoście zostało wykonane za pośrednictwem pakietu SSSD i disablesssd nie jest ustawione na wartość true. Jeśli disablesssd oraz forcesecureldap są ustawione na true, zostanie użyty protokół LDAPS zamiast wywołań biblioteki OpenLDAP realizowanych przez SQL Server.

Post SQL Server 2017 CU 14

Począwszy od programu SQL Server 2017 (14.x) CU 14, jeśli SQL Server został dołączony do kontrolera domeny Active Directory przy użyciu dostawców zewnętrznych i jest skonfigurowany do używania wywołań OpenLDAP dla ogólnego wyszukiwania w Active Directory, ustawiając disablesssd na wartość true, można również użyć opcji enablekdcfromkrb5, aby wymusić korzystanie przez SQL Server z biblioteki krb5 dla wyszukiwania KDC zamiast odwrotnego wyszukiwania DNS dla serwera KDC.

Może to być przydatne w scenariuszu, z którym chcesz ręcznie skonfigurować kontrolery domeny, z którymi program SQL Server próbuje się komunikować. A ty używasz mechanizmu biblioteki OpenLDAP, korzystając z listy KDC w krb5.conf.

Najpierw ustaw wartość disablesssd i enablekdcfromkrb5conf na true, a następnie uruchom ponownie program SQL Server:

sudo mssql-conf set network.disablesssd true
sudo mssql-conf set network.enablekdcfromkrb5conf true
systemctl restart mssql-server

Następnie skonfiguruj listę KDC w następujący /etc/krb5.conf sposób:

[realms]
CONTOSO.COM = {
  kdc = dcWithGC1.contoso.com
  kdc = dcWithGC2.contoso.com
}

Chociaż nie jest to zalecane, można użyć narzędzi, takich jak realmd, które konfigurują SSSD podczas dołączania hosta Linuksa do domeny, ustawiając disablesssd na true, aby SQL Server używał wywołań OpenLDAP zamiast SSSD do wywołań związanych z Active Directory.

Uwaga / Notatka

Logowanie do programu SQL Server przy użyciu nazwy FQDN (na przykład CONTOSO.COM\Username) nie jest obsługiwane. Użyj formatu CONTOSO\Username.

Loginy SQL Server z lokalnych grup domeny nie są obsługiwane. Zamiast tego użyj globalnych grup domen zabezpieczeń.

Współtworzenie dokumentacji SQL

Czy wiesz, że możesz samodzielnie edytować zawartość SQL? Jeśli to zrobisz, nie tylko pomożesz ulepszyć naszą dokumentację, ale także zostaniesz uznany za współautora strony.

Aby uzyskać więcej informacji, zobacz Edytowanie dokumentacji środowiska Microsoft Learn.