paint-brush
Conexión de una aplicación web tradicional a una base de datos Postgrespor@ockam
993 lecturas
993 lecturas

Conexión de una aplicación web tradicional a una base de datos Postgres

por Ockam8m2023/08/31
Read on Terminal Reader

Demasiado Largo; Para Leer

Aprenda a conectar una aplicación web tradicional a una base de datos de Postgres, de una manera segura por diseño y que requiere cambios mínimos o nulos en el código y sin administración de firewall.
featured image - Conexión de una aplicación web tradicional a una base de datos Postgres
Ockam HackerNoon profile picture
0-item


Ockam es un conjunto de bibliotecas de Rust , herramientas de línea de comandos y servicios administrados en la nube para orquestar el cifrado de extremo a extremo, la autenticación mutua, la administración de claves, la administración de credenciales y la aplicación de políticas de autorización, todo a gran escala. El extremo a extremo de Ockam canales seguros Garantizar la autenticidad, integridad y confidencialidad de todos los datos en movimiento en la capa de aplicación.


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 integrar con un proveedor de identidad externo como Okta para restringir quién puede acceder a sus servicios.


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.


Nuestro viaje

Antes de comenzar, echemos un vistazo a los pasos que realizaremos en esta publicación de blog.

Nuestro viaje


  1. Utilice ockam enroll para instalar la aplicación Ockam y crear un proyecto Ockam. Este es el primer requisito previo.


  2. 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.


  3. 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.


Requisitos previos

Para poder seguir adelante, asegúrese de instalar todos los requisitos previos que se enumeran a continuación.


  1. Comando Ockam
    • 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.


  2. Python y bibliotecas: Flash, psycopg2
    • 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 Código Python sección siguiente.


  3. postgresql
    • 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: código Python

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.


Ejecute la aplicación web

Siga las instrucciones a continuación para ejecutar la aplicación web.


  1. Primero, asegúrese de agregar las dependencias requeridas de Python con:

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


  1. Luego inicie la aplicación Flask ( main.py ) con:

     export APP_PG_PORT=5432 flask --app main run


  1. Finalmente, en un navegador web abra esta URL: http://localhost:5000/ .


Instalar Ockam

Ahora que hemos configurado nuestra aplicación web y base de datos, hagamos lo siguiente:


  1. Agrega Ockam a la mezcla.

  2. 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 :

  • Comprueba que todo esté instalado correctamente después de una inscripción exitosa con Ockam Orchestrator.
  • Crea un espacio y un proyecto para usted en Ockam Orchestrator y aprovisiona un relé cifrado de extremo a extremo en su proyecto default en /project/default .


Conectar la base de datos

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:

  • Aquí usamos la variable de entorno 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.
  • Crearemos la 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).


Conecte la aplicación web

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:

  • La nueva variable de entorno $OCKAM_PORT apunta a un nuevo puerto 5433 .
  • Este es el puerto en el que escuchará la 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/ .


  1. 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 🔐.

  2. 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 🎉.


Varias maquinas

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:


  1. Cambie localhost en el script main.py a la dirección IP de la máquina que aloja la base de datos.

  2. 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).


Explora otros comandos

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 manual . Mientras prueba cada uno de estos, esté atento a las cosas que haya creado en este ejercicio.


  • Pruebe ockam node list . ¿Ves los nodos que creaste en este ejercicio?
  • Pruebe ockam node --help . Estos son ejemplos más breves para que se familiarice con los comandos.
  • Pruebe ockam node show web . ¿Ves la tcp-inlet que creaste en este ejercicio?
  • Pruebe ockam node show db . ¿Ves la tcp-outlet que creaste en este ejercicio?
  • Pruebe ockam identity list . ¿Ves las identidades que creaste en este ejercicio?


También publicado aquí.