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
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.
Avant de commencer, examinons les étapes que nous allons effectuer dans cet article de blog.
Utilisez ockam enroll
pour installer l'application Ockam et créer un projet Ockam. C'est la première condition préalable.
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.
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.
Afin de suivre, assurez-vous d'installer tous les prérequis répertoriés ci-dessous.
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.
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
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 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.
Suivez les instructions ci-dessous pour exécuter l'application Web.
Tout d’abord, assurez-vous d’ajouter les dépendances Python requises avec :
# Install flask. pip3 install flask # Install psycopg2. pip3 install psycopg2-binary
Démarrez ensuite l'application Flask
( main.py
) avec :
export APP_PG_PORT=5432 flask --app main run
http://localhost:5000/
.Maintenant que nous avons configuré notre application Web et notre base de données, procédons comme suit :
Ajoutez Ockam au mélange.
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
:
default
à /project/default
.
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:
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.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).
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:
$OCKAM_PORT
pointe vers un nouveau port 5433
.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/
.
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é 🔐.
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 🎉.
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:
Remplacez localhost
dans le script main.py
par l'adresse IP de la machine qui héberge la base de données.
Exécutez ockam enroll
sur les deux machines (la machine de l'application Web et la machine du serveur de base de données).
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
ockam node list
. Voyez-vous les nœuds que vous avez créés dans cet exercice ?ockam node --help
. Ce sont des exemples plus courts pour vous familiariser avec les commandes.ockam node show web
. Voyez-vous l' tcp-inlet
que vous avez créée dans cet exercice ?ockam node show db
. Voyez-vous la tcp-outlet
que vous avez créée dans cet exercice ?ockam identity list
. Voyez-vous les identités que vous avez créées dans cet exercice ?
Également publié ici.