PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 25 → Mais segurança no seu PostgreSQL
Mais segurança no seu PostgreSQL
Iniciado por Boller, 20,sep. 2024 20:23 - No hay respuesta
Miembro registrado
4.521 mensajes
Publicado el 20,septiembre 2024 - 20:23
PostgreSQL

[20/09/2024, 14:20:45] Adriano Boller: O arquivo `pgpass` é uma ferramenta muito útil no PostgreSQL, especialmente nas versões mais recentes, por várias razões, principalmente relacionadas à segurança e automação no acesso ao banco de dados.

### Motivos para usar o `pgpass`:

1. **Automatização de Conexões Seguras**:
O `pgpass` armazena as credenciais do banco de dados (usuário, senha, host e porta) de forma segura, permitindo que scripts e programas possam se conectar ao banco de dados sem solicitar interativamente as credenciais. Isso é essencial para automação de tarefas de manutenção, backups, restaurações e migrações que precisem ser realizadas sem intervenção humana.

2. **Evita Expor Senhas em Scripts**:
Em vez de passar a senha diretamente em um comando SQL ou script, o `pgpass` permite que você armazene as credenciais de maneira centralizada, reduzindo o risco de expor a senha em arquivos de script ou logs. Isso é mais seguro e facilita a gestão de acesso em servidores.

3. **Compatibilidade com Múltiplas Instâncias**:
O arquivo `pgpass` pode ser configurado para armazenar credenciais de várias instâncias do PostgreSQL. Ele consegue gerenciar conexões para diferentes servidores, usuários e bancos de dados, tornando mais fácil o gerenciamento de ambientes com várias instâncias do PostgreSQL.

4. **Suporte Nativo e Integração Simples**:
O PostgreSQL, nas suas versões mais recentes, oferece suporte nativo ao `pgpass`, o que facilita sua integração sem necessidade de bibliotecas adicionais. Ele é automaticamente reconhecido pelas ferramentas do PostgreSQL, como o `psql` e o `pg_dump`, quando estas são executadas pelo mesmo usuário que possui o arquivo `pgpass`.

5. **Aprimoramento da Segurança**:
Ao configurar o `pgpass` corretamente, você pode garantir que ele tenha permissões de leitura adequadas (apenas o usuário proprietário pode acessá-lo), tornando o acesso ao banco de dados mais seguro do que armazenar as credenciais diretamente em scripts ou variáveis de ambiente.

### Como funciona o `pgpass`:
- O arquivo `.pgpass` (no Linux) ou `pgpass.conf` (no Windows) deve ser criado no diretório home do usuário que se conecta ao PostgreSQL.
- A sintaxe do arquivo é simples, com cada linha contendo: `hostname:port:database:username:password`.
- O PostgreSQL lerá este arquivo sempre que for necessária uma autenticação, utilizando as credenciais armazenadas para realizar a conexão automaticamente.

### Exemplo de configuração:
```
# Exemplo de arquivo pgpass
localhost:5432:meu_banco:meu_usuario:minha_senha
```

### Considerações finais:
Com o avanço das versões do PostgreSQL, a configuração do `pgpass` tem sido cada vez mais recomendada para garantir práticas de segurança eficientes e automação, permitindo que os administradores mantenham um ambiente controlado e seguro, especialmente em servidores de produção.

Se precisar de ajuda para configurar o `pgpass`, posso te guiar nos detalhes técnicos!

[20/09/2024, 14:20:45] Adriano Boller: Para evitar que um invasor possa derrubar (`drop`) bancos de dados PostgreSQL, é necessário implementar uma série de medidas de segurança que dificultem o acesso não autorizado e garantam a integridade dos dados. Abaixo estão as melhores práticas de segurança para evitar esse tipo de ataque:

### 1. **Restringir Acessos e Privilégios de Usuários**
- **Princípio do Menor Privilégio**: Conceda apenas os privilégios mínimos necessários para cada usuário. Somente o superusuário (como `postgres`) deve ter permissões para realizar operações destrutivas, como `DROP DATABASE`.
- **Separação de Funções**: Crie diferentes usuários para diferentes funções (como leitura, escrita e administração) e atribua permissões adequadas. Por exemplo, um usuário que só precisa ler dados não deve ter permissões de escrita, muito menos para remover objetos do banco.
- **Revisão Periódica**: Faça auditorias regulares nas permissões dos usuários para garantir que ninguém tenha acesso desnecessário.

### 2. **Proteção de Credenciais**
- **Senhas Fortes e Complexas**: Implemente senhas seguras e longas, que sejam difíceis de quebrar.
- **Autenticação Forte**: Considere usar autenticação baseada em certificados ou integração com mecanismos de autenticação externos, como LDAP ou Kerberos, ao invés de confiar somente em autenticação via senha.
- **Bloqueio de Tentativas de Login Mal-Sucedidas**: Configure mecanismos que detectam e bloqueiam tentativas repetidas de login falhas para evitar ataques de força bruta.

### 3. **Configuração Segura do PostgreSQL**
- **Arquivo `pg_hba.conf`**: Configure corretamente o arquivo de controle de acesso `pg_hba.conf` para restringir as conexões a apenas máquinas ou sub-redes específicas. Desabilite o acesso de IPs ou redes não confiáveis.
- Use `local` para conexões internas (Unix sockets) e limite o acesso via rede somente aos endereços IP confiáveis.
- **Desabilitar o Acesso Externo Desnecessário**: Se o banco de dados não precisa ser acessado de fora da rede local, não permita conexões externas. Se necessário, use firewalls para restringir o acesso a portas específicas.
- **Mudança da Porta Padrão**: A porta padrão do PostgreSQL é a 5432. Mudar essa porta para outra menos conhecida pode reduzir a probabilidade de ataques automatizados, embora não seja uma medida definitiva.

### 4. **Criptografia de Conexão**
- **SSL/TLS**: Sempre habilite SSL/TLS para criptograf


*Em resumo:*
Interessante até criar outro usuário em vez de Postgres na instalação um nome totalmente diferente e com pgpass.conf e para pghba.conf pra sua segurança e porta diferente da padrão. Pra melhorar só conseguir chegar no banco via vpn. Quem não estiver com a vpn não usa o sistema.

[20/09/2024, 15:16:08] Adriano Boller: *No Linux*

### Exemplo de configuração segura do `pgpass` e `pg_hba.conf` para PostgreSQL, incluindo a mudança da porta padrão e práticas para evitar invasões:

#### 1. Arquivo `.pgpass` (Armazenamento seguro de credenciais)
O arquivo `pgpass` armazena credenciais de conexão ao banco de dados de forma segura, e deve estar protegido com permissões restritas (0600 para Linux, por exemplo, para garantir que apenas o proprietário tenha acesso).

**Exemplo de arquivo `.pgpass`**:
```
# Formato: hostname:port:database:username:password
localhost:5433:meu_banco:meu_usuario:minha_senha_forte
192.168.0.100:5433:outro_banco:outro_usuario:senha_muito_secreta
```
- **Porta**: No exemplo, a porta padrão do PostgreSQL foi alterada de 5432 para 5433.
- **Senha**: Use senhas fortes e complexas para dificultar ataques de força bruta.
- **Hosts**: Você pode especificar diferentes IPs para diferentes bancos, garantindo que o acesso seja restrito apenas a hosts confiáveis.

> **Importante**: Certifique-se de que o arquivo `.pgpass` tenha permissões restritas para o usuário correto. No Linux, isso é feito com o comando:
```bash
chmod 600 ~/.pgpass
```

#### 2. Arquivo `pg_hba.conf` (Configuração de acesso ao PostgreSQL)
O arquivo `pg_hba.conf` define quem pode se conectar ao banco de dados, de onde, e como deve ser autenticado. Configurar corretamente esse arquivo é fundamental para evitar invasões.

**Exemplo seguro de `pg_hba.conf`**:
```ini
# Permitir apenas conexões locais (localhost) para usuários autenticados via senha (md5)
local all all md5

# Permitir conexões apenas de IPs internos específicos (ex: 192.168.0.x) com autenticação por senha forte
host all all 192.168.0.0/24 md5

# Bloquear qualquer outro acesso externo
host all all 0.0.0.0/0 reject
```
- **Local**: O primeiro bloco permite que qualquer usuário do sistema se conecte localmente, desde que tenha a senha correta (autenticação `md5`).
- **IP Interno**: O segundo bloco permite que apenas computadores da rede interna 192.168.0.0/24 acessem o banco de dados, exigindo autenticação por senha (`md5`).
- **Rejeição Global**: O terceiro bloco garante que qualquer outro acesso (externo ou de IPs desconhecidos) seja explicitamente rejeitado, prevenindo tentativas de acesso não autorizadas.

#### 3. Alteração da porta padrão no `postgresql.conf`
A mudança da porta padrão (5432) para uma porta diferente (como 9554433229) ajuda a dificultar a detecção automatizada de instâncias PostgreSQL.

**Passos para alterar a porta**:

- Abra o arquivo `postgresql.conf`, que geralmente fica no diretório de dados do PostgreSQL. Exemplo de caminho em sistemas Linux: `/etc/postgresql/14/main/postgresql.conf`.

- Procure a linha referente à porta:
```ini
# Port number for PostgreSQL to listen on
port = 5432
```

- Altere a porta para 9554433229 (ou outra de sua escolha):
```ini
port = 9554433229
```

- Reinicie o serviço PostgreSQL para aplicar as alterações:
```bash
sudo systemctl restart postgresql
```

#### 4. Configurações Adicionais de Segurança

- **Firewall**: Configure um firewall para permitir apenas o tráfego na nova porta do PostgreSQL (9554433229). No Linux com `ufw`, você pode fazer isso com:
```bash
sudo ufw allow 9554433229/tcp
```

- **SSL/TLS**: Habilite SSL no PostgreSQL para garantir que as conexões sejam criptografadas. No `postgresql.conf`, configure:
```ini
ssl = on
```
E adicione certificados SSL para garantir a segurança da conexão.

---

Com essas configurações, você protege o PostgreSQL de forma eficaz, evitando acessos não autorizados, usando senhas fortes, restringindo acessos a IPs confiáveis, e mudando a porta padrão para dificultar a exploração automatizada.

[20/09/2024, 15:16:08] Adriano Boller: *No Windows*

Para configurar o PostgreSQL de forma segura em **Windows**, incluindo a configuração de `pgpass`, `pg_hba.conf` e a alteração da porta padrão, aqui está um guia prático:

### 1. Arquivo `pgpass.conf` no Windows

No Windows, o arquivo `pgpass.conf` tem a mesma função que no Linux, mas o local de armazenamento é diferente. Ele permite armazenar as credenciais de conexão de forma segura para scripts e automações.

#### **Passos para criar o `pgpass.conf`**:

1. **Localização do Arquivo**:
O arquivo `pgpass.conf` deve ser criado na pasta do usuário no caminho:
```
C:\Users\<SEU_USUARIO>\AppData\Roaming\postgresql\pgpass.conf
```

2. **Conteúdo do `pgpass.conf`**:
O formato é o mesmo, contendo `hostname:port:database:username:password`.

**Exemplo**:
```
# Formato: hostname:port:database:username:password
localhost:9554433229:meu_banco:meu_usuario:minha_senha_forte
192.168.0.100:9554433229:outro_banco:outro_usuario:senha_muito_secreta
```

3. **Definindo Permissões**:
- No Windows, é essencial que apenas o usuário proprietário tenha permissão de leitura/escrita no arquivo. Para ajustar isso:
1. Clique com o botão direito no arquivo `pgpass.conf` e selecione **Propriedades**.
2. Vá para a aba **Segurança**.
3. Remova o acesso de todos os outros usuários, deixando apenas o seu.

### 2. Arquivo `pg_hba.conf` no Windows

O arquivo `pg_hba.conf` no Windows tem o mesmo propósito de definir quem pode se conectar ao PostgreSQL, de onde, e como a autenticação será feita.

#### **Localização do `pg_hba.conf`**:
O `pg_hba.conf` está localizado dentro da pasta de instalação de dados do PostgreSQL, geralmente em:
```
C:\Program Files\PostgreSQL\<versao>\data\pg_hba.conf
```

#### **Configuração Segura do `pg_hba.conf`**:

Aqui está um exemplo de configuração que limita o acesso ao servidor e impede invasores de fora da rede local.

```ini
# Permitir apenas conexões locais no servidor Windows
local all all md5

# Permitir conexões apenas de IPs internos (ex: 192.168.0.x) com autenticação por senha forte
host all all 192.168.0.0/24 md5

# Bloquear qualquer outro acesso externo
host all all 0.0.0.0/0 reject
```

- **Conexões locais**: O primeiro bloco permite apenas conexões locais no servidor (exemplo, scripts rodando no mesmo servidor) com autenticação por senha (`md5`).
- **Conexões da rede interna**: O segundo bloco permite que apenas IPs da rede interna 192.168.0.x possam se conectar, exigindo autenticação com senha.
- **Rejeição de outros acessos**: O terceiro bloco bloqueia qualquer outra conexão que não seja da rede local.

Após editar o `pg_hba.conf`, reinicie o serviço PostgreSQL para aplicar as mudanças.


### 3. Alterar a Porta Padrão no Windows

A mudança da porta padrão do PostgreSQL dificulta ataques automatizados que procuram a porta padrão (5432).

#### **Alterando a Porta no `postgresql.conf`**:

1. Abra o arquivo `postgresql.conf`, localizado em:
```
C:\Program Files\PostgreSQL\<versao>\data\postgresql.conf
```

2. Encontre a linha:
```ini
# Port number for PostgreSQL to listen on
port = 5432
```

3. Altere para outra porta, como 9554433229:
```ini
port = 9554433229
```

4. Salve o arquivo e reinicie o PostgreSQL para aplicar a mudança.

#### **Reiniciando o Serviço PostgreSQL no Windows**:

1. Abra o **Prompt de Comando** com permissões de administrador.
2. Execute o seguinte comando para reiniciar o serviço:
```bash
net stop postgresql-x64-14
net start postgresql-x64-14
```
(Substitua `14` pela sua versão instalada).

### 4. Configurando o Firewall no Windows

Após mudar a porta do PostgreSQL, é importante ajustar o firewall para permitir o tráfego na nova porta e bloquear conexões indesejadas.

#### **Passos para Configurar o Firewall**:

1. Abra o **Firewall do Windows com Segurança Avançada**.
2. Crie uma nova regra de entrada para permitir conexões TCP na nova porta:
- Vá para **Regras de Entrada** > **Nova Regra**.
- Selecione **Porta** e clique em **Avançar**.
- Escolha **TCP** e especifique a nova porta (5433, por exemplo).
- Defina a ação como **Permitir Conexão**.
- Aplique a regra a perfis de rede **Privado** e **Domínio** (evite aplicar em **Público**).

3. Opcionalmente, você pode bloquear outras portas não utilizadas ou limitar ainda mais as regras de firewall para hosts específicos.

---

### Recapitulando os Passos:

1. **pgpass.conf**: Armazenar credenciais com senhas fortes e definir permissões restritas.
2. **pg_hba.conf**: Restringir conexões a usuários locais e IPs confiáveis da rede.
3. **Alterar porta**: Mudar a porta padrão do PostgreSQL para dificultar ataques automatizados.
4. **Firewall**: Configurar o firewall do Windows para permitir apenas o tráfego na nova porta e de hosts confiáveis.

Com essas configurações, seu PostgreSQL no Windows estará muito mais protegido contra invasores.

Use vpn não use banco de dados sem rede privada!

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/