# ============================================================================= # CLOUDFLARE : Access Controls : Service Auth : mTLS Certificates # ============================================================================= # BRIQUE mTLS : en plus de l'identité (IdP), exiger un CERTIFICAT CLIENT # installé sur le poste pour accéder aux applications sensibles. Même un # compte compromis ne suffit plus : il faut aussi la machine. # # 1. Une autorité de certification (CA) est déposée dans Vault (secret/mtls, # clé ca_pem — le certificat PUBLIC de la CA, pas sa clé privée !) # 2. Cloudflare vérifie que le client présente un certificat signé par # cette CA sur les hostnames associés # 3. La politique réutilisable ci-dessous ("Allow valid client certificate") # peut être ajoutée aux applications à durcir # # La brique est inerte tant que mtls_enabled = false. # ACTIONS EXTERNES (voir ACTIONS_EXTERNES.md) : générer la CA, distribuer # les certificats clients sur les postes, pousser le PEM dans Vault. # ============================================================================= data "vault_generic_secret" "mtls" { count = var.mtls_enabled ? 1 : 0 path = var.vault_mtls_path } #====================================================== # La CA de confiance, associée aux hostnames à protéger #====================================================== resource "cloudflare_zero_trust_access_mtls_certificate" "home_ca" { count = var.mtls_enabled ? 1 : 0 account_id = local.cloudflare_account_id name = "Home mTLS CA" certificate = data.vault_generic_secret.mtls[0].data["ca_pem"] associated_hostnames = [ "home.${var.cloudflare_zone}", ] } #====================================================== # Politique réutilisable : certificat client valide exigé #====================================================== resource "cloudflare_zero_trust_access_policy" "allow_valid_client_certificate" { count = var.mtls_enabled ? 1 : 0 account_id = local.cloudflare_account_id name = "Allow valid client certificate" decision = "non_identity" session_duration = "24h" include = [{ certificate = {} }] }