Volver al blog

Síguenos y suscríbete

Sólo disponible en inglés

Por el momento, esta página solo está disponible en inglés. Lamentamos las molestias. Vuelva a visitar esta página más tarde.

Cómo desplegar el WAF de última generación de Fastly en menos de 10 minutos

Brooks Cunningham

Senior Security Strategist, Fastly

Cómo empezar

Entre los problemas a los que puede que te enfrentes al intentar proteger tus puntos de conexión web y de API, destacan dos: la lentitud y dificultad a la hora de desplegar la solución de seguridad, y la complejidad de manejo y mantenimiento de la misma. 

Así pues, cada vez es más importante que el equipo de DevOps pueda agilizar los cambios de reglas y políticas (como pueden ser las señales personalizadas o las reglas de limitación de volumen) en pos de la mitigación de amenazas a la seguridad, sobre todo cuando estas cada vez son más dinámicas y cambiantes. 

Gracias a una mayor velocidad y automatización, contarás con una política de seguridad más fuerte ante las amenazas presentes y futuras de internet, puesto que los equipos pueden adaptarse más rápidamente, actualizando reglas para impedir ataques con menos riesgo de errores humanos. Como veremos en la presente entrada, una estrategia integrada que implique IaC (infraestructura como código) puede resultar útil en este sentido.

El WAF de última generación de Fastly (NGWAF) cubre tanto velocidad como automatización: es la gran ventaja de ser «de última generación». Desde el minuto uno, se pone a funcionar y elimina falsos positivos sin necesidad de reglas, expresiones regulares ni ningún tipo de ajustes ni mantenimiento. Así, no es de extrañar que Gartner nombrase al WAF de última generación de Fastly «Customers’ Choice» cinco años seguidos. Por si esto fuera poco, el despliegue es fácil y rápido, y lo voy a demostrar a continuación creando un nuevo despliegue del NGWAF en el edge mediante Terraform.

Terraform sigue ganando en popularidad como herramienta para el despliegue y mantenimiento de infraestructuras de TI y facilita, más que nunca, la protección de tus puntos de conexión web y API en conjunción con nuestro NGWAF desplegado en el edge. No obstante, la presente guía se puede usar simplemente para facilitar el aprovisionamiento de la infraestructura y, luego, dejar Terraform de lado. 

Breve comentario sobre la terminología

A continuación compartimos una lista de términos que usaremos y sus definiciones correspondientes. Si quieres saber más, explora nuestra documentación online (https://docs.fastly.com/signalsciences/using-signal-sciences/corp-management/).

  • Sitio (https://docs.fastly.com/signalsciences/using-signal-sciences/web-interface/about-the-site-overview-page/

    • Los sitios pertenecen a una «corp» (organización) y están formados por un conjunto de peticiones y configuraciones. Las peticiones provienen de agentes configurados con las claves secretas de acceso del sitio. Son configuraciones las reglas de agente (p. ej., etiquetar peticiones como XSS, reglas de listas de permitidos y bloqueados, reglas de bloqueo), la lista de los miembros, integraciones y otras opciones de configuración. Si aplicamos la lógica, un sitio es la asignación de un dominio o aplicación concretos (p. ej., app1.ejemplo.com o app2.ejemplo.com); en cambio, puede haber múltiples aplicaciones que compartan las mismas claves de sitio, o puede existir una aplicación repartida entre diferentes sitios (p. ej., ejemplo.com y ejemplo.com/admin).

  • Corp (https://docs.fastly.com/signalsciences/using-signal-sciences/web-interface/about-the-corp-overview-page/

    • Una «corp» (organización) está formada por un conjunto de sitios y usuarios. Los usuarios se autentican mediante una organización y pueden ser miembros de diferentes sitios de la misma organización.

  • Despliegue en el edge (https://docs.fastly.com/signalsciences/install-guides/edge/edge-deployment/

    • Gracias al despliegue en el edge, puedes añadir Signal Sciences como servicio de seguridad en la plataforma de edge cloud de Fastly sin tener que efectuar cambios a tu propio entorno de alojamiento.

Selección de la estructura de tu despliegue

Dos preguntas que nos suelen plantear los clientes son: «¿Qué sitio del NGWAF debería enlazar con mi integración en el edge?», y «¿Necesito crear un nuevo sitio del NGWAF para la integración en el edge?». Con el NGWAF, puedes elegir la estructura que más convenga a tu organización. Si quieres, puedes usar un sitio existente, o puedes crear un nuevo sitio para esta opción concreta de despliegue. Si quieres saber más acerca de estas dos opciones, aquí encontrarás un recurso excelente sobre cómo diseñar la estructura de tu sitio y organización del NGWAF en el edge, pero la forma más fácil de empezar es desplegar usando un sitio del NGWAF existente.

Fastly proporciona todo lo necesario para este proceso:

  1. una clave de API del edge de Fastly con permisos para crear y gestionar servicios (https://docs.fastly.com/en/guides/using-api-tokens#creating-api-tokens); 

  2. una clave de API del WAF de última generación con permisos de gestión de la organización;

  3. un sitio y organización del WAF de última generación (https://docs.fastly.com/signalsciences/using-signal-sciences/corp-management/). 

Despliegue del WAF de última generación en el edge

Para el despliegue, se debe usar la siguiente configuración de Terraform:

# Terraform 0.13+ requires providers to be declared in a "required_providers" block
# https://registry.terraform.io/providers/fastly/fastly/latest/docs
terraform {
 required_providers {
   fastly = {
     source  = "fastly/fastly"
     version = ">= 3.0.4"
   }
   sigsci = {
     source = "signalsciences/sigsci"
     version = ">= 1.2.18"
   }
 }
}
# Fastly Edge VCL configuration
variable "FASTLY_API_KEY" {
   type        = string
   description = "This is API key for the Fastly VCL edge configuration."
}
#### VCL Service variables - Start
variable "USER_VCL_SERVICE_DOMAIN_NAME" {
 type = string
 description = "Frontend domain for your service. Try 'YOURNAME.global.ssl.fastly.net' to get up and running quickly."
 default = "brooks-ngwaf-tf-demo.global.ssl.fastly.net"
}
variable "USER_VCL_SERVICE_BACKEND_HOSTNAME" {
 type          = string
 description   = "hostname used for backend."
 default       = "http-me.glitch.me"
}
# Controls the percentage of traffic sent to NGWAF
variable "Edge_Security_dictionary" {
 type = string
 default = "Edge_Security"
}
variable "NGWAF_CORP" {
 type          = string
 description   = "Corp name for NGWAF"
}
variable "NGWAF_SITE" {
 type          = string
 description   = "Site name for NGWAF"
}
#### VCL Service variables - End
#### NGWAF variables - Start
variable "NGWAF_EMAIL" {
   type        = string
   description = "Email address associated with the token for the NGWAF API."
}
variable "NGWAF_TOKEN" {
   type        = string
   description = "Secret token for the NGWAF API."
   sensitive   = true
}
#### NGWAF variables - End
# Configure the Fastly Provider
provider "fastly" {
 api_key = var.FASTLY_API_KEY
}
#### Fastly VCL Service - Start
resource "fastly_service_vcl" "frontend-vcl-service" {
 name = "Frontend VCL Service - NGWAF edge deploy"
 domain {
   name    = var.USER_VCL_SERVICE_DOMAIN_NAME
   comment = "Frontend VCL Service - NGWAF edge deploy"
 }
 backend {
   address = var.USER_VCL_SERVICE_BACKEND_HOSTNAME
   name = "vcl_service_origin_1"
   port    = 443
   use_ssl = true
   ssl_cert_hostname = var.USER_VCL_SERVICE_BACKEND_HOSTNAME
   ssl_sni_hostname = var.USER_VCL_SERVICE_BACKEND_HOSTNAME
   override_host = var.USER_VCL_SERVICE_BACKEND_HOSTNAME
 }
 #### NGWAF Dynamic Snippets - MANAGED BY FASTLY - Start
  dynamicsnippet {
    name     = "ngwaf_config_init"
    type     = "init"
    priority = 0
  }
  dynamicsnippet {
    name     = "ngwaf_config_miss"
    type     = "miss"
    priority = 9000
  }
  dynamicsnippet {
    name     = "ngwaf_config_pass"
    type     = "pass"
    priority = 9000
  }
  dynamicsnippet {
    name     = "ngwaf_config_deliver"
    type     = "deliver"
    priority = 9000
  }
 #### NGWAF Dynamic Snippets - MANAGED BY FASTLY - End
 dictionary {
   name       = var.Edge_Security_dictionary
 }
 lifecycle {
   ignore_changes = [
     product_enablement,
   ]
 }
 force_destroy = true
}
resource "fastly_service_dictionary_items" "edge_security_dictionary_items" {
 for_each = {
 for d in fastly_service_vcl.frontend-vcl-service.dictionary : d.name => d if d.name == var.Edge_Security_dictionary
 }
 service_id = fastly_service_vcl.frontend-vcl-service.id
 dictionary_id = each.value.dictionary_id
 items = {
   Enabled: "100"
 }
}
resource "fastly_service_dynamic_snippet_content" "ngwaf_config_init" {
 for_each = {
 for d in fastly_service_vcl.frontend-vcl-service.dynamicsnippet : d.name => d if d.name == "ngwaf_config_init"
 }
 service_id = fastly_service_vcl.frontend-vcl-service.id
 snippet_id = each.value.snippet_id
 content = "### Fastly managed ngwaf_config_init"
 manage_snippets = false
}
resource "fastly_service_dynamic_snippet_content" "ngwaf_config_miss" {
 for_each = {
 for d in fastly_service_vcl.frontend-vcl-service.dynamicsnippet : d.name => d if d.name == "ngwaf_config_miss"
 }
 service_id = fastly_service_vcl.frontend-vcl-service.id
 snippet_id = each.value.snippet_id
 content = "### Fastly managed ngwaf_config_miss"
 manage_snippets = false
}
resource "fastly_service_dynamic_snippet_content" "ngwaf_config_pass" {
 for_each = {
 for d in fastly_service_vcl.frontend-vcl-service.dynamicsnippet : d.name => d if d.name == "ngwaf_config_pass"
 }
 service_id = fastly_service_vcl.frontend-vcl-service.id
 snippet_id = each.value.snippet_id
 content = "### Fastly managed ngwaf_config_pass"
 manage_snippets = false
}
resource "fastly_service_dynamic_snippet_content" "ngwaf_config_deliver" {
  for_each = {
  for d in fastly_service_vcl.frontend-vcl-service.dynamicsnippet : d.name => d if d.name == "ngwaf_config_deliver"
  }
  service_id = fastly_service_vcl.frontend-vcl-service.id
  snippet_id = each.value.snippet_id
  content = "### Fastly managed ngwaf_config_deliver"
  manage_snippets = false
}
#### Fastly VCL Service - End
#### NGWAF Edge deploy - Start
provider "sigsci" {
  corp = var.NGWAF_CORP
  email = var.NGWAF_EMAIL
  auth_token = var.NGWAF_TOKEN
  fastly_api_key = var.FASTLY_API_KEY
}
resource "sigsci_edge_deployment" "ngwaf_edge_site_service" {
 # https://registry.terraform.io/providers/signalsciences/sigsci/latest/docs/resources/edge_deployment
 site_short_name = var.NGWAF_SITE
}
resource "sigsci_edge_deployment_service" "ngwaf_edge_service_link" {
 # https://registry.terraform.io/providers/signalsciences/sigsci/latest/docs/resources/edge_deployment_service
 site_short_name = var.NGWAF_SITE
 fastly_sid      = fastly_service_vcl.frontend-vcl-service.id
 activate_version = true
 percent_enabled = 100
 depends_on = [
   sigsci_edge_deployment.ngwaf_edge_site_service,
   fastly_service_vcl.frontend-vcl-service,
   fastly_service_dictionary_items.edge_security_dictionary_items,
   fastly_service_dynamic_snippet_content.ngwaf_config_init,
   fastly_service_dynamic_snippet_content.ngwaf_config_miss,
   fastly_service_dynamic_snippet_content.ngwaf_config_pass,
   fastly_service_dynamic_snippet_content.ngwaf_config_deliver,
 ]
}
resource "sigsci_edge_deployment_service_backend" "ngwaf_edge_service_backend_sync" {
  site_short_name = var.NGWAF_SITE
  fastly_sid      = fastly_service_vcl.frontend-vcl-service.id
  fastly_service_vcl_active_version = fastly_service_vcl.frontend-vcl-service.active_version
  depends_on = [
    sigsci_edge_deployment_service.ngwaf_edge_service_link,
  ]
}
#### NGWAF Edge deploy - End
output "love_laugh_live_ngwaf" {
  value = <<tfmultiline
  #### Click the URL to go to the service ####
  https://cfg.fastly.com/${fastly_service_vcl.frontend-vcl-service.id}
  #### Send a test request with curl. ####
  curl -i "https://${var.USER_VCL_SERVICE_DOMAIN_NAME}/anything/whydopirates?likeurls=theargs" -d foo=bar
  #### Send an test as cmd exe request with curl. ####
  curl -i "https://${var.USER_VCL_SERVICE_DOMAIN_NAME}/anything/myattackreq?i=../../../../etc/passwd'" -d foo=bar
  #### Troubleshoot the logging configuration if necessary. ####
  curl https://api.fastly.com/service/${fastly_service_vcl.frontend-vcl-service.id}/logging_status -H fastly-key:$FASTLY_API_KEY
  tfmultiline
 description = "Output hints on what to do next."
 depends_on = [
   sigsci_edge_deployment_service.ngwaf_edge_service_link
 ]
}

Si ya cuentas con todos los requisitos anteriores (clave de API del edge de Fastly, clave de API del NGWAF, permisos y sitio/organización del NGWAF), basta con que ejecutes `terraform apply` y envíes una petición para probar el nuevo despliegue. Por suerte, también hemos integrado la petición de prueba en Terraform, porque queremos ponértelo lo más fácil posible. Ahora ya puedes empezar a usar la interfaz de usuario del NGWAF de Fastly para gestionar los ajustes de seguridad de tu aplicación, o bien puedes seguir usando Terraform como lo harías con cualquier otra opción de despliegue.

¿Y qué pasa tras bambalinas?

El proveedor de Terraform de Signal Sciences lleva a cabo dos acciones:

  1. crea el servicio del NGWAF en el edge;

  2. enlaza el servicio del NGWAF en el edge con tu servicio de VCL.

El enlace entre el servicio de VCL y el servicio del NGWAF en el edge genera, a su vez, varias acciones: 

  • crea un diccionario Edge; 

  • crea fragmentos dinámicos de cuyo mantenimiento se encargará Fastly;

  • sincroniza los orígenes configurados en el servicio de VCL con el servicio en el edge del NGWAF.

La primera vez que se ejecuta `terraform apply`, se crea el servicio de VCL con tres fragmentos dinámicos que establecen `managed = false` para indicar que esos recursos en concreto se gestionarán fuera de Terraform (https://registry.terraform.io/providers/fastly/fastly/latest/docs/resources/service_dynamic_snippet_content#manage_snippets). En este caso, «fuera de Terraform» implica que Fastly gestionará los fragmentos y los modificará si fuera necesario.

¡Enhorabuena!

Ya tienes a tu sitio protegido. Esperamos haber aclarado cómo se aprovisiona un despliegue del NGWAF en el edge con nuevos servicios de VCL por medio de Terraform; ¡es así de fácil! No te pierdas una futura entrada del blog en la que repasaremos cómo usar Terraform con un servicio de Fastly existente, y escríbenos si tienes algún comentario o pregunta.