Abrindo seu PostgreSQL na Internet com segurança

Como abrir seu PostgreSQL à Internet com seguranca?

Configurações praticamente obrigatórias

Altere os endereços de "escuta" do PostgreSQL no arquivo postgresql.conf

listen_addresses = '*'

1) Habilite o SSL

Habilite o SSL no postgresql.conf.

nano /etc/postgresql/11/main/pg_hba.conf

Por padrão já deve estar assim:

# - SSL -ssl = on#ssl_ca_file = ''ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'#ssl_crl_file = ''ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers#ssl_prefer_server_ciphers = on#ssl_ecdh_curve = 'prime256v1'#ssl_dh_params_file = ''#ssl_passphrase_command = ''#ssl_passphrase_command_supports_reload = off

Force que apenas conexões SSL sejam aceitas no pg_hba.conf

nano /etc/postgresql/11/main/pg_hba.conf

Um exemplo de arquivo:

# IPv4 local connections:hostssl    all             all             0.0.0.0/0               md5# IPv6 local connections:hostssl    all             all             ::1/128                 md5# Allow replication connections from localhost, by a user with the# replication privilege.local   replication     all                                     peerhostssl    replication     all             127.0.0.1/32            md5hostssl    replication     all             ::1/128                 md5

2) Mude a criptografia das senhas de MD5 para scram-sha-256

Por padrão todos os PostgreSQL instalados até agora (versão 12 para baixo) vem por padrão com senhas salvas em "criptografia" MD5. Isso é muito ruim.

Atenção! Quando você mudar isso, todas as senhas do banco precisarão ser resetadas.

Abra o arquivo postgresql.conf e mude o password_encryption

nano /etc/postgresql/11/main/postgresql.conf

# - Authentication -#authentication_timeout = 1min		# 1s-600spassword_encryption = scram-sha-256		# md5 or scram-sha-256#db_user_namespace = off# GSSAPI using Kerberos#krb_server_keyfile = ''#krb_caseins_users = off# - SSL -ssl = on#ssl_ca_file = ''ssl_cert_file = '/etc/ssl/certs/ssl-cert-snakeoil.pem'#ssl_crl_file = ''ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers#ssl_prefer_server_ciphers = on#ssl_ecdh_curve = 'prime256v1'#ssl_dh_params_file = ''#ssl_passphrase_command = ''#ssl_passphrase_command_supports_reload = off

Abra o arquivo pg_hba.conf e mude tudo que for md5 para scram-sha-256

nano /etc/postgresql/11/main/pg_hba.conf

O final do arquivo ficará assim:

# IPv4 local connections:hostssl    all             all             0.0.0.0/0               scram-sha-256# IPv6 local connections:hostssl    all             all             ::1/128                 scram-sha-256# Allow replication connections from localhost, by a user with the# replication privilege.local   replication     all                                     peerhostssl    replication     all             127.0.0.1/32            scram-sha-256hostssl    replication     all             ::1/128                 scram-sha-256

Resetando as senhas!

Resete a senha de todos os usuários já criados.

sudo su - postgres# Insira aqui sua senha para dar o sudopsql\password usuario# Insira aqui a nova senha para o usuario

3) Impeça que a conta SUPERUSER "postgres" seja acessada por um IP da internet

O PostgreSQL introduz por padrão com uma falha de segurança em todos os usuários SUPERUSER. Através do comando COPY um usuário SUPERUSER pode executar códigos maliciosos no servidor.

Edite o arquivo pg_hba.conf

# Antes da linha onde liberamos acesso para todos, coloque essas duas:# IPv4 local connections:# Allowing superuser login from desired LANhostssl    all             postgres        10.144.0.0/16        scram-sha-256# Rejecting superuser login from WANhostssl    all             postgres        0.0.0.0/0            reject

Bônus - Criando um usuário não superuser mas com permissões suficientes

sudo su - postgres# Insira aqui sua senha para dar o sudopsqlCREATE USER seu_usuario;\password seu_usuario# Digite a senha desejadaGRANT ALL PRIVILEGES ON DATABASE postgres TO seu_usuario;GRANT USER seu_usuario CREATEDB;GRANT USER seu_usuario CREATEROLE;GRANT USER seu_usuario CREATEUSER;

Você talvez também precise mudar o dono de tabelas e schemas já criados.

4) Desabilite acesso à funções em linguagens não confiáveis (Python via PL/pythonu)

Algumas linguagens procedurais são inseguras e permitem fazer chamadas do sistema. Desative o acesso a todas elas para esses usuários mais sensíveis.

Configurações Extras (opcionais)

Aqui vão algumas configurações extras que ajudam a aumentar a segurança.

Usar a extensão auth_delay para impedir ataques de força bruta

Coloque um delay entre cada tentativa de conexão consecutiva com essa extensão. Documentação: https://www.postgresql.org/docs/current/auth-delay.html

Não dê acesso ao schema public

O schema public permite todos os usuários criem tabelas fixas e temporárias. É possível encher todo o HD do servidor através dessa falha.

Se ainda assim quiser usar o schema public, revogue todas aquelas permissões promíscuas que ele dá automaticamente pra todos os usuários editando o "Default Privileges" do schema.

Use um serviço ou software anti DDoS

Evitar DDoS é uma tarefa difícil para nós meros mortais.

Existem serviços de "proxy" de diferentes provedores de serviços em nuvem, use algum deles. É o caminho mais fácil.

Se você quiser ser roots, vá para o lado de rede/infra da força e use um software de IDS tipo Suricata ou Snort.

Se você quiser ser hardcore, use um proxy reverso tipo HAProxy ou Nginx, eles te darão o máximo em performance mas também o máximo em trabalho de configuração.

Referências

Arigo dos mestres em PostgreSQL da CYBERTEC
https://www.cybertec-postgresql.com/en/secure-postgresql-a-reminder-on-various-attack-surfaces/

Artigo dos mestres SeveralNines
https://severalnines.com/database-blog/how-secure-your-postgresql-database-10-tips

You should also read:

PostgreSQL

# Instalando o wget para fazer download da chave do repositório # Instalando o wget, capaz de fazer downloads de documentos via HTTP…