Pesquisa de site

Como criptografar um banco de dados em repouso no PostgreSQL no Ubuntu 22.04


Introdução

PostgreSQL é um sistema de gerenciamento de banco de dados que existe desde 1996. Assim como outros sistemas de banco de dados; SQL, MySQL, Oracle, etc., o objetivo principal do PostgreSQL é fornecer aos usuários uma maneira de criar bancos de dados para armazenamento e recuperação de dados. Um de seus recursos marcantes inclui transações e suporte de simultaneidade.

Este guia demonstra como criptografar um banco de dados no PostgreSQL. O termo Em repouso no título refere-se à criptografia presente no banco de dados mesmo quando não está sendo usada ou reside no disco sem qualquer atividade. A criptografia não é uma questão de deveria, mas sim uma obrigação. Sem a segurança adequada, as informações correm um risco maior de ataques.

Neste tutorial, você aprenderá algumas maneiras de criptografar bancos de dados criados no PostgreSQL. Alguns dos métodos requerem bibliotecas externas, como Z-Lib, OpenSSL etc. Conforme você avança na lista, você finalmente entenderá qual método funciona melhor para você em termos de tempo e eficiência.

Pré-requisitos

Para concluir este tutorial, você precisará de:

  • Um servidor Ubuntu 22.10 configurado seguindo nosso guia Configuração inicial do servidor para Ubuntu 20.04 e, em seguida, configurando uma instalação do PostgreSQL.
  • Instalação das seguintes bibliotecas
  • Búfalo
  • Leia a linha
  • Flexível
  • Zlib
  • OpenSSL
  • Criptografia

através do comando:

sudo apt-get install libreadline8 libreadline-dev zlib1g-dev bison flex libssl-dev openssl

Método 1 – Criptografando banco de dados no disco do sistema

O primeiro método consiste em criptografar o banco de dados enquanto ele está no disco. É a forma mais simples de criptografia disponível que visa o nível do sistema de arquivos.

Para fazer isso, você deve primeiro criar um sistema de arquivos criptografado usando LUKS, que é uma especificação de criptografia de disco criada especificamente para Linux. Assim que o sistema de arquivos criptografado estiver configurado, copiaremos nossos clusters Postgres dentro deste sistema para obter a criptografia desejada.

Primeiro, você deve configurar uma lista de todos os sistemas de arquivos do console da seguinte forma:

df -hl

Uma vez listados todos os sistemas de arquivos, escolha um que não contenha informações importantes porque será formatado posteriormente. Uma unidade USB conectada ao sistema também pode ser usada para criptografia.

Na saída do console após executar o comando acima, você notará uma coluna chamada Montado em. Isso mostra a partição na qual esse sistema de arquivos específico está montado.

Suponhamos que a partição escolhida seja /dev/vda15. Você deve então desmontar da seguinte maneira:

sudo umount /dev/vda15

Em seguida, formate a partição desmontada:

sudo wipefs -a /dev/vda15

Assim que a formatação estiver concluída, é hora de criptografar a partição usando LUKS:

sudo cryptsetup luksFormat /dev/vda15

Isso solicitará uma senha que deve ser fornecida. Certifique-se de inserir uma senha longa e que contenha caracteres alfanuméricos.

Após a criptografia ser concluída, um map_point deve ser criado para que esta partição fique visível no sistema. Isso pode ser conseguido executando o seguinte comando:

sudo cryptsetup luksOpen /dev/vda15 map_point

Este mapeamento pode então ser visto na partição /dev/vda15 usando o comando:

lsblk

Uma partição criptografada agora está perfeitamente configurada. O que precisamos a seguir é um sistema de arquivos para armazenar nossos arquivos dentro da partição.

Isso pode ser conseguido criando um exFat ou FAT32 sistema de arquivos. Por enquanto, vamos criar um sistema de arquivos Fat32 da seguinte forma:

sudo mkfs.vfat /dev/mapper/map_point -n encrypt_part

O comando fornecido acima possui dois parâmetros:

  • /dev/mapper/map_pint : Refere-se ao map_point que criamos anteriormente usando luksOpen.
  • encrypt_part: Este é o nome do volume que você deve mencionar ao criar o sistema de arquivos. Você pode alterá-lo para qualquer nome que desejar.

Agora você só precisa criar um diretório onde montará este sistema de arquivos. Isso pode ser conseguido executando os seguintes comandos:

mkdir /dev/vda15c
sudo mount /dev/mapper/map_point /dev/vda15c

O diretório /dev/vda15c pode ser visto com o sistema de arquivos executando o comando:

df -hl

Nota: a execução do comando lsblk agora mencionará o tipo como crypt na coluna type do map_point.

Seu sistema de arquivos agora está criptografado e pode ser usado para armazenamento de banco de dados. Uma das maneiras de conseguir isso pode ser copiar o banco de dados pré-existente que você deseja proteger para esta partição e desmontá-lo. Quando quiser usá-lo novamente, basta montar a partição novamente e começar a trabalhar no banco de dados.

Faça login em sua conta postgres da seguinte forma:

sudo -i -u postgres

Então, para o prompt, execute isto:

psql

Agora, para visualizar o diretório que contém seus bancos de dados, emita um comando como segue:

show data_directory

Copie o diretório mostrado na saída. Suponhamos que seja algo como /var/lib/postgresql/14/main. Agora que você sabe onde os arquivos do seu banco de dados estão armazenados, basta copiar ou mover esses arquivos para o seu sistema de arquivos criptografado.

Para mover toda a pasta postgresql para seu sistema de arquivos criptografado, você simplesmente precisa executar o seguinte comando após sair da sua conta postgres.

sudo -av /var/lib/postgresql /dev/vda15c

Aviso: você pode ver na saída detalhada que alguns atributos podem não ser transferidos com sucesso. Isso é perfeitamente normal, já que o sistema de arquivos para o qual estamos transferindo os arquivos é do tipo crypt e não permitirá modificações de permissão de nenhuma maneira.

Assim que a transferência for concluída, sua pasta de banco de dados estará criptografada. Você pode então optar por avançar e desmontar e fechar a partição.

Para desmontar, primeiro pare o serviço postgresql e depois emita o comando umount:

sudo systemctl stop postgresql
sudo umount /dev/vda15c

Agora você aprendeu como criptografar o banco de dados postgresql no disco. Pode haver muitas outras modificações neste método, como realocar o diretório postgresql inteiramente no sistema de arquivos para economizar tempo de montagem/desmontagem. Isso será abordado em detalhes em um artigo posterior.

Método 2 – Criptografando banco de dados usando criptografia transparente de dados (TDE)

Se a criptografia do sistema de arquivos for muito assustadora e não considerada confiável pelo usuário, existe outro método para criptografar e descriptografar dados durante a gravação e recuperação do disco.

TDE não existe para Postgresql em seu pacote original. Ele deve ser baixado e usado. E sua configuração pré-construída está disponível apenas para criptografia do lado do servidor, enquanto o servidor é executado. Existem outras configurações de um TDE também, como lado do cliente, tablespace etc.

Para começar, primeiro você precisa instalar o Postgresql TDE de uma ferramenta de terceiros conhecida como CyberTec como:

wget https://download.cybertec-postgresql.com/postgresql-12.3_TDE_1.0.tar.gz

Depois de baixado, você precisa extrair o pacote:

tar xvfz postgresql-12.3_TDE_1.0.tar.gz

Um diretório com o nome postgresql-12.3_TDE_1.0.tar.gz agora será criado em seu diretório root.

Agora você precisa definir o diretório atual para esta pasta criada como:

cd postgresql-12.3_TDE_1.0.tar.gz

Uma vez dentro desta pasta, começaremos a configurar nossa instalação. Mas antes disso, precisamos instalar algumas bibliotecas necessárias como segue:

sudo apt-get install libldap2-dev libperl-dev python-dev

Agora você pode configurar a instalação:

./configure --prefix=/usr/local/pg12tde --with-openssl --with-perl \
 --with-python --with-ldap

Depois de configurado, você precisa emitir o seguinte comando:

sudo make install

Isso pode demorar um pouco para ser concluído. Após a conclusão do comando make, você precisará alternar para a pasta contrib dentro do pacote extraído e emitir o comando make novamente da seguinte forma:

cd contrib
sudo make install

Após a conclusão deste comando, agora você precisa configurar a chave que será usada para criptografia. Esta etapa é bastante simples, pois tudo que você precisa fazer é apenas escrever um arquivo que possa gerar o valor key. Para fazer isso, você pode criar um arquivo da seguinte maneira:

cd \
touch provide_key.sh

Agora você precisa abrir o arquivo:

nano provide_key.sh

Uma vez no arquivo, codifique a chave abaixo e salve:

echo 8ae8234234h243294324

A chave pode ser qualquer valor que você desejar. Agora tudo que você precisa fazer é dar a este arquivo um atributo para que ele seja acessível usando chmod:

chmod %x /provide_key.sh

Agora você pode fazer login na sua conta postgres da seguinte maneira:

sudo su - postgres

Após esta etapa, você precisa inicializar seu banco de dados em um diretório de sua escolha. Isto é essencial para garantir a segurança, ou seja, para reduzir quaisquer erros de permissão durante a execução do servidor postgres. Crie a pasta como:

sudo mkdir /usr/local/postgres

E então adicione os atributos para acesso posterior:

sudo chmod 775 /usr/local/postgres
sudo chown postgres /usr/local/postgres

Agora você pode inicializar seu banco de dados com a chave criada no arquivo provide_key.sh acima. Antes disso, você também precisa definir o caminho export para o banco de dados

export PATH=$PATH:/usr/local/pgsql/bin

E finalmente acertou:

initdb -D /usr/local/postgres -K /provide_key.sh

Isso ativará a criptografia e fornecerá um comando no final para copiar e executar a execução do servidor criptografado. O comando será parecido com isto:

 ....Success. You can now start the database server using:

 pg_ctl -D /usr/local/postgres -l logfile start

É assim que você configura um servidor TDE para Postgres. A chave fornecida no arquivo provide_key.sh será usada para ler/gravar quaisquer dados que seu servidor receber. Isso atinge o objetivo de proteger os dados durante a transmissão.

Você pode ter uma pergunta aqui: como ele criptografa o banco de dados em repouso? Afinal, a criptografia/descriptografia só funciona quando o servidor está em execução. em repouso não significa que o banco de dados não está sendo usado?

Bem, tecnicamente, você está certo. Mas há um porém. A chave que está sendo usada para criptografar os dados também está sendo usada para descriptografar os mesmos dados quando eles são recuperados. Assim, assim que o servidor for desligado, você poderá ter certeza de que os dados residentes no disco serão criptografados com a chave fornecida. Assim, funciona para fornecer segurança em ambos os cenários; durante o uso e em repouso.

Agora que você tem uma compreensão clara do TDE, é hora de aprender como criptografar partes de um banco de dados em repouso.

Método 3 – Criptografando partes do banco de dados

Criptografar partes de um banco de dados é um método muito eficiente em comparação com os fornecidos acima. A razão é que você está no controle do que criptografa e isso não leva tanto tempo quanto o anterior.

Para configurar isso, primeiro você precisa instalar a extensão pgcrypto. Faça login em sua conta postgres e execute o seguinte comando:

create extension if not exists pgcrypto;

O documento pgcrypto fornece uma breve lista de comandos que você pode usar para criptografar/descriptografar dados. Aqui, entretanto, você usará a criptografia de chave simétrica como ponto de partida.

Para uso simples, você pode assumir uma chave de comprimento 1-3 para um valor criptografado que seja legível e não muito longo. Como o algoritmo faz o hash do prefixo anexado antes dos dados e depois os criptografa com uma chave de sessão, o resultado geralmente é mais longo. Esta é uma excelente medida em termos de proteção de dados, pois quanto maior o comprimento, mais difícil é quebrar uma senha.

Portanto, agora você pode testar isso. Vamos começar criando uma tabela test_login:

create table test_login (name VARCHAR(50), password TEXT);

Agora, você pode inserir valores nele com a senha sendo criptografada como deveria:

insert into test_login (name, password) values ('Jonathon', pgp_sym_encrypt('123ab', 'd3a')::TEXT)

Esta senha agora será salva no disco neste formato criptografado. Para descriptografar esse valor, basta executar a seguinte consulta:

select
	name,
	pgp_sym_decrypt(password::bytea, 'd3a')
from
test_login;

O comando retornará a senha em sua forma original descriptografada. Portanto, desta forma você pode obter criptografia do banco de dados em repouso quando necessário.

Conclusão

Neste artigo, você aprendeu três formas diferentes de criptografia de banco de dados em repouso ao usar o postgresql.

A criptografia de banco de dados no sistema de arquivos é menos dispendiosa, mas exige mais armazenamento. Ele criptografa toda a partição e pode fazer com que outros tipos de dados também sejam criptografados.

A segunda opção de criptografia usando TDE é melhor, pois também protege os dados em tempo real. Mas não pode criptografar os registros individualmente e protegerá principalmente todo o banco de dados. A descriptografia em tempo real ainda será lenta.

A terceira ideia de criptografar partes de um banco de dados é a mais eficiente. Não só é menos dispendioso, mas também dá ao usuário a capacidade de proteger apenas os dados que ele considera importantes, em vez de criptografar todos os outros registros irrelevantes. Sua desvantagem é que a maioria dos usuários não sabe como os hackers podem usar a inferência (um ataque) para extrair informações importantes de um banco de dados, anulando assim as partes criptografadas. Assim, alguns podem argumentar, neste caso, que a criptografia completa do banco de dados é muito mais segura e reduz erros e falhas humanas.

No final, cabe ao usuário descobrir o que funciona melhor para ele. Você pode verificar mais opções de criptografia nos links fornecidos no artigo, que também serão elaborados e explicados em outro tutorial posteriormente, para que você possa não apenas entender, mas também testar a criptografia em tempo real.

Artigos relacionados: