Files
terraform-cloudflare-tunnel…/Access_Controls-Applications-Infrastructure.tf
hcornet 471024e022
Some checks failed
Terraform Apply / Terraform Apply (push) Failing after 7s
update file
2025-11-24 19:55:28 +01:00

241 lines
7.8 KiB
HCL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 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 ladresse interne qui sera protégée
# par Cloudflare Zero Trust. Elle représente lendpoint 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 lapplication en mode Infrastructure
# Cette ressource représente l'application Zero Trust côté Cloudflare,
# permettant d'appliquer politiques et règles daccè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 daccè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 ladresse interne qui sera protégée
# par Cloudflare Zero Trust. Elle représente lendpoint 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 lapplication en mode Infrastructure
# Cette ressource représente l'application Zero Trust côté Cloudflare,
# permettant d'appliquer politiques et règles daccè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 daccè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
}
}
}]
}