241 lines
7.8 KiB
HCL
241 lines
7.8 KiB
HCL
# =============================================================================
|
||
# 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
|
||
}
|
||
}
|
||
}]
|
||
}
|