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 nebude možné 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, aby uživatel, který není rootem, mohl přistupovat k databázovým souborům připojeným svazkům, 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ů

Může se jednat o výchozího uživatele bez oprávnění root nebo o jiného uživatele bez oprávnění root, kterého chcete zadat. V tomto příkladu nastavíme 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ý

Při konfiguraci možností ověřování nebo šifrování služby Active Directory, jako je transparentní šifrování dat (TDE) a SSL pro SQL Server v Linuxu nebo kontejnerech, existuje několik souborů, jako jsou 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, ke kterému je ve výchozím nastavení omezený na mssql a root uživatele. Při konfiguraci trvalého úložiště pro kontejnery SQL Serveru použijte stejnou strategii přístupu, abyste zajistili, že cesta na hostiteli nebo sdíleném svazku mapovaném na složku /var/opt/mssql/secrets uvnitř kontejneru je chráněná a přístupná pouze pro mssql a root uživatele 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žíváme 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 výše uvedeného příkazu musíte také zajistit, aby cesta ke složce /container/sql1/ 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 soubor mssql.conf 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 distribucí Linuxu může být také cesta k uložení certifikátu a klíče: /etc/pki/tls/certs/ a /etc/pki/tls/private/. Před aktualizací mssql.conf pro kontejnery SQL Serveru ověřte cestu. Umístění, které jste nastavili v mssql.conf, bude umístění, kam 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 jsme připojili mssql.conf, mssql.pema mssql.key soubory ke kontejneru a namapovali port 1433 (výchozí port SQL Serveru) v kontejneru na port 5434 na hostiteli.

    Poznámka

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

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.