Formas de restringir o usuário remoto para acessar somente um banco de dados remoto

2

Eu quero ser capaz de configurar um usuário remoto que possa atualizar um banco de dados do PostgreSQL em um servidor de produção.

Eu tenho duas máquinas, uma é um servidor local que eu uso como um sistema de comando e controle, chamado Controlling_Machine . Esta máquina deve fazer login no meu servidor remoto ( Remote_Server ) em execução na produção e atualizar um banco de dados Database_A .

Terminologia

Controlling_Machine : Uma caixa linux que pode acessar a Internet, mas sites por trás de um firewall e não aceita conexões de entrada. (Não pode ser acessado remotamente.)

Remote_Server : Uma VM de produção do Centos ou do Ubuntu em execução na nuvem.

DB_User : A conta de usuário no PostgreSQL que pode gravar somente em um banco de dados específico.

Server_User : a conta de usuário que o SSH está no servidor.

Database_A : O banco de dados que eu quero que seja atualizado remotamente por meio do controle da máquina.

Até agora eu pensei em duas maneiras de habilitar o acesso remoto ao banco de dados

1. Use uma combinação de usuário remoto e usuário do banco de dados local

Faça o login Server_User no servidor via SSH e restrinja todo o acesso de leitura, exceto para a sua pasta pessoal. Este usuário pode então acessar o banco de dados com o DB_User para este propósito.

  1. Eu não quero que o Server_User seja capaz de ler qualquer outra pasta, não / etc not / media nada além de home. Eu quero que eles sejam severamente restritos.

  2. Eu não quero que este usuário possa visualizar processos em execução ou acessar qualquer outra coisa.

  3. A ideia é que, se Controlling_Machine que lança Server_User for comprometido e o atacante fizer login em Remote_Server , quero garantir que o único dano que eles possam fazer é Database_A .

Todo o processo seria:

Controlling_Machine - > Remote_Server - > Database_A

2. Use um usuário de banco de dados remoto e exponha o PostgreSQL à internet pública

A outra maneira, provavelmente mais simples, de obter esse resultado é permitir o acesso público ao banco de dados PostgreSQL para que eu possa fazer o login com um usuário para o banco de dados. Isso significa que não preciso fazer outro usuário apenas para o Remote_Server , pois ele não está mais envolvido na transação.

  1. Mas isso é tão seguro quanto uma configuração SSH de usuário remoto em Remote_Server ? Eu gostaria de usar uma chave privada / pública para isso.

  2. Posso definir o PostgreSQL para permitir que apenas um banco de dados seja acessado remotamente?

Todo o processo seria:

Controlling_Machine - > Database_A

O que é mais seguro?

Eu gostaria de usar o método mais seguro possível. Se colocar o PostgreSQL em meu IP público é muito arriscado, então terei que manter o acesso ao banco de dados local no servidor de produção e fazer login remotamente via SSH.

Além disso, se essa é a maneira mais segura, como eu restringi esse usuário Linux remoto para nada além de fazer login no PostgreSQL localmente com DB_User (depois de logar remotamente via SSH com Server_User )

    
por Joseph 24.04.2016 / 08:08

1 resposta

2

Eu usaria ssh e restringiria o (s) comando (s) que podem ser executados por esse usuário. Pelo menos assim você sabe que a conexão é segura. Você pode fazer isso por meio de uma entrada em /etc/ssh/sshd_config :

Match User your_user
   X11Forwarding no
   AllowTcpForwarding no
   ForceCommand your-command arg1 arg2

Isso pode funcionar para você se você, através dos argumentos, forçar your-command a usar o banco de dados de sua escolha. (Alternativamente, você pode fazer isso no arquivo authorized_keys baseado na chave pública do Server_User).

Eu não sei os detalhes do PostgreSQL, mas é possível que, dentro da ferramenta de linha de comando usada para manipular o banco de dados, você possa apenas alterar o banco de dados em que está trabalhando. Se assim for, você não será capaz de restringir as coisas. Pode até ter algum temporariamente abrir um submarino (bash) que é um problema ainda maior para o seu caso.

Por isso, primeiro analiso o que você deseja que o usuário faça. Se isso estiver restrito a fazer um backup, restaurar um backup e algumas outras funções, provavelmente fará mais sentido criar um pequeno programa restrito a essa funcionalidade ou apenas permitir a cópia de arquivos de comando no servidor com um tarefa do cron, em seguida, manipulando o processamento dos comandos (e descartando qualquer coisa fora dos itens permitidos).

    
por 24.04.2016 / 09:49