Okta 사용자 컨텍스트 로그 수집
이 문서에서는 서드 파티 API를 사용하여 Google Security Operations 피드를 설정하여 Okta 사용자 컨텍스트 로그를 수집하는 방법을 설명합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Okta 테넌트 또는 관리 콘솔에 대한 액세스 권한
- Okta의 API 토큰 생성 권한
IP 허용 목록 구성
피드를 만들기 전에 Okta 방화벽 또는 네트워크 설정에서 Google SecOps IP 범위를 허용 목록에 추가해야 합니다.
Google SecOps IP 범위 가져오기
- Google IP 주소 범위 JSON 파일에서 IP 범위를 가져옵니다.
Okta 사용자 컨텍스트에 IP 범위 추가
- Okta 관리 콘솔에 로그인합니다.
- 보안 > 네트워크로 이동합니다.
- IP 주소 제한에서 수정을 클릭합니다.
- 각 Google SecOps IP 범위를 CIDR 표기법으로 신뢰할 수 있는 IP 주소에 추가합니다.
- 저장을 클릭합니다.
Okta 사용자 컨텍스트 API 액세스 구성
Google SecOps가 사용자 컨텍스트 데이터를 가져올 수 있도록 하려면 읽기 권한이 있는 API 토큰을 만들어야 합니다.
API 토큰 만들기
- Okta 관리 콘솔에 로그인합니다.
- 보안 > API로 이동합니다.
- 토큰 탭을 선택합니다.
- 토큰 만들기를 클릭합니다.
- 다음 구성 세부정보를 제공합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
Google SecOps Integration). - 설명 (선택사항): 설명을 입력합니다.
- 이름: 설명이 포함된 이름을 입력합니다 (예:
- 토큰 만들기를 클릭합니다.
API 사용자 인증 정보 기록
API 토큰을 만든 후 다음 사용자 인증 정보가 표시됩니다.
- API 토큰: API 토큰 값 (예:
00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1)
필수 API 권한
API 토큰에는 Okta에서 다음 권한이 필요합니다.
| 권한/역할 | 액세스 수준 | 목적 |
|---|---|---|
| 읽기 전용 관리자 | 읽기 | 사용자 프로필 데이터 액세스 |
| 최고 관리자 | 읽기 | 모든 사용자 데이터에 대한 전체 액세스 권한 |
피드 설정
피드를 구성하려면 다음 단계를 따르세요.
- SIEM 설정> 피드로 이동합니다.
- 새 피드 추가를 클릭합니다.
- 다음 페이지에서 단일 피드 구성을 클릭합니다.
- 피드 이름 필드에 피드 이름을 입력합니다(예:
Okta User Context). - 소스 유형으로 서드 파티 API를 선택합니다.
- 로그 유형으로 Okta 사용자 컨텍스트를 선택합니다.
- 다음을 클릭합니다.
다음 입력 매개변수의 값을 지정합니다.
인증 HTTP 헤더: 다음 형식으로 인증 사용자 인증 정보를 입력합니다.
Authorization:SSWS your-api-token- 예를 들면 다음과 같습니다.
Authorization:SSWS 00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1
- 예를 들면 다음과 같습니다.
API 호스트 이름: Okta 인스턴스의 정규화된 도메인 이름입니다 (예: example.okta.com, 구성된 커스텀 도메인은 아님).
- 예를 들면 다음과 같습니다.
company.okta.com
- 예를 들면 다음과 같습니다.
관리자 ID 참조 필드: Okta 이외의 ID를 사용하여 관리자를 참조할 때 필요한 ID입니다 (선택사항).
애셋 네임스페이스: 애셋 네임스페이스입니다.
수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출을 클릭합니다.
설정이 완료되면 피드가 Okta 사용자 컨텍스트 인스턴스에서 로그를 시간순으로 가져오기 시작합니다.
리전 엔드포인트
Okta는 조직의 지역에 따라 다른 API 엔드포인트를 사용합니다.
| 리전 | 기본 URL / 호스트 이름 |
|---|---|
| 미국 (기본값) | {org-name}.okta.com |
| EU (유럽, 중동, 아프리카) | {org-name}.okta-emea.com |
| APAC | {org-name}.okta.com.au |
| 미리보기 (테스트) | {org-name}.oktapreview.com |
Okta 인스턴스 리전에 해당하는 호스트 이름을 사용합니다.
API 비율 제한
Okta API에는 다음과 같은 비율 제한이 있습니다.
- 기본 비율 제한: 대부분의 엔드포인트에 대해 분당 600개 요청
- 시스템 로그 API: 분당 60개 요청
- 사용자 엔드포인트: 분당 600개 요청
Google SecOps는 지수 백오프를 사용하여 비율 제한을 자동으로 처리합니다. 문제가 발생하면 Okta 지원팀에 문의하여 API 한도를 늘리세요.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
activated |
event.idm.entity.entity.labels |
activated가 있으면 값이 키 'activated'가 있는 키-값 쌍으로 추가됩니다. |
created |
event.idm.entity.entity.labels |
created가 있으면 값이 'created' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.costCenter |
event.idm.entity.entity.labels |
profile.costCenter가 있으면 해당 값이 키 'costCenter'가 있는 키-값 쌍으로 추가됩니다. |
profile.Function |
event.idm.entity.entity.labels |
profile.Function가 있으면 해당 값이 'Function' 키가 있는 키-값 쌍으로 추가됩니다. |
statusChanged |
event.idm.entity.entity.labels |
statusChanged가 있으면 값이 'statusChanged' 키가 있는 키-값 쌍으로 추가됩니다. |
type.id |
event.idm.entity.entity.labels |
type.id가 있으면 값이 'type_id' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.location |
event.idm.entity.entity.location.name |
profile.location에서 가져온 값입니다. |
profile.AD_ObjectGUID |
event.idm.entity.entity.user.attribute.labels |
profile.AD_ObjectGUID가 있으면 해당 값이 키 'AD_ObjectGUID'가 있는 키-값 쌍으로 추가됩니다. |
profile.ADpwdLastSet |
event.idm.entity.entity.user.attribute.labels |
profile.ADpwdLastSet가 있으면 해당 값이 키 'ADpwdLastSet'이 있는 키-값 쌍으로 추가됩니다. |
profile.AFF_Code |
event.idm.entity.entity.user.attribute.labels |
profile.AFF_Code가 있으면 값이 키 'AFF_Code'가 있는 키-값 쌍으로 추가됩니다. |
profile.Desk_Location_WD |
event.idm.entity.entity.user.attribute.labels |
profile.Desk_Location_WD가 있으면 해당 값이 키 'Desk_Location_WD'가 있는 키-값 쌍으로 추가됩니다. |
profile.Mailing_Address_WD |
event.idm.entity.entity.user.attribute.labels |
profile.Mailing_Address_WD가 있으면 값이 'Mailing_Address_WD' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.Manager_UPN |
event.idm.entity.entity.user.attribute.labels |
profile.Manager_UPN이 있으면 값이 'Manager_UPN' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.PRIVATE_CONF_Profile |
event.idm.entity.entity.user.attribute.labels |
profile.PRIVATE_CONF_Profile가 있으면 값이 'PRIVATE_CONF_Profile' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.Region_WD |
event.idm.entity.entity.user.attribute.labels |
profile.Region_WD이 있으면 값이 'Region_WD' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.Subsidiary_Company |
event.idm.entity.entity.user.attribute.labels |
profile.Subsidiary_Company가 있으면 값이 'Subsidiary_Company' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.Telephone_Work |
event.idm.entity.entity.user.attribute.labels |
profile.Telephone_Work이 있으면 값이 'Telephone_Work' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.Temp_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
profile.Temp_WD_Primary_Email가 있으면 해당 값이 'Temp_WD_Primary_Email' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.VMware_WS1_Username |
event.idm.entity.entity.user.attribute.labels |
profile.VMware_WS1_Username가 있으면 값이 키 'VMware_WS1_Username'이 있는 키-값 쌍으로 추가됩니다. |
profile.Work_Street_Address_WD |
event.idm.entity.entity.user.attribute.labels |
profile.Work_Street_Address_WD가 있으면 해당 값이 키 'Work_Street_Address_WD'가 있는 키-값 쌍으로 추가됩니다. |
profile.Workato_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
profile.Workato_WD_Primary_Email가 있으면 해당 값이 'Workato_WD_Primary_Email' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.Workday_ID |
event.idm.entity.entity.user.attribute.labels |
profile.Workday_ID가 있으면 값이 'Workday_ID' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.Worker_Type_WD |
event.idm.entity.entity.user.attribute.labels |
profile.Worker_Type_WD가 있으면 해당 값이 키 'Worker_Type_WD'가 있는 키-값 쌍으로 추가됩니다. |
profile.businessUnit |
event.idm.entity.entity.user.attribute.labels |
profile.businessUnit가 있으면 값이 'businessUnit' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.companyName |
event.idm.entity.entity.user.attribute.labels |
profile.companyName가 있으면 값이 'companyName' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.contingentSupplierName |
event.idm.entity.entity.user.attribute.labels |
profile.contingentSupplierName가 있으면 값이 'contingentSupplierName' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.conversationId |
event.idm.entity.entity.user.attribute.labels |
profile.conversationId가 있으면 값이 'conversationId' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.distinguishedName |
event.idm.entity.entity.user.attribute.labels |
profile.distinguishedName이 있으면 값이 'distinguishedName' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.division |
event.idm.entity.entity.user.attribute.labels |
profile.division가 있으면 값이 'division' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.emailPrefix |
event.idm.entity.entity.user.attribute.labels |
profile.emailPrefix가 있으면 값이 'emailPrefix' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.employeeType |
event.idm.entity.entity.user.attribute.labels |
profile.employeeType가 있으면 해당 값이 키가 'employeeType'인 키-값 쌍으로 추가됩니다. |
profile.homePostalAddress |
event.idm.entity.entity.user.attribute.labels |
profile.homePostalAddress가 있으면 값이 'homePostalAddress' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.isManager |
event.idm.entity.entity.user.attribute.labels |
profile.isManager가 있으면 값이 'isManager' 키가 있는 키-값 쌍으로 추가됩니다. |
lastLogin |
event.idm.entity.entity.user.attribute.labels |
lastLogin가 있으면 값이 키 'lastLogin'이 있는 키-값 쌍으로 추가됩니다. |
profile.leaveOfAbsence |
event.idm.entity.entity.user.attribute.labels |
profile.leaveOfAbsence가 있으면 값이 'leaveOfAbsence' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.managerDn |
event.idm.entity.entity.user.attribute.labels |
profile.managerDn이 있으면 값이 'managerDn' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.payGroup |
event.idm.entity.entity.user.attribute.labels |
profile.payGroup가 있으면 값이 'payGroup' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.wdemployeeID |
event.idm.entity.entity.user.attribute.labels |
profile.wdemployeeID가 있으면 값이 'wdemployeeID' 키가 있는 키-값 쌍으로 추가됩니다. |
profile.zipCode |
event.idm.entity.entity.user.attribute.labels |
profile.zipCode가 있으면 해당 값이 키 'zipCode'가 있는 키-값 쌍으로 추가됩니다. |
profile.userType |
event.idm.entity.entity.user.attribute.roles |
profile.userType가 있으면 해당 값이 역할 배열에 추가됩니다. |
profile.organization, profile.company |
event.idm.entity.entity.user.company_name |
profile.organization에서 가져온 값입니다. profile.organization이 없는 경우 profile.company에서 가져옵니다. |
profile.department |
event.idm.entity.entity.user.department |
profile.department에서 가져온 값입니다. |
profile.email, profile.secondEmail, profile.login |
event.idm.entity.entity.user.email_addresses |
profile.email, profile.secondEmail, profile.login의 값 (이메일이고 중복이 아닌 경우)이 이 필드로 병합됩니다. |
profile.employeeNumber |
event.idm.entity.entity.user.employee_id |
profile.employeeNumber에서 가져온 값입니다. |
profile.firstName, profile.Preferred_First_Name |
event.idm.entity.entity.user.first_name |
profile.firstName에서 가져온 값입니다. profile.firstName이 없는 경우 profile.Preferred_First_Name에서 가져옵니다. |
profile.EmployeeWorkGroup |
event.idm.entity.entity.user.group_identifiers |
profile.EmployeeWorkGroup에서 가져온 값입니다. |
profile.HireDate, profile.hiredate |
event.idm.entity.entity.user.hire_date |
값이 profile.HireDate에서 파싱됩니다. profile.HireDate이 없는 경우 profile.hiredate에서 파싱됩니다. |
profile.lastName, profile.preferred_Last_Name |
event.idm.entity.entity.user.last_name |
profile.lastName 또는 profile.preferred_Last_Name이 있는 경우 profile.lastName에서 가져온 값입니다. |
lastLogin |
event.idm.entity.entity.user.last_login_time |
값은 lastLogin에서 파싱됩니다. |
passwordChanged |
event.idm.entity.entity.user.last_password_change_time |
값은 passwordChanged에서 파싱됩니다. |
profile.manager, profile.managerEmail, profile.managerId |
event.idm.entity.entity.user.managers |
profile.manager의 user_display_name, profile.managerEmail의 email_addresses, profile.managerId의 employee_id이 포함된 객체로 채워집니다. |
profile.city, profile.firstBaseCity |
event.idm.entity.entity.user.office_address.city |
profile.city에서 가져온 값입니다. profile.city이 없는 경우 profile.firstBaseCity에서 가져옵니다. |
profile.countryCode, profile.country |
event.idm.entity.entity.user.office_address.country_or_region |
profile.countryCode에서 가져온 값입니다. profile.countryCode이 없는 경우 profile.country에서 가져옵니다. |
profile.streetAddress |
event.idm.entity.entity.user.personal_address.name |
profile.streetAddress에서 가져온 값입니다. |
profile.state |
event.idm.entity.entity.user.personal_address.state |
profile.state에서 가져온 값입니다. |
profile.primaryPhone, profile.mobilePhone, profile.mobile |
event.idm.entity.entity.user.phone_numbers |
profile.primaryPhone, profile.mobilePhone, profile.mobile의 값이 이 필드로 병합됩니다. |
profile.terminationDate, profile.terminationdate |
event.idm.entity.entity.user.termination_date |
값이 profile.terminationDate에서 파싱됩니다. profile.terminationDate이 없는 경우 profile.terminationdate에서 파싱됩니다. |
profile.title |
event.idm.entity.entity.user.title |
profile.title에서 가져온 값입니다. |
status |
event.idm.entity.entity.user.user_authentication_status |
status에서 매핑: ACTIVE/RECOVERY/LOCKED_OUT/PASSWORD_EXPIRED -> ACTIVE; SUSPENDED -> SUSPENDED; DEPROVISIONED -> DELETED; 그 외에는 UNKNOWN_AUTHENTICATION_STATUS |
profile.displayName |
event.idm.entity.entity.user.user_display_name |
profile.displayName에서 가져온 값입니다. |
profile.samAccountName, profile.samaccountname, profile.login, profile.ldapUid |
event.idm.entity.entity.user.userid |
우선순위가 profile.samAccountName, profile.samaccountname, profile.login (이메일이 아닌 경우), profile.ldapUid (profile.login이 이메일이 아닌 경우)로 채워집니다. |
event.idm.entity.metadata.entity_type |
USER로 설정합니다. |
|
id |
event.idm.entity.metadata.product_entity_id |
id에서 가져온 값입니다. |
event.idm.entity.metadata.product_name |
Identity Cloud로 설정합니다. |
|
event.idm.entity.metadata.vendor_name |
Okta로 설정합니다. |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.