Zabezpečení kontejnerů SQL Serveru s Linuxem

Platí pro:SQL Server na Linuxu

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).

Note

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 najdete v článku Spuštění kontejneru jako jiného uživatele než root na hostiteli.

  1. Stáhněte si ukázkový soubor Dockerfile pro kontejnery SQL Serveru, které nejsou kořenové, a uložte ho jako Dockerfile.

  2. Spustěte následující příkaz v adresáři, který obsahuje Dockerfile pro vytvoření nekořenového SQL Server kontejneru:

    cd <path to Dockerfile directory>
    docker build -t 2017-latest-non-root .
    
  3. Spusťte kontejner.

    Important

    Proměnná prostředí SA_PASSWORD se již nepoužívá. Místo toho použijte MSSQL_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-root
    

    Note

    Příznak --cap-add SYS_PTRACE se vyžaduje pro ne rootové kontejnery SQL Serveru, aby se vygenerovaly výpisy paměti pro účely řešení potíží.

  4. Zkontrolujte, zda kontejner běží jako ne-root uživatel:

    docker exec -it sql1 bash
    

    Spusť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

Warning

Ujistěte se, že kontejner SQL Server má pojmenovaného uživatele, například mssql nebo root. Jinak sqlcmd nelze běžet uvnitř 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 kontejner nespouštěný pod uživatelem root spustit jako uživatel root, čímž kontejner automaticky získá všechna oprávnění k souborům, protože uživatel root 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

Aby uživatel bez root mohl přistupovat k databázovým souborům na připojených svazcích, ujistěte se, že uživatel nebo skupina, pod kterou 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

Important

Když konfigurujete autentizaci nebo šifrovací možnosti v služba Active Directory, jako je transparentní šifrování dat (TDE) a TLS pro SQL Server on Linux nebo kontejnery, existuje několik souborů, jako je keytab, certifikáty a strojový klíč, které jsou ve výchozím nastavení vytvořeny ve složce /var/opt/mssql/secrets, a přístup k nim je ve výchozím nastavení omezen pro mssql uživateleroot. 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 služba 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.

  1. 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 365
    

    V předchozí ukázce kódu je sql1 název hostitele kontejneru SQL, takže při připojování k tomuto kontejneru bude název použitý v připojovacím řetězci sql1.contoso.com,5434. Před spuštěním předchozího příkazu musíte také zajistit, aby cesta ke /container/sql1/ složce již existuje.

  2. Ujistěte se, že máte správná oprávnění na souborech mssql.key and mssql.pem souborů, abyste se vyhnuli chybám při připojování souborů do kontejneru SQL Server:

    chmod 440 /container/sql1/mssql.pem
    chmod 440 /container/sql1/mssql.key
    
  3. Nyní vytvořte mssql.conf soubor s následujícím obsahem, který umožní šifrování iniciované serverem. Pro šifrování iniciované klientem změňte poslední řádek na forceencryption = 0.

    [network]
    tlscert = /etc/ssl/certs/mssql.pem
    tlskey = /etc/ssl/private/mssql.key
    tlsprotocols = 1.2
    forceencryption = 1
    

    Note

    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.conf pro kontejnery SQL Serveru ověřte cestu. Umístění, které jste nastavili v mssql.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.conf je 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.keya mssql.pem ve složce sql1.

  4. 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-latest
    

    V předchozím příkazu jste připojili soubory mssql.conf, mssql.pem a mssql.key ke kontejneru a namapovali výchozí port SQL Serveru 1433 v kontejneru na port 5434 na hostiteli.

    Note

    Pokud používáte Red Hat Enterprise Linux 8 a novější verze, můžete místo příkazu podman runpoužít docker run příkaz .

Postupujte podle sekcí "Zaregistrujte certifikát na svém klientském stroji" a "Příklady spojovacích řetězců" zdokumentovaných v šifrování iniciovaném klientem, abyste mohli začít šifrovat připojení k SQL Server on Linux kontejnerům.

  • Začněte s obrazy kontejnerů SQL Serveru 2017 (14.x) v Dockeru pomocí rychlého startu .
  • Začněte pracovat s image kontejneru SQL Serveru 2019 (15.x) na Dockeru tím, že projdete rychlý průvodce
  • 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