JAMF Security Cloud 로그 수집
이 문서에서는 Google Cloud Storage V2를 사용하여 JAMF Security Cloud 로그를 Google Security Operations에 수집하는 방법을 설명합니다.
JAMF Security Cloud는 Apple 기기를 위한 모바일 위협 방어 및 엔드포인트 보안 플랫폼입니다. DNS 계층 보호, 피싱 방지, 콘텐츠 필터링, 기기 위험 평가를 포함하는 위협 감지, 규정 준수, 기기 보안 이벤트 로그를 생성합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Cloud Storage API가 사용 설정된 GCP 프로젝트
- GCS 버킷 및 IAM 정책을 만들고 관리할 수 있는 권한
- JAMF Security Cloud 포털 (Jamf Threat Defense 또는 Jamf Protect 콘솔)에 대한 권한 액세스
Google Cloud Storage 버킷 만들기
- Google Cloud 콘솔로 이동합니다.
- 프로젝트를 선택하거나 새 프로젝트를 만듭니다.
- 탐색 메뉴에서 Cloud Storage> 버킷으로 이동합니다.
- 버킷 만들기를 클릭합니다.
다음 구성 세부정보를 제공합니다.
설정 값 버킷 이름 지정 전역적으로 고유한 이름 (예: jamf-security-cloud-logs)을 입력합니다.위치 유형 필요에 따라 선택 (리전, 이중 리전, 멀티 리전) 위치 위치를 선택합니다 (예: us-central1).스토리지 클래스 Standard (자주 액세스하는 로그에 권장) 액세스 제어 균일 (권장) 보호 조치 선택사항: 객체 버전 관리 또는 보관 정책 사용 설정 만들기를 클릭합니다.
JAMF Security Cloud 로그를 Google Cloud Storage로 내보내기
JAMF Security Cloud는 클라우드 스토리지 대상으로의 이벤트 데이터 스트리밍을 지원합니다. JAMF Security Cloud 포털에서 데이터 내보내기를 구성합니다.
- JAMF Security Cloud 포털에 로그인합니다.
- 통합 > 데이터 스트림으로 이동합니다.
- 스트림 추가를 클릭합니다.
- 지원되는 대상 유형을 선택합니다. JAMF Data Streams는 AWS S3 및 일반 HTTP 엔드포인트를 기본적으로 지원합니다. Google Cloud Storage에 로그를 전송하려면 GCS에 쓰는 Cloud Run 함수가 있는 일반 HTTP 엔드포인트를 사용하거나 중간 S3 호환 대상을 구성하면 됩니다.
- 다음 구성 세부정보를 제공합니다.
- 스트림 이름: 설명이 포함된 이름을 입력합니다 (예:
Chronicle GCS Export). - GCS 버킷 이름: 버킷 이름 (예:
jamf-security-cloud-logs)을 입력합니다. - 경로 접두사: 폴더 접두사 (예:
jamf-security-cloud/)를 입력합니다. - 출력 형식: JSON을 선택합니다 (Chronicle 수집에 권장됨).
- 스트림 이름: 설명이 포함된 이름을 입력합니다 (예:
- GCS 버킷에 대한 쓰기 액세스 권한이 있는 GCP 서비스 계정 사용자 인증 정보 JSON 키를 업로드하거나 붙여넣습니다.
- 내보낼 이벤트 유형을 선택합니다.
- 위협 이벤트 (네트워크 위협, 피싱, 멀웨어)
- 기기 규정 준수 이벤트
- DNS 보안 이벤트
- 앱 위험 이벤트
- 저장 또는 만들기를 클릭합니다.
- 로그 파일이 지정된 접두사 아래의 GCS 버킷에 표시되기 시작하는지 확인합니다.
- 내보내기에 사용되는 GCP 서비스 계정에 대상 버킷에 대한 스토리지 객체 생성자 역할이 있는지 확인합니다.
- 로그 파일은 JSON 형식으로 작성되며 각 파일에는 하나 이상의 이벤트 레코드가 포함됩니다.
Google SecOps 서비스 계정 가져오기
- Google SecOps 콘솔에 로그인합니다.
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 소스 유형으로 Google Cloud Storage V2를 선택합니다.
- 로그 유형으로 JAMF Security Cloud를 선택합니다.
서비스 계정 가져오기를 클릭합니다. 고유한 서비스 계정 이메일이 표시됩니다. 예를 들면 다음과 같습니다.
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com이 이메일 주소를 복사합니다. 다음 단계에서 사용합니다.
- 각 Google SecOps 인스턴스에는 고유한 서비스 계정이 있습니다. 다른 문서나 예의 서비스 계정을 사용하지 마세요.
Google SecOps 서비스 계정에 IAM 권한 부여
- Cloud Storage> 버킷으로 이동합니다.
- 버킷 이름을 클릭합니다.
- 권한 탭으로 이동합니다.
- 액세스 권한 부여를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 주 구성원 추가: Google SecOps 서비스 계정 이메일을 붙여넣습니다.
- 역할 할당: 스토리지 객체 뷰어를 선택합니다.
- 저장을 클릭합니다.
- 삭제 옵션 (전송된 파일 삭제)을 사용하려면 스토리지 객체 뷰어 대신 스토리지 객체 관리자 역할을 부여하세요.
JAMF Security Cloud 로그를 수집하도록 Google SecOps에서 피드 구성
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
JAMF Security Cloud logs). - 소스 유형으로 Google Cloud Storage V2를 선택합니다.
- 로그 유형으로 JAMF Security Cloud를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
필드 값 스토리지 버킷 URI gs://jamf-security-cloud-logs/jamf-security-cloud/소스 삭제 옵션 원하는 대로 삭제 옵션을 선택합니다. 최대 파일 보관 기간 (일) 기본값은 180일입니다. 애셋 네임스페이스 애셋 네임스페이스 수집 라벨 이 피드의 이벤트에 적용할 라벨입니다. jamf-security-cloud-logs을 실제 GCS 버킷 이름으로 바꿉니다.- 항상 URI 끝에 후행 슬래시 (
/)를 포함합니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
| event_data.account.parentId, event_data.action, event_data.device.os, event_data.dns.recordType, event_data.riskDetails.appRiskIndexThreshold, event_data.riskDetails.deviceRiskIndex, event_data.routeName, event_data.signatureId.id, event_data.signatureId.name, event_data.threat.result, event_data.tld, customer.parentId, customer.resellerId, device.deviceId, device.deviceName, device.carrier.carrierName, device.carrier.isoCountryCode, device.carrier.mcc, device.carrier.mnc, device.hw.deviceModel, device.hw.hwPlatform, device.hw.imei, device.hw.platform, device.lastNetworkTrafficUtcMs, device.lastUpdatedUtcMs, device.location.isoCountryCode, device.mdm.lastMdmCheckInUtcMs, device.mdm.mdmId, device.network.ssid, device.os.osVersion, device.state.activated, device.state.deploymentState, device.state.vpnActive, device.state.wifiActive, device.user.id, device.user.name, device.wanderaApp.version, trigger.triggerTimeUtcMs, trigger.triggerType, app.appId.packageName, app.appId.appName, app.appId.appVersion, app.category.label, app.category.system, app.installation.installationTimeUtcMs, app.installation.installedBy, app.developer, app.threats, app.permissions, event_data.accessPoint, event_data.alertId, event_data.event_dataType, event_data.software.softwareId, event_data.software.softwareVersion, event_data.software.softwareName, event_data.cve.id, event_data.cve.baseScore, event_data.cve.exploitAvailable, event_data.cve.attribution, event_data.threat.types, event_data.app.id, event_data.app.name, event_data.app.version | additional.fields | 소스의 특정 키와 값이 있는 라벨로 병합됨 |
| event_data.dns.ttl | dns_answers.ttl | uint로 변환됨 |
| event_data.dns.category | dns_questions.name | 값이 직접 복사됨 |
| event_data.receiptTime | metadata.collected_timestamp | 값이 직접 복사됨 |
| event_data_event_dataType_description, event_data.cve.description | metadata.description | 비어 있지 않은 경우 event_data_event_dataType_description의 값, 그렇지 않은 경우 event_data.cve.description |
| has_principal, has_user | metadata.event_type | has_principal이 true이면 STATUS_UPDATE로 설정하고, has_user가 true이면 USER_UNCATEGORIZED로 설정하고, 그 밖의 경우에는 GENERIC_EVENT로 설정합니다. |
| event_data.md1.product, md1.product | metadata.product_event_type | 비어 있지 않은 경우 event_data.md1.product의 값, 그렇지 않은 경우 md1.product |
| event_data.device.externalId, event_data.externalId | metadata.product_log_id | 비어 있지 않은 경우 event_data.device.externalId의 값, 그렇지 않은 경우 event_data.externalId |
| event_data.md1.schemaVersion, schemaVersion | metadata.product_version | 비어 있지 않은 경우 event_data.md1.schemaVersion의 값, 그렇지 않은 경우 schemaVersion |
| dns_answers | network.dns.answers | dns_answers에서 병합됨 |
| dns_questions | network.dns.questions | dns_questions에서 병합됨 |
| event_data.dns.responseStatus | network.dns.response | NOERROR인 경우 true로 설정하고 그렇지 않으면 false로 설정합니다. |
| event_data.domain | principal.administrative_domain | 값이 직접 복사됨 |
| event_data.application | principal.application | 값이 직접 복사됨 |
| event_data.hostName, event_data.device.userDeviceName | principal.asset.hostname | 비어 있지 않은 경우 event_data.hostName의 값, 비어 있는 경우 event_data.device.userDeviceName |
| event_data.source.ip | principal.asset.ip | 값이 직접 복사됨 |
| event_data.hostName, event_data.device.userDeviceName | principal.hostname | 비어 있지 않은 경우 event_data.hostName의 값, 비어 있는 경우 event_data.device.userDeviceName |
| event_data.source.ip | principal.ip | 값이 직접 복사됨 |
| event_data.source.port | principal.port | 정수로 변환됨 |
| event_data_event_dataType_id | principal.process.pid | 값이 직접 복사됨 |
| event_data.event_dataUrl, event_data.cve.consoleUrl | principal.url | event_data.event_dataUrl의 값(비어 있지 않은 경우), 그렇지 않으면 event_data.cve.consoleUrl |
| device.user.email | principal.user.email_addresses | 이메일 정규식과 일치하는 경우 병합됨 |
| event_data.account.name, event_data.user.userName | principal.user.user_display_name | 비어 있지 않은 경우 event_data.account.name의 값, 그렇지 않은 경우 event_data.user.userName |
| event_data.account.customerId, customer.customerId, event_data.customerId, device.user.email | principal.user.userid | 비어 있지 않은 경우 event_data.account.customerId의 값, 비어 있지 않은 경우 customer.customerId, 비어 있지 않은 경우 event_data.customerId, 이메일이 아닌 경우 device.user.email |
| event_data.blocked | security_result.action | true인 경우 차단, false인 경우 허용으로 설정 |
| event_data_event_dataType_name | security_result.description | 값이 직접 복사됨 |
| app.threats, app.permissions, event_data.cve.id, event_data.cve.baseScore, event_data.cve.exploitAvailable, event_data.cve.attribution | security_result.detection_fields | 소스에서 라벨로 병합됨 |
| event_data.severity | security_result.severity | 2인 경우 INFORMATIONAL, 4인 경우 LOW, 6인 경우 MEDIUM, 8인 경우 HIGH, 10인 경우 CRITICAL로 설정 |
| event_data.blockReason | security_result.summary | 값이 직접 복사됨 |
| event_data.cve.cveDetailUrl | security_result.url_back_to_product | 값이 직접 복사됨 |
| event_data.device.deviceId | target.asset.asset_id | 'CS:' 접두사와 연결됨 |
| event_data.destination.ips, event_data.destinationIp, event_data.destination.ip, device.carrier.ipAddress, device.network.assignedIp, device.network.publicIp | target.asset.ip | 소스에서 병합됨 |
| app_id_md5 | target.file.md5 | 값이 직접 복사됨 |
| app_id_sha1 | target.file.sha1 | 값이 직접 복사됨 |
| app_id_sha256 | target.file.sha256 | 값이 직접 복사됨 |
| event_data.destination.name | target.hostname | 값이 직접 복사됨 |
| event_data.destination.ips, event_data.destinationIp, event_data.destination.ip, device.carrier.ipAddress, device.network.assignedIp, device.network.publicIp | target.ip | 소스에서 병합됨 |
| device.location.countryName | target.location.country_or_region | 값이 직접 복사됨 |
| device.hw.wifiMacAddress, event_data.accessPointBssid, device.network.bssid | target.mac | 소스에서 병합됨 |
| event_data.device.osType, event_data_device_os_osType, device.os.osType | target.platform | event_data에서 먼저, 그다음에 기기에서 Win과 일치하는 경우 WINDOWS, IOS 또는 MAC_OS와 일치하는 경우 MAC, Lin과 일치하는 경우 LINUX, 그 외의 경우 UNKNOWN_PLATFORM으로 설정됩니다. |
| event_data_device_os_osVersion, device.os.osVersion | target.platform_version | 비어 있지 않은 경우 event_data_device_os_osVersion의 값, 그렇지 않은 경우 device.os.osVersion |
| event_data.destination.port | target.port | 정수로 변환됨 |
| event_data.device.deviceName | target.resource.name | 값이 직접 복사됨 |
| event_data.user.email | target.user.email_addresses | 이메일 정규식과 일치하는 경우 병합됨 |
| event_data.user.email, event_data.user.name | target.user.userid | 이메일이 아닌 경우 event_data.user.email의 값, 이메일인 경우 event_data.user.name |
| metadata.product_name | 'JAMF_SECURITY_CLOUD'로 설정 | |
| metadata.vendor_name | 'JAMF_SECURITY_CLOUD'로 설정 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.