Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Si applica a:SQL Server su Linux
I contenitori di SQL Server 2017 (14.x) vengono avviati come utente ROOT per impostazione predefinita, causando alcuni problemi di sicurezza. Questo articolo illustra le opzioni di sicurezza disponibili quando si eseguono contenitori Linux di SQL Server e come creare un contenitore di SQL Server come utente non root.
Gli esempi in questo articolo ipotizzano che si usi Docker, ma è possibile applicare gli stessi principi ad altri strumenti di orchestrazione dei contenitori, tra cui Kubernetes.
Compilare ed eseguire contenitori di SQL Server 2017 non root
Eseguire la procedura seguente per creare un contenitore di SQL Server 2017 (14.x) che si avvia come utente mssql (non root).
Note
I contenitori di SQL Server 2019 (15.x) e versioni successive vengono avviati automaticamente come contenitori non root, mentre i contenitori di SQL Server 2017 (14.x) vengono avviati come contenitori root per impostazione predefinita. Per ulteriori informazioni, vedere Eseguire il contenitore come un utente non root diverso sull'host.
Scaricare il dockerfile di esempio per il contenitore di SQL Server non root e salvarlo come
Dockerfile.Esegui il seguente comando nella directory che contiene il Dockerfile per costruire il contenitore SQL Server non root:
cd <path to Dockerfile directory> docker build -t 2017-latest-non-root .Avviare il contenitore.
Importante
La variabile di ambiente
SA_PASSWORDè deprecata. Utilizzare inveceMSSQL_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-rootNote
Il flag
--cap-add SYS_PTRACEè necessario per i contenitori di SQL Server non radice per generare dump a scopo di risoluzione dei problemi.Controlla che il contenitore sia in esecuzione come utente non root:
docker exec -it sql1 bashEseguire
whoami, che restituirà l'utente in esecuzione nel contenitore.whoami
Eseguire il contenitore come un altro utente non root nell'host
Per eseguire il contenitore di SQL Server come un altro utente non root, aggiungere il flag -u al comando docker run. Il contenitore non root prevede una restrizione, ovvero deve essere eseguito nell’ambito del gruppo root, a meno che non venga montato un volume in /var/opt/mssql a cui l'utente non root può accedere. Il gruppo root non concede alcuna autorizzazione root aggiuntiva all'utente non root.
Esegui come utente con UID 4000
È possibile avviare SQL Server con un UID personalizzato. Ad esempio, il comando seguente avvia SQL Server con l'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
Avviso
Assicurati che il container di SQL Server abbia un utente nominato, come mssql o root. Altrimenti, sqlcmd non può essere eseguito all'interno del container. È possibile verificare se il contenitore di SQL Server è in esecuzione come utente denominato eseguendo whoami nel contenitore.
Eseguire il container non-root come utente root
Puoi eseguire il contenitore non root come utente root se necessario, che concede automaticamente tutti i permessi ai file al container, perché ha privilegi più elevati.
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
Esegui come utente sulla macchina host
È possibile avviare SQL Server con un utente esistente nel computer host con il comando seguente:
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
Eseguire come utente e gruppo diversi
È possibile avviare SQL Server con un utente e un gruppo personalizzati. In questo esempio, il volume montato ha le autorizzazioni configurate per l'utente o il gruppo nel computer host.
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
Configurare le autorizzazioni di archiviazione permanenti per i contenitori non root
Per permettere all'utente non root di accedere ai file del database presenti su volumi montati, assicurati che l'utente o il gruppo sotto cui esegui il contenitore possa leggere e scrivere sullo storage persistente dei file.
È possibile ottenere la proprietà corrente dei file di database con questo comando.
ls -ll <database file dir>
Se SQL Server non ha accesso ai file di database persistenti, eseguire uno dei comandi seguenti.
Concedere al gruppo root l'accesso in lettura/scrittura ai file di database
Concedere le autorizzazioni al gruppo root per le directory seguenti in modo che il contenitore SQL Server senza privilegi di root abbia accesso ai file di database.
chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>
Impostare l'utente non root come proprietario dei file
Il proprietario può essere l'utente non radice predefinito o qualsiasi altro utente non radice che si vuole specificare. In questo esempio si imposta UID 10001 come utente non radice.
chown -R 10001:0 <database file dir>
Crittografare le connessioni ai contenitori Linux di SQL Server
Importante
Quando si configurano opzioni di autenticazione o crittografia Active Directory come Transparent Data Encryption (TDE) e TLS per SQL Server in Linux o container, ci sono diversi file, come keytab, certificati e chiave macchina, creati di default sotto la cartella/var/opt/mssql/secrets, e l'accesso a cui è limitato di default a mssql e root utenti. Quando si configura l'archiviazione permanente per i contenitori di SQL Server, usare la stessa strategia di accesso, assicurandosi che anche il percorso nell'host o nel volume condiviso mappato alla /var/opt/mssql/secrets cartella all'interno del contenitore sia protetto e accessibile solo agli mssql utenti e root nell'host. Se l'accesso a questo percorso/cartella viene compromesso, un utente malintenzionato può accedere a questi file critici, compromettendo la gerarchia di crittografia e/o le configurazioni di Active Directory.
Per crittografare le connessioni ai contenitori Linux di SQL Server, è necessario un certificato con i requisiti seguenti.
Nel seguito è riportato un esempio di come è possibile crittografare la connessione a contenitori Linux di SQL Server. In questo caso si usa un certificato autofirmato, che non deve essere usato per gli scenari di produzione. Per questi ambienti, usare invece i certificati della CA.
Creare un certificato autofirmato, adatto solo per ambienti di test e non di produzione.
openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=sql1.contoso.com' -keyout /container/sql1/mssql.key -out /container/sql1/mssql.pem -days 365Nell’esempio di codice precedente,
sql1è il nome host del contenitore SQL, quindi quando ci si connette a questo contenitore il nome usato nella stringa di connessione saràsql1.contoso.com,5434. È anche necessario assicurarsi che il percorso/container/sql1/della cartella esista già prima di eseguire il comando precedente.Assicurati di impostare i permessi corretti sui
mssql.keyfile e,mssql.pemcosì da evitare errori quando monti i file nel container SQL Server:chmod 440 /container/sql1/mssql.pem chmod 440 /container/sql1/mssql.keyOra crea un
mssql.conffile con il seguente contenuto per abilitare la crittografia avviata dal server. Per la crittografia avviata dal cliente, cambiare l'ultima riga inforceencryption = 0.[network] tlscert = /etc/ssl/certs/mssql.pem tlskey = /etc/ssl/private/mssql.key tlsprotocols = 1.2 forceencryption = 1Note
Per alcune distribuzioni di Linux, il percorso per l'archiviazione del certificato e della chiave potrebbe anche essere
/etc/pki/tls/certs/e/etc/pki/tls/private/rispettivamente. Verificare il percorso prima di aggiornare ilmssql.confper i contenitori di SQL Server. Il percorso impostato inmssql.confè il percorso in cui SQL Server nel contenitore cercherà il certificato e la relativa chiave. In questo caso, la posizione è/etc/ssl/certs/e/etc/ssl/private/.Viene anche creato il file
mssql.confnello stesso percorso della cartella/container/sql1/. Al termine dell'esecuzione dei passaggi precedenti, i tre filemssql.conf,mssql.keyemssql.pemdovrebbero essere presenti nella cartellasql1.Distribuire il contenitore di SQL Server con il comando seguente (sostituire
<password>con una password valida):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-latestNel comando precedente, montavi i
mssql.conffile ,mssql.pem, emssql.keysul container e mappavi la porta predefinita 1433 di SQL Server nel container alla porta 5434 dell'host.Note
Se si usa Red Hat Enterprise Linux 8 e versioni successive, è anche possibile usare il
podman runcomando anzichédocker run.
Segui le sezioni "Registra il certificato sulla tua macchina client" e "Esempi stringhe di connessione" documentate in crittografia iniziata dal cliente per iniziare a criptare le connessioni a SQL Server in Linux container.
Contenuti correlati
- Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2017 (14.x) in Docker, vedere questo articolo di avvio rapido
- Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2019 (15.x) in Docker, vedere questo articolo di avvio rapido
- Per informazioni introduttive sull'uso delle immagini del contenitore di SQL Server 2022 (16.x) in Docker, vedere questo articolo di avvio rapido
- Introduzione alle immagini del contenitore di SQL Server 2025 (17.x) in Docker eseguendo la guida introduttiva