18.8. Opções de encriptação #

O PostgreSQL oferece encriptação em vários níveis, permitindo flexibilidade na proteção dos dados contra exposição devido a roubo do servidor de banco de dados, administradores inescrupulosos, e redes inseguras. A encriptação também pode ser necessária para proteger dados sensíveis, como registros médicos ou transações financeiras.

Encriptação de senha

As senhas de usuário do banco de dados são armazenadas como hashes (determinados pela configuração de password_encryption), portanto, o administrador não pode ver a senha real atribuída ao usuário. Se for usada a encriptação SCRAM ou MD5 para autenticação do cliente, a senha não encriptada nunca está presente em algum momento no servidor, porque o cliente a encripta antes enviá-la pela rede. SCRAM é a preferida, porque é um padrão da Internet, sendo mais segura do que o protocolo de autenticação MD5 específico do PostgreSQL.

Atenção

O suporte a senhas encriptadas usando MD5 está obsoleto e será removido em uma versão futura do PostgreSQL. Veja Autenticação por senha para obter detalhes sobre a migração para outro tipo de senha.

Encriptação para colunas específicas

O módulo pgcrypto permite que certos campos sejam armazenados encriptados. É útil quando apenas alguns dados são sensíveis. O cliente fornece a chave de desencriptação, e os dados são desencriptados no servidor e enviados para o cliente.

Os dados desencriptados, e a chave de desencriptação, estão presentes no servidor por um breve período, enquanto os dados estão sendo desencriptados e comunicados entre o cliente e o servidor. Portanto, há um instante em que dados e chaves podem ser interceptados por alguém com acesso completo ao servidor de banco de dados, como o administrador do sistema.

Encriptação da partição de dados

A encriptação do armazenamento pode ser executada no nível do sistema de arquivos, ou no nível do bloco. As opções de encriptação do sistema de arquivos do Linux incluem eCryptfs e EncFS, enquanto o FreeBSD usa o PEFS. As opções de encriptação no nível de bloco, ou de disco completo, incluem dm-crypt + LUKS no Linux e módulos GEOM geli e gbde no FreeBSD. Muitos outros sistemas operacionais suportam esta funcionalidade, incluindo o Windows.

Este mecanismo impede que dados não encriptados sejam lidos nas unidades de armazenamento, se as unidades ou o computador inteiro forem roubados. Esta encriptação não protege contra ataques quando o sistema de arquivos está montado, porque quando está montado o sistema operacional mostra uma visão não encriptada dos dados. Entretanto, para montar o sistema de arquivos, é necessária alguma maneira para que a chave de encriptação seja passada para o sistema operacional e, às vezes, a chave é armazenada em algum lugar no hospedeiro que monta o disco.

Encriptação de dados através da rede

As conexões SSL encriptam todos os dados que trafegam pela rede: a senha, as consultas e os dados retornados. O arquivo pg_hba.conf permite aos administradores especificarem quais hospedeiros podem usar conexões não encriptadas (host), e quais requerem conexões encriptadas por SSL (hostssl). Além disso, os clientes podem especificar que querem se conectar aos servidores somente via SSL.

As conexões encriptadas pela GSSAPI encriptam todos os dados enviados pela rede, incluindo consultas e dados retornados. (Nenhuma senha é enviada através da rede.) O arquivo pg_hba.conf permite aos administradores especificarem quais hospedeiros podem usar conexões não encriptadas (host), e quais requerem conexões encriptadas pela GSSAPI (hostgssenc ). Além disso, os clientes podem especificar que querem se conectar aos servidores somente via conexões encriptadas pela GSSAPI (gssencmode=require).

Stunnel e SSH também podem ser usados para encriptar as transmissões.

Autenticação de hospedeiro via SSL

É possível que o cliente e o servidor forneçam certificados SSL reciprocamente. É necessária alguma configuração extra de cada lado, mas fornece uma verificação de identidade mais forte do que o mero uso de senhas, impedindo que um computador finja ser o servidor por tempo suficiente para ler a senha enviada pelo cliente. Também ajuda a prevenir ataques man in the middle, onde um computador entre o cliente e o servidor finge ser o servidor, lendo e passando todos os dados entre o cliente e o servidor.

Encriptação do lado cliente

Se o administrador de sistema da máquina onde está o servidor não for confiável, é necessário que o cliente encripte os dados; dessa forma, nunca existem dados não encriptados no servidor de banco de dados. Os dados são encriptados no cliente antes de serem enviados ao servidor, e os resultados do banco de dados precisam ser desencriptados no cliente antes de serem usados.