Jamf Concepts

Guías

Gestionar la Jamf Platform con Terraform: el proveedor de Jamf Platform

~11 min read

En nuestros artículos anteriores, cubrimos los fundamentos de Infrastructure as Code y cómo gestionar la configuración de Jamf Pro y Jamf Protect con Terraform. Si aún no los ha leído, vale la pena empezar con ellos ya que cubren la instalación, la estructura del proyecto y la gestión del estado.

Esta vez dirigimos nuestra atención a las API de Jamf Platform, que han entrado recientemente en beta pública. Estas API alimentan una nueva generación de microservicios de Jamf que conviven con Jamf Pro y Jamf Protect, incluyendo blueprints, Compliance Benchmarks y grupos de dispositivos. Hemos construido un proveedor de Terraform dedicado que le permite gestionar estos recursos como código.

¿Por qué un proveedor dedicado para los microservicios de Jamf Platform?

Las API de Jamf Platform son una superficie de API separada de las API Jamf Pro Classic y Pro. Alimentan capacidades que son distintas de los recursos que gestiona con el proveedor de Jamf Pro, y se autentican a través de un conjunto diferente de credenciales contra una puerta de enlace de API regional (us.apigw.jamf.com, eu.apigw.jamf.com o apac.apigw.jamf.com).

Los Blueprints le permiten definir el estado de configuración deseado para un grupo de dispositivos e implementarlo en una única operación. Los Compliance Benchmarks le permiten aplicar líneas de base de seguridad estándar de la industria desde el macOS Security Compliance Project (mSCP) y monitorear cómo se desempeña su flota. Los grupos de dispositivos le dan una forma de organizar y dirigirse a dispositivos a nivel de plataforma. Estas son todas capacidades de primera clase que merecen su propio proveedor, con esquemas diseñados específicamente para los recursos que gestionan.

Si ha estado gestionando blueprints y benchmarks a través de la consola de Jamf Pro, ya sabe que recrear una configuración entre inquilinos o realizar un seguimiento de los cambios a lo largo del tiempo requiere mucho trabajo. Con este proveedor, toda su configuración vive en Git, pasa por revisión de código y se aplica de manera consistente donde sea que la necesite.

¿Qué cubre?

El proveedor viene con 3 recursos, 12 fuentes de datos, 3 recursos de lista y 4 acciones de dispositivo. Aquí están las áreas clave:

Motor de Compliance Benchmark - Cree y gestione compliance benchmarks contra líneas de base mSCP incluyendo CIS Level 1 y 2, NIST 800-53 (Low, Moderate, High) y DISA STIG. Puede habilitar o deshabilitar reglas individuales, personalizar Organization-Defined Values (ODV) y dirigir benchmarks a grupos de dispositivos específicos. Las fuentes de datos le permiten consultar líneas de base disponibles, reglas y benchmarks existentes.

Blueprints - Defina blueprints de configuración de dispositivos que cubran aplicación de actualización de software, configuración de actualización de software, políticas de código de acceso, configuración de Safari, marcadores y extensiones, gestión de disco, configuración de accesorios de audio, configuración de matemáticas, tareas de fondo de servicio, archivos de configuración de servicio, payloads heredados y declaraciones DDM personalizadas. Cada blueprint se dirige a uno o más grupos de dispositivos y puede ser implementado o no implementado como código. Las fuentes de datos le permiten consultar blueprints existentes y componentes de blueprint disponibles.

Grupos de dispositivos - Cree grupos de dispositivos inteligentes y estáticos para computadoras y dispositivos móviles, con reglas de pertenencia basadas en criterios para grupos inteligentes y listas de miembros explícitas para grupos estáticos. Estos grupos se referencian mediante benchmarks y blueprints para su orientación.

Inventario unificado - Fuentes de datos de solo lectura para consultar dispositivos individuales y listas de dispositivos a nivel de plataforma.

Acciones de dispositivo - Acciones de Terraform 1.14+ actions para operaciones de borrado, reinicio, apagado y anulación de administración en dispositivos administrados.

Todos los recursos admiten operaciones CRUD completas e terraform import.

Primeros pasos

Si ha seguido el artículo introductorio, ya debería tener Terraform instalado y una comprensión básica de cómo se estructuran los proyectos. Los pasos aquí son similares.

1. Crear credenciales de API para la API de Jamf Platform

Diríjase a Jamf Account y cree un cliente de API con los permisos que necesita para los recursos que desea gestionar. La guía Getting Started en el portal de Jamf Developer le muestra este proceso.

2. Configurar el proveedor

Agregue el proveedor a su configuración de Terraform:

terraform {
  required_providers {
    jamfplatform = {
      source  = "Jamf-Concepts/jamfplatform"
      version = "~> 0.15.0"
    }
  }
}

provider "jamfplatform" {
  base_url      = var.jamfplatform_base_url
  client_id     = var.jamfplatform_client_id
  client_secret = var.jamfplatform_client_secret
  tenant_id     = var.jamfplatform_tenant_id
}

También puede usar variables de entorno para mantener el bloque del proveedor limpio:

export JAMFPLATFORM_BASE_URL="https://us.apigw.jamf.com"
export JAMFPLATFORM_CLIENT_ID="your-client-id"
export JAMFPLATFORM_CLIENT_SECRET="your-client-secret"
export JAMFPLATFORM_TENANT_ID="your-tenant-id"

Como siempre, 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. Defina sus recursos

Veamos algunos ejemplos de alto impacto.

Grupos de dispositivos

Antes de crear benchmarks o blueprints, querrá un grupo de dispositivos para dirigirlos a ellos. Aquí hay un grupo de computadora inteligente que se dirige a dispositivos que ejecutan macOS 26 o posterior:

resource "jamfplatform_device_group" "macos_26_plus" {
  name        = "macOS 26+"
  group_type  = "smart"
  device_type = "computer"
  criteria = [
    {
      criteria = "Operating System Version"
      operator = "greater than or equal"
      value    = "26.0"
    }
  ]
}

Este grupo puede ser referenciado por ID en sus recursos de benchmark y blueprint, de modo que Terraform entienda el gráfico de dependencias y cree todo en el orden correcto.

Compliance benchmarks

Los compliance benchmarks utilizan las líneas de base mSCP que están integradas en el Motor de Compliance Benchmark. Primero, use una fuente de datos para obtener las reglas de la línea de base que desea. Luego cree un benchmark que haga referencia a esas reglas y se dirija a su grupo de dispositivos:

data "jamfplatform_cbengine_rules" "cis_lvl1" {
  baseline_id = "cis_lvl1"
}

resource "jamfplatform_cbengine_benchmark" "cis_level_1" {
  title              = "CIS macOS Level 1"
  description        = "CIS Level 1 benchmark - Managed by Terraform"
  source_baseline_id = "cis_lvl1"

  sources = [
    for s in data.jamfplatform_cbengine_rules.cis_lvl1.sources : {
      branch   = s.branch
      revision = s.revision
    }
  ]

  rules = [
    for r in data.jamfplatform_cbengine_rules.cis_lvl1.rules : {
      id      = r.id
      enabled = r.enabled
    }
  ]

  target_device_group = jamfplatform_device_group.macos_26_plus.id
  enforcement_mode    = "MONITOR"
}

Esto crea un benchmark CIS Level 1 en modo monitor, limitado al grupo inteligente que definimos anteriormente. Cada regla de la línea de base se incluye, y puede deshabilitar selectivamente reglas individuales o establecer valores ODV personalizados para que coincidan con los requisitos de su organización. Por ejemplo, para personalizar una regla específica:

rules = [
  {
    id        = "system_settings_time_server_configure"
    enabled   = true
    odv_value = "ntp.example.com"
  },
  {
    id      = "system_settings_critical_update_install_enforce"
    enabled = true
  }
]

Establecer enforcement_mode a "MONITOR_AND_ENFORCE" remediará automáticamente la configuración no conforme.

Vale la pena notar que la API del Motor de Compliance Benchmark no ofrece actualmente un método PUT o PATCH para benchmarks. Esto significa que cualquier cambio a un recurso de benchmark en su configuración de Terraform resultará en una destrucción y recreación (reemplazo forzado) en lugar de una actualización in situ. Tenga esto en cuenta al hacer cambios a benchmarks que ya están implementados y reportando activamente en dispositivos.

El verdadero poder aquí es que puede controlar la versión del conjunto exacto de reglas y personalizaciones que ha aplicado, revisar cambios a través de solicitudes de extracción y replicar el mismo benchmark en múltiples inquilinos sin esfuerzo manual.

Blueprints

Los Blueprints componen múltiples componentes de configuración en una sola unidad que se implementa en uno o más grupos de dispositivos. Cada tipo de componente se asigna a un dominio de configuración de declaración de Declarative Device Management (DDM). Aquí hay un blueprint que configura la configuración de actualización de software con aplazamientos e instalación automática:

resource "jamfplatform_blueprints_blueprint" "software_update_settings" {
  name        = "Software Update Settings"
  description = "Managed by Terraform"
  deployed    = true

  device_groups = [jamfplatform_device_group.macos_26_plus.id]

  software_update_settings = {
    allow_standard_user_os_updates           = true
    automatic_download                       = "AlwaysOn"
    automatic_install_os_updates             = "AlwaysOn"
    automatic_install_security_updates       = "AlwaysOn"
    deferral_major_period_days               = 30
    deferral_minor_period_days               = 14
    deferral_system_period_days              = 3
    notifications_enabled                    = true
    rapid_security_response_enabled          = true
    rapid_security_response_rollback_enabled = false
    recommended_cadence                      = "Newest"
  }
}

Y aquí hay un blueprint que implementa una política de código de acceso:

resource "jamfplatform_blueprints_blueprint" "passcode_policy" {
  name        = "Passcode Policy"
  description = "Managed by Terraform"
  deployed    = true

  device_groups = [jamfplatform_device_group.macos_26_plus.id]

  passcode_policy = {
    require_passcode              = true
    require_alphanumeric_passcode = true
    minimum_length                = 12
    minimum_complex_characters    = 1
    maximum_failed_attempts       = 10
    maximum_inactivity_in_minutes = 5
    maximum_passcode_age_in_days  = 90
    passcode_reuse_limit          = 5
  }
}

Cada blueprint se asigna a un conjunto único de grupos de dispositivos a través del atributo device_groups, que toma un conjunto de UUID de Platform. Establecer deployed a true le dice al proveedor que implemente el blueprint (e lo reimplemente si pierde su validez). Establecerlo a false lo no implementa.

También puede usar el componente software_update para aplicar una versión de OS específica en una fecha específica, el atributo legacy_payloads para payloads de perfil de configuración tradicionales, o custom_declarations para declaraciones DDM arbitrarias que el proveedor aún no tiene un componente dedicado.

4. Aplique su configuración

Los mismos comandos que conoce de los otros proveedores se aplican aquí:

terraform init       # Initialize and download the provider
terraform plan       # Review what will be created, changed or destroyed
terraform apply      # Apply the changes (you'll be asked to confirm)

Traer un inquilino existente bajo gestión

Si ya tiene blueprints, benchmarks y grupos de dispositivos configurados en su inquilino, no necesita empezar de cero. Todos los recursos en el proveedor admiten terraform import, por lo que puede traer recursos existentes bajo gestión de Terraform sin recrearlos.

Descubrir recursos existentes con Terraform query

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

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

list "jamfplatform_blueprints_blueprint" "software_update" {
  provider         = jamfplatform
  include_resource = true

  config {
    search = "software update"
  }
}

list "jamfplatform_cbengine_benchmark" "cis_benchmarks" {
  provider         = jamfplatform
  include_resource = true

  config {
    search = "CIS"
  }
}

list "jamfplatform_device_group" "smart_computer_groups" {
  provider         = jamfplatform
  include_resource = true

  config {
    filter {
      selector = "deviceType"
      argument = "COMPUTER"
    }

    filter {
      join_with = "and"
      selector  = "groupType"
      argument  = "SMART"
    }
  }
}

Luego ejecute:

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

Terraform consultará su inquilino, devolverá los recursos coincidentes junto con sus ID, y generará tanto los bloques de recursos como los bloques de importación en generated.tf. Los recursos de lista de blueprint y benchmark admiten un filtro search para búsqueda de subcadena que no distingue mayúsculas de minúsculas contra nombres y descripciones. El recurso de lista de grupo de dispositivos admite bloques filter con selectores RSQL para name, description, deviceType y groupType, dándole control preciso sobre qué grupos se devuelven.

Importar recursos

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

import {
  to = jamfplatform_blueprints_blueprint.software_update_settings
  id = "your-blueprint-uuid"
}

import {
  to = jamfplatform_cbengine_benchmark.cis_level_1
  id = "your-benchmark-uuid"
}

Ejecute terraform plan para generar la configuración de los recursos importados, refínela según sea necesario, y a partir de ese momento se gestionan como código. Para más información sobre importación masiva de recursos, consulte la documentación de importación masiva de HashiCorp.

Usar junto con otros proveedores de Jamf

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

  • Proveedor de Jamf Protect - para gestionar recursos en Jamf Protect (planes de seguridad de endpoint, prevención de amenazas, telemetría y más) a través de la API GraphQL de Jamf Protect.
  • Proveedor Jamf Pro de Deployment Theory - para gestionar recursos en Jamf Pro (políticas, scripts, perfiles de configuración, grupos y más) a través de sus API Classic y Pro.

Entre estos proveedores, puede gestionar su entorno completo de Jamf como código desde un único proyecto de Terraform. Un patrón común es usar el proveedor de Jamf Pro para crear recursos como grupos inteligentes y políticas, luego referenciar los ID de Platform resultantes en el proveedor de Jamf Platform para benchmarks y blueprints.

Involucrarse

El proveedor es de código abierto bajo la licencia MPL y publicado en ambos registros de HashiCorp y OpenTofu. Se construye en el Marco de Plugin de Terraform de HashiCorp (Protocol v6) e incluye pruebas de integración en todo. El proveedor utiliza nuestro jamfplatform-go-sdk de código abierto que puede importar en sus propios proyectos de Go para scripting y automatización contra la API de Jamf Platform.

Agradecemos las contribuciones. Se aprecian los informes de bugs, solicitudes de características y solicitudes de extracción. El proveedor continuará creciendo en sincronía con las API de Jamf Platform a medida que se agreguen más capacidades.

Referencias