Zurück zum Blog

Folgen und abonnieren

So gelingt die Bereitstellung der Fastly Next-Gen WAF in weniger als 10 Minuten

Brooks Cunningham

Senior Security Strategist, Fastly

Erste Schritte

Mit die größten Reibungspunkte bei der Absicherung von Web- und API-Endpoints sind komplizierte oder schwer zu wartende Sicherheitslösungen und eine langsame und mühsame Bereitstellung. 

Insbesondere im Hinblick auf das dynamische und sich ständig weiterentwickelnde Bedrohungsumfeld wird es für DevOps-Teams immer wichtiger, Richtlinien und Regeländerungen zur Abwehr von Bedrohungen der Anwendungssicherheit (darunter nutzerdefinierte Signale oder Rate-Limiting-Regeln) zu beschleunigen. 

Schnelligkeit und Automatisierung führen angesichts immer neuer Bedrohungen aus dem Internet zu einer robusteren Sicherheitsstrategie. So können sich Teams schneller anpassen und sind bei der Überarbeitung von Regeln zur Angriffsabwehr weniger anfällig für menschliche Fehler. Wie wir in diesem Blogpost sehen werden, kann ein integrierter Ansatz, bei dem auch Infrastructure as Code (IaC) mit zum Einsatz kommt, Abhilfe verschaffen.

Die Fastly Next-Gen WAF (NGWAF) löst beide Probleme auf einen Streich (das ist eben das Tolle an einem Produkt der nächsten Generation). Sie ist sofort einsatzbereit und schließt Fehlalarme aus, ohne dass dafür Regeln oder Regex-Muster oder irgendeine Form von Tuning oder Wartung erforderlich wären. Dies sind einige der Gründe, warum die Fastly Next-Gen WAF von Gartner fünf Jahre in Folge zum „Customers’ Choice“ gekürt</u> wurde. Außerdem lässt sie sich im Handumdrehen einrichten. Im Folgenden zeige ich Ihnen, wie schnell und einfach Sie mit Terraform ein neues NGWAF Edge Deployment erstellen können.

Terraform erfreut sich als Tool für die Bereitstellung und Verwaltung von IT-Infrastrukturen immer größerer Beliebtheit und macht es einfacher denn je, Ihre Web- und API-Endpoints mit unserer NGWAF als Edge Deployment zu schützen. Die hier beschriebenen Hinweise können aber auch einfach nur zur Bereitstellung der Infrastruktur verwendet werden. 

Begriffsbestimmung

Hier einige Begriffe, die wir verwenden werden, und eine kurze Erklärung zu ihrer Bedeutung. Mehr erfahren Sie in unserer Onlinedokumentation (https://docs.fastly.com/signalsciences/using-signal-sciences/corp-management/</u>).

  • Site – https://docs.fastly.com/signalsciences/using-signal-sciences/web-interface/about-the-site-overview-page/</u> 

    • Sites sind Teil einer Corp und bestehen aus verschiedenen Requests und Konfigurationen. Requests kommen von Agents, die mit den Zugangs- und Geheimcodes der Site konfiguriert sind. Zu den Konfigurationen gehören Agent-Regeln (z. B. die Kennzeichnung von Requests als XSS, Regeln für die Liste blockierter und erlaubter Requests, Blockierungsregeln), die Liste der Mitglieder, Integrationen und andere Konfigurationsoptionen. Aus logischer Sicht könnte man sich eine Site als einer bestimmten Anwendung oder Domain zugehörige Verknüpfung vorstellen (z. B. app1.example.com vs. app2.example.com). Sie können aber auch mehrere Anwendungen auf dieselben Site Keys zugreifen lassen oder eine Anwendung in verschiedene Sites unterteilen (z. B. example.com und example.com/admin).

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

    • Eine Corp (Corporation) ist eine Zusammenstellung von Sites und Nutzern. Die Nutzer werden über eine Corp authentifiziert und können Mitglieder verschiedener Sites dieser Corp sein.

  • Edge Deployment – https://docs.fastly.com/signalsciences/install-guides/edge/edge-deployment/</u> 

    • Mit dem Edge Deployment können Sie Signal Sciences als Edge-Security-Service in die Edge-Cloud-Plattform von Fastly einbinden, ohne Änderungen an Ihrer eigenen Hosting-Umgebung vornehmen zu müssen.

Entscheidung über die Struktur Ihrer Bereitstellung

Zwei häufig gestellte Kundenfragen lauten: „Welche NGWAF Site soll ich mit meiner Edge-Integration verbinden?“ und „Muss ich für die Edge-Integration eine neue NGWAF Site erstellen?“. Bei unserer NGWAF können Sie ganz einfach die Struktur wählen, die zu Ihrem Unternehmen am besten passt: Entweder Sie verwenden eine bestehende Site oder erstellen eine neue Site für diese spezifische Bereitstellungsoption. Wenn Sie mehr über diese Optionen erfahren möchten, finden Sie hier eine großartige Ressource zur Ausgestaltung Ihrer NGWAF Corp- und Site-Struktur</u>. Der einfachste Weg für den Einstieg ist aber die Bereitstellung unter Verwendung einer bestehenden NGWAF Site.

Fastly bietet Ihnen alles, was Sie dafür brauchen:

  1. Einen Fastly Edge API-Schlüssel mit der Berechtigung, Services zu erstellen und zu verwalten https://docs.fastly.com/en/guides/using-api-tokens#creating-api-tokens</u> 

  2. Einen Next-Gen WAF API-Schlüssel mit Corp-Admin-Berechtigungen</u>

  3. Eine Next-Gen WAF Corp und Site https://docs.fastly.com/signalsciences/using-signal-sciences/corp-management/</u> 

Bereitstellung der Next-Gen WAF auf der Edge

Für die Bereitstellung sollten Sie die nachstehende Terraform Konfiguration verwenden.

# 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
 ]
}

Wenn Sie alle der oben genannten Voraussetzungen erfüllen (Fastly Edge API-Schlüssel, NGWAF API-Schlüssel, Berechtigungen und NGWAF Corp/Site), müssen Sie nur noch „terraform apply“ ausführen und einen Request senden, um Ihre Bereitstellung für die neue Edge-Bereitstellung zu testen. Glücklicherweise haben wir den Test-Request ebenfalls in Terraform integriert (weil wir es Ihnen so einfach wie möglich machen wollen). Nun können Sie die Sicherheitseinstellungen Ihrer Anwendungen über die Nutzeroberfläche der Fastly NGWAF verwalten oder Sie können wie bei jeder anderen Bereitstellungsoption weiterhin Terraform nutzen.

Was passiert hinter den Kulissen?

Der Signal Sciences Terraform Provider tut zweierlei Dinge:

  1. Er erstellt den NGWAF Edge Service.

  2. Er verknüpft den NGWAF Edge Service mit Ihrem VCL Service.

Bei der Verknüpfung des VCL Service mit dem NGWAF Edge Service geschehen gleich mehrere Dinge: 

  • Ein Edge Dictionary wird angelegt. 

  • Dynamische Snippets, die von Fastly verwaltet werden, werden erstellt.

  • Die für den VCL Service konfigurierten Origin-Server werden mit dem NGWAF Edge Service synchronisiert.

Wenn wir „terraform apply“ zum ersten Mal ausführen, wird ein VCL Service mit drei dynamischen Snippets erstellt, die allesamt die Einstellung „managed = false“ beinhalten. Diese gibt an, dass die entsprechenden spezifischen Ressourcen außerhalb von Terraform verwaltet werden (https://registry.terraform.io/providers/fastly/fastly/latest/docs/resources/service_dynamic_snippet_content#manage_snippets</u>). In unserem Fall bedeutet „außerhalb von Terraform“, dass Fastly die Snippets verwaltet und bei Bedarf Änderungen vornimmt.

Glückwunsch!

Ihre Sites zu schützen kann so einfach sein. Wir hoffen, dass Ihnen dieser Post dabei hilft, unsere NGWAF mithilfe von Terraform auf der Edge bereitzustellen. Seien Sie gespannt auf weitere Blogposts über die Verwendung von Terraform mit einem bestehenden Fastly Service und kontaktieren Sie uns gerne, wenn Sie Fragen oder Anregungen haben.