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é
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.
Antes de começarmos, vamos dar uma olhada nas etapas que executaremos nesta postagem do blog.
Use ockam enroll
para instalar o aplicativo Ockam e criar um projeto Ockam. Este é o primeiro pré-requisito.
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.
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.
Para acompanhar, certifique-se de instalar todos os pré-requisitos listados abaixo.
Execute brew install build-trust/ockam/ockam
para instalar isso via brew
. Você poderá então executar o aplicativo CLI ockam
em seu terminal.
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
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 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.
Siga as instruções abaixo para executar o aplicativo da web.
Primeiro, certifique-se de adicionar as dependências Python necessárias com:
# Install flask. pip3 install flask # Install psycopg2. pip3 install psycopg2-binary
Em seguida, inicie o aplicativo Flask
( main.py
) com:
export APP_PG_PORT=5432 flask --app main run
http://localhost:5000/
.Agora que configuramos nosso aplicativo web e banco de dados, vamos fazer o seguinte:
Adicione Ockam à mistura.
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:
default
em /project/default
.
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:
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.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).
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:
$OCKAM_PORT
aponta para uma nova porta 5433
.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/
.
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 🔐.
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 🎉.
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:
Altere localhost
no script main.py
para o endereço IP da máquina que hospeda o banco de dados.
Execute ockam enroll
em ambas as máquinas (a máquina do aplicativo Web e a máquina do servidor de banco de dados).
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
ockam node list
. Você vê os nós que criou neste exercício?ockam node --help
. Estes são exemplos mais curtos para você se familiarizar com os comandos.ockam node show web
. Você vê a tcp-inlet
que criou neste exercício?ockam node show db
. Você vê o tcp-outlet
que criou neste exercício?ockam identity list
. Você vê as identidades que criou neste exercício?
Também publicado aqui.