Activación de App and API Protection para las extensiones de servicio de GCP
Este producto no es compatible con el
sitio Datadog seleccionado. (
).
Las extensiones de App and API Protection Service está en vista previa
Para probar la vista previa de las extensiones de App and API Protection Service para GCP, sigue las instrucciones de configuración a continuación.
Puedes activar App and API Protection (AAP) con extensiones de servicio de GCP dentro de GCP Cloud Load Balancing. La integración de Datadog y las extensiones de servicio de App and API Protection proporciona capacidades de detección y bloqueo de amenazas directamente en tu entorno de GCP.
Requisitos previos
El Datadog Agent está instalado y configurado para el sistema operativo o contenedor, nube o entorno virtual de tu aplicación.
La configuración remota está configurada para permitir el bloqueo de atacantes a través de la interfaz de usuario de Datadog.
En tu proyecto de GCP, tienes el rol owner
o editor
del proyecto, o los roles de IAM de Compute Engine relevantes: compute.instanceAdmin.v1
(para crear instancias) y compute.networkAdmin
(para configurar el equilibrio de carga).
Se configura un proyecto de GCP con un Cloud Load Balancer para tus servicios. El Cloud Load Balancer debe ser uno de los Application Load Balancers compatibles con Traffic Callouts.
Las APIs Compute Engine y Network Services están activadas:
gcloud services enable compute.googleapis.com networkservices.googleapis.com
Habilitación de la detección de amenazas
Para configurar la extensión de servicio de App and API Protection en tu entorno de GCP, utiliza la consola de Google Cloud o los scripts de Terraform y completa los siguientes pasos.
Nota: Google Cloud proporciona guías para crear un servicio de backend de llamada y configurar una extensión de servicio como extensión de tráfico. Los siguientes pasos utilizan la misma configuración general, pero incluyen configuraciones personalizadas específicas para la integración de App and API Protection de Datadog.
Crea una instancia de VM Compute utilizando la imagen de Docker de extensiones de servicio de Datadog App and API Protection.
Consulta Configuración para conocer las variables de entorno disponibles cuando configures tu instancia de VM.
Note: Be sure to update your Firewall rules to allow the Load Balancer and Datadog agent to communicate with the Callout VM instance.
Añade la máquina virtual a un grupo de instancias no gestionadas.
Especifica http:80
y grpc:443
(o los valores que hayas configurado) para las asignaciones de puertos del grupo de instancias.
Crea un servicio de backend con la siguiente configuración:
- Protocolo:
HTTP2
- Nombre del puerto:
grpc
- Región: selecciona tu región
- Número de puerto de check de estado:
80
(o el valor que hayas configurado)
Añade el grupo de instancias con la VM de extensión de servicio como backend a este servicio de backend.
Configura la llamada de Traffic Service Extension:
- En la consola de Google Cloud, ve a Extensiones de servicios y crea una nueva extensión de servicio.
- Selecciona el tipo de balanceador de carga.
- Selecciona
Traffic extensions
como tipo. - Selecciona tus reglas de reenvío.
Crear una cadena de extensión
- Para enviar todo el tráfico a la extensión, inserta
true
en la Condición de coincidencia. - Para Tipo de capacidad de programación, selecciona
Callouts
. - Selecciona el servicio de backend que creaste en el paso anterior.
- Selecciona todos los eventos de la lista en los que deseas que App and API Protection ejecute la detección (encabezados de solicitud y encabezados de respuesta son obligatorios).
After this configuration is complete, the library collects security data from your application and sends it to the Agent. The Agent sends the data to Datadog, where out-of-the-box detection rules flag attacker techniques and potential misconfigurations so you can take steps to remediate.
To see App and API Protection threat detection in action, send known attack patterns to your application. For example, trigger the Security Scanner Detected rule by running a file that contains the following curl script:
for ((i=1;i<=250;i++));
do
# Target existing service's routes
curl https://your-application-url/existing-route -A dd-test-scanner-log;
# Target non existing service's routes
curl https://your-application-url/non-existing-route -A dd-test-scanner-log;
done
Note: The dd-test-scanner-log
value is supported in the most recent releases.
A few minutes after you enable your application and send known attack patterns to it, threat information appears in the Application Signals Explorer and vulnerability information appears in the Vulnerabilities explorer.
Puedes utilizar Terraform para automatizar el despliegue de la extensión de servicio de GCP de App and API Protection. Esto simplifica el proceso de configuración de la extensión de servicio para que funcione con tu equilibrador de carga existente.
- Terraform instalado en tu máquina local (versión 1.0.0 o posterior)
- Credenciales de GCP con los permisos adecuados
- Una clave de API de Datadog (utilizada para configurar el Datadog Agent)
- Un GCP Cloud Load Balancer existente para tu aplicación
El despliegue de Terraform creará los siguientes componentes:
- Una VM del Datadog Agent para recopilar trazas con eventos de seguridad
- Una VM que ejecuta la llamada de extensión de servicio de Datadog en un contenedor
- Una regla de firewall que permite la comunicación entre la extensión y el Agent
- Un grupo de instancias no gestionado que contiene la máquina virtual de extensión de servicios
- Un servicio de backend configurado para HTTP/2 con checks de estado
- Una extensión de servicio conectada a tu equilibrador de carga existente
Pasos de despliegue
El despliegue de la extensión de servicio de App and API Protection requiere varios componentes que funcionan juntos. Vamos a crear un módulo de Terraform que encapsula todos estos componentes, haciendo que el proceso de despliegue sea repetible y más fácil de mantener.
Crea un nuevo directorio y los archivos de Terraform necesarios:
mkdir gcp-aap-service-extension && cd gcp-aap-service-extension
touch main.tf variables.tf
Añade el siguiente código a tu archivo main.tf
. Este archivo define todos los componentes de infraestructura necesarios para la extensión de servicio de App and API Protection, incluidas las reglas de red, las instancias de máquina virtual y la configuración del equilibrador de carga:
# main.tf
#----------------------------------------------------------
# Network Configuration
#----------------------------------------------------------
# Firewall rule to allow the Service Extension to communicate with the Datadog Agent
resource "google_compute_firewall" "aap_se_firewall" {
name = "${var.project_prefix}-dd-agent-firewall"
network = "default"
allow {
protocol = "tcp"
ports = ["8126"]
}
source_tags = ["http-server"]
target_tags = ["datadog-agent"]
}
#----------------------------------------------------------
# Datadog Agent Configuration
#----------------------------------------------------------
# Datadog Agent container configuration
module "gce-container-datadog-agent" {
source = "terraform-google-modules/container-vm/google"
container = {
image = "public.ecr.aws/datadog/agent:latest"
env = [
{
name = "DD_API_KEY",
value = var.datadog_agent_api_key,
},
{
name = "DD_ENV",
value = "dev",
},
]
}
}
# Datadog Agent VM instance that collects traces from the Service Extension
resource "google_compute_instance" "datadog_agent" {
name = "${var.project_prefix}-datadog-agent"
machine_type = "e2-medium"
zone = var.zone
boot_disk {
auto_delete = true
initialize_params {
image = module.gce-container-datadog-agent.source_image
}
}
network_interface {
network = "default"
subnetwork = var.application_vpc_subnetwork
}
metadata = {
gce-container-declaration = module.gce-container-datadog-agent.metadata_value
google-logging-enabled = "true"
}
lifecycle {
create_before_destroy = true
}
tags = ["datadog-agent"]
}
#----------------------------------------------------------
# Service Extension Callout Container Configuration
#----------------------------------------------------------
# Datadog App and API Protection GCP Service Extension container configuration
module "gce-container-aap-service-extension" {
source = "terraform-google-modules/container-vm/google"
container = {
image = "ghcr.io/datadog/dd-trace-go/service-extensions-callout:v1.72.1" # Replace with the latest version
env = [
{
name = "DD_AGENT_HOST",
value = google_compute_instance.datadog_agent.network_interface.0.network_ip,
}
]
}
}
# Service Extension VM instance (callout instance)
resource "google_compute_instance" "default" {
name = "${var.project_prefix}-instance"
machine_type = "e2-medium"
zone = var.zone
boot_disk {
auto_delete = true
initialize_params {
image = module.gce-container-aap-service-extension.source_image
}
}
network_interface {
network = var.application_vpc_network
subnetwork = var.application_vpc_subnetwork
}
metadata = {
gce-container-declaration = module.gce-container-aap-service-extension.metadata_value
google-logging-enabled = "true"
}
lifecycle {
create_before_destroy = true
}
# http-server: Allow access on the http server for health checks
# https-server: Allow access on the 443 port for the AAP Service Extension
tags = ["http-server", "https-server", "lb-health-check"]
}
#----------------------------------------------------------
# Load Balancer Integration
#----------------------------------------------------------
# Unmanaged Instance Group including the App and API Protection Service Extension instance
resource "google_compute_instance_group" "aap_se_instance_group" {
name = "${var.project_prefix}-instance-group"
description = "Unmanaged instance group for the App and API Protection Service Extension"
zone = var.zone
named_port {
name = "http"
port = 80
}
named_port {
name = "grpc"
port = "443"
}
instances = [
google_compute_instance.default.self_link
]
}
# Health Check for the Backend Service
resource "google_compute_health_check" "aap_se_health_check" {
name = "${var.project_prefix}-health-check"
check_interval_sec = 5
timeout_sec = 5
healthy_threshold = 2
unhealthy_threshold = 2
http_health_check {
port = 80
request_path = "/"
}
}
# Backend Service that points to the Service Extension instance group
resource "google_compute_backend_service" "se_backend_service" {
name = "${var.project_prefix}-backend-service"
port_name = "grpc"
protocol = "HTTP2"
timeout_sec = 10
health_checks = [google_compute_health_check.aap_se_health_check.self_link]
load_balancing_scheme = "EXTERNAL_MANAGED"
backend {
group = google_compute_instance_group.aap_se_instance_group.self_link
}
}
#----------------------------------------------------------
# GCP Service Extension
#----------------------------------------------------------
# GCP Service Extension configuration for traffic interception
resource "google_network_services_lb_traffic_extension" "default" {
name = "${var.project_prefix}-service-extension"
description = "Datadog App and API Protection Service Extension"
location = "global"
load_balancing_scheme = "EXTERNAL_MANAGED"
forwarding_rules = [var.load_balancer_forwarding_rule]
extension_chains {
name = "${var.project_prefix}-service-extension-chain"
match_condition {
cel_expression = "true" # Match all traffic
}
extensions {
name = "${var.project_prefix}-service-extension-chain-ext"
authority = "datadoghq.com"
service = google_compute_backend_service.se_backend_service.self_link
timeout = "0.5s"
fail_open = false # If the extension fails, the request is dropped
# Supported events for the App and API Protection Service Extension
supported_events = ["REQUEST_HEADERS", "REQUEST_BODY", "RESPONSE_HEADERS", "RESPONSE_BODY"]
}
}
}
Añade el siguiente contenido al archivo variables.tf
. Este archivo define todas las variables de entrada necesarias para la configuración de Terraform:
# variables.tf
variable "region" {
description = "The GCP region where resources will be created (e.g., us-central1)"
type = string
validation {
condition = length(var.region) > 0
error_message = "Region cannot be empty."
}
}
variable "zone" {
description = "The GCP zone where zonal resources will be created (e.g., us-central1-a)"
type = string
validation {
condition = length(var.zone) > 0
error_message = "Zone cannot be empty."
}
}
# Project configuration
variable "project_prefix" {
description = "Prefix for the project. All resource names will be prefixed with this value"
type = string
validation {
condition = length(var.project_prefix) > 0
error_message = "Project prefix cannot be empty."
}
}
# Network configuration
variable "application_vpc_network" {
description = "Name of the VPC network for the application"
type = string
validation {
condition = length(var.application_vpc_network) > 0
error_message = "VPC network name cannot be empty."
}
}
variable "application_vpc_subnetwork" {
description = "Name of the VPC subnetwork for the application"
type = string
validation {
condition = length(var.application_vpc_subnetwork) > 0
error_message = "VPC subnetwork name cannot be empty."
}
}
# Authentication and API keys
variable "datadog_agent_api_key" {
description = "Datadog API key"
type = string
sensitive = true
validation {
condition = length(var.datadog_agent_api_key) > 0
error_message = "Datadog API key cannot be empty."
}
}
# Load balancer configuration
variable "load_balancer_forwarding_rule" {
description = "Self link to the forwarding rule for the load balancer"
}
Incluye el módulo en tu proyecto principal de Terraform. Este ejemplo muestra cómo hacer referencia al módulo creado anteriormente:
# main.tf
module "service_extension" {
source = "./gcp-aap-service-extension"
zone = "us-central1-a"
region = "us-central1"
project_prefix = "datadog-aap"
application_vpc_subnetwork = "your-subnet-name"
datadog_agent_api_key = "your-datadog-api-key"
load_balancer_forwarding_rule = "projects/your-project/regions/us-central1/forwardingRules/your-lb-rule" # or with a self link on your resource
}
Despliega la infraestructura ejecutando estos comandos en el directorio donde se encuentran tus archivos de Terraform:
terraform init
terraform plan
terraform apply
Validación posterior al despliegue
La extensión de servicio inspecciona automáticamente todo el tráfico que pasa por tu equilibrador de carga en busca de amenazas de seguridad.
After this configuration is complete, the library collects security data from your application and sends it to the Agent. The Agent sends the data to Datadog, where out-of-the-box detection rules flag attacker techniques and potential misconfigurations so you can take steps to remediate.
To see App and API Protection threat detection in action, send known attack patterns to your application. For example, trigger the Security Scanner Detected rule by running a file that contains the following curl script:
for ((i=1;i<=250;i++));
do
# Target existing service's routes
curl https://your-application-url/existing-route -A dd-test-scanner-log;
# Target non existing service's routes
curl https://your-application-url/non-existing-route -A dd-test-scanner-log;
done
Note: The dd-test-scanner-log
value is supported in the most recent releases.
A few minutes after you enable your application and send known attack patterns to it, threat information appears in the Application Signals Explorer and vulnerability information appears in the Vulnerabilities explorer.
Configuración
La imagen de Docker de la extensión de servicio de Datadog App and API Protection admite los siguientes ajustes de configuración:
Variable de entorno | Valor por defecto | Descripción |
---|
DD_SERVICE_EXTENSION_HOST | 0.0.0.0 | Dirección de escucha del servidor gRPC. |
DD_SERVICE_EXTENSION_PORT | 443 | Puerto del servidor gRPC. |
DD_SERVICE_EXTENSION_HEALTHCHECK_PORT | 80 | Puerto del servidor HTTP para checks de estado. |
Configura el contenedor para enviar trazas a tu Datadog Agent utilizando las siguientes variables de entorno:
Variable de entorno | Valor por defecto | Descripción |
---|
DD_AGENT_HOST | localhost | Nombre de host donde se ejecuta tu Datadog Agent. |
DD_TRACE_AGENT_PORT | 8126 | Puerto del Datadog Agent para la recopilación de trazas. |
Note: La integración de las extensiones de servicio de GCP se basa en el Datadog Go Tracer. Sigue el mismo proceso de lanzamiento que el rastreador, y sus imágenes de Docker se etiquetan con la versión del rastreador correspondiente.
La integración de las extensiones de servicio de GCP utiliza el Datadog Go Tracer y hereda todas las variables de entorno del rastreador. Encontrarás más opciones de configuración en la Configuración de la biblioteca de rastreo de Go y Configuración de la biblioteca de App and API Protection.
Limitaciones
Las extensiones de servicio de GCP tienen las siguientes limitaciones:
- El cuerpo de la solicitud no se inspecciona, independientemente de su tipo de contenido.
Referencias adicionales
Más enlaces, artículos y documentación útiles: