terraform-cloudflare-tunnel-zone-org
Bibliothèque d'exemples Cloudflare Zero Trust gérés par Terraform, construite autour d'un tunnel Cloudflare « home lab » sur la zone tips-of-mine.org.
Inspiré de macharpe/terraform-cloudflare-zero-trust-demo, adapté à une stack Vault (miroir OpenBao) + Authentik + Gitea Actions, et enrichi de briques supplémentaires.
📋 Avant tout apply : lire ACTIONS_EXTERNES.md — tout ce que Terraform ne peut pas faire (secrets Vault à créer, sshd à configurer, connecteurs à installer...) y est détaillé brique par brique.
Les briques
Les fichiers suivent la navigation du dashboard Cloudflare Zero Trust (Section-SousSection-Nom.tf).
Cœur — tunnel & applications
| Fichier | Contenu |
|---|---|
main.tf |
Secrets Vault, locals, construction des règles d'ingress |
Networks-Connectors-Cloudflare_Tunnels.tf |
Tunnels cloudflared (home + clouds) |
Networks-Routes-cidr.tf |
Routes réseau, DNS des applications, config d'ingress du tunnel |
Networks-Routes-Virtual_Networks.tf |
Réseaux virtuels par cloud |
variables.auto.tfvars → applications |
La map des applications exposées : ajouter une entrée = DNS + ingress créés au prochain apply |
Identité — deux briques IdP interchangeables
| Brique | Fichiers | Activation |
|---|---|---|
| Authentik (OIDC) | Integrations-Identity_providers.tf, Access_Controls-Policies-Rule_Groups.tf |
toujours active |
| Azure Entra ID | Integrations-Identity_providers.tf, Access_Controls-Policies-Rule_Groups-Azure.tf |
azure_idp_enabled = true + secret Vault secret/azure |
Les deux alimentent les mêmes concepts : rule groups, politiques réutilisables, enrôlement WARP.
Accès SSH — deux approches comparées
| Brique | Fichier | Principe |
|---|---|---|
| Certificats éphémères | Access_Controls-Service_Auth-Short_Lived_Certificates.tf + apps Infrastructure/ssh |
Cloudflare signe un certificat SSH de quelques secondes à chaque connexion — aucune clé à distribuer |
| Clé SSH classique | Access_Controls-Applications-ssh_key_based.tf |
Paire de clés ED25519 générée par Terraform, publiée via le tunnel — montre les limites (clé dans le state, rotation manuelle) |
Agent WARP (postes de travail)
| Fichier | Contenu |
|---|---|
Team_Resources-Devices-Enrollment_Permissions.tf |
Qui peut enrôler son poste (app type warp, MFA, domaine mail) |
Team_Resources-Devices-Device_posture.tf |
Postures gérées par Terraform : WARP actif, pare-feu, disque chiffré, version d'OS |
Team_Resources-Devices-Device_profiles.tf |
Profils WARP par OS |
Sites distants d'entreprise
| Brique | Fichier | Principe |
|---|---|---|
| Tunnels par site | Networks-Routes-Remote_Sites.tf |
Un cloudflared + un réseau virtuel par agence — CIDR identiques entre sites (cas réel post-fusion), isolés par réseau virtuel |
| WARP Connector | Networks-Connectors-WARP_Connector.tf |
Connectivité bidirectionnelle site↔site (création manuelle du connecteur, tokens récupérés par Terraform) |
Politiques de trafic (Gateway)
| Fichier | Contenu |
|---|---|
Traffic_Policies-Firewall_Policies-DNS.tf |
Blocage malware + liste publicitaire Pi-hole (mise à jour quotidienne par action-update-lists.yml) |
Traffic_Policies-Firewall_Policies-HTTP.tf |
Gouvernance IA, filtrage contenu, RBI (webmail isolé, sous licence) |
Traffic_Policies-Firewall_Policies-Network.tf |
Anti-mouvement latéral (SSH/RDP/SMB/WinRM/DB), contrôle RDP |
Traffic_Policies-Firewall_Policies-DLP.tf |
Profil DLP IBAN + politique de blocage (sous licence) |
Observabilité & M2M
| Fichier | Contenu |
|---|---|
Insights-Digital_Experience-Tests.tf |
Tests DEX (HTTP + traceroute) exécutés par les postes WARP |
Insights-Logs-Logpush.tf |
Export des logs Gateway vers S3/R2/SIEM (logpush_enabled) |
Access_Controls-Service_Auth-Service_Tokens.tf |
Accès machine-to-machine (CI) par service token |
Prérequis
- Terraform >= 1.8.0 (CI : 1.15.8 — les cores 1.7.x crashent avec le provider Cloudflare v5 récent) — https://developer.hashicorp.com/terraform/install
- Un Vault (ou OpenBao) joignable avec les secrets décrits dans ACTIONS_EXTERNES.md
- Un bucket S3 pour le state (
state.tf)
Token API Cloudflare (stocké dans Vault : secret/cloudflare, clé api_token)
| Type | Item | Permission | Mandatory |
|---|---|---|---|
Account |
Cloudflare Tunnel |
Edit | Required |
Account |
Zero Trust |
Edit | Required |
Account |
Access: Apps and Policies |
Edit | Required |
Account |
Access: Service Tokens |
Edit | Required |
Account |
Zero Trust: PII |
Read | Recommended |
Account |
Account Settings |
Read | Recommended |
Zone |
DNS |
Edit | Required |
Zone |
Zone |
Read | Recommended |
Démarrage manuel
git clone https://gitea.tips-of-mine.com/terraform-cloudflare-tunnel-zone-org.git
cd terraform-cloudflare-tunnel-zone-org
Utilisation du repository
init
terraform init
validation
terraform validate
plan (le token Vault est demandé, ou via TF_VAR_vault_token)
terraform plan
CI/CD (Gitea Actions)
| Workflow | Déclencheur | Rôle |
|---|---|---|
validate.yml |
pull request | fmt + validate + plan |
cicd.yml |
push sur main |
plan + apply |
action-update-lists.yml |
cron quotidien | met à jour la liste Pi-hole et ouvre une PR |
Secrets Gitea nécessaires : VAULT_TOKEN, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY.