Files
Applications/terraform-cloudflare-tunnel-zone/Readme.md
T
2026-03-16 18:26:47 +01:00

275 lines
5.7 KiB
Markdown

# Cloudflare Tunnel - Configuration Terraform
Configuration Terraform pour gérer un tunnel Cloudflare avec support multi-applications et intégration Vault.
## 📋 Prérequis
- Terraform >= 1.7.5
- Accès à Vault (https://vault.tips-of-mine.com)
- Compte Cloudflare avec accès Zero Trust
- Token Vault avec permissions de lecture sur `secret/cloudflare`
## 🔐 Configuration Vault
### 1. Structure des secrets dans Vault
Les secrets Cloudflare doivent être stockés dans Vault au chemin `secret/cloudflare` :
```bash
# Se connecter à Vault
vault login
# Créer les secrets Cloudflare
vault kv put secret/cloudflare \
api_token="votre_token_cloudflare" \
zone_id="votre_zone_id" \
account_id="votre_account_id" \
email="admin@tips-of-mine.org"
```
### 2. Vérifier les secrets
```bash
vault kv get secret/cloudflare
```
### 3. Créer un token Vault pour la CI/CD
```bash
# Créer une politique pour Terraform
vault policy write terraform-cloudflare - <<EOF
path "secret/data/cloudflare" {
capabilities = ["read"]
}
EOF
# Créer un token avec cette politique
vault token create -policy=terraform-cloudflare -ttl=1h
```
## 🚀 Utilisation
### Configuration locale (développement)
```bash
# Initialiser Terraform
terraform init
# Définir le token Vault
export VAULT_TOKEN="votre_token_vault"
export TF_VAR_vault_token="$VAULT_TOKEN"
# Planifier les changements
terraform plan
# Appliquer la configuration
terraform apply
```
### Ajouter une nouvelle application
Éditez `terraform.tfvars` et ajoutez une nouvelle entrée dans `applications` :
```hcl
applications = {
# Applications existantes...
# Nouvelle application
"mon-app" = {
subdomain = "mon-app"
origin_url = "http://10.0.4.200:3000"
no_tls_verify = false
access_enabled = true
access_team_name = "tips-of-mine"
access_aud_tags = ["mon-app-tag"]
}
}
```
## 🔧 Configuration CI/CD
### Variables d'environnement requises
La CI/CD doit définir :
```bash
# Token Vault (obligatoire)
VAULT_TOKEN="hvs.xxxxxxxxxxxxx"
# Ou via TF_VAR
TF_VAR_vault_token="hvs.xxxxxxxxxxxxx"
```
### Exemple de commandes CI/CD
```bash
# Pipeline steps
terraform init
terraform validate
terraform plan -out=tfplan
terraform apply tfplan
```
## 📊 Outputs
Après l'apply, Terraform affichera :
- **tunnel_id** : ID du tunnel Cloudflare
- **tunnel_cname** : CNAME technique du tunnel
- **tunnel_token** : Token pour cloudflared (sensible)
- **applications_urls** : URLs publiques de toutes les applications
- **applications_details** : Détails complets de chaque application
### Récupérer le tunnel token
```bash
terraform output -raw tunnel_token
```
## 🔒 Sécurité
### ✅ Ce qui est sécurisé
- Tous les secrets Cloudflare sont dans Vault
- Le tunnel token est marqué comme sensible
- Pas de secrets en clair dans le code
- Variables sensibles protégées
### ⚠️ Points d'attention
- Ne **jamais** commiter `terraform.tfstate` (contient le tunnel token)
- Ne **jamais** commiter `.terraform/`
- Le `vault_token` doit être fourni par la CI/CD
- Utiliser un backend distant pour le state (S3, GCS, Terraform Cloud)
### .gitignore recommandé
```gitignore
# Terraform
.terraform/
*.tfstate
*.tfstate.*
*.tfvars.backup
.terraform.lock.hcl
# Secrets
*.pem
*.key
.env
secrets/
# OS
.DS_Store
Thumbs.db
```
## 📁 Structure du projet
```
.
├── main.tf # Configuration principale et Vault
├── variables.tf # Déclaration des variables
├── terraform.tfvars # Valeurs des variables (sans secrets)
├── providers.tf # Configuration des providers
├── tunnels.tf # Configuration du tunnel et applications
├── outputs.tf # Outputs Terraform
└── README.md # Cette documentation
```
## 🔄 Backend Terraform distant (recommandé)
Pour la CI/CD, configurez un backend distant dans `providers.tf` :
```hcl
terraform {
backend "s3" {
bucket = "votre-bucket-terraform-state"
key = "cloudflare-tunnel/terraform.tfstate"
region = "eu-west-1"
}
}
```
Ou avec Terraform Cloud :
```hcl
terraform {
cloud {
organization = "votre-org"
workspaces {
name = "cloudflare-tunnel"
}
}
}
```
## 📖 Exemples d'applications
### Application simple sans Access
```hcl
"app-simple" = {
subdomain = "app"
origin_url = "http://10.0.4.10:80"
no_tls_verify = false
access_enabled = false
}
```
### Application avec HTTPS auto-signé
```hcl
"app-https" = {
subdomain = "secure-app"
origin_url = "https://10.0.4.20:443"
no_tls_verify = true # Accepter les certificats auto-signés
access_enabled = false
}
```
### Application avec Cloudflare Access
```hcl
"app-protected" = {
subdomain = "admin"
origin_url = "http://10.0.4.30:8080"
no_tls_verify = false
access_enabled = true
access_team_name = "tips-of-mine"
access_aud_tags = ["admin-access"]
}
```
## 🆘 Dépannage
### Erreur : "Invalid Vault token"
```bash
# Vérifier que le token est valide
vault token lookup
# Renouveler si nécessaire
vault token renew
```
### Erreur : "Permission denied on secret/cloudflare"
```bash
# Vérifier les permissions du token
vault token capabilities secret/cloudflare
```
### Le tunnel ne se connecte pas
```bash
# Récupérer le token et le tester
TOKEN=$(terraform output -raw tunnel_token)
cloudflared tunnel run --token $TOKEN
```
## 📝 Notes
- Le `lifecycle { ignore_changes = [config] }` permet de modifier manuellement la config dans le Dashboard Cloudflare sans conflit
- Chaque application obtient son propre enregistrement DNS CNAME
- Le tunnel supporte un nombre illimité d'applications
- Les règles Access sont optionnelles par application