So gelingt die Bereitstellung der Fastly Next-Gen WAF in weniger als 10 Minuten
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 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/).
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).
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/
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. 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:
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
Einen Next-Gen WAF API-Schlüssel mit Corp-Admin-Berechtigungen
Eine Next-Gen WAF Corp und Site https://docs.fastly.com/signalsciences/using-signal-sciences/corp-management/
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/docsterraform { required_providers { fastly = { source = "fastly/fastly" version = ">= 3.0.4" } sigsci = { source = "signalsciences/sigsci" version = ">= 1.2.18" } }}# Fastly Edge VCL configurationvariable "FASTLY_API_KEY" { type = string description = "This is API key for the Fastly VCL edge configuration."}#### VCL Service variables - Startvariable "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 NGWAFvariable "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 - Startvariable "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 Providerprovider "fastly" { api_key = var.FASTLY_API_KEY}#### Fastly VCL Service - Startresource "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 - Startprovider "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 - Endoutput "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:
Er erstellt den NGWAF Edge Service.
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). 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.