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.
Notre voyage
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.
Conditions préalables
Afin de suivre, assurez-vous d'installer tous les prérequis répertoriés ci-dessous.
- Commande Ockam
Exécutez
brew install build-trust/ockam/ockam
pour l'installer viabrew
. Vous pourrez alors exécuter l'applicationockam
CLI sur votre terminal.
- Python et bibliothèques : Flash, psychopg2
Exécutez
brew install python
pour l'installer viabrew
. Vous pourrez alors exécuter la commandepython3
dans votre terminal.Les instructions sur la façon d'obtenir les dépendances (
Flask
,psycopg2
) se trouvent dans leCode Python section ci-dessous.
- Postgresql
Exécutez
brew install postgresql@15
viabrew
. Vous pourrez alors exécuter le serveur de base de données PostgreSQL sur votre machine sur le port par défaut de5432
. Assurez-vous de suivre les instructions debrew
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 surpassword
. Le code Python ci-dessous utilisepostgres: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'utilisateurpostgres
.Tapez ensuite ceci dans REPL :
ALTER USER postgres PASSWORD 'password';
, et enfin tapezexit
.
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'environnementAPP_PG_PORT
.Nous définirons la variable d'environnement
APP_PG_PORT
sur5432
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.
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
- 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 :
Ajoutez Ockam au mélange.
Mettez à jour notre variable d'environnement
APP_PG_PORT
afin qu'elle se connecte à un nouveau port (et non5432
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 nonAPP_PG_PORT
(qui est utilisée dans notre application Web). Il pointe vers le port PostgreSQL par défaut de5432
. Dans la section ci-dessous, nous remplaceronsAPP_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 port5433
. - 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/
.
Nous avons remplacé
$APP_PG_PORT
par la même valeur que$OCKAM_PORT
(5433
). Notre application Web (scriptmain.py
) ne se connecte pas directement au serveur de base de données non sécurisé (sur le port5432
). 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 🎉.
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:
Remplacez
localhost
dans le scriptmain.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).
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
- 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 latcp-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.