Jamf Concepts

Guías

Gestión de Jamf Protect con Terraform: El Proveedor de Jamf Protect

~9 min read

En nuestro artículo anterior, Gestión de la Configuración de Jamf con Terraform: Una Introducción, recorrimos los conceptos básicos de Infrastructure as Code y cómo comenzar con Terraform y Jamf Pro. Si aún no ha leído ese artículo, le recomendamos que comience por allí, ya que cubre los fundamentos de Terraform, instalación, estructura del proyecto y gestión de estado.

En esta ocasión, nos enfocamos en Jamf Protect. Hemos creado un proveedor de Terraform dedicado que le permite gestionar su configuración del producto Jamf Protect como código - planes, configuraciones de acciones, conjuntos de excepciones y mucho más.

¿Por qué un proveedor dedicado para Jamf Protect?

Al igual que Jamf Pro, Jamf Protect es un producto en sí mismo y forma parte de la familia de plataformas Jamf. Tiene su propia superficie de API (basada en GraphQL) y su propio conjunto de recursos que son distintos de Jamf Pro y otros microservicios de la Plataforma Jamf (por ejemplo, Blueprints y Compliance Benchmarks). Elementos como planes de seguridad de endpoints, configuraciones de telemetría y políticas de almacenamiento extraíble residen en Jamf Protect y necesitan su propio proveedor para ser gestionados adecuadamente.

Si ha estado gestionando su configuración de Jamf Protect a través de la consola, sabrá que recrear una configuración entre tenants o revertir un cambio requiere mucho trabajo manual. Con este proveedor, toda su configuración de Jamf Protect puede residir en Git, pasar por revisión de código y ser aplicada consistentemente entre entornos.

¿Qué cubre?

El proveedor incluye 16 recursos y 18 fuentes de datos. Estas son algunas de las áreas clave que cubre:

Detección y Prevención de Amenazas

  • Listas de Prevención Personalizadas - listas de permitir/bloquear por ID de Equipo, hash de archivo, CDHash o ID de firma.
  • Conjuntos de Excepciones - excepciones para análisis y controles de seguridad de endpoints.

Configuración de Endpoints

  • Planes - configuraciones completas de seguridad de endpoints incluyendo modos de prevención de amenazas, protocolos de comunicación, intervalos de informes y recopilación de información de dispositivos.
  • Configuraciones de Acciones - enriquecimiento de datos de alertas y endpoints de informes (HTTP, Kafka, cloud).
  • Telemetría - recopilación de eventos y registros: eventos de seguridad, autenticación, monitoreo de integridad de archivos, métricas de rendimiento y más.

Control de Dispositivos

  • Conjuntos de Control de Almacenamiento Extraíble - políticas de dispositivos USB con anulaciones por ID de proveedor, ID de producto o número de serie.

Configuración Operativa

  • Reenvío de Datos - enrutar datos a Amazon S3, Microsoft Sentinel o endpoints en la cloud.
  • Retención de Datos - políticas de retención a nivel de tenant.
  • Gestión de Cambios - congelaciones de configuración.
  • Filtros de Registro Unificado - recopilación de registros unificados de macOS usando filtros NSPredicate.

Control de Acceso

  • Usuarios, Grupos, Roles y Clientes de API - gestione el acceso y permisos en código.

Todos los recursos soportan operaciones CRUD completas e terraform import.

Es importante notar que jamfprotect_change_management, jamfprotect_data_forwarding y jamfprotect_data_retention son recursos singleton - gestionan configuraciones a nivel de tenant en lugar de objetos identificables individualmente.

Comenzando

Si siguió el artículo de introducción, ya debe tener Terraform instalado y una comprensión básica de cómo se estructuran los proyectos. Los pasos aquí son similares.

1. Crear un cliente de API en Jamf Protect

Vaya a Administración > Clientes de API en su consola de Jamf Protect y cree un nuevo cliente de API con los permisos que necesita para los recursos que desea gestionar.

2. Configurar el proveedor

Agregue el proveedor a su configuración de Terraform:

terraform {
  required_providers {
    jamfprotect = {
      source  = "Jamf-Concepts/jamfprotect"
      version = "~> 0.1.0"
    }
  }
}

provider "jamfprotect" {
  url           = "https://your-tenant.protect.jamfcloud.com"
  client_id     = var.jamfprotect_client_id
  client_secret = var.jamfprotect_client_secret
}

También puede usar variables de entorno si prefiere mantener el bloque de proveedor limpio:

export JAMFPROTECT_URL="https://your-tenant.protect.jamfcloud.com"
export JAMFPROTECT_CLIENT_ID="your-client-id"
export JAMFPROTECT_CLIENT_SECRET="your-client-secret"

Al igual que con el proveedor de Jamf Pro, asegúrese de que estas credenciales no terminen en su repositorio de Git. Use un archivo terraform.tfvars y agréguelo a su .gitignore.

3. Definir sus recursos

Aquí hay un ejemplo de una configuración de acción que define qué datos se recopilan y dónde se envían las alertas:

resource "jamfprotect_action_configuration" "default" {
  name = "Default Action Config"

  alert_data_collection = {
    binary_included_data_attributes                = ["Sha256", "Signing Information"]
    download_event_included_data_attributes        = ["File"]
    file_included_data_attributes                  = ["Sha256", "Signing Information"]
    file_system_event_included_data_attributes     = ["File", "Process"]
    gatekeeper_event_included_data_attributes      = ["Blocked Process"]
    group_included_data_attributes                 = ["Name"]
    keylog_register_event_included_data_attributes = ["Source Process"]
    process_included_data_attributes               = ["Args", "Signing Information", "Binary", "User", "Parent"]
    process_event_included_data_attributes         = ["Process"]
    screenshot_event_included_data_attributes      = ["File"]
    synthetic_click_event_included_data_attributes = ["Process"]
    user_included_data_attributes                  = ["Name"]
  }

  jamf_protect_cloud_endpoint = {
    collect_alerts = ["low", "medium", "high"]
    collect_logs   = ["telemetry"]
  }
}

Una política de almacenamiento extraíble que bloquea todo almacenamiento USB excepto unidades cifradas aprobadas:

resource "jamfprotect_removable_storage_control_set" "strict" {
  name                               = "Strict USB Policy"
  description                        = "Block all removable storage except encrypted devices."
  default_permission                 = "Prevent"
  default_local_notification_message = "Removable storage devices are not permitted."

  override_encrypted_devices = [
    {
      permission = "Read and Write"
    },
  ]
}

Un conjunto de excepciones para excluir herramientas de administración de IT conocidas de la prevención de amenazas:

resource "jamfprotect_exception_set" "it_admin_tools" {
  name        = "IT Admin Tools"
  description = "Exceptions for trusted IT administration software."

  exceptions = [
    {
      type     = "Override Endpoint Threat Prevention"
      sub_type = "Process"
      rules = [
        {
          rule_type = "Team ID"
          value     = "EQHXZ8M8AV"
        },
      ]
    },
  ]
}

También puede usar fuentes de datos para hacer referencia a recursos existentes en lugar de crearlos. Aquí buscamos el conjunto de Excepciones Predeterminadas Gestionadas por Jamf que ya existe en el tenant:

data "jamfprotect_exception_sets" "all" {}

locals {
  jamf_managed_default_exceptions = [
    for es in data.jamfprotect_exception_sets.all.exception_sets :
    es if es.name == "Jamf Managed Default Exceptions"
  ][0]
}

Estos recursos pueden entonces estar vinculados en un plan, que es la configuración que se implementa en los endpoints:

resource "jamfprotect_plan" "endpoint_security" {
  name        = "Endpoint Security Plan"
  description = "Standard endpoint security plan with threat prevention."

  action_configuration          = jamfprotect_action_configuration.default.id
  removable_storage_control_set = jamfprotect_removable_storage_control_set.strict.id

  exception_sets = [
    jamfprotect_exception_set.it_admin_tools.id,
    local.jamf_managed_default_exceptions.uuid,
  ]

  endpoint_threat_prevention = "Block and report"
  advanced_threat_controls   = "Block and report"
  tamper_prevention          = "Block and report"

  reporting_interval            = 1440
  compliance_baseline_reporting = true
  auto_update                   = true
  communications_protocol       = "MQTT:443"
  log_level                     = "Error"

  report_architecture  = true
  report_hostname      = true
  report_serial_number = true
  report_model_name    = true
  report_os_version    = true
}

El plan hace referencia a otros recursos por sus IDs, por lo que Terraform entiende el gráfico de dependencias y crea todo en el orden correcto.

4. Aplicar su configuración

Los mismos comandos que aprendió en la introducción se aplican aquí:

terraform init       # Inicializar y descargar el proveedor
terraform plan       # Revisar qué se creará, cambiará o destruirá
terraform apply      # Aplicar los cambios (se le pedirá que confirme)

Llevar un tenant existente bajo gestión

Si ya tiene un tenant de Jamf Protect con una configuración existente, no necesita empezar desde cero. Cada recurso en el proveedor soporta terraform import, por lo que puede llevar recursos existentes bajo gestión de Terraform sin recrearlos.

Descubrir recursos existentes con consulta de Terraform

Si está ejecutando Terraform 1.14+, el proveedor soporta list resources - una nueva característica que le permite consultar su infraestructura existente directamente desde Terraform. Esto es útil para descubrir qué ya existe en su tenant antes de importarlo.

Cree un archivo de consulta (por ejemplo, discover.tfquery.hcl):

list "jamfprotect_plan" "all" {
  provider         = jamfprotect
  include_resource = true
}

list "jamfprotect_exception_set" "custom" {
  provider = jamfprotect

  config {
    name_prefix = "Custom"
  }
}

Luego ejecute:

terraform query -generate-config-out=generated.tf

Terraform consultará su tenant de Jamf Protect, devolverá los recursos coincidentes junto con sus IDs y generará tanto los bloques de recursos como los bloques de importación en generated.tf. Cada tipo de recurso de lista en el proveedor soporta un filtro name_prefix en el bloque config (o email_prefix para usuarios) para que pueda limitar los resultados a lo que está buscando.

Todos los tipos de recursos soportan consultas de lista excepto los siguientes recursos singleton:

  • jamfprotect_change_management
  • jamfprotect_data_forwarding
  • jamfprotect_data_retention

Importar recursos

Una vez que tenga los IDs que necesita, puede usar bloques de importación para llevarlos bajo gestión. Con Terraform 1.5+:

import {
  to = jamfprotect_plan.endpoint_security
  id = "your-plan-uuid"
}

Ejecute terraform plan para generar la configuración del recurso importado, refínela según sea necesario, y desde ese punto en adelante se gestiona como código. Para más información sobre importación masiva de recursos, vea la documentación de importación masiva de HashiCorp.

Usar junto a otros proveedores de Jamf

Este proveedor está diseñado para funcionar junto a otros proveedores de Terraform en el ecosistema de Jamf. Puede usarlo con:

Entre estos proveedores, puede gestionar su entorno completo de Jamf como código desde un único proyecto de Terraform.

Antecedentes

Este proveedor fue creado originalmente por James Smith (@smithjw), quien generosamente donó el código fuente a Jamf Concepts. Gracias a James por el trabajo fundamental que hizo esto posible.

El proveedor es de código abierto bajo la licencia MPL 2.0 y está construido sobre el Terraform Plugin Framework de HashiCorp (Protocol v6). Incluye pruebas unitarias y de aceptación, y aceptamos contribuciones - reportes de errores, solicitudes de características y pull requests.

Qué viene después

Esta es una versión v0.1.x y estamos recopilando activamente comentarios. Si lo prueba, nos gustaría escuchar qué funciona y qué no. Abra un problema en el repositorio de GitHub o comuníquese en Jamf Nation.

Referencias