paint-brush
Connexion d'une application Web traditionnelle à une base de données Postgrespar@ockam
993 lectures
993 lectures

Connexion d'une application Web traditionnelle à une base de données Postgres

par Ockam8m2023/08/31
Read on Terminal Reader

Trop long; Pour lire

Apprenez à connecter une application Web traditionnelle à une base de données Postgres, d'une manière sécurisée dès la conception et nécessitant peu ou pas de modifications de code et aucune gestion de pare-feu.
featured image - Connexion d'une application Web traditionnelle à une base de données Postgres
Ockam HackerNoon profile picture
0-item


Ockam est une suite de bibliothèques Rust , d'outils de ligne de commande et de services cloud gérés pour orchestrer le chiffrement de bout en bout, l'authentification mutuelle, la gestion des clés, la gestion des informations d'identification et l'application des politiques d'autorisation, le tout à grande échelle. Ockam de bout en bout canaux sécurisés garantir l'authenticité, l'intégrité et la confidentialité de toutes les données en mouvement au niveau de la couche application.


Si vous stockez vos données dans une base de données relationnelle, NoSQL , une base de données graphique ou quelque chose de similaire, ces données sont probablement privées. Et vous ne souhaitez probablement pas l'exposer à Internet. Vous pouvez donc résoudre ce problème en le plaçant dans un sous-réseau privé. Cependant, vous devez désormais gérer les listes de contrôle d'accès au réseau, les groupes de sécurité ou les tables de routage pour permettre à d'autres machines d'ouvrir une connexion à la base de données. Cela représente beaucoup de frais généraux.


Avec Ockam, les administrateurs réseau n'ont pas besoin de mettre à jour les listes de contrôle d'accès au réseau, les groupes de sécurité ou les tables de routage. Ockam applique un contrôle précis à vos services via le contrôle d'accès basé sur les attributs. Et tu peux même intégrer avec un fournisseur d'identité externe comme Okta pour restreindre les personnes pouvant accéder à vos services.


Dans cet article de blog, nous explorerons l'interface de ligne de commande Ockam, ockam , et verrons comment nous pouvons connecter une application Web traditionnelle à une base de données PostgreSQL, avec un minimum ou aucune modification de code. Nous allons créer une application Python Flask très basique qui incrémente simplement un compteur dans une base de données PostgreSQL. Ensuite, nous déplacerons la connexion entre l'application et la base de données via un canal sécurisé Ockam.


Notre voyage

Avant de commencer, examinons les étapes que nous allons effectuer dans cet article de blog.

Notre voyage


  1. Utilisez ockam enroll pour installer l'application Ockam et créer un projet Ockam. C'est la première condition préalable.


  2. Configurez la base de données PostgreSQL. C'est la deuxième condition préalable. Configurez ensuite une "prise" Ockam sur le serveur de base de données. Nous en apprendrons davantage à ce sujet dans la section « connecter la base de données » ci-dessous.


  3. Configurez l'application Web (Python Flask). C'est la troisième condition préalable. Configurez ensuite une "entrée" Ockam depuis l'application Python. Nous en apprendrons davantage à ce sujet dans la section « Connecter l'application Web » ci-dessous.


Conditions préalables

Afin de suivre, assurez-vous d'installer tous les prérequis répertoriés ci-dessous.


  1. Commande Ockam
    • Exécutez brew install build-trust/ockam/ockam pour l'installer via brew . Vous pourrez alors exécuter l'application ockam CLI sur votre terminal.


  2. Python et bibliothèques : Flash, psychopg2
    • Exécutez brew install python pour l'installer via brew . Vous pourrez alors exécuter la commande python3 dans votre terminal.

    • Les instructions sur la façon d'obtenir les dépendances ( Flask , psycopg2 ) se trouvent dans le Code Python section ci-dessous.


  3. Postgresql
    • Exécutez brew install postgresql@15 via brew . Vous pourrez alors exécuter le serveur de base de données PostgreSQL sur votre machine sur le port par défaut de 5432 . Assurez-vous de suivre les instructions de brew et d'ajouter PostgreSQL à votre chemin.

    • Exécutez brew services start postgresql@15 pour démarrer le serveur PostgreSQL.

    • Ensuite, vous pouvez définir un nouveau mot de passe pour l'utilisateur de la base de données postgres . Définissez ce mot de passe sur password . Le code Python ci-dessous utilise postgres:password@localhost comme chaîne de connexion pour le pilote de base de données.


      Les instructions ci-dessous vous permettent de le faire sous Linux et macOS :


      • Dans un terminal, exécutez sudo -u postgres psql --username postgres --password --dbname template1 pour vous connecter localement à la base de données en tant qu'utilisateur postgres .

      • Tapez ensuite ceci dans REPL : ALTER USER postgres PASSWORD 'password'; , et enfin tapez exit .



L'application Web - Code Python

L'application Web Python Flask incrémente un compteur dans une base de données PostgreSQL. L'intégralité de l'application tient dans un seul fichier.


Créez un fichier main.py sur votre ordinateur et copiez-collez-y le code ci-dessous.


 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



Dans ce script, nous utilisons "postgres://postgres:password@localhost:%s/"%pg_port pour établir une connexion à la base de données.


  • pg_port obtient sa valeur de la variable d'environnement APP_PG_PORT .

  • Nous définirons la variable d'environnement APP_PG_PORT sur 5432 avant d'exécuter le script Python (instructions ci-dessous).

  • Ainsi, la chaîne de connexion à la base de données pointe simplement vers localhost:5432 .


Veuillez noter la variable Python pg_port et la variable d'environnement APP_PG_PORT . En production, nous chargeons généralement le port à partir d'une variable d'environnement et il n'est pas codé en dur dans la source.


Exécutez l'application Web

Suivez les instructions ci-dessous pour exécuter l'application Web.


  1. Tout d’abord, assurez-vous d’ajouter les dépendances Python requises avec :

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


  1. Démarrez ensuite l'application Flask ( main.py ) avec :

     export APP_PG_PORT=5432 flask --app main run


  1. Enfin, dans un navigateur Web, ouvrez cette URL : http://localhost:5000/ .


Installer Ockam

Maintenant que nous avons configuré notre application Web et notre base de données, procédons comme suit :


  1. Ajoutez Ockam au mélange.

  2. Mettez à jour notre variable d'environnement APP_PG_PORT afin qu'elle se connecte à un nouveau port (et non 5432 qui est celui où s'exécute le serveur PostgreSQL).


Tout d’abord, exécutons ockam enroll . Assurez-vous que vous avez déjà installé la CLI Ockam comme décrit dans la section des prérequis ci-dessus.


Dans une fenêtre de terminal, exécutez cette commande et suivez les invites pour terminer le processus d'inscription (dans Ockam Orchestrator).

 ockam enroll


Voici ce que fait la commande ockam enroll :

  • Il vérifie que tout est correctement installé après une inscription réussie auprès d'Ockam Orchestrator.
  • Il crée un espace et un projet pour vous dans Ockam Orchestrator et provisionne un relais chiffré de bout en bout dans votre projet default à /project/default .


Connecter la base de données

Ensuite, configurons une tcp-outlet qui nous permet d'envoyer du trafic TCP brut au serveur PostgreSQL sur le port 5432 . Créez ensuite un relais dans notre projet Orchestrator par défaut. Pour ce faire, exécutez ces commandes dans votre terminal.

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


Remarques:

  • Nous utilisons ici la variable d'environnement PG_PORT , et non APP_PG_PORT (qui est utilisée dans notre application Web). Il pointe vers le port PostgreSQL par défaut de 5432 . Dans la section ci-dessous, nous remplacerons APP_PG_PORT par une valeur différente.
  • Nous créerons l’ tcp-inlet correspondante dans la section suivante.

Les relais vous permettent d'établir des protocoles de bout en bout avec des services qui fonctionnent sur des réseaux privés distants. Ils éliminent le besoin d'exposer les ports du service distant (à un réseau hostile comme Internet).


Connectez l'application Web

Enfin, configurons une tcp-inlet locale afin que nous puissions recevoir le trafic TCP brut sur le port 5433 avant qu'il ne soit transféré.

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


Remarques:

  • La nouvelle variable d'environnement $OCKAM_PORT pointe vers un nouveau port 5433 .
  • C'est le port sur lequel tcp-inlet écoutera. Et il est différent du port PostgreSQL par défaut.

Une entrée TCP est un moyen de définir où un nœud écoute ses connexions. Et puis vers où il doit transférer ce trafic. Une entrée et une sortie travaillent ensemble pour former un portail.


Ensuite, redémarrez votre application Web avec les commandes ci-dessous.


 export APP_PG_PORT=$OCKAM_PORT flask --app main run


Enfin, connectez-vous à nouveau à cette URL depuis votre navigateur Web http://localhost:5000/ .


  1. Nous avons remplacé $APP_PG_PORT par la même valeur que $OCKAM_PORT ( 5433 ). Notre application Web (script main.py ) ne se connecte pas directement au serveur de base de données non sécurisé (sur le port 5432 ). Il passe désormais par le canal sécurisé 🔐.

  2. Le compteur continuera à incrémenter comme avant, sans aucune modification de code dans votre application. Mais l'application web communique désormais avec la base de données via un canal sécurisé Ockam 🎉.


Plusieurs machines

Vous pouvez également étendre cet exemple et déplacer le service PostgreSQL dans un conteneur Docker ou vers une machine entièrement différente. Une fois les nœuds enregistrés (après l'exécution ockam enroll ), cette démo continuera à fonctionner, sans modification du code d'application et sans qu'il soit nécessaire d'exposer les ports PostgreSQL directement à Internet.


Vous pouvez également exécuter l'application Web et la base de données sur différentes machines. Pour faire ça:


  1. Remplacez localhost dans le script main.py par l'adresse IP de la machine qui héberge la base de données.

  2. Exécutez ockam enroll sur les deux machines (la machine de l'application Web et la machine du serveur de base de données).


Explorer d'autres commandes

Maintenant que vous avez terminé cet exemple, voici quelques commandes pour essayer de voir ce qu'elles font. Vous pouvez toujours rechercher les détails de ce qu'ils font dans le manuel . Pendant que vous essayez chacun de ces éléments, gardez un œil sur les éléments que vous avez pu créer dans cet exercice.


  • Essayez ockam node list . Voyez-vous les nœuds que vous avez créés dans cet exercice ?
  • Essayez ockam node --help . Ce sont des exemples plus courts pour vous familiariser avec les commandes.
  • Essayez ockam node show web . Voyez-vous l' tcp-inlet que vous avez créée dans cet exercice ?
  • Essayez ockam node show db . Voyez-vous la tcp-outlet que vous avez créée dans cet exercice ?
  • Essayez ockam identity list . Voyez-vous les identités que vous avez créées dans cet exercice ?


Également publié ici.