Data

8 mai, 2018

Estabelecendo conexão SSL segura com o servidor do banco de dados PostgreSQL

Publicidade

Um dos desafios mais exigidos no mundo moderno da Internet das Coisas é obter o mais alto nível de segurança. É por isso que hoje vamos considerar o processo de estabelecer uma conexão SSL segura com seu container PostgreSQL hospedado no Jelastic Cloud.

Ao se esforçar para manter seguras as informações em seu banco de dados PostgreSQL, a primeira coisa que você precisa fazer é criptografar todas as conexões para proteger as credenciais de autenticação (nomes de usuário/senhas) e os dados processados da interceptação.

Abaixo, exploraremos o ajuste apropriado do servidor de banco de dados e a geração de certificados, necessários para a ativação de SSL. Em seguida, descobriremos como adicionar certs a uma máquina cliente e, por último, estabeleceremos uma conexão segura com nosso servidor por meio do pgAdmin. Vamos em frente!

Configuração do servidor PostgreSQL

Dentro das instruções abaixo, consideraremos dois casos de uso para dois ambientes separados: com nó único do banco de dados PostgreSQL e dois nós agrupados com replicação master-slave.

No caso de uma instalação de nó único, você pode simplesmente criá-lo via assistente de topologia de ambiente.

  • Para a configuração rápida de uma solução em cluster, você pode usar o pacote PostgreSQL Database Replication, disponível na seção Marketplace > Clusters.

Para encontrar facilmente a solução necessária, use a barra de pesquisa no topo do frame. Clique em “Install” para a solução apropriada.

Dependendo da topologia preferida, você verá um novo ambiente de um ou dois nós de banco de dados interconectados (como na imagem acima), exibido em seu dashboard do Jelastic.

1. Para iniciar a configuração da conexão SSL, você precisa acessar o servidor de banco de dados por meio do Jelastic SSH Gate – isso pode ser feito de duas maneiras.

A mais fácil é utilizar um cliente Web SSH e estabelecer a conexão diretamente através do Jelastic Dashboard (note que essa opção está disponível a partir da versão 5.4 da plataforma Jelastic).

Outra maneira de inserir o container necessário é usar seu cliente SSH local. Caso você não tenha realizado uma operação semelhante antes, será necessário:

2. Depois de inserir o servidor de banco de dados PostgreSQL via SSH, você precisará adicionar os três arquivos a seguir ao diretório /var/lib/pgsql/data para que funcione via SSL:

  • server.key – chave privada
  • server.crt – certificado de servidor
  • root.crt – root certificate confiável

Se você já tiver um conjunto desses arquivos de certificação sendo pré-gerado, basta enviá-los para a pasta mencionada acima (a opção apropriada está disponível no Configuration Manager incorporado no dashboard do Jelastic) e pular para a sexta etapa da atual instrução.

Caso contrário, preste atenção ao terceiro e quinto passo abaixo, nos quais descrevemos brevemente como gerá-los por conta própria.

3. Para criar e configurar o primeiro arquivo mencionado acima (server.key), realize as seguintes etapas:

  • Execute os comandos:
cd /var/lib/pgsql/data
openssl genrsa -des3 -out server.key 1024

Durante a geração, será solicitada uma pass phrase – especifique qualquer uma e confirme-a para concluir a criação.

  • Para trabalhar ainda mais com essa chave, é necessário remover a frase secreta que você adicionou anteriormente. Execute o seguinte comando para isso:
openssl rsa -in server.key -out server.key

Digite novamente a frase secreta mais uma vez para confirmação.

  • Finalmente, defina os direitos de permissão e propriedade devidos para o seu arquivo de chave privada com os próximos comandos:
chmod 400 server.key
chown postgres.postgres server.key

Nota: No caso de você usar um certificado pré-gerado, por favor, depois de carregá-lo para o servidor, certifique-se de que suas permissões de acesso e propriedade coincidam com as configurações acima para o arquivo de chave privada apropriado.

4. Em seguida, você precisa criar um server certificate com base no seu arquivo server.key, por exemplo:

openssl req -new -key server.key -days 3650 -out server.crt -x509 -subj ‘/C=US/ST=California/L=PaloAlto/O=Jelastic/CN=mysite.com/emailAddress=mail@jelastic.com‘

Nota: O parâmetro -subj é opcional, sendo necessário apenas no caso em que o certificado gerado será usado na produção. Nesse caso, você precisará fornecer os seguintes dados pessoais como seu valor de acordo com o formato mostrado acima (por exemplo, ‘unit1=meaning_value1/unit2=meaning_value2/unit3=…’ etc).

Alternativamente, a informação apropriada pode ser ajustada adicionalmente no modo interativo por meio da consulta aberta automaticamente.

5. Como vamos assinar certificados por nós mesmos, o server certificate gerado também pode ser usado como um root certificate confiável, portanto, basta fazer sua cópia com o nome apropriado:

cp server.crt root.crt

Agora, como você tem todos os três arquivos de certificado, pode prosseguir para as configurações do banco de dados PostgreSQL, necessárias para a ativação e uso real do SSL.

6. Na mesma pasta, abra o arquivo pg_hba.conf para edição (com qualquer editor de terminal preferível – vim, por exemplo – ou diretamente no dashboard).

Substitua seu conteúdo padrão pelas seguintes linhas:

# TYPE  DATABASE    USER CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local   all all               trust
# IPv4 local connections:
host    all    all 127.0.0.1/32          trust

# IPv4 remote connections for authenticated users
hostssl all         webadmin 0.0.0.0/0             md5 clientcert=1

# IPv6 remote connections for authenticated users

hostssl all         webadmin ::/0         md5 clientcert=1

Dicas:

  • Se você instalou a solução em cluster, execute a mesma etapa descrita acima, exceto a linha relacionada à replicação – ela deve permanecer inalterada. Caso contrário, o recurso de replicação de dados será desativado.

  • Se você for trabalhar com o banco de dados e não como o usuário padrão do webadmin, precisará alterar o valor apropriado nas últimas linhas do arquivo, substituindo-o pelo nome de usuário do banco de dados exigido.

Observe que, nesse caso, você precisará usar o mesmo nome de usuário para todos os demais comandos (apontaremos onde é obrigatório).

Salve o arquivo atualizado.

7. Para finalizar as configurações, você precisa aplicar mais algumas alterações no arquivo postgresql.conf.

Navegue até a seção Security and Authentication (aproximadamente na 80ª linha) e ative o próprio uso do SSL, descomentando a configuração com o mesmo nome e alterando seu valor para “on”. Além disso, anexe o novo parâmetro ssl_ca_file abaixo:

ssl = on
ssl_ca_file = ‘root.crt’

Não se esqueça de salvar essas alterações.

8. Por fim, reinicie seu servidor PostgreSQL para aplicar novas configurações.

sudo service postgresql restart


Certificados de cliente

Agora vamos criar mais um conjunto de arquivos de certificado SSL para a instância do cliente, a fim de oferecer suporte para a conexão segura em ambos os lados.

1. Volte para a janela do terminal com a conexão SSH estabelecida para o seu servidor PostgreSQL durante a qual você operou a configuração do servidor (ou reconecte-a) – você precisará dos certificados do servidor para ações adicionais.

Uma vez dentro, gere uma chave privada para um cliente (também sem uma pass phrase, como foi feito na seção anterior) – por exemplo, dentro do diretório tmp:

openssl genrsa -des3 -out /tmp/postgresql.key 1024
openssl rsa -in /tmp/postgresql.key -out /tmp/postgresql.key

2. Em seguida, crie um certificado SSL para o usuário do banco de dados PostgreSQL (webadmin, por padrão) e assine-o com nosso arquivo root.crt confiável em um servidor.

openssl req -new -key /tmp/postgresql.key -out /tmp/postgresql.csr -subj ‘/C=US/ST=California/L=PaloAlto/O=Jelastic/CN=webadmin’
openssl x509 -req -in /tmp/postgresql.csr -CA root.crt -CAkey server.key -out /tmp/postgresql.crt -CAcreateserial

Nota:

Quando os dados comuns, fornecidos dentro do parâmetro -subj podem ser alterados para suas informações pessoais, seu Common Name (/CN=) deve ser igual ao nome de usuário do banco de dados que você definiu no arquivo de configuração do servidor pg_hba.conf durante a primeira geração de certificados (webadmin, no nosso caso).

O segundo comando acima deve ser executado a partir do local (diretório do servidor), onde os arquivos root.crt e server.key são armazenados; caso contrário, o caminho completo para eles deve ser especificado.

3. Depois que esses arquivos (por exemplo, postgresql.key, postgresql.crt e root.crt) estiverem prontos, você precisará movê-los para a pasta .postgresql na sua máquina cliente. Você pode usar a interface do dashboard do Jelastic para obtê-los (basta baixá-los ou copiar/colar o conteúdo dos arquivos).

Dica: Se tal diretório ainda não existir, crie-o com o comando mkdir ~/.postgresql ou similar (de acordo com a distribuição do sistema operacional).

Além disso, se necessário, você pode configurar a permissão de leitura de chave para o proprietário apenas com o comando chmod 400 ~/.postgresql/postgresql.key para obter mais segurança.

Dica: Não se esqueça de remover as chaves do diretório tmp no seu servidor de banco de dados posteriormente.

Estabelecer conexão via PgAdmin

Eventualmente, depois que as configurações do servidor e do cliente estiverem concluídas, você estará pronto para estabelecer a conexão. No nosso caso, usaremos a ferramenta pgAdmin 3 como exemplo para obter esse aplicativo (ou outro preferido) instalado antecipadamente.

1. Para conectar-se ao servidor de banco de dados via SSL, você precisa de um Public IP ou um endpoint sendo anexado ao seu container de banco de dados PostgreSQL.

Consideraremos o último caso: Settings do ambiente de acesso, alternar para a seção Endpoints e Add novo endpoint com o botão com o mesmo nome no painel superior.

2. Agora, quando você tiver um ponto de acesso, execute o seu cliente pgAdmin 3 e selecione a opção New Server Registration.

Na aba Properties da janela aberta, especifique os seguintes dados:

  • Name: qualquer nome de conexão desejado (por exemplo, ssl-to-pgsql)
  • Host: ponto de acesso que você adicionou na primeira etapa (endereço Public IP ou endpoint Access URL sem número de porta)
  • Port: use o número da porta padrão 5432 para External IP ou Public port do endoint (indicado na seção com o mesmo nome da coluna apropriada)
  • Username: usuário do banco de dados em que você definiu o certificado SSL e as configurações for (por exemplo, webadmin)
  • Password: a senha do usuário correspondente (enviada por e-mail para webadmin ou aquela que você definiu de outra forma)

O restante dos campos pode ser deixado inalterado ou ajustado de acordo com suas necessidades.

3. Em seguida, alterne para a aba SSL e, para a linha com o mesmo nome, selecione a opção require na lista suspensa.

Isso é tudo! Os certificados necessários serão carregados automaticamente durante o estabelecimento da primeira conexão (se não, você pode escolhê-los manualmente), basta clicar em “OK” para começar a gerenciar seu banco de dados através de conexão segura.

Agora você pode vincular seu aplicativo ao banco de dados necessário (use o guia Connect to Database para isso) e habilitar as configurações de SSL para o seu projeto a fim de criptografar seus dados durante a busca ou a transferência.

Sinta-se à vontade para pedir ajuda aos nossos especialistas técnicos no Stackoverflow, caso tenha alguma dúvida ao estabelecer a conexão SSL com seu servidor PostgreSQL.

***

Tetiana Markova faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://jelastic.com/blog/establish-secure-ssl-connection-to-postgresql-database-server/