paint-brush
Conectando um aplicativo Web tradicional a um banco de dados Postgrespor@ockam
993 leituras
993 leituras

Conectando um aplicativo Web tradicional a um banco de dados Postgres

por Ockam8m2023/08/31
Read on Terminal Reader

Muito longo; Para ler

Aprenda como conectar um aplicativo da web tradicional a um banco de dados postgres, de uma forma segura por design e que requer mínima ou nenhuma alteração de código e nenhum gerenciamento de firewall
featured image - Conectando um aplicativo Web tradicional a um banco de dados Postgres
Ockam HackerNoon profile picture
0-item


Ockam é um conjunto de bibliotecas Rust , ferramentas de linha de comando e serviços de nuvem gerenciados para orquestrar criptografia ponta a ponta, autenticação mútua, gerenciamento de chaves, gerenciamento de credenciais e aplicação de políticas de autorização – tudo em grande escala. Ockam de ponta a ponta canais seguros garantir autenticidade, integridade e confidencialidade de todos os dados em movimento na camada de aplicação.


Se você armazena seus dados em um banco de dados relacional, NoSQL , banco de dados gráfico ou algo semelhante, esses dados provavelmente são privados. E você provavelmente não quer expô-lo à Internet. Portanto, você pode resolver esse problema colocando-o dentro de uma sub-rede privada. No entanto, agora você precisa gerenciar listas de controle de acesso à rede, grupos de segurança ou tabelas de rotas para permitir que outras máquinas abram uma conexão com o banco de dados. Isso é muita sobrecarga.


Com o Ockam, os administradores de rede não precisam atualizar listas de controle de acesso à rede, grupos de segurança ou tabelas de rotas. A Ockam aplica controle refinado aos seus serviços por meio do controle de acesso baseado em atributos. E você pode até integrar com um provedor de identidade externo como o Okta para restringir quem pode acessar seus serviços.


Nesta postagem do blog, exploraremos a interface de linha de comando Ockam, ockam , e veremos como podemos conectar um aplicativo da web tradicional a um banco de dados PostgreSQL, com mínima ou nenhuma alteração de código. Criaremos um aplicativo Python Flask muito básico que simplesmente incrementa um contador em um banco de dados PostgreSQL. Em seguida, moveremos a conexão entre a aplicação e o banco de dados através de um canal seguro Ockam.


Nossa jornada

Antes de começarmos, vamos dar uma olhada nas etapas que executaremos nesta postagem do blog.

Nossa jornada


  1. Use ockam enroll para instalar o aplicativo Ockam e criar um projeto Ockam. Este é o primeiro pré-requisito.


  2. Configure o banco de dados PostgreSQL. Este é o segundo pré-requisito. Em seguida, configure uma "saída" Ockam para o servidor de banco de dados. Aprenderemos mais sobre isso na seção “conectar o banco de dados” abaixo.


  3. Configure o aplicativo da web (Python Flask). Este é o terceiro pré-requisito. Em seguida, configure uma "entrada" Ockam no aplicativo Python. Aprenderemos mais sobre isso na seção "conectar o aplicativo da web" abaixo.


Pré-requisitos

Para acompanhar, certifique-se de instalar todos os pré-requisitos listados abaixo.


  1. Comando Ockam
    • Execute brew install build-trust/ockam/ockam para instalar isso via brew . Você poderá então executar o aplicativo CLI ockam em seu terminal.


  2. Python e bibliotecas: Flash, psycopg2
    • Execute brew install python para instalar via brew . Você poderá então executar o comando python3 em seu terminal.

    • Instruções sobre como obter as dependências ( Flask , psycopg2 ) estão no Código Python seção abaixo.


  3. Postgresql
    • Execute brew install postgresql@15 via brew . Você poderá então executar o servidor de banco de dados PostgreSQL em sua máquina na porta padrão 5432 . Certifique-se de seguir as instruções de brew e adicione PostgreSQL ao seu caminho.

    • Execute brew services start postgresql@15 para iniciar o servidor PostgreSQL.

    • Então você pode definir uma nova senha para o usuário do banco de dados postgres . Defina esta senha como password . O código Python abaixo usa postgres:password@localhost como string de conexão para o driver db.


      As instruções abaixo permitem que você faça isso no Linux e no macOS:


      • Em um terminal, execute sudo -u postgres psql --username postgres --password --dbname template1 para fazer login no banco de dados localmente como o usuário postgres .

      • Em seguida, digite isto no REPL: ALTER USER postgres PASSWORD 'password'; e, finalmente, digite exit .



O aplicativo da Web - código Python

O aplicativo da web Python Flask incrementa um contador em um banco de dados PostgreSQL. Todo o aplicativo cabe em um único arquivo.


Crie um arquivo main.py em sua máquina e copie e cole o código abaixo nele.


 import os import psycopg2 from flask import Flask CREATE_TABLE = ( "CREATE TABLE IF NOT EXISTS events (id SERIAL PRIMARY KEY, name TEXT);" ) INSERT_RETURN_ID = "INSERT INTO events (name) VALUES (%s) RETURNING id;" app = Flask(__name__) pg_port = os.environ['APP_PG_PORT'] # 5432 is the default port url = "postgres://postgres:password@localhost:%s/"%pg_port connection = psycopg2.connect(url) @app.route("/") def hello_world(): with connection: with connection.cursor() as cursor: cursor.execute(CREATE_TABLE) cursor.execute(INSERT_RETURN_ID, ("",)) id = cursor.fetchone()[0] return "I've been visited {} times".format(id), 201



Neste script, usamos "postgres://postgres:password@localhost:%s/"%pg_port para estabelecer uma conexão com o banco de dados.


  • pg_port obtém seu valor da variável de ambiente APP_PG_PORT .

  • Definiremos a variável de ambiente APP_PG_PORT como 5432 antes de executarmos o script Python (instruções abaixo).

  • Portanto, a string de conexão do banco de dados simplesmente aponta para localhost:5432 .


Anote a variável Python pg_port e a variável de ambiente APP_PG_PORT . Na produção, geralmente carregamos a porta a partir de uma variável de ambiente e ela não é codificada no código-fonte.


Execute o aplicativo da web

Siga as instruções abaixo para executar o aplicativo da web.


  1. Primeiro, certifique-se de adicionar as dependências Python necessárias com:

     # Install flask. pip3 install flask # Install psycopg2. pip3 install psycopg2-binary


  1. Em seguida, inicie o aplicativo Flask ( main.py ) com:

     export APP_PG_PORT=5432 flask --app main run


  1. Finalmente, em um navegador da web, abra este URL: http://localhost:5000/ .


Instale o Ockam

Agora que configuramos nosso aplicativo web e banco de dados, vamos fazer o seguinte:


  1. Adicione Ockam à mistura.

  2. Atualize nossa variável de ambiente APP_PG_PORT para que ela se conecte a uma nova porta (não 5432 , que é onde o servidor PostgreSQL é executado).


Primeiro, vamos executar ockam enroll . Certifique-se de já ter instalado a CLI do Ockam conforme descrito na seção de pré-requisitos acima.


Em uma janela de terminal, execute este comando e siga as instruções para concluir o processo de registro (no Ockam Orchestrator).

 ockam enroll


Isto é o que o comando ockam enroll faz:

  • Ele verifica se tudo está instalado corretamente após o registro bem-sucedido no Ockam Orchestrator.
  • Ele cria um espaço e um projeto para você no Ockam Orchestrator e provisiona uma retransmissão criptografada de ponta a ponta em seu projeto default em /project/default .


Conecte o banco de dados

A seguir, vamos configurar uma tcp-outlet que nos permite enviar tráfego TCP bruto para o servidor PostgreSQL na porta 5432 . Em seguida, crie uma retransmissão em nosso projeto padrão do Orchestrator. Para fazer isso, execute estes comandos em seu terminal.

 export PG_PORT=5432 ockam tcp-outlet create --to $PG_PORT ockam relay create


Notas:

  • Usamos a variável de ambiente PG_PORT aqui, e não APP_PG_PORT (que é usada em nosso aplicativo web). Ele aponta para a porta padrão do PostgreSQL 5432 . Na seção abaixo alteraremos APP_PG_PORT para um valor diferente.
  • Criaremos a tcp-inlet correspondente na próxima seção.

Os relés permitem estabelecer protocolos ponta a ponta com serviços que operam em redes privadas remotas. Eles eliminam a necessidade de expor portas no serviço remoto (a uma rede hostil como a Internet).


Conecte o aplicativo da web

Finalmente, vamos configurar uma tcp-inlet local para que possamos receber tráfego TCP bruto na porta 5433 antes de ser encaminhado.

 export OCKAM_PORT=5433 ockam tcp-inlet create --from $OCKAM_PORT


Notas:

  • A nova variável de ambiente $OCKAM_PORT aponta para uma nova porta 5433 .
  • Esta é a porta que o tcp-inlet irá escutar. E é diferente da porta padrão do PostgreSQL.

Uma entrada TCP é uma forma de definir onde um nó escuta suas conexões. E então para onde deve encaminhar esse tráfego. Uma entrada e uma saída trabalham juntas para formar um portal.


A seguir, inicie seu aplicativo web novamente com os comandos abaixo.


 export APP_PG_PORT=$OCKAM_PORT flask --app main run


Por fim, conecte-se a este URL novamente em seu navegador http://localhost:5000/ .


  1. Alteramos $APP_PG_PORT para o mesmo valor de $OCKAM_PORT ( 5433 ). Nosso aplicativo da web (script main.py ) não se conecta diretamente ao servidor de banco de dados inseguro (na porta 5432 ). Agora passa pelo canal seguro 🔐.

  2. O contador continuará a incrementar como antes, sem nenhuma alteração de código em seu aplicativo. Mas o aplicativo da web agora se comunica com o banco de dados por meio de um canal seguro Ockam 🎉.


Várias máquinas

Você também pode estender este exemplo e mover o serviço PostgreSQL para um contêiner Docker ou para uma máquina totalmente diferente. Depois que os nós forem registrados (após a execução ockam enroll ), esta demonstração continuará funcionando, sem alterações no código do aplicativo e sem necessidade de expor as portas do PostgreSQL diretamente à Internet.


Além disso, você pode executar o aplicativo web e o banco de dados em máquinas diferentes. Para fazer isso:


  1. Altere localhost no script main.py para o endereço IP da máquina que hospeda o banco de dados.

  2. Execute ockam enroll em ambas as máquinas (a máquina do aplicativo Web e a máquina do servidor de banco de dados).


Explore outros comandos

Agora que você concluiu este exemplo, aqui estão alguns comandos para você experimentar e ver o que eles fazem. Você sempre pode consultar os detalhes do que eles fazem no manual . Ao experimentar cada um deles, fique atento às coisas que você pode ter criado neste exercício.


  • Experimente ockam node list . Você vê os nós que criou neste exercício?
  • Tente ockam node --help . Estes são exemplos mais curtos para você se familiarizar com os comandos.
  • Experimente ockam node show web . Você vê a tcp-inlet que criou neste exercício?
  • Tente ockam node show db . Você vê o tcp-outlet que criou neste exercício?
  • Experimente ockam identity list . Você vê as identidades que criou neste exercício?


Também publicado aqui.