Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:Program SQL Server w systemie Linux
Kontenery programu SQL Server 2017 (14.x) są domyślnie uruchamiane jako użytkownik główny, co może powodować pewne problemy z zabezpieczeniami. W tym artykule omówiono opcje zabezpieczeń, które są dostępne podczas uruchamiania kontenerów programu SQL Server Linux oraz jak utworzyć kontener programu SQL Server jako użytkownik niebędący użytkownikiem głównym.
W przykładach w tym artykule założono, że używasz platformy Docker, ale możesz zastosować te same zasady do innych narzędzi orkiestracji kontenerów, w tym platformy Kubernetes.
Kompilowanie i uruchamianie kontenerów innych niż główne kontenery programu SQL Server 2017
Wykonaj następujące kroki, aby utworzyć kontener programu SQL Server 2017 (14.x), który jest uruchamiany jako użytkownik mssql (inny niż użytkownik główny).
Note
Kontenery dla SQL Server 2019 (15.x) i nowszych wersji są automatycznie uruchamiane jako nie-root, podczas gdy kontenery SQL Server 2017 (14.x) są domyślnie uruchamiane jako root. Aby uzyskać więcej informacji, zobacz Uruchamianie kontenera jako inny użytkownik niebędący rootem na hoście.
Pobierz przykładowy plik Dockerfile dla kontenerów programu SQL Server innych niż root i zapisz go jako
Dockerfile.Uruchom następujące polecenie w katalogu zawierającym plik Docker, aby zbudować kontener SQL Server nierootowy:
cd <path to Dockerfile directory> docker build -t 2017-latest-non-root .Uruchom kontener.
Ważna
Zmienna środowiskowa
SA_PASSWORDjest przestarzała. UżyjMSSQL_SA_PASSWORDzamiast tego.docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE --name sql1 -p 1433:1433 -d 2017-latest-non-rootNote
Flaga
--cap-add SYS_PTRACEjest wymagana dla kontenerów programu SQL Server innych niż root w celu wygenerowania zrzutów na potrzeby rozwiązywania problemów.Sprawdź, czy kontener działa jako użytkownik nierootowy:
docker exec -it sql1 bashUruchom
whoami, który zwraca użytkownika działającego w kontenerze.whoami
Uruchom kontener jako inny użytkownik bez uprawnień roota na hoście
Aby uruchomić kontener programu SQL Server jako inny użytkownik niebędący użytkownikiem głównym, dodaj flagę -u do polecenia docker run. Kontener bez uprawnień administratora ma ograniczenie, że musi działać w ramach grupy root, chyba że do /var/opt/mssql zamontowano wolumin, do którego użytkownik bez uprawnień głównych może uzyskać dostęp. Grupa root nie udziela żadnych dodatkowych uprawnień głównych użytkownikowi niebędącemu użytkownikiem głównym.
Uruchamianie jako użytkownik z identyfikatorem UID 4000
Program SQL Server można uruchomić przy użyciu niestandardowego identyfikatora UID. Na przykład następujące polecenie uruchamia program SQL Server z identyfikatorem UID 4000:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u 4000:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Warning
Upewnij się, że kontener SQL Server ma nazwanego użytkownika, takiego jak mssql lub root. W przeciwnym razie sqlcmd nie może działać w kontenerze. Możesz sprawdzić, czy kontener programu SQL Server jest uruchomiony jako nazwany użytkownik, uruchamiając whoami w kontenerze.
Uruchom kontener bez uprawnień administracyjnych jako użytkownik root
Możesz uruchomić kontener nierootowy jako użytkownik root, jeśli to konieczne, co automatycznie przyznaje wszystkie uprawnienia do plików, ponieważ ma on wyższe uprawnienia.
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -u 0:0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Uruchom jako użytkownik na maszynie hosta
Program SQL Server można uruchomić przy użyciu istniejącego użytkownika na maszynie hosta za pomocą następującego polecenia:
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u $(id -u myusername):0 -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Uruchom jako inny użytkownik i grupa
Program SQL Server można uruchomić przy użyciu niestandardowego użytkownika i grupy. W tym przykładzie zainstalowany wolumin ma uprawnienia skonfigurowane dla użytkownika lub grupy na maszynie hosta.
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE -u $(id -u myusername):$(id -g myusername) -v /path/to/mssql:/var/opt/mssql -p 1433:1433 -d mcr.microsoft.com/mssql/server:2019-latest
Skonfiguruj uprawnienia do trwałego magazynowania dla kontenerów działających bez uprawnień root
Aby umożliwić użytkownikowi niebędącemu root dostęp do plików bazy danych znajdujących się na zamontowanych woluminach, upewnij się, że użytkownik lub grupa, pod którą uruchamiasz kontener, może odczytywać i zapisywać na trwałym nośniku plików.
Za pomocą tego polecenia możesz uzyskać bieżącą własność plików bazy danych.
ls -ll <database file dir>
Uruchom jedno z następujących poleceń, jeśli program SQL Server nie ma dostępu do utrwalanych plików bazy danych.
Udzielanie grupie głównej dostępu do odczytu/zapisu do plików bazy danych
Przyznaj grupie głównej uprawnienia do następujących katalogów, aby kontener programu SQL Server inny niż główny miał dostęp do plików bazy danych.
chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>
Ustawianie użytkownika innego niż główny jako właściciela plików
Właściciel może być domyślnym użytkownikiem niebędącym użytkownikiem głównym lub innym użytkownikiem niebędącym użytkownikiem głównym, który chcesz określić. W tym przykładzie ustawisz identyfikator UID 10001 jako użytkownika niebędącego użytkownikiem głównym.
chown -R 10001:0 <database file dir>
Szyfrowanie połączeń z kontenerami systemu Linux programu SQL Server
Ważna
Gdy konfigurujesz uwierzytelnianie lub opcje szyfrowania Active Directory, takie jak Transparent Data Encryption (TDE) i TLS dla SQL Server on Linux lub kontenerów, domyślnie tworzone są różne pliki, takie jak keytab, certyfikaty i klucz maszynowy, tworzone domyślnie w folderze /var/opt/mssql/secrets, a dostęp do którego domyślnie jest ograniczony dla mssql użytkowników i root . Podczas konfigurowania magazynu trwałego dla kontenerów programu SQL Server należy użyć tej samej strategii dostępu, zapewniając, że ścieżka na hoście lub udostępnionym woluminie zmapowanego do folderu /var/opt/mssql/secrets wewnątrz kontenera jest chroniona i dostępna tylko dla użytkowników mssql oraz root na hoście. Jeśli dostęp do tej ścieżki/folderu zostanie naruszony, złośliwy użytkownik może uzyskać dostęp do tych krytycznych plików, naruszyć hierarchię szyfrowania i/lub konfiguracje usługi Active Directory.
Aby szyfrować połączenia z kontenerami systemu Linux programu SQL Server, potrzebny jest certyfikat z następującymi wymaganiami .
Poniżej przedstawiono przykład sposobu szyfrowania połączenia z kontenerami systemu Linux programu SQL Server. W tym miejscu użyjesz certyfikatu z podpisem własnym, który nie powinien być używany w scenariuszach produkcyjnych. W takich środowiskach należy zamiast tego używać certyfikatów urzędu certyfikacji.
Utwórz certyfikat z podpisem własnym, który jest odpowiedni tylko dla środowisk testowych i nieprodukcyjnych.
openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=sql1.contoso.com' -keyout /container/sql1/mssql.key -out /container/sql1/mssql.pem -days 365W poprzednim przykładzie kodu
sql1jest nazwą hosta kontenera SQL, więc podczas nawiązywania połączenia z tym kontenerem nazwa używana w parametrach połączenia będziesql1.contoso.com,5434. Przed uruchomieniem poprzedniego polecenia należy również upewnić się, że ścieżka/container/sql1/folderu już istnieje.Upewnij się, że ustawisz odpowiednie uprawnienia dla plików
mssql.keyimssql.pem, aby uniknąć błędów podczas montowania tych plików w kontenerze SQL Server:chmod 440 /container/sql1/mssql.pem chmod 440 /container/sql1/mssql.keyTeraz utwórz
mssql.confplik z następującą zawartością, aby umożliwić szyfrowanie inicjowane przez serwer. Dla szyfrowania inicjowanego przez klienta zmień ostatnią linię na .forceencryption = 0[network] tlscert = /etc/ssl/certs/mssql.pem tlskey = /etc/ssl/private/mssql.key tlsprotocols = 1.2 forceencryption = 1Note
W przypadku niektórych dystrybucji systemu Linux ścieżka do przechowywania certyfikatu i klucza może być odpowiednio
/etc/pki/tls/certs/i/etc/pki/tls/private/. Przed zaktualizowaniemmssql.confdla kontenerów programu SQL Server sprawdź ścieżkę. Lokalizacja ustawiona w lokalizacjimssql.confto lokalizacja, w której program SQL Server w kontenerze będzie wyszukiwać certyfikat i jego klucz. W takim przypadku lokalizacje to/etc/ssl/certs/i/etc/ssl/private/.Plik
mssql.confjest również tworzony w tej samej lokalizacji folderu/container/sql1/. Po wykonaniu powyższych kroków w folderzemssql.confpowinny znajdować się trzy pliki:mssql.key,mssql.pemisql1.Wdróż kontener programu SQL Server za pomocą następującego polecenia (zastąp
<password>prawidłowym hasłem):docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" -p 5434:1433 --name sql1 -h sql1 -v /container/sql1/mssql.conf:/var/opt/mssql/mssql.conf -v /container/sql1/mssql.pem:/etc/ssl/certs/mssql.pem -v /container/sql1/mssql.key:/etc/ssl/private/mssql.key -d mcr.microsoft.com/mssql/server:2019-latestW poprzednim poleceniu zamontowałeś pliki
mssql.conf,mssql.pemimssql.keydo kontenera oraz zmapowałeś domyślny port 1433 programu SQL Server w kontenerze na port 5434 na hoście.Note
Jeśli używasz systemu Red Hat Enterprise Linux 8 i nowszych wersji, możesz również użyć
podman runpolecenia zamiastdocker run.
Aby rozpocząć szyfrowanie połączeń z programem SQL Server w kontenerach systemu Linux, postępuj zgodnie z sekcjami „Zarejestruj certyfikat na komputerze klienta” oraz „Przykładowe ciągi połączenia” opisanymi w dokumencie Szyfrowanie inicjowane przez klienta.
Treści powiązane
- Rozpocznij pracę z obrazami kontenerów SQL Server 2025 (17.x) na platformie Docker, przechodząc przez Szybki start