W naszym poprzednim artykule Zarządzanie konfiguracją Jamf za pomocą Terraform: Wprowadzenie, przeszliśmy przez podstawy Infrastructure as Code i jak zacząć pracę z Terraform i Jamf Pro. Jeśli jeszcze tego nie przeczytałeś, rekomendujemy zacząć od tego artykułu, ponieważ omawia on podstawy Terraform, instalację, strukturę projektów i zarządzanie stanem.
Tym razem skupiamy się na Jamf Protect. Opracowaliśmy dedykowanego dostawcę Terraform, który pozwala na zarządzanie konfiguracją produktu Jamf Protect jako kod - plany, konfiguracje akcji, zestawy wyjątków i wiele więcej.
Dlaczego dedykowany dostawca dla Jamf Protect?
Tak jak Jamf Pro, Jamf Protect jest produktem własnym i częścią rodziny Jamf Platform. Posiada własną powierzchnię API (opartą na GraphQL) i własny zestaw zasobów, które są różne od Jamf Pro i innych mikrousług Jamf Platform (np. Blueprints i Compliance Benchmarks). Takie rzeczy jak plany bezpieczeństwa punktów końcowych, konfiguracje telemetrii i zasady magazynowania wymiennego - wszystkie znajdują się w Jamf Protect i wymagają własnego dostawcy do prawidłowego zarządzania.
Jeśli zarządzałeś konfiguracją Jamf Protect za pośrednictwem konsoli, wiesz, że odtworzenie konfiguracji w wielu dzierżawach lub wycofanie zmian wymaga wiele ręcznej pracy. Dzięki temu dostawcy, cała konfiguracja Jamf Protect może znajdować się w Git, przejść przez weryfikację kodu i być stosowana konsekwentnie w różnych środowiskach.
Co obejmuje?
Dostawca jest dostarczany z 16 zasobami i 18 źródłami danych. Oto niektóre z kluczowych obszarów, które obejmuje:
Detekcja i Zapobieganie Zagrożeniom
- Niestandardowe Listy Zapobiegania - listy dozwolonych/zablokowanych według Team ID, skrótu pliku, CDHash lub ID podpisania.
- Zestawy Wyjątków - wyjątki dla analityki i kontroli bezpieczeństwa punktów końcowych.
Konfiguracja Punktu Końcowego
- Plany - pełne konfiguracje bezpieczeństwa punktów końcowych, w tym tryby zapobiegania zagrożeniom, protokoły komunikacji, interwały raportowania i zbieranie informacji o urządzeniach.
- Konfiguracje Akcji - wzbogacanie danych alertów i punkty końcowe raportowania (HTTP, Kafka, chmura).
- Telemetria - zbieranie zdarzeń i dzienników: zdarzenia bezpieczeństwa, uwierzytelnianie, monitorowanie integralności plików, metryki wydajności i inne.
Kontrola Urządzeń
- Zestawy Kontroli Magazynowania Wymiennego - zasady urządzeń USB z przesłonięciami według ID dostawcy, ID produktu lub numeru seryjnego.
Ustawienia Operacyjne
- Przesyłanie Danych - kierowanie danych do Amazon S3, Microsoft Sentinel lub punktów końcowych w chmurze.
- Przechowywanie Danych - zasady przechowywania na poziomie dzierżawy.
- Zarządzanie Zmianami - blokowanie konfiguracji.
- Sfiltrowane Ujednolicone Dzienniki - zbieranie dziennika ujednoliconego macOS przy użyciu filtrów NSPredicate.
Kontrola Dostępu
- Użytkownicy, Grupy, Role i Klienty API - zarządzaj dostępem i uprawnieniami w kodzie.
Wszystkie zasoby obsługują pełne operacje CRUD i terraform import.
Warto zauważyć, że jamfprotect_change_management, jamfprotect_data_forwarding i jamfprotect_data_retention są zasobami singleton - zarządzają ustawieniami na poziomie dzierżawy, a nie indywidualnie identyfikowalnymi obiektami.
Rozpoczęcie pracy
Jeśli postępowałeś zgodnie z artykułem wprowadzającym, powinieneś już mieć zainstalowany Terraform i podstawowe zrozumienie struktury projektów. Kroki tutaj są podobne.
1. Utwórz klienta API w Jamf Protect
Przejdź do Administration > API Clients w konsoli Jamf Protect i utwórz nowego klienta API z uprawnieniami potrzebnymi dla zasobów, którymi chcesz zarządzać.
2. Skonfiguruj dostawcę
Dodaj dostawcę do konfiguracji 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
}
Alternatywnie możesz używać zmiennych środowiskowych, jeśli wolisz utrzymać blok dostawcy czysty:
export JAMFPROTECT_URL="https://your-tenant.protect.jamfcloud.com"
export JAMFPROTECT_CLIENT_ID="your-client-id"
export JAMFPROTECT_CLIENT_SECRET="your-client-secret"
Jak w przypadku dostawcy Jamf Pro, upewnij się, że te poświadczenia nie trafią do repozytorium Git. Użyj pliku terraform.tfvars i dodaj go do .gitignore.
3. Zdefiniuj swoje zasoby
Oto przykład konfiguracji akcji, która definiuje, jakie dane są zbierane i gdzie są wysyłane alerty:
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"]
}
}
Zasada magazynowania wymiennego, która blokuje całą pamięć USB z wyjątkiem zatwierdzonych dysków szyfrowanych:
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"
},
]
}
Zestaw wyjątków, aby wykluczyć znane narzędzia administracyjne IT z zapobiegania zagrożeniom:
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"
},
]
},
]
}
Możesz również używać źródeł danych do odwoływania się do istniejących zasobów zamiast ich tworzenia. Tutaj wyszukujemy zestaw Jamf Managed Default Exceptions, który już istnieje w dzierżawie:
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]
}
Te zasoby można następnie połączyć w planie, który jest konfiguracją wdrażaną na punktach końcowych:
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
}
Plan odwołuje się do innych zasobów za pomocą ich identyfikatorów, dzięki czemu Terraform rozumie graf zależności i tworzy wszystko w odpowiedniej kolejności.
4. Zastosuj swoją konfigurację
Te same polecenia, które poznałeś we wprowadzeniu, tutaj się stosują:
terraform init # Inicjuj i pobierz dostawcę
terraform plan # Przejrzyj, co zostanie utworzone, zmienione lub usunięte
terraform apply # Zastosuj zmiany (zostaniesz poproszony o potwierdzenie)
Wprowadzanie istniejącej dzierżawy pod zarządzanie
Jeśli masz już dzierżawę Jamf Protect z istniejącą konfiguracją, nie musisz zaczynać od zera. Każdy zasób w dostawcy obsługuje terraform import, dzięki czemu możesz wprowadzić istniejące zasoby pod zarządzanie Terraform bez ich ponownego tworzenia.
Odkrywanie istniejących zasobów za pomocą zapytania Terraform
Jeśli używasz Terraform 1.14+, dostawca obsługuje zasoby list - nową funkcję, która pozwala na bezpośrednie zapytanie istniejącej infrastruktury z Terraform. Jest to przydatne do odkrywania, co już znajduje się w Twojej dzierżawie przed jego importem.
Utwórz plik zapytania (np. discover.tfquery.hcl):
list "jamfprotect_plan" "all" {
provider = jamfprotect
include_resource = true
}
list "jamfprotect_exception_set" "custom" {
provider = jamfprotect
config {
name_prefix = "Custom"
}
}
Następnie uruchom:
terraform query -generate-config-out=generated.tf
Terraform będzie odpytywać Twoją dzierżawę Jamf Protect, zwrócić pasujące zasoby wraz z ich ID i wygenerować zarówno bloki zasobów, jak i bloki importu w generated.tf. Każdy zasób list w dostawcy obsługuje filtr name_prefix w bloku config (lub email_prefix dla użytkowników), dzięki czemu możesz zawęzić wyniki do tego, czego szukasz.
Wszystkie typy zasobów obsługują zapytania list, z wyjątkiem następujących zasobów singleton:
jamfprotect_change_managementjamfprotect_data_forwardingjamfprotect_data_retention
Importowanie zasobów
Po otrzymaniu potrzebnych ID możesz używać bloków importu, aby wprowadzić je pod zarządzanie. Z Terraform 1.5+:
import {
to = jamfprotect_plan.endpoint_security
id = "your-plan-uuid"
}
Uruchom terraform plan, aby wygenerować konfigurację dla importowanego zasobu, usprawnij ją w razie potrzeby, a następnie zarządzaj nią jako kodem. Aby uzyskać więcej informacji na temat zbiorcze importu zasobów, zobacz dokumentację zbiorcze importu HashiCorp.
Używanie obok innych dostawców Jamf
Ten dostawca jest zaprojektowany do pracy obok innych dostawców Terraform w ekosystemie Jamf. Możesz go używać razem z:
- Jamf Platform Provider - do zarządzania zasobami w Jamf Platform (np. Blueprints i Compliance Benchmarks) za pośrednictwem API Jamf Platform.
- Deployment Theory Jamf Pro Provider - do zarządzania zasobami w produkcie Jamf Pro za pośrednictwem jego Classic i Pro APIs.
Dzięki tym dostawcom możesz zarządzać całym środowiskiem Jamf jako kodem z jednego projektu Terraform.
Historia
Ten dostawca został pierwotnie utworzony przez James Smith (@smithjw), który hojnie przekazał kod źródłowy Jamf Concepts. Dziękujemy James za fundamentalną pracę, która to umożliwiła.
Dostawca jest open-source na licencji MPL 2.0 i zbudowany na Framework Terraform Plugin HashiCorp (Protocol v6). Zawiera testy jednostkowe i akceptacyjne, i zapraszamy do współpracy - raporty błędów, prośby o funkcje i pull requesty.
Co dalej
To jest wydanie v0.1.x i aktywnie zbieramy opinię. Jeśli go wypróbujesz, chcielibyśmy wiedzieć, co działa, a co nie. Otwórz issue w repozytorium GitHub lub skontaktuj się za pośrednictwem Jamf Nation.