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 peer hostssl replication all 127.0.0.1/32 md5 hostssl 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-600s password_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 peer hostssl replication all 127.0.0.1/32 scram-sha-256 hostssl 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 sudo psql \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 LAN hostssl all postgres 10.144.0.0/16 scram-sha-256 # Rejecting superuser login from WAN hostssl 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 sudo psql CREATE USER seu_usuario; \password seu_usuario # Digite a senha desejada GRANT 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