<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Laurent Quastana</title>
    <description>The latest articles on DEV Community by Laurent Quastana (@laurent_quastana).</description>
    <link>https://dev.to/laurent_quastana</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2455076%2F757e51af-0af0-4ae2-a604-a1a996fe6a24.png</url>
      <title>DEV Community: Laurent Quastana</title>
      <link>https://dev.to/laurent_quastana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/laurent_quastana"/>
    <language>en</language>
    <item>
      <title>Sécuriser HL7/MLLP avec Stunnel (mTLS)</title>
      <dc:creator>Laurent Quastana</dc:creator>
      <pubDate>Mon, 07 Jul 2025 14:37:18 +0000</pubDate>
      <link>https://dev.to/laurent_quastana/securiser-hl7mllp-avec-stunnel-mtls-46b4</link>
      <guid>https://dev.to/laurent_quastana/securiser-hl7mllp-avec-stunnel-mtls-46b4</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Vous échangez des flux HL7 en clair entre EAI et DPI ?&lt;br&gt;
Voici comment les sécuriser avec TLS mutuel sans toucher au code source, en 4 commandes et un Docker Compose.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🌍 Contexte
&lt;/h2&gt;

&lt;p&gt;Les messages HL7 sont souvent véhiculés via MLLP (Minimal Lower Layer Protocol)… sans chiffrement.&lt;br&gt;
C’est encore toléré dans certains SIH, mais difficilement défendable en 2025 :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exposition des données patients (PHI) en clair&lt;/li&gt;
&lt;li&gt;Absence d’authentification forte entre systèmes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alors comment ajouter une &lt;strong&gt;couche TLS mutuelle&lt;/strong&gt; sans casser un lien MLLP existant ?&lt;br&gt;
Réponse : &lt;strong&gt;Stunnel + Docker&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Objectif du projet
&lt;/h2&gt;

&lt;p&gt;Le dépôt &lt;a href="https://github.com/lquastana/mllp-safetunnel" rel="noopener noreferrer"&gt;&lt;code&gt;mllp-safetunnel&lt;/code&gt;&lt;/a&gt; fournit un environnement de test pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;encapsuler HL7/MLLP en TLS (avec &lt;strong&gt;authentification mutuelle&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;simuler&lt;/strong&gt; des flux EAI ⇄ DPI via deux conteneurs Docker&lt;/li&gt;
&lt;li&gt;tester la réception, les ACKs, et l’interopérabilité&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🎯 Sans changer le code du DPI ou de l’EAI.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Contenu du dépôt
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Répertoire / fichier&lt;/th&gt;
&lt;th&gt;Rôle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eai/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dockerfile + scripts Python simulant l’envoi HL7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dpi/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Idem côté DPI (réception + retour)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;stunnel/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Certificats X.509 de test + script &lt;code&gt;gen-certs.sh&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Orchestration complète&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Diagrammes, bonnes pratiques sécurité, cheatsheets HL7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Les conteneurs utilisent deux réseaux internes (net_eai, net_dpi).&lt;br&gt;
Seuls les &lt;strong&gt;ports TLS (32100, 32200)&lt;/strong&gt; sont exposés à l’hôte.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Prérequis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker ≥ 24.0&lt;/li&gt;
&lt;li&gt;Docker Compose v2&lt;/li&gt;
&lt;li&gt;OpenSSL (si vous régénérez les certificats)&lt;/li&gt;
&lt;li&gt;Ports TCP disponibles : &lt;code&gt;32100&lt;/code&gt;, &lt;code&gt;32200&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Démarrage rapide
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Cloner le dépôt&lt;/span&gt;
git clone https://github.com/votre_org/mllp-safetunnel.git
&lt;span class="nb"&gt;cd &lt;/span&gt;mllp-safetunnel

&lt;span class="c"&gt;# 2. (Optionnel) régénérer les certificats&lt;/span&gt;
./stunnel/gen-certs.sh

&lt;span class="c"&gt;# 3. Lancer l’environnement&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# 4. Suivre les logs&lt;/span&gt;
docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; eai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Des messages HL7 (MDM^T02, ADT^A01) sont simulés toutes les 20 secondes, avec accusé de réception (ACK).&lt;/p&gt;




&lt;h2&gt;
  
  
  📡 Détail des tunnels Stunnel
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔁 EAI → DPI (client TLS)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Étape&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Protocole&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Envoi MLLP clair&lt;/td&gt;
&lt;td&gt;&lt;code&gt;21010&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tunnel TLS sortant&lt;/td&gt;
&lt;td&gt;&lt;code&gt;32100&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TLS mutuel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redirection vers DPI (clair)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;21010&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;TCP interne&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🔁 DPI → EAI (retour)
&lt;/h3&gt;

&lt;p&gt;Même logique, avec les ports &lt;code&gt;22010&lt;/code&gt; (clair) → &lt;code&gt;32200&lt;/code&gt; (TLS) → &lt;code&gt;22010&lt;/code&gt; (clair).&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Simulation HL7
&lt;/h2&gt;

&lt;p&gt;Chaque conteneur embarque :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Script&lt;/th&gt;
&lt;th&gt;Rôle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;send.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envoie un fichier HL7, logue le résultat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;send_loop.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envoi auto toutes les 20 s (actif par défaut)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;listen.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Écoute MLLP, affiche + ACK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;server.log&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Démarrage du service HL7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Exemple de test manuel :
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Depuis EAI vers DPI&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;eai /app/send.sh
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;dpi /app/listen.sh

&lt;span class="c"&gt;# Depuis DPI vers EAI&lt;/span&gt;
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;dpi /app/send.sh
docker compose &lt;span class="nb"&gt;exec &lt;/span&gt;eai /app/listen.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ Personnalisation
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Besoin&lt;/th&gt;
&lt;th&gt;À modifier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Certificats de prod&lt;/td&gt;
&lt;td&gt;Remplacer les fichiers dans &lt;code&gt;stunnel/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autres ports&lt;/td&gt;
&lt;td&gt;Modifier &lt;code&gt;stunnel.conf&lt;/code&gt; et &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remplacer simulateurs&lt;/td&gt;
&lt;td&gt;Monter vos conteneurs EAI / DPI réels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logs plus verbeux&lt;/td&gt;
&lt;td&gt;Ajouter &lt;code&gt;debug = 7&lt;/code&gt; dans les confs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔐 Bonnes pratiques sécurité
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TLS mutuel obligatoire&lt;/strong&gt; (&lt;code&gt;verify = 2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Limiter l’exposition aux ports &lt;code&gt;32100&lt;/code&gt; / &lt;code&gt;32200&lt;/code&gt; uniquement&lt;/li&gt;
&lt;li&gt;Automatiser la rotation des certificats (&lt;code&gt;gen-certs.sh&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Surveiller &lt;code&gt;stunnel.log&lt;/code&gt;, surtout en cas d’erreurs handshake&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📈 Envisager la production
&lt;/h2&gt;

&lt;p&gt;Ce projet est une base pour :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Démonstrateur sécurité avant mise en production&lt;/li&gt;
&lt;li&gt;Formation des équipes DevOps santé&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il peut être adapté en &lt;strong&gt;k8s&lt;/strong&gt;, supervisé avec &lt;strong&gt;Prometheus&lt;/strong&gt;, ou branché sur un EAI Mirth/Rhapsody.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧾 Licence
&lt;/h2&gt;

&lt;p&gt;MIT — libre d’usage et d’adaptation, y compris en contexte hospitalier.&lt;/p&gt;




&lt;p&gt;👉 &lt;strong&gt;Repo GitHub&lt;/strong&gt; : &lt;a href="https://github.com/lquastana/mllp-safetunnel" rel="noopener noreferrer"&gt;github.com/lquastana/mllp-safetunnel&lt;/a&gt;&lt;br&gt;
📢 Questions ? Ouvert aux PR / issues / idées !&lt;/p&gt;

</description>
      <category>hl7</category>
      <category>tls</category>
      <category>healthcare</category>
      <category>stunnel</category>
    </item>
    <item>
      <title>Mapping a Hospital Information System</title>
      <dc:creator>Laurent Quastana</dc:creator>
      <pubDate>Tue, 01 Jul 2025 11:53:43 +0000</pubDate>
      <link>https://dev.to/laurent_quastana/mapping-a-hospital-information-system-1mpm</link>
      <guid>https://dev.to/laurent_quastana/mapping-a-hospital-information-system-1mpm</guid>
      <description>&lt;h2&gt;
  
  
  1 — About me
&lt;/h2&gt;

&lt;p&gt;I’m a software engineer who spent more than a decade designing application architectures &lt;strong&gt;in banking&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Since 2022 I’ve served as transversal architect for several public hospitals (~ 300 apps, 500 data flows). My role: give &lt;strong&gt;CIOs&lt;/strong&gt; and operations a dual view—strategic &lt;em&gt;and&lt;/em&gt; hands-on—of their digital ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  2 — Starting point
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No global map&lt;/strong&gt; – every silo had its own PowerPoint.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No flow matrix&lt;/strong&gt; – impossible to size cyber-exposure or dependencies.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sparse documentation&lt;/strong&gt; on many off-the-shelf products.
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; governance suffered from &lt;strong&gt;limited visibility&lt;/strong&gt;, slowing territorial convergence and compliance work (PGSSI-S, HAS 2025).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  3 — Method: follow the ANSSI playbook
&lt;/h2&gt;

&lt;p&gt;The French cyber-agency guide &lt;em&gt;“Mapping an Information System in Five Steps”&lt;/em&gt; provides the backbone:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;establish the stakes,
&lt;/li&gt;
&lt;li&gt;collect reality,
&lt;/li&gt;
&lt;li&gt;pick tooling,
&lt;/li&gt;
&lt;li&gt;produce the views,
&lt;/li&gt;
&lt;li&gt;keep the map alive.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4 — Micro view: an ANSSI-aligned cartography engine
&lt;/h2&gt;

&lt;p&gt;To capture the &lt;strong&gt;nuts-and-bolts layer&lt;/strong&gt;—processes, applications, assets, flows, criticality—I rely on an &lt;strong&gt;open-source engine built around the ANSSI meta-model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multi-user workflow &amp;amp; JSON API
&lt;/li&gt;
&lt;li&gt;out-of-the-box alignment with EBIOS risk analysis
&lt;/li&gt;
&lt;li&gt;easy to script exports for DevSecOps pipelines
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Trade-offs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;substantial first data load&lt;/strong&gt; (time + people)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;information-dense diagrams&lt;/strong&gt;: perfect for engineers, too detailed for an executive “big picture”&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5 — Macro view: a Draw.io schema
&lt;/h2&gt;

&lt;p&gt;To bridge that &lt;em&gt;big-picture gap&lt;/em&gt;, I built a &lt;strong&gt;Domain → Process → Application&lt;/strong&gt; diagram (criticality, hosting model, mutualisation). Great for the C-suite—even if it can’t generate KPIs on its own.&lt;/p&gt;




&lt;h2&gt;
  
  
  6 — Dual tooling &amp;amp; data pipeline
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Angle&lt;/th&gt;
&lt;th&gt;Tooling choice&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Granular / operational&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ANSSI-aligned cartography engine&lt;/td&gt;
&lt;td&gt;Live knowledge base; validates new flows; links to biomedical assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Macro / indicators&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;it-lanscape&lt;/strong&gt; (my OSS repo)&lt;/td&gt;
&lt;td&gt;Nightly JSON → static dashboards: process similarity, mutualisation rate, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;Give it a try:&lt;/strong&gt; fork the project on GitHub → &lt;a href="https://github.com/lquastana/it-lanscape" rel="noopener noreferrer"&gt;https://github.com/lquastana/it-lanscape&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>architecture</category>
      <category>healthcare</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
