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.
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_PASSWORD
se 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-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íží.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.
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ězcisql1.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.Ujistěte se, že pro soubory
mssql.key
amssql.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
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 naforceencryption = 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 vmssql.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.key
amssql.pem
ve 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-latest
V předchozím příkazu jsme připojili
mssql.conf
,mssql.pem
amssql.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 run
použít příkazdocker 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.
Související obsah
- Začněte s imagí kontejneru SQL Serveru 2022 (16.x) na Dockeru a projděte si rychlý průvodce.