Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server em Linux
Os contêineres do SQL Server 2017 (14.x) são iniciados como o usuário raiz por padrão, o que pode causar alguns problemas de segurança. Este artigo fala sobre as opções de segurança que você tem ao executar contêineres Linux do SQL Server 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 pode aplicar os mesmos princípios a outras ferramentas de orquestração de contêineres, incluindo o Kubernetes.
Construir e executar contêineres sem privilégio de root do SQL Server 2017
Siga estas etapas para criar um contêiner do SQL Server 2017 (14.x) que se inicie como o usuário mssql (não-root).
Note
Os contêineres para SQL Server 2019 (15.x) e versões posteriores são iniciados automaticamente como não raiz, enquanto os contêineres do SQL Server 2017 (14.x) são iniciados como raiz por padrão. Para mais informações, consulte Executar o contentor como um utilizador diferente sem privilégios de root no anfitrião.
Baixe o Dockerfile de exemplo para contêineres sem raiz do SQL Server e salve-o como
Dockerfile.Execute o seguinte comando no diretório que contém o Dockerfile para construir o contentor SQL Server não root:
cd <path to Dockerfile directory> docker build -t 2017-latest-non-root .Inicie o recipiente.
Importante
A variável de ambiente
SA_PASSWORDfoi preterida. UtilizeMSSQL_SA_PASSWORDem substituição.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 indicador
--cap-add SYS_PTRACEé necessário para que contentores do SQL Server sem privilégios de root gerem dumps para fins de resolução de problemas.Verifique se o contentor está a correr como utilizador não root:
docker exec -it sql1 bashExecute
whoami, que retorna o utilizador em execução dentro do contêiner.whoami
Executar contêiner como um usuário não-root 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 ele deve ser executado como parte do grupo root, a menos que um volume seja montado para /var/opt/mssql que o usuário não raiz possa acessar. O grupo root não concede nenhuma permissão de root extra para o usuário não-root.
Executar como um usuário com um UID 4000
Você pode iniciar o SQL Server com um UID personalizado. 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 contentor do SQL Server tem um utilizador nomeado, como mssql ou root. Caso contrário, sqlcmd não consegue correr dentro do contentor. Você pode verificar se o contêiner do SQL Server está sendo executado como um usuário nomeado executando whoami dentro do contêiner.
Execute o contenedor não-root como o utilizador root
Podes executar o contentor não-root como utilizador root, se necessário, o que também concede automaticamente todas as permissões de ficheiro ao contentor, porque tem privilégios mais elevados.
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 utilizador na sua máquina anfitriã
Você pode iniciar o SQL Server com um usuário existente na máquina 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 utilizador e grupo diferente
Você pode iniciar o SQL Server com um usuário e grupo personalizados. Neste exemplo, o volume montado tem permissões configuradas para o usuário ou grupo na máquina 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 utilizador não root aceda a ficheiros de base de dados que estejam em volumes montados, certifique-se de que o utilizador ou grupo sob o qual executa o contentor pode ler e escrever no armazenamento persistente de ficheiros.
Você pode obter a propriedade atual dos arquivos de banco de dados com este comando.
ls -ll <database file dir>
Execute um dos seguintes comandos se o SQL Server não tiver acesso a arquivos de banco de dados persistentes.
Conceder ao grupo raiz acesso de leitura/gravação aos arquivos de banco de dados
Conceda permissões ao grupo raiz para os seguintes diretórios para que o contêiner não raiz do SQL Server 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-root como o proprietário dos arquivos
O proprietário pode ser o usuário não-root padrão ou qualquer outro usuário não-root que você gostaria de especificar. Neste exemplo, você define UID 10001 como o usuário não-root.
chown -R 10001:0 <database file dir>
Criptografar conexões com contêineres do SQL Server Linux
Importante
Quando configura opções de autenticação ou encriptação do Active Directory, como Encriptação de Dados Transparente (TDE) e TLS para SQL Server em Linux ou contentores, existem vários ficheiros, como o keytab, certificados e chave de máquina, que são criados por defeito na pasta /var/opt/mssql/secrets, cujo acesso é restrito por defeito a mssql e root utilizadores. Ao configurar o armazenamento persistente para contentores do SQL Server, use a mesma estratégia de acesso, garantindo que o caminho no host ou volume compartilhado, mapeado para a pasta /var/opt/mssql/secrets dentro do contentor, esteja protegido e acessível apenas para os utilizadores mssql e root no host também. Se o acesso a esse caminho/pasta for comprometido, um usuário mal-intencionado pode obter acesso a esses arquivos críticos, comprometendo a hierarquia de criptografia e/ou as configurações do Ative Directory.
Para criptografar conexões com contêineres do SQL Server Linux, você precisa de um certificado com os seguintes requisitos de .
A seguir está um exemplo de como a conexão pode ser criptografada para contêineres Linux do SQL Server. Aqui você usa um certificado autoassinado, que não deve ser usado para cenários de produção. Para esses ambientes, deve-se usar certificados de CA.
Crie um certificado autoassinado, que é adequado apenas para ambientes de teste e 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 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 verificar se o caminho/container/sql1/da pasta já existe antes de executar o comando anterior.Certifique-se de configurar as permissões corretas nos ficheiros
mssql.keyemssql.pem, para evitar erros ao montar os ficheiros no contentor do SQL Server:chmod 440 /container/sql1/mssql.pem chmod 440 /container/sql1/mssql.keyAgora crie um
mssql.confficheiro com o seguinte conteúdo para ativar a encriptação iniciada pelo servidor. Para encriptação iniciada pelo cliente, altere 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 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 definido nomssql.confé o local onde o SQL Server no contêiner vai procurar o certificado e sua chave. Neste caso, esse local é/etc/ssl/certs/e/etc/ssl/private/.O arquivo
mssql.conftambém é criado no mesmo local de pasta/container/sql1/. Depois de 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, montaste os ficheiros
mssql.conf,mssql.pememssql.keyno contentor e mapeaste a porta predefinida 1433 do SQL Server no contentor para a porta 5434 no anfitrião.Note
Se você usa o Red Hat Enterprise Linux 8 e versões posteriores, também pode usar
podman runcommand em vez dedocker run.
Siga as secções "Registar o certificado na sua máquina cliente" e "Exemplos de cadeias de ligação" documentadas na encriptação iniciada pelo cliente para começar a encriptar ligações ao SQL Server em Linux containers.
Conteúdo relacionado
- Comece a usar imagens de contentores do SQL Server 2025 (17.x) no Docker passando pelo quickstart