From 7edd1c99380bb83b4d561493a5a482b8b800abce Mon Sep 17 00:00:00 2001 From: hcornet Date: Fri, 31 Jul 2026 13:38:47 +0200 Subject: [PATCH] Update doc / change page deny --- README.md | 47 +-------- docs/architecture.svg | 227 ++++++++++++++++++++++++++++++++++++++++++ workers/deny-page.js | 154 ++++++++++++++++++++++------ 3 files changed, 357 insertions(+), 71 deletions(-) create mode 100644 docs/architecture.svg diff --git a/README.md b/README.md index c6d76ed..0ea36aa 100644 --- a/README.md +++ b/README.md @@ -21,51 +21,12 @@ Dans un modèle classique, on ouvre des ports sur sa box ou on installe un VPN : ## Vue d'ensemble -```mermaid -flowchart LR - subgraph POSTES["🖥️ Postes de travail"] - NAV["Navigateur"] - WARP["Agent WARP
multi-OS"] - end - - subgraph EDGE["☁️ Réseau Cloudflare"] - direction TB - ACCESS["🔐 Access
authentification & politiques"] - GW["🛡️ Gateway
filtrage DNS / HTTP / réseau"] - DENY["📄 Worker
page de refus"] - end - - subgraph IDP["🪪 Fournisseurs d'identité"] - AUTHENTIK["Authentik OIDC"] - AZUREAD["Azure Entra ID"] - GOOGLE["Google OAuth"] - end - - subgraph HOME["🏠 Réseau domestique - 10.0.x.x"] - CFD["connecteur cloudflared"] - HA["Home Assistant"] - WEB["Apps web internes"] - SSHSRV["Serveur SSH"] - end - - subgraph SITES["🏢 Sites distants d'entreprise"] - PARIS["Site Paris
10.100.0.0/16"] - LYON["Site Lyon
10.100.0.0/16
même CIDR !"] - end - - NAV -- "https://home.tips-of-mine.org" --> ACCESS - WARP -- "tout le trafic du poste" --> GW - ACCESS <-->|"vérification d'identité"| IDP - ACCESS -- "refus ➜ explication" --> DENY - ACCESS -- "tunnel (connexion sortante)" --> CFD - CFD --> HA & WEB & SSHSRV - GW -- "réseau privé virtuel" --> SITES - PARIS -."vnet-site-paris".- GW - LYON -."vnet-site-lyon".- GW -``` +![Architecture Zero Trust tips-of-mine.org](docs/architecture.svg) Point clé : les flèches vers le réseau domestique et les sites passent par des tunnels **initiés depuis l'intérieur**. Couper cloudflared = plus aucun accès possible, il n'existe pas de « porte » à attaquer. +> 🖊️ Le schéma est un SVG versionné dans [docs/architecture.svg](docs/architecture.svg) — éditable à la main (texte) ou dans Inkscape, et suivi dans les diffs comme le reste du code. + ## Parcours d'un accès utilisateur Ce qui se passe entre « je tape l'URL » et « je vois l'application » : @@ -274,6 +235,8 @@ Toutes alimentent les mêmes concepts : rule groups, politiques réutilisables, | `Account` | `Zero Trust` | **Edit** | **Required** | | `Account` | `Access: Apps and Policies` | **Edit** | **Required** | | `Account` | `Access: Service Tokens` | **Edit** | **Required** | +| `Account` | `Workers Scripts` | **Edit** | **Required** (page de refus) | +| `Zone` | `Workers Routes` | **Edit** | **Required** (page de refus) | | `Account` | `Digital Experience Monitoring` | **Edit** | For `dex_enabled = true` | | `Account` | `Zero Trust: DLP` | **Edit** | For `dlp_enabled = true` (+ abonnement DLP) | | `Account` | `Zero Trust: PII` | **Read** | **Recommended** | diff --git a/docs/architecture.svg b/docs/architecture.svg new file mode 100644 index 0000000..6fe89c9 --- /dev/null +++ b/docs/architecture.svg @@ -0,0 +1,227 @@ + + + + + + + + + + + + Architecture Zero Trust — tips-of-mine.org + Aucun port entrant ouvert : tous les tunnels sont initiés depuis l'intérieur, chaque accès est authentifié et contextualisé. + + + + Gitea — repo & CI/CD + validate · apply · drift quotidien + + + Terraform + state S3 verrouillé + + + Vault — secrets + AppRole CI · miroir OpenBao + + + + lit + + provisionne (API) + + + + Utilisateurs — navigateur + https://*.tips-of-mine.org + + 1. requête HTTPS → authentification Access + + + + Postes de travail — agent WARP + + 💻 Windows — profil + postures + + 💻 macOS — profil + postures + + 💻 Linux — profil + postures + Enrôlement : MFA + domaine mail + Postures : WARP · pare-feu · disque chiffré · OS + Tests DEX depuis les postes + + tunnel WARP + + + + POLITIQUES + Applications Access + • Home Network (défaut + service token) + • Intranet · Competition (MFA, posture) + • Browser SSH / VNC / RDP + • SSH classique par clé + Infrastructure + • SSH certificats éphémères (CA) + Enrôlement des postes + • MFA + domaine tips-of-mine.org + Rule groups + • Localisation (pays / continents) + • Versions d'OS (postures TF) + • Groupes SAML Authentik · Azure + Gateway + • DNS : malware + liste Pi-hole + • L4 : anti-mouvement latéral + • HTTP : IA · catégories · DNI banque + • DLP (IBAN) · RBI — sous licence + + + + + + Cloudflare — Zero Trust + équipe : tips-of-mine.cloudflareaccess.com + + + + QUOI + + Vérifier l'identité + multi-IdP · MFA obligatoire + + Vérifier le poste + posture en continu + + Accorder selon contexte + groupe · pays · appareil + + + + COMMENT + + Reverse proxy + rien d'exposé à l'origine + + Routes privées + réseaux virtuels par site + + Terminal navigateur + SSH · VNC · RDP + + + + Cloudflare Access + authentification & politiques + apps · service tokens · mTLS + + + Gateway + filtrage DNS · réseau L4 · HTTP + inspection TLS (certificat déployé) + + + + Worker — page de refus professionnelle + denied.tips-of-mine.org · réf. incident (Ray ID) · support / ticketing + + si refus + + + Observabilité + DEX · Logpush → S3/R2 · logs Gateway + + + + App Launcher — portail unique des applications autorisées + Home Assistant · Intranet · Competition · Browser SSH/VNC/RDP + + Chaque requête = identité + appareil + contexte vérifiés, à chaque fois — jamais de confiance implicite + + + + FOURNISSEURS D'IDENTITÉ (briques interchangeables) + + Authentik — OIDC + ✔ actif + MFA · claims groupes SAML + Contractors · IT Admin · Sales… + + Azure Entra ID + ⏸ optionnel — azure_idp_enabled + groupes Entra · Conditional Access + + Google OAuth + ⏸ optionnel — google_idp_enabled + + code email (OTP) + + OIDC / SAML + + + + 🏠 Réseau domestique — 10.0.x.0/24 + + cloudflared + connecteur (sortant) + replicas HA possibles + + Home Assistant + home.tips-of-mine.org + + http-app + http-app.…org + + secure-app + secure.…org + Access + + Serveur SSH + ssh.…org — clé/cert + Pi-hole 10.0.4.2 — la liste publicitaire alimente aussi Gateway (MàJ quotidienne CI) + ⛔ Aucun port entrant ouvert sur la box + + tunnel sortant + + + + 🏢 Sites distants d'entreprise (CIDR identiques) + + Site Paris — siège + cloudflared · LAN 10.100.0.0/16 + vnet-site-paris + serveurs · AD · imprimantes + + Site Lyon — agence + cloudflared · LAN 10.100.0.0/16 + vnet-site-lyon + ⚠ même CIDR — isolé par vnet + Variante WARP Connector (bidirectionnel) prête — IDs à renseigner + + un tunnel par site + + + + ☁️ Multi-cloud (exemples du catalogue) + + AWS + vpc-aws + route + + GCP + vpc-gcp + route + + Azure + vpc-azure + route + + OVH + vpc-ovh + route + + + + + + flux actif + + optionnel / conditionnel + + edge Cloudflare + + on-premise + diff --git a/workers/deny-page.js b/workers/deny-page.js index 26d40f0..083f97e 100644 --- a/workers/deny-page.js +++ b/workers/deny-page.js @@ -1,56 +1,149 @@ /** - * Page de refus d'accès personnalisée — servie sur denied.tips-of-mine.org + * Page de refus d'accès — servie sur denied.tips-of-mine.org * Toutes les applications Access du repo pointent leur custom_deny_url ici. * Déployée par Terraform : Workers-Deny_Page.tf + * + * La page affiche une référence d'incident (le Ray ID Cloudflare de la + * requête) : l'utilisateur la communique au support, qui peut retrouver la + * requête exacte dans les logs Access/Gateway. */ addEventListener('fetch', (event) => { event.respondWith(handleRequest(event.request)); }); +const SUPPORT_EMAIL = 'support@tips-of-mine.org'; +const TICKETING_URL = 'https://ticket.tips-of-mine.org'; // adapter à l'outil de ticketing + async function handleRequest(request) { + const rayId = request.headers.get('cf-ray') || 'indisponible'; + const now = new Date().toLocaleString('fr-FR', { timeZone: 'Europe/Paris', dateStyle: 'long', timeStyle: 'medium' }); + const html = ` - Accès refusé — Tips-Of-Mine + + Accès refusé (403) — Tips-Of-Mine
-
🚫
-

Accès refusé

-

Votre identité a bien été vérifiée, mais elle ne remplit pas - les conditions d'accès de cette application (groupe, posture du poste, MFA ou localisation).

-
- Que faire ?
- • Vérifiez que vous êtes connecté avec le bon compte ;
- • Vérifiez que le client WARP est actif et votre poste conforme ;
- • Si le besoin est légitime, contactez l'administrateur : - thedjinhn@gmail.com. +
+
+ +
+
+
Tips-Of-Mine
+
Sécurité des accès — Zero Trust
+
+
+ +
+ + + Erreur 403 — Accès refusé + + +

Vous n'êtes pas autorisé à accéder à cette application

+

Votre identité a bien été vérifiée, mais elle ne remplit pas + les conditions d'accès définies pour cette ressource : groupe d'autorisation, + conformité du poste de travail, authentification multifacteur ou localisation.

+ +
+
Référence incident
${rayId}
+
Horodatage
${now}
+
Code
HTTP 403 — Forbidden
+
+ +
    +
  • Vérifiez que vous êtes connecté avec votre compte professionnel ;
  • +
  • Vérifiez que le client WARP est actif et que votre poste est conforme ;
  • +
  • Si votre besoin d'accès est légitime, contactez le support en joignant la référence incident ci-dessus.
  • +
+ + +
+ +
@@ -58,6 +151,9 @@ async function handleRequest(request) { return new Response(html, { status: 403, - headers: { 'content-type': 'text/html; charset=utf-8' }, + headers: { + 'content-type': 'text/html; charset=utf-8', + 'cache-control': 'no-store', + }, }); }