Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server – Linux
Kontejnery SQL Serveru 2017 (14.x) se standardně spouštějí jako uživatel root, což může způsobit určité obavy zabezpečení. Tento článek popisuje možnosti zabezpečení, které máte při spouštění kontejnerů SQL Serveru Linux a jak sestavit kontejner SQL Serveru jako uživatel, který není root.
Příklady v tomto článku předpokládají, že používáte Docker, ale stejné principy můžete použít i u jiných nástrojů pro orchestraci kontejnerů, včetně Kubernetes.
Sestavení a spuštění nekořenových kontejnerů SQL Serveru 2017
Pomocí těchto kroků sestavte kontejner SQL Serveru 2017 (14.x), který se spustí jako uživatel mssql (ne root).
Poznámka
Kontejnery pro SQL Server 2019 (15.x) a novější verze se automaticky spouštějí bez root oprávnění, zatímco kontejnery SQL Serveru 2017 (14.x) se ve výchozím nastavení spouštějí jako root. Další informace o spouštění kontejnerů SQL Serveru jako ne root naleznete v tématu Zabezpečení kontejnerů SQL Serveru Linux.
Stáhněte si ukázkový soubor Dockerfile pro kontejnery SQL Serveru, které nejsou kořenové, a uložte ho jako
dockerfile.Spuštěním následujícího příkazu v kontextu adresáře dockerfile sestavte ne root kontejner SQL Serveru:
cd <path to dockerfile> docker build -t 2017-latest-non-root .Spusťte kontejner.
Důležitý
Proměnná prostředí
SA_PASSWORDse již nepoužívá. Místo toho použijteMSSQL_SA_PASSWORD.docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" --cap-add SYS_PTRACE --name sql1 -p 1433:1433 -d 2017-latest-non-rootPoznámka
Příznak
--cap-add SYS_PTRACEse vyžaduje pro ne rootové kontejnery SQL Serveru, aby se vygenerovaly výpisy paměti pro účely řešení potíží.Zkontrolujte, že kontejner běží jako uživatel, který není root:
docker exec -it sql1 bashSpusťte
whoami, který vrací uživatele spuštěného v kontejneru.whoami
Spusťte kontejner jako jiného ne-root uživatele na hostiteli.
Pokud chcete spustit kontejner SQL Serveru jako jiný uživatel, který není root, přidejte do příkazu -u příznak docker run. Jiný než kořenový kontejner má omezení, které musí běžet jako součást skupiny root, pokud není svazek připojený k /var/opt/mssql, ke kterému má přístup jiný uživatel než root. Skupina root neuděluje ne-root uživateli žádná další kořenová oprávnění.
Spustit jako uživatel s UID 4000
SQL Server můžete spustit s vlastním UID. Například následující příkaz spustí SQL Server s 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
Varování
Ujistěte se, že kontejner SQL Serveru má pojmenovaného uživatele, například mssql nebo root, jinak sqlcmd nemůže spustit v rámci kontejneru. Spuštěním whoami v rámci kontejneru můžete zkontrolovat, jestli je kontejner SQL Serveru spuštěný jako pojmenovaný uživatel.
Spusťte kontejner běžící bez oprávnění root jako uživatel root
V případě potřeby můžete spustit ne root kontejner jako uživatel root, který také automaticky udělí kontejneru všechna oprávnění k souborům, protože má vyšší oprávnění.
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
Spusťte jako uživatele na hostitelském počítači
SQL Server můžete spustit s existujícím uživatelem na hostitelském počítači pomocí následujícího příkazu:
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
Spustit jako jiný uživatel a skupina
SQL Server můžete spustit s vlastním uživatelem a skupinou. V tomto příkladu má připojený svazek nakonfigurovaná oprávnění pro uživatele nebo skupinu na hostitelském počítači.
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
Konfigurace trvalých oprávnění úložiště pro jiné než kořenové kontejnery
Pokud chcete umožnit uživateli, který není rootem, přístup k databázovým souborům, které jsou na připojených svazcích, ujistěte se, že uživatel nebo skupina, pod kterým kontejner spouštíte, může číst a zapisovat do trvalého úložiště souborů.
Pomocí tohoto příkazu můžete získat aktuální vlastnictví databázových souborů.
ls -ll <database file dir>
Pokud SQL Server nemá přístup k trvalým databázovým souborům, spusťte jeden z následujících příkazů.
Udělte skupině root přístup ke čtení a zápisu k souborům databáze.
Udělte kořenovým skupinám oprávnění k následujícím adresářům, aby k souborům databáze získal přístup jiný než kořenový kontejner SQL Serveru.
chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>
Nastavení uživatele, který není rootem, jako vlastníka souborů
Vlastníkem může být výchozí uživatel bez oprávnění root nebo jiný uživatel bez oprávnění root, kterého chcete specifikovat. V tomto příkladu nastavíte UID 10001 jako uživatele, který není root.
chown -R 10001:0 <database file dir>
Šifrování připojení ke kontejnerům SQL Serveru s Linuxem
Důležitý
Když nakonfigurujete možnosti ověřování nebo šifrování služby Active Directory, jako je transparentní šifrování dat (TDE) a SSL/TLS pro SQL Server v Linuxu nebo kontejnerech, existuje několik souborů, například klíčová karta, certifikáty a klíč počítače, které se ve výchozím nastavení vytvářejí ve složce /var/opt/mssql/secrets, a přístup k němu, který je ve výchozím nastavení omezený na mssql uživatele a root uživatele. Když nakonfigurujete trvalé úložiště pro kontejnery SQL Serveru, použijte stejnou strategii přístupu a ujistěte se, že cesta na hostiteli nebo sdíleném svazku mapovaná na /var/opt/mssql/secrets uvnitř kontejneru je chráněná a přístupná pouze uživatelům mssql a root na hostiteli. Pokud dojde k ohrožení přístupu k této cestě nebo složce, může uživatel se zlými úmysly získat přístup k těmto důležitým souborům a ohrozit tak konfiguraci šifrovací hierarchie nebo služby Active Directory.
Pokud chcete šifrovat připojení ke kontejnerům SQL Serveru s Linuxem, potřebujete certifikát s následujícími požadavky.
Následuje příklad šifrování připojení ke kontejnerům SQL Serveru s Linuxem. Tady použijete certifikát podepsaný svým držitelem, který by se neměl používat pro produkční scénáře. V takových prostředích byste měli místo toho používat certifikáty certifikační autority.
Vytvořte certifikát podepsaný svým držitelem, který je vhodný jenom pro testovací a neprodukční prostředí.
openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=sql1.contoso.com' -keyout /container/sql1/mssql.key -out /container/sql1/mssql.pem -days 365V předchozí ukázce kódu je
sql1název hostitele kontejneru SQL, takže při připojování k tomuto kontejneru bude název použitý v připojovacím řetězcisql1.contoso.com,port. Před spuštěním předchozího příkazu musíte také zajistit, aby cesta ke/container/sql1/složce již existuje.Ujistěte se, že pro soubory
mssql.keyamssql.pemnastavíte správná oprávnění, abyste se vyhnuli chybám při připojování souborů ke kontejneru SQL Serveru:chmod 440 /container/sql1/mssql.pem chmod 440 /container/sql1/mssql.keyTeď vytvořte
mssql.confsoubor s následujícím obsahem, který povolí šifrování iniciované serverem. U šifrování iniciovaného klientem změňte poslední řádek naforceencryption = 0.[network] tlscert = /etc/ssl/certs/mssql.pem tlskey = /etc/ssl/private/mssql.key tlsprotocols = 1.2 forceencryption = 1Poznámka
U některých linuxových distribucí může být cesta pro uložení certifikátu a klíče také
/etc/pki/tls/certs/a/etc/pki/tls/private/v uvedeném pořadí. Před aktualizacímssql.confpro kontejnery SQL Serveru ověřte cestu. Umístění, které jste nastavili vmssql.conf, je místo, kde bude SQL Server v kontejneru hledat certifikát a jeho klíč. V tomto případě je toto umístění/etc/ssl/certs/a/etc/ssl/private/.Soubor
mssql.confje také vytvořen ve stejném umístění složky/container/sql1/. Po spuštění výše uvedených kroků byste měli mít tři soubory:mssql.conf,mssql.keyamssql.pemve složcesql1.Nasaďte kontejner SQL Serveru následujícím příkazem (nahraďte
<password>platným heslem):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-latestV předchozím příkazu jste připojili soubory
mssql.conf,mssql.pemamssql.keyke kontejneru a namapovali port 1433 (standardní port pro SQL Server) v kontejneru na port 5434 na hostiteli.Poznámka
Pokud používáte Red Hat Enterprise Linux 8 a novější verze, můžete místo příkazu
podman runpoužítdocker runpříkaz .
Postupujte podle částí "Registrace certifikátu na klientském počítači" a "Ukázkové připojovací řetězce" zdokumentované v šifrování iniciované klientem a spusťte šifrování připojení k SQL Serveru v kontejnerech Linuxu.
Související obsah
- Začněte s imagí kontejneru SQL Serveru 2022 (16.x) na Dockeru a projděte si rychlý průvodce.
- Začínáme s obrázky kontejnerů SQL Serveru 2025 (17.x) v Dockeru pomocí rychlého průvodce