Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a: SQL Server no Linux
Contêineres do SQL Server 2017 (14.x) são iniciados como o usuário raiz por padrão, o que pode causar algumas preocupações de segurança. Este artigo aborda as opções de segurança disponíveis ao executar contêineres do SQL Server no Linux e como criar um contêiner do SQL Server como um usuário não raiz.
Os exemplos neste artigo pressupõem que você esteja usando o Docker, mas você pode aplicar os mesmos princípios a outras ferramentas de orquestração de contêiner, incluindo o Kubernetes.
Criar e executar contêineres sem privilégios de root do SQL Server 2017
Siga estas etapas para criar um contêiner do SQL Server 2017 (14.x) que inicia como o usuário mssql (não-root).
Note
Contêineres para SQL Server 2019 (15.x) e versões posteriores iniciam automaticamente como não raiz, enquanto os contêineres do SQL Server 2017 (14.x) iniciam como raiz por padrão. Para mais informações, consulte Executar o contêiner como um usuário diferente, sem privilégios de root, no host.
Baixe o Dockerfile de exemplo para contêineres do SQL Server não raiz e salve-o como
Dockerfile.Execute o seguinte comando no diretório que contém o Dockerfile para construir o contêiner SQL Server não root:
cd <path to Dockerfile directory> docker build -t 2017-latest-non-root .Inicie o contêiner.
Importante
A variável de ambiente
SA_PASSWORDfoi preterida. UseMSSQL_SA_PASSWORDem seu lugar.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
O flag
--cap-add SYS_PTRACEé necessário para contêineres de SQL Server sem privilégios de root gerarem despejos para fins de solução de problemas.Verifique se o container está rodando como um usuário não root:
docker exec -it sql1 bashExecute
whoami, que retorna o usuário em execução dentro do contêiner.whoami
Executar o contêiner como um usuário não raiz diferente no host
Para executar o contêiner do SQL Server como um usuário não raiz diferente, adicione o sinalizador -u ao comando docker run. O contêiner não raiz tem a restrição de que precisa ser executado como parte do grupo root, a menos que um volume seja montado em /var/opt/mssql, ao qual o usuário não raiz tenha acesso. O grupo root não concede permissões de raiz extras ao usuário não raiz.
Executar como um usuário com UID 4000
Você pode iniciar o SQL Server com uma UID personalizada. Por exemplo, o seguinte comando inicia o SQL Server com 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
Certifique-se de que o contêiner do SQL Server tenha um usuário nomeado, como mssql ou root. Caso contrário, sqlcmd não dá para rodar dentro do container. Você pode verificar se o contêiner do SQL Server está sendo executado como um usuário nomeado executando whoami dentro do contêiner.
Executar o contêiner não raiz como o usuário raiz
Você pode rodar o contêiner não-root como usuário root, se necessário, o que também concede automaticamente todas as permissões de arquivo ao container, porque ele tem privilégios maiores.
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
Executar como um usuário na sua máquina host
Você pode iniciar o SQL Server com um usuário existente no computador host com o seguinte comando:
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
Executar como um usuário e grupo diferentes
Você pode iniciar o SQL Server com um usuário e um grupo personalizados. Neste exemplo, o volume montado tem permissões configuradas para o usuário ou o grupo no computador 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
Configurar permissões de armazenamento persistente para contêineres não raiz
Para permitir que o usuário não root acesse arquivos de banco de dados que estejam em volumes montados, certifique-se de que o usuário ou grupo sob o qual você executa o contêiner possa ler e gravar no armazenamento persistente de arquivos.
Você pode obter a propriedade atual dos arquivos de banco de dados com este comando.
ls -ll <database file dir>
Execute um dos comandos a seguir se o SQL Server não tiver acesso aos arquivos de banco de dados persistentes.
Conceder ao grupo raiz acesso de leitura/gravação aos arquivos de banco de dados
Conceda as permissões do grupo raiz aos seguintes diretórios para que o contêiner do SQL Server não raiz tenha acesso aos arquivos de banco de dados.
chgrp -R 0 <database file dir>
chmod -R g=u <database file dir>
Definir o usuário não raiz como o proprietário dos arquivos
O proprietário pode ser o usuário não raiz padrão ou qualquer outro usuário não raiz que você gostaria de especificar. Neste exemplo, você define o UID 10001 como o usuário não raiz.
chown -R 10001:0 <database file dir>
Criptografar conexões com os contêineres do SQL Server no Linux
Importante
Quando você configura opções de autenticação ou criptografia do Active Directory, como Transparent Data Encryption (TDE) e TLS para SQL Server em Linux ou containers, há vários arquivos, como a keytab, certificados e chave de máquina, que são criados por padrão na pasta /var/opt/mssql/secrets, cujo acesso é restrito por padrão a mssql e root usuários. Ao configurar o armazenamento persistente para contêineres do SQL Server, use a mesma estratégia de acesso, garantindo que o caminho no host ou no volume compartilhado mapeado para a pasta /var/opt/mssql/secrets dentro do contêiner seja protegido e acessível somente para os usuários mssql e root no host. Se o acesso a esse caminho/pasta estiver comprometido, um usuário mal-intencionado poderá obter acesso a esses arquivos críticos, comprometendo a hierarquia de criptografia e/ou as configurações do Active Directory.
Para criptografar conexões com os contêineres do SQL Server no Linux, você precisará de um certificado com os requisitos a seguir.
A seguir está um exemplo de como a conexão pode ser criptografada para os contêineres do SQL Server no Linux. Aqui você usa um certificado autoassinado, que não deve ser usado para cenários de produção. Para esses ambientes, você deve usar certificados de Autoridade Certificadora.
Crie um certificado autoassinado, que é adequado somente para ambientes de teste e de não produção.
openssl req -x509 -nodes -newkey rsa:2048 -subj '/CN=sql1.contoso.com' -keyout /container/sql1/mssql.key -out /container/sql1/mssql.pem -days 365No exemplo de código anterior,
sql1é o nome do host do contêiner de SQL, portanto, ao se conectar a esse contêiner, o nome usado na cadeia de conexão serásql1.contoso.com,5434. Você também deve garantir que o caminho/container/sql1/da pasta já exista antes de executar o comando anterior.Certifique-se de definir as permissões corretas nos arquivos
mssql.keyemssql.pem, para evitar erros ao montar esses arquivos no contêiner do SQL Server:chmod 440 /container/sql1/mssql.pem chmod 440 /container/sql1/mssql.keyAgora crie um
mssql.confarquivo com o conteúdo a seguir para habilitar a criptografia iniciada pelo servidor. Para criptografia iniciada pelo cliente, mude a última linha paraforceencryption = 0.[network] tlscert = /etc/ssl/certs/mssql.pem tlskey = /etc/ssl/private/mssql.key tlsprotocols = 1.2 forceencryption = 1Note
Para algumas distribuições do Linux, o caminho para armazenar o certificado e a chave também pode ser
/etc/pki/tls/certs/e/etc/pki/tls/private/, respectivamente, . Verifique o caminho antes de atualizar omssql.confpara contêineres do SQL Server. O local que você definir nomssql.confé o local onde o SQL Server no contêiner vai procurar o certificado e sua chave. Nesse caso, esse local é/etc/ssl/certs/e/etc/ssl/private/.O arquivo
mssql.conftambém é criado na mesma localização da pasta/container/sql1/. Após executar as etapas acima, você deve ter três arquivos:mssql.conf,mssql.keyemssql.pemna pastasql1.Implante o contêiner do SQL Server com o seguinte comando (substitua
<password>por uma senha válida):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-latestNo comando anterior, você montou os arquivos
mssql.conf,mssql.pememssql.keyno contêiner e mapeou a porta padrão 1433 do SQL Server no contêiner para a porta 5434 no host.Note
Se você usar o Red Hat Enterprise Linux 8 e versões posteriores, também poderá usar o
podman runcomando em vez dedocker run.
Siga as seções "Registrar o certificado na sua máquina cliente" e "Exemplos de cadeias de conexão" documentadas em criptografia iniciada pelo cliente para começar a criptografar conexões para o SQL Server em Linux containers.
Conteúdo relacionado
- Comece a usar as imagens de contêiner do SQL Server 2017 (14.x) no Docker acompanhando o guia de início rápido
- Comece a usar as imagens de contêiner do SQL Server 2019 (15.x) no Docker acompanhando o guia de início rápido
- Comece a usar as imagens de contêiner do SQL Server 2022 (16.x) no Docker acompanhando o guia de início rápido
- Comece a usar as imagens de contêiner do SQL Server 2025 (17.x) no Docker acompanhando o guia de início rápido