Esta página descreve como implementar a encriptação do lado do cliente no Cloud SQL.
Vista geral
A encriptação do lado do cliente é o ato de encriptar dados antes de os escrever no Cloud SQL. Pode encriptar os dados do Cloud SQL de forma que apenas a sua aplicação os possa desencriptar.
Para ativar a encriptação por parte do cliente, tem as seguintes opções:
- Usando uma chave de encriptação armazenada no Cloud Key Management Service (Cloud KMS).
- Usando uma chave de encriptação armazenada localmente na sua aplicação.
Neste documento, descrevemos como usar a primeira opção, que oferece a opção de gestão de chaves mais transparente. Criamos uma chave de encriptação no Cloud KMS e implementamos a encriptação em envelope através da biblioteca criptográfica de código aberto Tink Google.
Por que motivo precisa da encriptação por parte do cliente?
Precisa da encriptação do lado do cliente se quiser proteger os dados do Cloud SQL ao nível da coluna. Imagine que tem uma tabela de nomes e números de cartões de crédito. Quer conceder a um utilizador acesso a esta tabela, mas não quer que este veja os números dos cartões de crédito. Pode encriptar os números através da encriptação por parte do cliente. Enquanto o utilizador não tiver acesso à chave de encriptação no Cloud KMS, não pode ler as informações do cartão de crédito.
Também pode restringir o acesso ao nível da instância ou da base de dados.
Crie chaves com o Cloud KMS
O Cloud KMS permite-lhe criar e gerir chaves no Google Cloud.
O Cloud KMS suporta muitos tipos de chaves diferentes. Para a encriptação do lado do cliente, tem de criar uma chave simétrica.
Para conceder à sua aplicação acesso à chave no Cloud KMS, tem de conceder à conta de serviço que a sua aplicação usa a função cloudkms.cryptoKeyEncrypterDecrypter
. Na CLI gcloud, usa o seguinte comando para o fazer:
gcloud kms keys add-iam-policy-binding key \ --keyring=key-ring \ --location=location \ --member=serviceAccount:[email protected] \ --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
Embora possa usar a chave do KMS para encriptar dados diretamente, aqui usamos uma solução mais flexível chamada encriptação de envelopes. Isto permite-nos encriptar mensagens com mais de 64 KB, que é o tamanho máximo de mensagens que a API Cloud Key Management Service pode suportar.
Encriptação de envelope do Cloud KMS
Na encriptação de envelope, a chave do KMS funciona como uma chave de encriptação de chaves (KEK). Ou seja, é usada para encriptar chaves de encriptação de dados (DEK), que, por sua vez, são usadas para encriptar dados reais.
Depois de criar uma KEK no Cloud KMS, para encriptar cada mensagem, tem de:
- Gerar uma chave de encriptação de dados (DEK) localmente.
- Use esta DEK localmente para encriptar a mensagem.
- Chamar o Cloud KMS para encriptar (envolver) a DEK com a KEK.
- Armazenar os dados encriptados e a DEK envolvida.
Em vez de implementar a encriptação de envelope desde o início, neste documento, usamos o Tink.
Tink
O Tink é uma biblioteca multiplataforma e em vários idiomas que fornece APIs criptográficas de alto nível. Para encriptar dados com a encriptação em envelope do Tink, fornece ao Tink um URI de chave que aponta para a sua KEK no Cloud KMS e credenciais que permitem ao Tink usar a KEK. O Tink gera a DEK, encripta os dados, envolve a DEK e devolve um único texto cifrado com os dados encriptados e a DEK envolvida.
O Tink suporta a encriptação de envelopes em C++, Java, Go e Python através da API AEAD:
public interface Aead{
byte[] encrypt(final byte[] plaintext, final byte[] associatedData)
throws…
byte[] decrypt(final byte[] ciphertext, final byte[] associatedData)
throws…
}
Além do argumento normal de mensagem/texto cifrado, os métodos de encriptação e desencriptação suportam dados associados opcionais. Este argumento pode ser usado para associar o texto cifrado a um conjunto de dados. Por exemplo, suponhamos que tem uma base de dados com um campo user-id
e um campo encrypted-medical-history
. Neste caso, o campo
user-id
deve provavelmente ser usado como dados associados ao encriptar o histórico
médico. Isto garante que um atacante não pode mover o histórico médico de um utilizador para outro. Também é usado para verificar se tem a linha de dados correta quando executa uma consulta.
Amostras
Nesta secção, vamos analisar o código de exemplo de uma base de dados de informações de eleitores que usa a encriptação do lado do cliente. O exemplo de código mostra como:
- Crie uma tabela de base de dados e um conjunto de ligações
- Configure o Tink para a encriptação de envelopes
- Encriptar e desencriptar dados usando a encriptação de envelope do Tink com uma KEK no Cloud KMS
Antes de começar
Crie uma instância do Cloud SQL seguindo estas instruções. Tome nota da cadeia de caracteres de ligação, do utilizador da base de dados e da palavra-passe da base de dados que criar.
Crie uma base de dados para a sua aplicação seguindo estas instruções. Tome nota do nome da base de dados.
Crie uma chave do KMS para a sua aplicação seguindo estas instruções. Copie o nome do recurso da chave criada.
Crie uma conta de serviço com as autorizações de "cliente do Cloud SQL" seguindo estas instruções.
Adicione a autorização "Encriptador/desencriptador de CryptoKey do Cloud KMS" para a chave à sua conta de serviço seguindo estas instruções.