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.
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.
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.
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.
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.
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.
É 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.
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.