# ============================================================================= # CLOUDFLARE : Access Controls : Applications > Infrastructure # ============================================================================= # ====================================================== # Création d'une Application en mode Infrastructure : # Accès SSH à une base MySQL hébergée sur AWS # ====================================================== # ------------------------------------------------------ # Création de la cible (Target) # Cette ressource définit la machine ou l’adresse interne qui sera protégée # par Cloudflare Zero Trust. Elle représente l’endpoint auquel les utilisateurs # se connecteront via Cloudflare Access (ici : accès SSH vers une VM AWS). # ------------------------------------------------------ resource "cloudflare_zero_trust_access_infrastructure_target" "aws_ssh_target" { account_id = local.cloudflare_account_id hostname = var.cloudflare_aws_target_ssh_name ip = { ipv4 = { ip_addr = var.aws_vm_internal_ip } } } # ------------------------------------------------------ # Création de l’application en mode Infrastructure # Cette ressource représente l'application Zero Trust côté Cloudflare, # permettant d'appliquer politiques et règles d’accès pour le protocole SSH. # ------------------------------------------------------ resource "cloudflare_zero_trust_access_application" "cloudflare_aws_app_ssh_infra" { account_id = local.cloudflare_account_id type = "infrastructure" name = var.cloudflare_aws_infra_app_name logo_url = "https://upload.wikimedia.org/wikipedia/commons/0/01/Google-cloud-platform.svg" # Tag permettant d'associer cette app à un groupe logique de ressources tags = [cloudflare_zero_trust_access_tag.tags["engineers"].name] # URLs personnalisées en cas d'accès refusé ou d'identité non reconnue custom_deny_url = "https://denied.tips-of-mine.org/" custom_non_identity_deny_url = "https://denied.tips-of-mine.org/" # Définition des critères de la cible (port et protocole) target_criteria = [{ port = "22", protocol = "SSH" target_attributes = { hostname = [var.cloudflare_aws_target_ssh_name] }, }] # ------------------------------------------------------ # Définition de la politique d’accès SSH pour cette application # Cette politique précise : # - qui peut se connecter # - via quel fournisseur d'identité # - quelles méthodes d'authentification sont requises # - quelles règles de sécurité supplémentaires s'appliquent # ------------------------------------------------------ policies = [{ name = "SSH GCP Infrastructure Policy" decision = "allow" # Fournisseurs d'identité autorisés allowed_idps = [ cloudflare_zero_trust_access_identity_provider.authentik_oidc.id, ] auto_redirect_to_identity = true allow_authenticate_via_warp = false # Groupes / domaines autorisés à accéder include = [ { saml = { identity_provider_id = cloudflare_zero_trust_access_identity_provider.authentik_oidc.id attribute_name = "groups" attribute_value = var.okta_infra_admin_saml_group_name # Admins Infra } }, { saml = { identity_provider_id = cloudflare_zero_trust_access_identity_provider.authentik_oidc.id attribute_name = "groups" attribute_value = var.okta_contractors_saml_group_name # Contractuels } }, { email_domain = { domain = var.cloudflare_email_domain } } ] # Exigences de sécurité obligatoires (MFA, posture appareil, etc.) require = [ { device_posture = { integration_uid = var.cloudflare_gateway_posture_id } }, { auth_method = { auth_method = "mfa" } } ] # Méthodes explicitement interdites exclude = [ { auth_method = { auth_method = "sms" } } ] # Configuration spécifique SSH (règles de connexion) connection_rules = { ssh = { allow_email_alias = true usernames = [] # None } } }] } # ====================================================== # Création d'une Application en mode Infrastructure : # Accès SSH à une base MySQL hébergée sur GCP # ====================================================== # ------------------------------------------------------ # Création de la cible (Target) # Cette ressource définit la machine ou l’adresse interne qui sera protégée # par Cloudflare Zero Trust. Elle représente l’endpoint auquel les utilisateurs # se connecteront via Cloudflare Access (ici : accès SSH vers une VM GCP). # ------------------------------------------------------ resource "cloudflare_zero_trust_access_infrastructure_target" "gcp_ssh_target" { account_id = local.cloudflare_account_id hostname = var.cloudflare_gcp_target_ssh_name ip = { ipv4 = { ip_addr = var.gcp_vm_internal_ip } } } # ------------------------------------------------------ # Création de l’application en mode Infrastructure # Cette ressource représente l'application Zero Trust côté Cloudflare, # permettant d'appliquer politiques et règles d’accès pour le protocole SSH. # ------------------------------------------------------ resource "cloudflare_zero_trust_access_application" "cloudflare_gcp_app_ssh_infra" { account_id = local.cloudflare_account_id type = "infrastructure" name = var.cloudflare_gcp_infra_app_name logo_url = "https://upload.wikimedia.org/wikipedia/commons/0/01/Google-cloud-platform.svg" tags = [cloudflare_zero_trust_access_tag.tags["engineers"].name] custom_deny_url = "https://denied.tips-of-mine.org/" custom_non_identity_deny_url = "https://denied.tips-of-mine.org/" target_criteria = [{ port = "22", protocol = "SSH" target_attributes = { hostname = [var.cloudflare_gcp_target_ssh_name] }, }] # Politique d’accès SSH pour GCP (mêmes principes que pour AWS) policies = [{ name = "SSH GCP Infrastructure Policy" decision = "allow" allowed_idps = [ cloudflare_zero_trust_access_identity_provider.authentik_oidc.id, ] auto_redirect_to_identity = true allow_authenticate_via_warp = false # Groupes / domaines autorisés à accéder include = [ { saml = { identity_provider_id = cloudflare_zero_trust_access_identity_provider.authentik_oidc.id attribute_name = "groups" attribute_value = var.okta_infra_admin_saml_group_name # Admins Infra } }, { saml = { identity_provider_id = cloudflare_zero_trust_access_identity_provider.authentik_oidc.id attribute_name = "groups" attribute_value = var.okta_contractors_saml_group_name # Contractuels } }, { email_domain = { domain = var.cloudflare_email_domain } } ] # Exigences de sécurité obligatoires (MFA, posture appareil, etc.) require = [ { device_posture = { integration_uid = var.cloudflare_gateway_posture_id } }, { auth_method = { auth_method = "mfa" } } ] # Méthodes explicitement interdites exclude = [ { auth_method = { auth_method = "sms" } } ] # Configuration spécifique SSH (règles de connexion) connection_rules = { ssh = { allow_email_alias = true usernames = [] # None } } }] }