이전 글에서 코드형 인프라의 기본과 Terraform으로 Jamf Pro 및 Jamf Protect 구성을 관리하는 방법을 다루었습니다. 아직 읽지 않았다면 설치, 프로젝트 구조 및 상태 관리를 다루므로 거기서 시작하는 것을 권장합니다.
이번에는 최근 공개 베타에 진입한 Jamf Platform API로 주의를 돌립니다. 이 API는 Jamf Pro 및 Jamf Protect와 나란히 있는 새로운 세대의 Jamf 마이크로서비스(청사진, 규정 준수 벤치마크 및 장치 그룹 포함)를 구동합니다. 이러한 리소스를 코드로 관리할 수 있는 전용 Terraform 공급자를 구축했습니다.
Jamf Platform 마이크로서비스용 전용 공급자는 왜?
Jamf Platform API는 Jamf Pro Classic 및 Pro API와 다른 API 표면입니다. 이들은 Jamf Pro 공급자로 관리하는 리소스와 구별되는 기능을 구동하며, 지역 API 게이트웨이(us.apigw.jamf.com, eu.apigw.jamf.com 또는 apac.apigw.jamf.com)에 대해 다른 자격 증명 세트를 통해 인증합니다.
청사진을 통해 장치 그룹의 원하는 구성 상태를 정의하고 한 번의 작업으로 배포할 수 있습니다. 규정 준수 벤치마크를 통해 macOS 보안 규정 준수 프로젝트(mSCP)에서 업계 표준 보안 기준을 적용하고 플릿이 어떻게 측정되는지 모니터링할 수 있습니다. 장치 그룹은 플랫폼 수준에서 장치를 구성하고 대상화할 수 있는 방법을 제공합니다. 이들은 모두 관리하는 리소스에 목적으로 구축된 스키마를 가진 자체 공급자를 받을 가치가 있는 1급 기능입니다.
Jamf Pro 콘솔을 통해 청사진과 벤치마크를 관리해온 경우 테넌트 간 설정을 다시 만들거나 시간 경과에 따른 변경 사항을 추적하는 것을 이미 알 것입니다. 이 공급자를 사용하면 전체 구성이 Git에 있고 코드 검토를 거쳐 필요한 곳마다 일관되게 적용됩니다.
범위는 무엇입니까?
공급자는 3개의 리소스, 12개의 데이터 소스, 3개의 목록 리소스 및 4개의 장치 작업과 함께 제공됩니다. 주요 영역은 다음과 같습니다:
규정 준수 벤치마크 엔진 - CIS 레벨 1 및 2, NIST 800-53(낮음, 중간, 높음) 및 DISA STIG를 포함한 mSCP 기준을 기반으로 규정 준수 벤치마크를 만들고 관리합니다. 개별 규칙을 활성화하거나 비활성화하고, 조직 정의 값(ODV)을 사용자 정의하고, 벤치마크를 특정 장치 그룹으로 대상화할 수 있습니다. 데이터 소스를 통해 사용 가능한 기준선, 규칙 및 기존 벤치마크를 쿼리할 수 있습니다.
청사진 - 소프트웨어 업데이트 적용, 소프트웨어 업데이트 설정, 암호 정책, Safari 설정, 북마크 및 확장 프로그램, 디스크 관리, 오디오 액세서리 설정, 수학 설정, 서비스 백그라운드 작업, 서비스 구성 파일, 기존 페이로드 및 사용자 정의 DDM 선언을 포함하는 장치 구성 청사진을 정의합니다. 각 청사진은 하나 이상의 장치 그룹을 대상으로 하며 코드로 배포하거나 배포 해제할 수 있습니다. 데이터 소스를 통해 기존 청사진 및 사용 가능한 청사진 구성 요소를 쿼리할 수 있습니다.
장치 그룹 - 컴퓨터 및 모바일 장치용 스마트 및 정적 장치 그룹을 만듭니다. 스마트 그룹의 경우 기준 기반 멤버십 규칙과 정적 그룹의 경우 명시적 멤버 목록을 사용합니다. 이 그룹은 벤치마크 및 청사진의 대상 지정을 위해 참조됩니다.
통합 인벤토리 - 플랫폼 수준에서 개별 장치 및 장치 목록을 쿼리하기 위한 읽기 전용 데이터 소스입니다.
장치 작업 - 관리되는 장치에 대해 삭제, 다시 시작, 종료 및 관리 해제 작업을 수행하기 위한 Terraform 1.14+ 작업.
모든 리소스는 전체 CRUD 작업 및 terraform import를 지원합니다.
시작하기
소개 문서를 따라가셨다면 이미 Terraform을 설치하고 프로젝트 구조를 기본적으로 이해하고 있어야 합니다. 여기의 단계는 비슷합니다.
1. Jamf Platform API용 API 자격 증명 만들기
Jamf Account로 이동하여 관리하려는 리소스에 필요한 권한으로 API 클라이언트를 만드십시오. Jamf Developer 포털의 시작하기 가이드가 이 프로세스를 안내합니다.
2. 공급자 구성
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
}
공급자 블록을 깔끔하게 유지하기 위해 환경 변수를 사용할 수도 있습니다:
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"
항상 이러한 자격 증명이 Git 저장소에 들어가지 않도록 하십시오. terraform.tfvars 파일을 사용하고 .gitignore에 추가합니다.
3. 리소스 정의
몇 가지 영향력이 있는 예를 살펴보겠습니다.
장치 그룹
벤치마크 또는 청사진을 작성하기 전에 이를 대상으로 할 장치 그룹을 원할 것입니다. 다음은 macOS 26 이상을 실행하는 장치를 대상으로 하는 스마트 컴퓨터 그룹입니다:
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"
}
]
}
그 후 ID별로 벤치마크 및 청사진 리소스에서 참조될 수 있으며, Terraform은 의존성 그래프를 이해하고 올바른 순서로 모든 것을 만듭니다.
규정 준수 벤치마크
규정 준수 벤치마크는 규정 준수 벤치마크 엔진에 기본 제공되는 mSCP 기준을 사용합니다. 먼저 데이터 소스를 사용하여 원하는 기준의 규칙을 가져옵니다. 그런 다음 해당 규칙을 참조하고 장치 그룹을 대상으로 하는 벤치마크를 만듭니다:
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"
}
이는 모니터 모드에서 앞서 정의한 스마트 그룹으로 범위가 지정된 CIS 레벨 1 벤치마크를 만듭니다. 기준의 모든 규칙이 포함되며 개별 규칙을 선택적으로 비활성화하거나 조직의 요구사항에 맞는 사용자 정의 ODV 값을 설정할 수 있습니다. 예를 들어 특정 규칙을 사용자 정의하려면:
rules = [
{
id = "system_settings_time_server_configure"
enabled = true
odv_value = "ntp.example.com"
},
{
id = "system_settings_critical_update_install_enforce"
enabled = true
}
]