In unserem vorherigen Artikel Managing Jamf Configuration with Terraform: An Introduction haben wir die Grundlagen der Infrastructure as Code und die ersten Schritte mit Terraform und Jamf Pro durchgegangen. Falls Sie diesen noch nicht gelesen haben, empfehlen wir Ihnen, dort zu beginnen, da er die Grundlagen von Terraform, Installation, Projektstruktur und State Management abdeckt.
Dieses Mal konzentrieren wir uns auf Jamf Protect. Wir haben einen dedizierten Terraform Provider entwickelt, mit dem Sie Ihre Jamf Protect Produktkonfiguration als Code verwalten können - Pläne, Action Konfigurationen, Exception Sets und vieles mehr.
Warum ein dedizierter Provider für Jamf Protect?
Genau wie Jamf Pro ist Jamf Protect ein eigenständiges Produkt und Teil der Jamf Platform Familie. Es hat seine eigene API-Oberfläche (basierend auf GraphQL) und seinen eigenen Satz von Ressourcen, die sich von Jamf Pro und anderen Jamf Platform Microservices unterscheiden (z. B. Blueprints und Compliance Benchmarks). Dinge wie Endpoint Security Pläne, Telemetrie-Konfigurationen und Richtlinien für externe Speicher befinden sich in Jamf Protect und benötigen einen eigenen Provider für eine ordnungsgemäße Verwaltung.
Wenn Sie Ihre Jamf Protect Konfiguration bisher über die Konsole verwaltet haben, wissen Sie, dass die Rekonstruktion einer Einrichtung über Mandanten hinweg oder das Rollback einer Änderung viel manuelle Arbeit bedeutet. Mit diesem Provider kann sich Ihre gesamte Jamf Protect Konfiguration in Git befinden, durch Code Review gehen und konsistent über Umgebungen hinweg angewendet werden.
Was wird abgedeckt?
Der Provider wird mit 16 Ressourcen und 18 Datenquellen ausgeliefert. Hier sind einige der wichtigsten Bereiche, die er abdeckt:
Threat Detection & Prevention
- Custom Prevent Lists - Allow/Block-Listen nach Team ID, Datei-Hash, CDHash oder Signing ID.
- Exception Sets - Ausnahmen für Analytics und Endpoint Security Kontrollen.
Endpoint-Konfiguration
- Pläne - vollständige Endpoint Security Konfigurationen einschließlich Threat Prevention Modi, Kommunikationsprotokolle, Reporting-Intervalle und Geräteinformationserfassung.
- Action Configurations - Alert-Datenanreicherung und Reporting-Endpunkte (HTTP, Kafka, Cloud).
- Telemetrie - Event- und Log-Erfassung: Sicherheitsereignisse, Authentifizierung, Dateiintegritätsüberwachung, Leistungsmetriken und mehr.
Device Control
- Removable Storage Control Sets - USB-Geräterichtlinien mit Overrides nach Vendor ID, Product ID oder Seriennummer.
Betriebliche Einstellungen
- Data Forwarding - Routing von Daten zu Amazon S3, Microsoft Sentinel oder Cloud-Endpunkten.
- Data Retention - Mandanten-weite Aufbewahrungsrichtlinien.
- Change Management - Konfigurationsfreeze.
- Unified Logging Filters - macOS Unified Log Erfassung mit NSPredicate Filtern.
Access Control
- Users, Groups, Roles, and API Clients - Verwalten Sie Zugriff und Berechtigungen im Code.
Alle Ressourcen unterstützen vollständige CRUD-Operationen und terraform import.
Es ist erwähnenswert, dass jamfprotect_change_management, jamfprotect_data_forwarding und jamfprotect_data_retention Singleton-Ressourcen sind - sie verwalten Mandanten-weite Einstellungen statt einzeln identifizierbarer Objekte.
Erste Schritte
Falls Sie den Einführungsartikel gelesen haben, sollten Sie Terraform bereits installiert haben und ein grundlegendes Verständnis für die Projektstruktur haben. Die Schritte hier sind ähnlich.
1. Erstellen Sie einen API Client in Jamf Protect
Gehen Sie zu Administration > API Clients in Ihrer Jamf Protect Konsole und erstellen Sie einen neuen API Client mit den Berechtigungen, die Sie für die zu verwaltenden Ressourcen benötigen.
2. Konfigurieren Sie den Provider
Fügen Sie den Provider zu Ihrer Terraform-Konfiguration hinzu:
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
}
Sie können auch Umgebungsvariablen verwenden, wenn Sie den Provider Block sauber halten möchten:
export JAMFPROTECT_URL="https://your-tenant.protect.jamfcloud.com"
export JAMFPROTECT_CLIENT_ID="your-client-id"
export JAMFPROTECT_CLIENT_SECRET="your-client-secret"
Stellen Sie wie beim Jamf Pro Provider sicher, dass diese Anmeldedaten nicht in Ihrem Git Repository landen. Verwenden Sie eine terraform.tfvars Datei und fügen Sie sie zu Ihrer .gitignore hinzu.
3. Definieren Sie Ihre Ressourcen
Hier ist ein Beispiel einer Action Configuration, die definiert, welche Daten erfasst werden und wohin Alerts gesendet werden:
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"]
}
}
Eine Richtlinie für externe Speicher, die alle USB-Speicher blockiert, außer genehmigten verschlüsselten Laufwerken:
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"
},
]
}
Ein Exception Set, um bekannte IT-Administrationswerkzeuge von Threat Prevention auszuschließen:
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"
},
]
},
]
}
Sie können auch Datenquellen verwenden, um auf vorhandene Ressourcen zu verweisen, anstatt sie zu erstellen. Hier schauen wir uns das Jamf Managed Default Exceptions Set an, das bereits im Mandanten existiert:
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]
}
Diese Ressourcen können dann in einem Plan zusammengebunden werden, das ist die Konfiguration, die auf Endpunkte bereitgestellt wird:
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
}
Der Plan verweist auf andere Ressourcen anhand ihrer IDs, sodass Terraform das Abhängigkeitsdiagramm versteht und alles in der richtigen Reihenfolge erstellt.
4. Wenden Sie Ihre Konfiguration an
Die gleichen Befehle, die Sie in der Einführung gelernt haben, gelten auch hier:
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)
Verwaltung eines vorhandenen Mandanten übernehmen
Falls Sie bereits über einen Jamf Protect Mandanten mit einer bestehenden Konfiguration verfügen, müssen Sie nicht von vorne beginnen. Jede Ressource im Provider unterstützt terraform import, sodass Sie vorhandene Ressourcen unter Terraform-Verwaltung bringen können, ohne sie neu zu erstellen.
Entdeckung vorhandener Ressourcen mit Terraform query
Falls Sie Terraform 1.14+ ausführen, unterstützt der Provider list resources - eine neue Funktion, mit der Sie Ihre vorhandene Infrastruktur direkt aus Terraform abfragen können. Dies ist nützlich, um zu entdecken, was bereits in Ihrem Mandanten vorhanden ist, bevor Sie es importieren.
Erstellen Sie eine Query-Datei (z. B. discover.tfquery.hcl):
list "jamfprotect_plan" "all" {
provider = jamfprotect
include_resource = true
}
list "jamfprotect_exception_set" "custom" {
provider = jamfprotect
config {
name_prefix = "Custom"
}
}
Führen Sie dann aus:
terraform query -generate-config-out=generated.tf
Terraform fragt Ihren Jamf Protect Mandanten ab, gibt die übereinstimmenden Ressourcen zusammen mit ihren IDs zurück und generiert sowohl die Ressourcenblöcke als auch die Import-Blöcke in generated.tf. Jede List-Ressource im Provider unterstützt einen name_prefix Filter im config Block (oder email_prefix für Benutzer), sodass Sie die Ergebnisse auf das eingrenzen können, was Sie suchen.
Alle Ressourcentypen unterstützen List-Queries, außer den folgenden Singleton-Ressourcen:
jamfprotect_change_managementjamfprotect_data_forwardingjamfprotect_data_retention
Import von Ressourcen
Sobald Sie die benötigten IDs haben, können Sie Import-Blöcke verwenden, um sie unter Verwaltung zu bringen. Mit Terraform 1.5+:
import {
to = jamfprotect_plan.endpoint_security
id = "your-plan-uuid"
}
Führen Sie terraform plan aus, um die Konfiguration für die importierte Ressource zu generieren, verfeinern Sie sie nach Bedarf, und von da an wird sie als Code verwaltet. Weitere Informationen zum Massen-Import von Ressourcen finden Sie in der Bulk Import Dokumentation von HashiCorp.
Verwendung neben anderen Jamf Providern
Dieser Provider ist so konzipiert, dass er neben anderen Terraform Providern des Jamf Ökosystems funktioniert. Sie können ihn zusammen mit folgenden verwenden:
- Jamf Platform Provider - zum Verwalten von Ressourcen in der Jamf Platform (z. B. Blueprints und Compliance Benchmarks) über die Jamf Platform APIs.
- Deployment Theory Jamf Pro Provider - zum Verwalten von Ressourcen im Jamf Pro Produkt über seine Classic und Pro APIs.
Mit diesen Providern können Sie Ihre gesamte Jamf-Umgebung als Code aus einem einzigen Terraform-Projekt verwalten.
Hintergrund
Dieser Provider wurde ursprünglich von James Smith (@smithjw) erstellt, der den Quellcode großzügig an Jamf Concepts spendete. Danke an James für die grundlegende Arbeit, die dies möglich gemacht hat.
Der Provider ist Open-Source unter der MPL 2.0 Lizenz und basiert auf HashiCorps Terraform Plugin Framework (Protocol v6). Er enthält Unit- und Acceptance Tests und wir freuen uns über Beiträge - Fehlerberichte, Feature Requests und Pull Requests.
Nächste Schritte
Dies ist eine v0.1.x Release und wir sammeln aktiv Feedback. Falls Sie diesen ausprobieren, würden wir gerne wissen, was funktioniert und was nicht. Erstellen Sie ein Issue im GitHub Repository oder kontaktieren Sie uns über Jamf Nation.