Si almacena sus datos en una base de datos relacional, NoSQL , base de datos gráfica o algo similar, esos datos probablemente sean privados. Y probablemente no quieras exponerlo en Internet. Entonces puedes resolver este problema colocándolo dentro de una subred privada. Sin embargo, ahora debe administrar listas de control de acceso a la red, grupos de seguridad o tablas de rutas para permitir que otras máquinas abran una conexión a la base de datos. Eso es un montón de gastos generales.
Con Ockam, los administradores de red no tienen que actualizar listas de control de acceso a la red, grupos de seguridad o tablas de rutas. Ockam aplica un control detallado a sus servicios a través del control de acceso basado en atributos. Y tu puedes incluso
En esta publicación de blog, exploraremos la interfaz de línea de comandos de Ockam, ockam
, y veremos cómo podemos conectar una aplicación web tradicional a una base de datos PostgreSQL, con mínimos o ningún cambio de código. Crearemos una aplicación Python Flask muy básica que simplemente incrementa un contador en una base de datos PostgreSQL. Luego moveremos la conexión entre la aplicación y la base de datos a través de un canal seguro de Ockam.
Antes de comenzar, echemos un vistazo a los pasos que realizaremos en esta publicación de blog.
Utilice ockam enroll
para instalar la aplicación Ockam y crear un proyecto Ockam. Este es el primer requisito previo.
Configure la base de datos PostgreSQL. Este es el segundo requisito previo. Luego configure una "salida" de Ockam al servidor de la base de datos. Aprenderemos más sobre esto en la sección "conectar la base de datos" a continuación.
Configure la aplicación web (Python Flask). Éste es el tercer requisito previo. Luego configure una "entrada" de Ockam desde la aplicación Python. Aprenderemos más sobre esto en la sección "conectar la aplicación web" a continuación.
Para poder seguir adelante, asegúrese de instalar todos los requisitos previos que se enumeran a continuación.
Ejecute brew install build-trust/ockam/ockam
para instalar esto a través de brew
. Luego podrá ejecutar la aplicación CLI ockam
en su terminal.
Ejecute brew install python
para instalar esto mediante brew
. Luego podrás ejecutar el comando python3
en tu terminal.
Las instrucciones sobre cómo obtener las dependencias ( Flask
, psycopg2
) se encuentran en el
Ejecute brew install postgresql@15
mediante brew
. Luego podrá ejecutar el servidor de base de datos PostgreSQL en su máquina en el puerto predeterminado 5432
. Asegúrese de seguir las instrucciones de brew
y agregar PostgreSQL a su ruta.
Ejecute brew services start postgresql@15
para iniciar el servidor PostgreSQL.
Luego puede establecer una nueva contraseña para el usuario de la base de datos postgres
. Establezca esta contraseña en password
. El siguiente código Python utiliza postgres:password@localhost
como cadena de conexión para el controlador db.
Las instrucciones a continuación le permiten hacer esto en Linux y macOS:
En una terminal, ejecute sudo -u postgres psql --username postgres --password --dbname template1
para iniciar sesión en la base de datos localmente como usuario postgres
.
Luego escriba esto en REPL: ALTER USER postgres PASSWORD 'password';
y finalmente escriba exit
.
La aplicación web Python Flask incrementa un contador en una base de datos PostgreSQL. Toda la aplicación cabe en un solo archivo.
Cree un archivo main.py
en su máquina y copie y pegue el siguiente código en él.
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
En este script, usamos "postgres://postgres:password@localhost:%s/"%pg_port
para establecer una conexión a la base de datos.
pg_port
obtiene su valor de la variable de entorno APP_PG_PORT
.
Estableceremos la variable de entorno APP_PG_PORT
en 5432
antes de ejecutar el script Python (instrucciones a continuación).
Entonces, la cadena de conexión de la base de datos simplemente apunta a localhost:5432
.
Tome nota de la variable Python pg_port
y de la variable de entorno APP_PG_PORT
. En producción, normalmente cargamos el puerto desde una variable de entorno y no está codificado en el código fuente.
Siga las instrucciones a continuación para ejecutar la aplicación web.
Primero, asegúrese de agregar las dependencias requeridas de Python con:
# Install flask. pip3 install flask # Install psycopg2. pip3 install psycopg2-binary
Luego inicie la aplicación Flask
( main.py
) con:
export APP_PG_PORT=5432 flask --app main run
http://localhost:5000/
.Ahora que hemos configurado nuestra aplicación web y base de datos, hagamos lo siguiente:
Agrega Ockam a la mezcla.
Actualice nuestra variable de entorno APP_PG_PORT
para que se conecte a un nuevo puerto (no 5432
, que es donde se ejecuta el servidor PostgreSQL).
Primero, ejecutemos ockam enroll
. Asegúrese de haber instalado la CLI de Ockam como se describe en la sección de requisitos previos anterior.
En una ventana de terminal, ejecute este comando y siga las indicaciones para completar el proceso de inscripción (en Ockam Orchestrator).
ockam enroll
Esto es lo que hace el comando ockam enroll
:
default
en /project/default
.
A continuación, configuremos una tcp-outlet
que nos permita enviar tráfico TCP sin procesar al servidor PostgreSQL en el puerto 5432
. Luego cree un relé en nuestro proyecto Orchestrator predeterminado. Para hacer esto, ejecute estos comandos en su terminal.
export PG_PORT=5432 ockam tcp-outlet create --to $PG_PORT ockam relay create
Notas:
PG_PORT
, y no APP_PG_PORT
(que se usa en nuestra aplicación web). Apunta al puerto PostgreSQL predeterminado de 5432
. En la siguiente sección cambiaremos APP_PG_PORT
a un valor diferente.tcp-inlet
correspondiente en la siguiente sección.Los relés le permiten establecer protocolos de extremo a extremo con servicios que operan en redes privadas remotas. Eliminan la necesidad de exponer puertos en el servicio remoto (a una red hostil como Internet).
Finalmente, configuremos una tcp-inlet
local para que podamos recibir tráfico TCP sin procesar en el puerto 5433
antes de reenviarlo.
export OCKAM_PORT=5433 ockam tcp-inlet create --from $OCKAM_PORT
Notas:
$OCKAM_PORT
apunta a un nuevo puerto 5433
.tcp-inlet
. Y es diferente del puerto predeterminado de PostgreSQL.Una entrada TCP es una forma de definir dónde escucha un nodo sus conexiones. Y luego hacia dónde debería reenviar ese tráfico. Una entrada y una salida trabajan juntas para formar un portal.
A continuación, inicie su aplicación web nuevamente con los siguientes comandos.
export APP_PG_PORT=$OCKAM_PORT flask --app main run
Finalmente, conéctese nuevamente a esta URL desde su navegador web http://localhost:5000/
.
Hemos cambiado $APP_PG_PORT
al mismo valor que $OCKAM_PORT
( 5433
). Nuestra aplicación web (script main.py
) no se conecta directamente al servidor de base de datos no seguro (en el puerto 5432
). Ahora pasa por el canal seguro 🔐.
El contador continuará incrementándose tal como lo hizo antes, sin cambios de código en su aplicación. Pero la aplicación web ahora se comunica con la base de datos a través de un canal seguro de Ockam 🎉.
También puede ampliar este ejemplo y mover el servicio PostgreSQL a un contenedor Docker o a una máquina completamente diferente. Una vez que los nodos estén registrados (después de que se ejecute ockam enroll
), esta demostración continuará funcionando, sin cambios en el código de la aplicación y sin necesidad de exponer los puertos PostgreSQL directamente a Internet.
Además, puede ejecutar la aplicación web y la base de datos en diferentes máquinas. Para hacer esto:
Cambie localhost
en el script main.py
a la dirección IP de la máquina que aloja la base de datos.
Ejecute ockam enroll
en ambas máquinas (la máquina de la aplicación web y la máquina del servidor de la base de datos).
Ahora que ha completado este ejemplo, aquí hay algunos comandos para que pruebe y vea qué hacen. Siempre puedes buscar los detalles de lo que hacen en el
ockam node list
. ¿Ves los nodos que creaste en este ejercicio?ockam node --help
. Estos son ejemplos más breves para que se familiarice con los comandos.ockam node show web
. ¿Ves la tcp-inlet
que creaste en este ejercicio?ockam node show db
. ¿Ves la tcp-outlet
que creaste en este ejercicio?ockam identity list
. ¿Ves las identidades que creaste en este ejercicio?
También publicado aquí.