Jamf Concepts

Handleidingen

Jamf Protect beheren met Terraform: De Jamf Protect Provider

~8 min read

In ons vorige artikel, Managing Jamf Configuration with Terraform: An Introduction, doorliepen we de basis van Infrastructure as Code en hoe u aan de slag kunt met Terraform en Jamf Pro. Als u dat nog niet heeft gelezen, raden we aan daar te beginnen omdat het de fundamenten van Terraform, installatie, projectstructuur en state management behandelt.

Deze keer richten we ons op Jamf Protect. We hebben een specifieke Terraform-provider gebouwd waarmee u uw Jamf Protect-productconfiguratie als code kunt beheren - plans, action configurations, exception sets en nog veel meer.

Waarom een specifieke provider voor Jamf Protect?

Net als Jamf Pro is Jamf Protect een product op zichzelf en onderdeel van de Jamf Platform-familie. Het heeft zijn eigen API-oppervlak (GraphQL-gebaseerd) en zijn eigen set resources die verschillen van Jamf Pro en andere Jamf Platform-microservices (bijv. Blueprints en Compliance Benchmarks). Zaken zoals endpoint security plans, telemetrieconfiguraties en removable storage policies leven allemaal in Jamf Protect en hebben hun eigen provider nodig om ze correct te beheren.

Als u uw Jamf Protect-configuratie via de console heeft beheerd, weet u dat het recreëren van een setup over tenants of het terugdraaien van een wijziging veel handmatig werk betekent. Met deze provider kan uw volledige Jamf Protect-configuratie in Git leven, door code review gaan en consistent worden toegepast over omgevingen.

Wat dekt het?

De provider wordt geleverd met 16 resources en 18 data sources. Hier zijn enkele van de belangrijkste gebieden die het dekt:

Threat Detection & Prevention

  • Custom Prevent Lists - allow/block-lijsten per Team ID, file hash, CDHash of signing ID.
  • Exception Sets - uitzonderingen voor analytics en endpoint security controls.

Endpoint Configuration

  • Plans - volledige endpoint security-configuraties inclusief threat prevention-modi, communicatieprotocollen, rapportage-intervallen en device information collection.
  • Action Configurations - alert data-verrijking en rapportage-endpoints (HTTP, Kafka, cloud).
  • Telemetry - event- en logverzameling: beveiligingsevents, authenticatie, file integrity monitoring, performance metrics en meer.

Device Control

  • Removable Storage Control Sets - USB-apparaatbeleid met overrides per vendor ID, product ID of serienummer.

Operational Settings

  • Data Forwarding - routeer data naar Amazon S3, Microsoft Sentinel of cloud-endpoints.
  • Data Retention - tenant-brede retentiebeleid.
  • Change Management - configuratiebevriezingen.
  • Unified Logging Filters - macOS unified log-verzameling met NSPredicate-filters.

Access Control

  • Users, Groups, Roles en API Clients - beheer toegang en permissies in code.

Alle resources ondersteunen volledige CRUD-operaties en terraform import.

Het is vermeldenswaard dat jamfprotect_change_management, jamfprotect_data_forwarding en jamfprotect_data_retention singleton resources zijn - ze beheren tenant-brede instellingen in plaats van individueel identificeerbare objecten.

Aan de slag

Als u het introductie-artikel heeft gevolgd, zou u al Terraform geïnstalleerd moeten hebben en een basiskennis van hoe projecten zijn gestructureerd. De stappen hier zijn vergelijkbaar.

1. Maak een API-client in Jamf Protect

Ga naar Administration > API Clients in uw Jamf Protect-console en maak een nieuwe API-client met de permissies die u nodig heeft voor de resources die u wilt beheren.

2. Configureer de provider

Voeg de provider toe aan uw Terraform-configuratie:

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
}

U kunt ook omgevingsvariabelen gebruiken als u het provider-blok schoon wilt houden:

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

Zoals bij de Jamf Pro-provider, zorg ervoor dat deze credentials niet in uw Git-repository belanden. Gebruik een terraform.tfvars-bestand en voeg het toe aan uw .gitignore.

3. Definieer uw resources

Hier is een voorbeeld van een action configuration die definieert welke data wordt verzameld en waar alerts naartoe worden gestuurd:

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

Een removable storage-beleid dat alle USB-opslag blokkeert behalve goedgekeurde versleutelde schijven:

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"
    },
  ]
}

Een exception set om bekende IT-beheertools uit te sluiten van threat prevention:

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"
        },
      ]
    },
  ]
}

U kunt ook data sources gebruiken om te verwijzen naar bestaande resources in plaats van ze aan te maken. Hier zoeken we de Jamf Managed Default Exceptions-set op die al bestaat in de 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]
}

Deze resources kunnen vervolgens worden samengevoegd in een plan, wat de configuratie is die wordt uitgerold naar 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
}

Het plan verwijst naar andere resources op hun ID's, zodat Terraform de afhankelijkheidsgrafiek begrijpt en alles in de juiste volgorde aanmaakt.

4. Pas uw configuratie toe

Dezelfde commando's die u leerde in de introductie zijn hier van toepassing:

terraform init       # Initialiseer en download de provider
terraform plan       # Bekijk wat wordt aangemaakt, gewijzigd of vernietigd
terraform apply      # Pas de wijzigingen toe (u wordt gevraagd te bevestigen)

Een bestaande tenant onder beheer brengen

Als u al een Jamf Protect-tenant heeft met een bestaande configuratie, hoeft u niet vanaf nul te beginnen. Elke resource in de provider ondersteunt terraform import, zodat u bestaande resources onder Terraform-beheer kunt brengen zonder ze opnieuw aan te maken.

Bestaande resources ontdekken met Terraform query

Als u Terraform 1.14+ draait, ondersteunt de provider list resources - een nieuwe functie waarmee u uw bestaande infrastructuur rechtstreeks vanuit Terraform kunt bevragen. Dit is nuttig om te ontdekken wat er al in uw tenant zit voordat u het importeert.

Maak een query-bestand (bijv. discover.tfquery.hcl):

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

list "jamfprotect_exception_set" "custom" {
  provider = jamfprotect

  config {
    name_prefix = "Custom"
  }
}

Voer dan uit:

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

Terraform bevraagt uw Jamf Protect-tenant, retourneert de overeenkomende resources samen met hun ID's, en genereert zowel de resource-blokken als import-blokken in generated.tf. Elke list resource in de provider ondersteunt een name_prefix-filter in het config-blok (of email_prefix voor gebruikers) zodat u resultaten kunt beperken tot wat u zoekt.

Alle resourcetypes ondersteunen list queries behalve de volgende singleton resources:

  • jamfprotect_change_management
  • jamfprotect_data_forwarding
  • jamfprotect_data_retention

Resources importeren

Zodra u de ID's heeft die u nodig heeft, kunt u import-blokken gebruiken om ze onder beheer te brengen. Met Terraform 1.5+:

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

Voer terraform plan uit om de configuratie voor de geïmporteerde resource te genereren, verfijn deze indien nodig, en vanaf dat moment wordt het beheerd als code. Voor meer over bulk-importeren van resources, zie HashiCorp's bulk import documentation.

Gebruiken naast andere Jamf-providers

Deze provider is ontworpen om samen te werken met de andere Terraform-providers in het Jamf-ecosysteem. U kunt het samen gebruiken met:

Tussen deze providers kunt u uw volledige Jamf-omgeving als code beheren vanuit één Terraform-project.

Achtergrond

Deze provider is oorspronkelijk gemaakt door James Smith (@smithjw), die genereus de broncode doneerde aan Jamf Concepts. Dank aan James voor het fundamentele werk dat dit mogelijk maakte.

De provider is open-source onder de MPL 2.0-licentie en gebouwd op HashiCorp's Terraform Plugin Framework (Protocol v6). Het bevat unit- en acceptatietests door het hele project, en we verwelkomen bijdragen - bugrapporten, feature requests en pull requests.

Wat nu

Dit is een v0.1.x-release en we verzamelen actief feedback. Als u het uitprobeert, horen we graag wat werkt en wat niet. Open een issue op de GitHub-repository of neem contact op via Jamf Nation.

Referenties