Sdílet prostřednictvím


Zabezpečení kontejnerů SQL Serveru s Linuxem

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.

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

  2. 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 .
    
  3. Spusťte kontejner.

    Důležitý

    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
    

    Poznámka

    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, že kontejner běží jako uživatel, který není root:

    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

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.

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

  2. Ujistěte se, že pro soubory mssql.key a mssql.pem nastaví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.key
    
  3. Teď vytvořte mssql.conf soubor s následujícím obsahem, který povolí šifrování iniciované serverem. U šifrování iniciovaného 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
    

    Pozná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.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 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žít docker run pří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.

  • Začněte s obrazy kontejnerů pro SQL Server 2017 (14.x) v Dockeru tím, že si projdete rychlý start
  • Začněte s obrazy kontejneru SQL Serveru 2019 (15.x) v Dockeru, projděte si rychlý start .
  • 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