Recomendar quando usar o Banco de Dados SQL do Azure Always Encrypted

Concluído

O Always Encrypted é um recurso projetado para proteger dados confidenciais, como números de cartão de crédito ou números de identificação nacionais/regionais (por exemplo, números de segurança social dos EUA), armazenados no Banco de Dados SQL do Azure, na Instância Gerenciada SQL do Azure e nos bancos de dados do SQL Server. O Always Encrypted permite que os clientes criptografem dados confidenciais dentro de aplicativos cliente e nunca revelem as chaves de criptografia para o Mecanismo de Banco de Dados. Isso fornece uma separação entre aqueles que possuem os dados e podem visualizá-los e aqueles que gerenciam os dados, mas não devem ter acesso - administradores de banco de dados locais, operadores de banco de dados em nuvem ou outros usuários não autorizados com privilégios elevados. Como resultado, o Always Encrypted permite que os clientes armazenem com confiança seus dados confidenciais na nuvem e reduzam a probabilidade de roubo de dados por insiders mal-intencionados.

Always Encrypted pode ser configurado para suportar consultas confidenciais limitadas em dados criptografados, as consultas que envolvem comparações de igualdade. Por exemplo, pesquisas de pesquisa de pontos ou associações de igualdade. Essas consultas aproveitam a criptografia determinística.

Diagrama mostrando um exemplo de um banco de dados sempre criptografado.

Nota

Enclaves seguros estendem recursos de computação confidenciais do Always Encrypted com correspondência de padrões, outros operadores de comparação e criptografia in-loco.

O Always Encrypted torna a encriptação transparente para as aplicações. Um driver habilitado para Always Encrypted instalado no computador cliente consegue isso criptografando e descriptografando automaticamente dados confidenciais no aplicativo cliente. O driver criptografa os dados em colunas confidenciais antes de passar os dados para o Mecanismo de Banco de Dados e reescreve automaticamente as consultas para que a semântica do aplicativo seja preservada. Da mesma forma, o driver descriptografa dados de forma transparente, armazenados em colunas de banco de dados criptografadas, contidos nos resultados da consulta.

Configurar Sempre Criptografado

Para configurar o Always Encrypted em seu banco de dados, você precisa:

  1. Provisione chaves criptográficas para proteger seus dados. Always Encrypted usa dois tipos de chaves:

    • Chaves de criptografia de coluna.
    • Teclas mestras de coluna.

    Uma chave de criptografia de coluna é usada para criptografar dados em uma coluna criptografada. Uma chave mestra de coluna é uma chave de proteção de chave que criptografa uma ou mais chaves de criptografia de coluna.

    Você precisa armazenar chaves mestras de coluna em um armazenamento de chaves confiáveis fora do sistema de banco de dados, como o Cofre de Chaves do Azure, o armazenamento de certificados do Windows ou um módulo de segurança de hardware.

    Em seguida, você precisa provisionar chaves de criptografia de coluna e criptografar cada uma delas com uma chave mestra de coluna.

    Finalmente, você precisa armazenar os metadados sobre as chaves em seu banco de dados.

    • Os metadados da chave mestra de coluna capturam o local da chave mestra de coluna.
    • Os metadados da chave de criptografia de coluna contêm o valor criptografado da chave de criptografia de coluna. O Mecanismo de Banco de Dados nunca armazena ou usa as chaves de qualquer tipo em texto sem formatação.
  2. Configure a criptografia para colunas de banco de dados selecionadas que contenham dados confidenciais a serem protegidos. Isso pode envolver a criação de novas tabelas com colunas criptografadas ou a criptografia de colunas de banco de dados existentes e dados existentes. Ao configurar a criptografia para uma coluna, você especifica as informações sobre um algoritmo de criptografia, uma chave de criptografia de coluna para proteger os dados na coluna e um tipo de criptografia. O Always Encrypted suporta dois tipos de encriptação:

    • A criptografia determinística sempre gera o mesmo valor criptografado para um determinado valor de texto sem formatação. O uso de criptografia determinística permite pesquisas pontuais, uniões de igualdade, agrupamento e indexação em colunas criptografadas. No entanto, ele também pode permitir que usuários não autorizados adivinhem informações sobre valores criptografados examinando padrões na coluna criptografada, especialmente se houver um pequeno conjunto de possíveis valores criptografados, como Verdadeiro/Falso ou região Norte/Sul/Leste/Oeste.
    • A criptografia aleatória usa um método que criptografa dados de maneira menos previsível. A criptografia aleatória é mais segura, mas impede pesquisa, agrupamento, indexação e junção em colunas criptografadas.

    Use criptografia determinística para colunas que serão usadas como parâmetros de pesquisa ou agrupamento. Por exemplo, um número de identificação do governo. Use criptografia aleatória para dados como comentários confidenciais de investigação, que não são agrupados com outros registros e não são usados para unir tabelas.

    Para obter detalhes sobre algoritmos criptográficos Always Encrypted, consulte Always Encrypted cryptography.

    Você pode executar as etapas acima usando ferramentas SQL:

    Para garantir que as chaves Always Encrypted e os dados confidenciais protegidos nunca sejam revelados em texto sem formatação para o ambiente de banco de dados, o Mecanismo de Banco de Dados não pode estar envolvido no provisionamento de chaves e criptografia de dados ou em operações de descriptografia. Portanto, o Transact-SQL (T-SQL) não oferece suporte a provisionamento de chaves ou operações criptográficas. Pelo mesmo motivo, criptografar dados existentes ou criptografá-los novamente (com um tipo de criptografia diferente ou uma chave de criptografia de coluna) precisa ser executado fora do banco de dados (as ferramentas SQL podem automatizar isso).

    Nota

    Always Encrypted com enclaves seguros levanta algumas das restrições acima, permitindo operações criptográficas em dados existentes usando T-SQL, e elimina a necessidade de mover os dados para fora do banco de dados.

Como funcionam as consultas em colunas criptografadas

Para executar uma consulta em colunas de banco de dados criptografadas, inserir dados em colunas criptografadas, recuperar valores de texto sem formatação de colunas criptografadas ou executar operações com suporte (por exemplo, pesquisas de pesquisa de ponto) em colunas usando criptografia determinística, um usuário ou um aplicativo que emite a consulta deve atender aos seguintes pré-requisitos:

  • Tenha acesso à chave mestra da coluna que protege os dados. O acesso à chave é necessário além das permissões no nível do banco de dados, como SELECT na tabela que contém os dados.
  • Conecte-se ao banco de dados com Always Encrypted habilitado na conexão do banco de dados. A maioria das ferramentas SQL e drivers de cliente SQL oferecem suporte à habilitação do Always Encrypted para conexões de banco de dados.

Nota

Se o usuário tiver exigido permissões de banco de dados para ler os dados, mas nenhum acesso às chaves que os protegem, o usuário ainda poderá recuperar dados cyphertext (criptografados) conectando-se ao banco de dados sem habilitar Always Encrypted na conexão de banco de dados.

Veja como funcionam as consultas em colunas criptografadas:

  1. Quando um aplicativo emite uma consulta parametrizada, o driver do cliente SQL dentro do aplicativo contata de forma transparente o Mecanismo de Banco de Dados (chamando sp_describe_parameter_encryption (Transact-SQL) para determinar quais parâmetros visam colunas criptografadas e devem ser criptografados. Para cada parâmetro que precisa ser criptografado, o driver recebe o algoritmo de criptografia, o tipo de criptografia e os metadados da chave, incluindo a chave de criptografia de coluna criptografada e o local de sua chave mestra de coluna correspondente.

  2. O driver chama o armazenamento de chaves, contendo chaves mestras de coluna para descriptografar os valores de chave de criptografia de coluna criptografada. As chaves de criptografia de coluna de texto simples resultantes são armazenadas em cache para reduzir o número de viagens de ida e volta para o armazenamento de chaves em usos subsequentes das mesmas chaves de criptografia de coluna.

  3. O driver usa as chaves de criptografia de coluna de texto simples obtidas para criptografar os parâmetros de consulta correspondentes às colunas criptografadas.

  4. O driver substitui os valores de texto sem formatação dos parâmetros que visam colunas criptografadas por seus valores criptografados e envia a consulta ao Mecanismo de Banco de Dados para processamento.

  5. O Mecanismo de Banco de Dados executa a consulta, que pode envolver comparações de igualdade em colunas usando criptografia determinística.

  6. Se os resultados da consulta incluírem dados de colunas criptografadas, o Mecanismo de Banco de Dados anexará metadados de criptografia para cada coluna, incluindo as informações sobre o algoritmo de criptografia, o tipo de criptografia e os metadados da chave ao conjunto de resultados.

  7. O Mecanismo de Banco de Dados envia o conjunto de resultados para o aplicativo cliente.

  8. Para cada coluna criptografada no conjunto de resultados recebido, o driver primeiro tenta encontrar a chave de criptografia de coluna de texto simples no cache local e só faz uma viagem de ida e volta a um armazenamento de chaves que contém a chave mestra da coluna se não conseguir encontrar a chave no cache.

  9. O driver descriptografa os resultados e retorna valores de texto sem formatação para o aplicativo.

Um driver de cliente interage com um armazenamento de chaves, contendo uma chave mestra de coluna, usando um provedor de armazenamento de chaves mestras de coluna, que é um componente de software do lado do cliente que encapsula um armazenamento de chaves que contém a chave mestra de coluna. Os provedores para tipos comuns de armazenamentos de chaves estão disponíveis em bibliotecas de drivers do lado do cliente da Microsoft ou como downloads autônomos. Você também pode implementar seu próprio provedor. Os recursos Sempre criptografados, incluindo provedores de armazenamento de chaves mestras de coluna integrados, variam de acordo com uma biblioteca de drivers e sua versão.

Consulte Desenvolver aplicativos usando Always Encrypted para obter a lista de drivers de cliente que suportam Always Encrypted e para obter informações sobre como desenvolver aplicativos que consultam colunas criptografadas.

Você também pode consultar colunas criptografadas usando ferramentas SQL, por exemplo, Azure Data Studio ou SSMS.

Limitações

As seguintes limitações aplicam-se a consultas em colunas encriptadas:

  • A criptografia determinística suporta as seguintes operações envolvendo comparações de igualdade - nenhuma outra operação é permitida.
  • Não são permitidos cálculos em colunas criptografadas usando criptografia aleatória.

Nota

Sempre criptografado com enclaves seguros relaxa a restrição acima, permitindo correspondência de padrões, operadores de comparação, classificação e indexação em colunas usando criptografia aleatória.

  • Instruções de consulta que acionam cálculos envolvendo texto sem formatação e dados criptografados não são permitidas. Por exemplo:
    • Comparando uma coluna criptografada com uma coluna de texto sem formatação ou um literal.
    • Copiar dados de uma coluna de texto simples para uma coluna encriptada (ou o contrário) UPDATE, BULK INSERT, SELECT INTO ou INSERT.. SELECIONAR.
    • Inserção de literais em colunas encriptadas.

Tais declarações resultam em erros de choque de operando como este:

Output
Msg 206, Level 16, State 2, Line 89
Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
  • Os aplicativos devem usar parâmetros de consulta para passar valores que correspondem a colunas criptografadas. Por exemplo, ao inserir dados em colunas criptografadas ou filtrar por colunas criptografadas (ao usar criptografia determinística). Não há suporte para a passagem de literais ou variáveis T-SQL correspondentes a colunas criptografadas. Para obter mais informações específicas para um driver de cliente que você está usando, consulte Desenvolver aplicativos usando Always Encrypted.

  • Você deve usar a Parametrização para variáveis Sempre Criptografadas no Azure Data Studio ou no SSMS para emitir consultas que passam valores correspondentes a colunas criptografadas nessas ferramentas. Por exemplo, ao inserir dados em colunas criptografadas ou filtrar por colunas criptografadas (ao usar criptografia determinística).

  • Não há suporte para parâmetros com valor de tabela direcionados a colunas criptografadas.

  • Não há suporte para consultas que usam as seguintes cláusulas:

  • Depois de alterar a definição de uma coluna criptografada, execute sp_refresh_parameter_encryption para atualizar os metadados Always Encrypted para o objeto.

  • Sempre criptografado não é suportado para as colunas com as características abaixo:

    • Colunas usando um dos seguintes tipos de dados: xml, timestamp, rowversion, image, ntext, text, sql_variant, hierarchyid, geography, geometry, alias, user-defined types.
    • Colunas FILESTREAM
    • Colunas com a propriedade IDENTITY .
    • Colunas com propriedade ROWGUIDCOL .
    • Colunas de cadeia de caracteres (varchar, char, etc.) com agrupamentos diferentes de agrupamentos de ponto de código binário (_BIN2) ao usar criptografia determinística.
    • Colunas que são chaves para índices agrupados e não agrupados ao usar criptografia aleatória (índices em colunas usando criptografia determinística são suportados).
    • Colunas incluídas em índices de texto completo (Always Encrypted não suporta Pesquisa de Texto Completo).
    • Colunas computadas.
    • Colunas referenciadas por colunas computadas (quando a expressão faz operações sem suporte para Always Encrypted).
    • Conjunto de colunas esparso.
    • Colunas que são referenciadas por estatísticas ao usar criptografia aleatória (criptografia determinística é suportada).
    • Particionamento de colunas.
    • Colunas com restrições padrão.
    • Colunas referenciadas por restrições exclusivas ao usar criptografia aleatória (criptografia determinística é suportada).
    • Colunas de chave primária ao usar criptografia aleatória (criptografia determinística é suportada).
    • Referenciar colunas em restrições de chave estrangeira ao usar criptografia aleatória ou ao usar criptografia determinística, se as colunas referenciadas e de referência usarem chaves ou algoritmos diferentes.
    • Colunas referenciadas por restrições de verificação.
    • Colunas capturadas/controladas usando a captura de dados de alteração.
    • Colunas de chave primária em tabelas com controle de alterações.
    • Colunas mascaradas (usando mascaramento dinâmico de dados).
    • Colunas em tabelas de banco de dados stretch. (Tabelas com colunas criptografadas com Always Encrypted podem ser habilitadas para Stretch.)
  • Importante

    O Stretch Database foi preterido no SQL Server 2022 (16.x) e no Banco de Dados SQL do Azure. Esse recurso será removido em uma versão futura do Mecanismo de Banco de Dados. Evite usar esse recurso em novos trabalhos de desenvolvimento e planeje modificar aplicativos que atualmente usam esse recurso.

  • Os seguintes recursos não funcionam em colunas criptografadas:

Referência Transact-SQL sempre criptografada

O Always Encrypted usa as seguintes instruções Transact-SQL, exibições do catálogo do sistema, procedimentos armazenados do sistema e permissões.

Extratos

Exibições do catálogo do sistema e procedimentos armazenados

Consulte também sys.columns (Transact-SQL) para obter informações sobre metadados de criptografia armazenados para cada coluna.

Permissões de banco de dados

Há quatro permissões de banco de dados para Always Encrypted:

  • ALTER ANY COLUMN MASTER KEY - necessário para criar e excluir metadados de chave mestra de coluna.
  • ALTER ANY COLUMN ENCRYPTION KEY - necessário para criar e excluir metadados de chave de criptografia de coluna.
  • EXIBIR QUALQUER DEFINIÇÃO DE CHAVE MESTRA DE COLUNA - necessário para acessar e ler os metadados da chave mestra da coluna, que são necessários para consultar colunas criptografadas.
  • VIEW ANY COLUMN ENCRYPTION KEY DEFINITION - necessário para acessar e ler os metadados da chave mestra da coluna, que são necessários para consultar colunas criptografadas.

A tabela a seguir resume as permissões necessárias para ações comuns.

Cenário ALTERAR QUALQUER CHAVE MESTRA DE COLUNA ALTERAR QUALQUER CHAVE DE ENCRIPTAÇÃO DE COLUNA VER QUALQUER DEFINIÇÃO DE CHAVE MESTRA DE COLUNA EXIBIR QUALQUER DEFINIÇÃO DE CHAVE DE CRIPTOGRAFIA DE COLUNA
Gestão de chaves (criação/alteração/revisão de metadados chave na base de dados) X X X X
Consultando colunas criptografadas X X

Considerações importantes

  • As permissões VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION são necessárias ao selecionar colunas criptografadas, mesmo que o usuário não tenha permissão para as chaves mestras de coluna (em seus armazenamentos de chaves), protegendo as colunas e não acesse a tentativa de texto sem formatação.
  • No SQL Server, as permissões VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION são concedidas por padrão à função de banco de dados fixa pública. Um administrador de banco de dados pode optar por revogar (ou negar) as permissões para a função pública e concedê-las a funções ou usuários específicos para implementar um controle mais restrito.
  • No Banco de dados SQL, as permissões VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION não são concedidas por padrão à função de banco de dados fixa pública. Isso permite que certas ferramentas herdadas existentes (usando versões mais antigas do DacFx) funcionem corretamente. Para trabalhar com colunas criptografadas (mesmo que não as descriptografe), um administrador de banco de dados deve conceder explicitamente as permissões VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION.