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.
Este artigo explica como usar o SQL Server Always Encrypted com aplicações Django através do mssql-django backend. O Always Encrypted fornece encriptação ao nível das colunas que protege dados sensíveis em repouso e em trânsito.
Pré-requisitos
- Microsoft ODBC Driver 17 ou 18 para SQL Server
- SQL Server 2016 ou posterior, ou Base de Dados SQL do Azure
- Encriptação de colunas configurada no SQL Server (chave mestra de coluna e chave de encriptação de coluna)
Como funciona
O Always Encrypted é tratado pela camada do driver ODBC, não pelo próprio Django. Quando ativas o ColumnEncryption parâmetro ODBC, o driver encripta e desencripta automaticamente os dados à medida que passam entre a tua aplicação e o SQL Server. Os modelos Django e as consultas funcionam da mesma forma, quer as colunas estejam encriptadas ou não.
Armazenamento de certificados do Windows
Quando as chaves mestras das colunas estiverem armazenadas na loja de certificados do Windows, ative o Always Encrypted adicionando ColumnEncryption=Enabled a extra_params:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"USER": "<your-username>",
"PASSWORD": "<your-password>",
"HOST": "<your-server>",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": "ColumnEncryption=Enabled",
},
},
}
Esta abordagem funciona apenas no Windows.
Azure Key Vault com ID do cliente e segredo
Quando as chaves mestras das colunas são armazenadas no Azure Key Vault, forneça as credenciais da aplicação emextra_params:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"USER": "<your-username>",
"PASSWORD": "<your-password>",
"HOST": "<your-server>",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": (
"ColumnEncryption=Enabled;"
"KeyStoreAuthentication=KeyVaultClientSecret;"
"KeyStorePrincipalId=<application-client-id>;"
"KeyStoreSecret=<client-secret>"
),
},
},
}
Substitua <application-client-id> e <client-secret> pelo ID da Aplicação (cliente) e pelo valor do segredo do cliente do registo da aplicação.
Importante
Não codifique segredos de forma rígida em settings.py. Use variáveis de ambiente ou um gestor de segredos para fornecer credenciais em tempo de execução.
Azure Key Vault com identidade gerida
Ao correr no Azure (por exemplo, Máquinas Virtuais do Azure ou Serviço de Aplicações do Azure), use a identidade gerida para aceder ao Azure Key Vault.
Identidade gerenciada atribuída ao sistema
Não é necessária nenhuma configuração extra para além do KeyStoreAuthentication parâmetro:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"HOST": "<your-server>.database.windows.net",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": (
"ColumnEncryption=Enabled;"
"KeyStoreAuthentication=KeyVaultManagedIdentity"
),
},
},
}
Identidade gerenciada atribuída pelo usuário
Inclua o ID do cliente da identidade gerida (também chamado ID da aplicação):
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "<your-database>",
"HOST": "<your-server>.database.windows.net",
"PORT": "1433",
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"extra_params": (
"ColumnEncryption=Enabled;"
"KeyStoreAuthentication=KeyVaultManagedIdentity;"
"KeyStorePrincipalId=<managed-identity-client-id>"
),
},
},
}
Conceder permissões de identidade gerida
Conceder à identidade gerida acesso à sua base de dados do SQL do Azure:
CREATE USER [<identity-name>] FOR EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [<identity-name>]; ALTER ROLE db_datawriter ADD MEMBER [<identity-name>]; GRANT VIEW ANY COLUMN MASTER KEY DEFINITION TO [<identity-name>]; GRANT VIEW ANY COLUMN ENCRYPTION KEY DEFINITION TO [<identity-name>];Conceda à identidade gerida acesso ao Azure Key Vault que armazena a chave mestra de coluna, com as permissões indicadas na documentação do Always Encrypted Azure Key Vault.
Deixe o Django gerir tabelas encriptadas
Ao usar o Always Encrypted com o Django, configure primeiro os objetos de encriptação no SQL Server e depois execute migrações.
Ordem recomendada:
- Crie a chave mestra da coluna (CMK) e a chave de encriptação da coluna (CEK) no SQL Server ou SQL do Azure.
- Configurar
ColumnEncryption=Enablednas definições de ligação do Django. - Executa migrações de Django.
- Encripte as colunas de destino com SQL Server Management Studio ou T-SQL.
Execute as migrações:
python manage.py migrate
mssql-django não cria nem gere metadados de chave Always Crypted. A criação de chaves e a política de encriptação das colunas continuam a ser tarefas administrativas do SQL Server.
Métodos de autenticação não suportados
A autenticação interativa do nome de utilizador/palavra-passe e do Azure Key Vault não é suportada para acesso ao arquivo de chaves do Always Encrypted.