Workday HCM 로그 수집
이 문서에서는 서드 파티 API를 사용하여 피드를 설정하여 Workday HCM 로그를 Google Security Operations로 수집하는 방법을 설명합니다.
파서는 JSON 형식 로그에서 Workday HCM 사용자 데이터를 추출합니다. 필드 이름 바꾸기, 중첩된 객체 병합, 날짜 파싱, 사용자 속성, 고용 세부정보, 조직 구조에 대한 UDM 필드 채우기를 비롯한 다양한 데이터 변환을 처리합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- 보안 관리자 또는 이와 동등한 권한으로 Workday에 대한 권한 있는 액세스
Workday API 인증 구성
통합 시스템 사용자 (ISU) 만들기
- 관리자 권한으로 Workday에 로그인합니다.
- 검색창에 통합 시스템 사용자 만들기 를 입력하고 작업을 선택합니다.
- 사용자 이름 (예:
ISU_SecOps_HCM)을 입력합니다. - 비밀번호 를 설정합니다.
- ISU가 시간 초과되지 않도록 세션 만료 시간(분) 을
0으로 설정합니다. - UI 로그인을 제한하여 보안을 강화하려면 UI 세션 허용 안 함 을 사용 설정합니다.
- 비밀번호 규칙 유지보수 작업으로 이동합니다.
- 통합 시스템 사용자를 비밀번호 만료에서 제외되는 시스템 사용자 필드에 추가합니다.
통합 보안 그룹 만들기
- 검색창에 보안 그룹 만들기 를 입력하고 작업을 선택합니다.
- 테넌트 보안 그룹 유형 필드를 찾아 통합 시스템 보안 그룹 (제약 없음) 을 선택합니다.
- 보안 그룹의 이름 (예:
ISG_SecOps_HCM)을 제공합니다. - 확인 을 클릭합니다.
- 새로 만든 보안 그룹의 수정 을 클릭합니다.
- 이전 단계의 통합 시스템 사용자를 보안 그룹에 할당합니다.
- 완료 를 클릭합니다.
보안 그룹에 도메인 액세스 권한 부여
Google SecOps 피드는 4개의 Workday REST API 엔드포인트에서 데이터를 가져옵니다. 각 엔드포인트에는 통합 보안 그룹에 부여할 특정 도메인 보안 정책 권한이 필요합니다.
- 검색창에 보안 그룹에 대한 권한 유지보수 를 입력하고 작업을 선택합니다.
- 소스 보안 그룹 목록에서 만든 보안 그룹 (예:
ISG_SecOps_HCM)을 선택합니다. - 확인 을 클릭합니다.
- 도메인 보안 정책 권한 으로 이동합니다.
다음 각 도메인에 대해 GET 액세스 권한을 추가합니다.
API 엔드포인트 필수 도메인 보안 정책 /workers— 작업자 목록 및 프로필Worker Data: Public Worker Reports/workers/{id}/timeOffEntries— 휴가 잔액Worker Data: Time Off (Time Off Balances),Worker Data: Time Off (Time Off Balances Manager View)/workers/{id}/history— 작업자 인력 기록Worker Data: Historical Staffing Information/supervisoryOrganizations— 조직 구조Manage: Supervisory Organization또는View: Supervisory Organization확인 을 클릭합니다.
완료 를 클릭하여 변경사항을 저장합니다.
보안 정책 변경사항 활성화
- 검색창에 보류 중인 보안 정책 변경사항 활성화 를 입력하고 작업을 선택합니다.
- 의견 필드에 변경 사유 (예:
Granting API access for Google SecOps HCM integration)를 입력합니다. - 확인 을 클릭합니다.
- 확인을 선택한 다음 확인을 클릭합니다.
통합을 위한 API 클라이언트 등록
- 검색창에 통합을 위한 API 클라이언트 등록 을 입력하고 선택합니다.
- 만들기 를 클릭합니다.
다음 구성 세부정보를 제공합니다.
- 클라이언트 이름: 이름을 입력합니다 (예:
Google SecOps HCM Client). - 시스템 사용자: 만든 통합 시스템 사용자 (예:
ISU_SecOps_HCM)를 선택합니다. 범위: 다음 범위를 선택합니다.
위에 나열된 세 가지 범위를 모두 추가해야 합니다. 각 범위는 서로 다른 Workday REST API 리소스 집합에 매핑됩니다.범위 필수 인력 /workers및/workers/{id}/history엔드포인트휴가 및 휴직 /workers/{id}/timeOffEntries엔드포인트조직 및 역할 /supervisoryOrganizations엔드포인트
- 클라이언트 이름: 이름을 입력합니다 (예:
저장 을 클릭합니다.
확인 을 클릭합니다.
클라이언트 ID 와 클라이언트 보안 비밀번호 를 즉시 복사하여 저장합니다.
OAuth 2.0 갱신 토큰 생성
- 검색창에 통합을 위한 갱신 토큰 관리 를 입력하고 선택합니다.
- 새 갱신 토큰 생성 을 클릭합니다.
- Workday 계정 필드에서 통합 시스템 사용자 (예:
ISU_SecOps_HCM)를 검색하여 선택합니다. - 만든 API 클라이언트를 선택하고 확인 을 클릭합니다.
- 갱신 토큰 을 복사하여 저장합니다.
API 엔드포인트 URL 가져오기
- 검색창에 API 클라이언트 보기 를 입력하고 선택합니다.
- 통합을 위한 API 클라이언트에서 만든 클라이언트 (예:
Google SecOps HCM Client)를 찾습니다. 다음 세부정보를 복사하여 저장합니다.
- 토큰 엔드포인트: 액세스 토큰을 가져오는 URL (예:
https://wd2-impl-services1.workday.com/ccx/oauth2/YOUR_TENANT/token) - Workday REST API 엔드포인트: API 호출의 기본 URL (예:
https://wd2-impl-services1.workday.com/ccx/api/v1/YOUR_TENANT)
- 토큰 엔드포인트: 액세스 토큰을 가져오는 URL (예:
OAuth 액세스 토큰 생성
curl또는 유사한 HTTP 클라이언트를 사용하여 토큰 엔드포인트에 POST 요청을 보냅니다.curl -X POST "https://HOSTNAME/ccx/oauth2/TENANT/token" \ -d "grant_type=refresh_token" \ -d "client_id=YOUR_CLIENT_ID" \ -d "client_secret=YOUR_CLIENT_SECRET" \ -d "refresh_token=YOUR_REFRESH_TOKEN"
그러면 액세스 토큰 (예: "access_token": "abcd1234")이 반환됩니다. 액세스 토큰을 복사하여 저장합니다.
API 액세스 확인
피드를 구성하기 전에 ISU에 키 엔드포인트에 필요한 권한이 있는지 확인합니다. 변수를 실제 값으로 바꿉니다.
TOKEN="your-access-token" HOST="your-workday-host" TENANT="your-tenant" # Test 1: Workers (should return worker list) curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: Bearer $TOKEN" \ "https://$HOST/ccx/api/v1/$TENANT/workers?limit=1" # Test 2: Time off entries (replace WORKER_ID with an ID from Test 1) curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: Bearer $TOKEN" \ "https://$HOST/ccx/api/v1/$TENANT/workers/WORKER_ID/timeOffEntries" # Test 3: Worker history (replace WORKER_ID with an ID from Test 1) curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: Bearer $TOKEN" \ "https://$HOST/ccx/api/v1/$TENANT/workers/WORKER_ID/history" # Test 4: Supervisory organizations curl -s -o /dev/null -w "%{http_code}" \ -H "Authorization: Bearer $TOKEN" \ "https://$HOST/ccx/api/v1/$TENANT/supervisoryOrganizations"
각 테스트는 HTTP 상태 200을 반환해야 합니다. 엔드포인트에서 403을 반환하는 경우 문제 해결 섹션을 참조하세요.
Workday HCM 데이터를 수집하도록 Google SecOps에서 피드 구성
피드 설정하기
- **SIEM 설정 > 피드** 로 이동합니다.
- 새 피드 추가 를 클릭합니다.
- 다음 페이지에서 단일 피드 구성 을 클릭합니다.
- 피드 이름 필드에 피드 이름 (예:
Workday HCM)을 입력합니다. - 소스 유형 으로 서드 파티 API 를 선택합니다.
- 로그 유형 으로 Workday 를 선택합니다.
- 다음 을 클릭합니다.
피드 매개변수 구성
다음 입력 매개변수의 값을 지정합니다.
API 호스트 이름: Workday REST API 엔드포인트의 정규화된 도메인 이름 (예:
wd2-impl-services1.workday.com)테넌트: Workday 인스턴스를 식별하는 Workday REST API 엔드포인트의 마지막 경로 요소입니다.
액세스 토큰: 이전 섹션에서 생성된 OAuth 액세스 토큰입니다.
고급 옵션:
- 애셋 네임스페이스: 애셋 네임스페이스입니다.
- 수집 라벨: 이 피드의 이벤트에 적용할 라벨입니다.
다음 을 클릭합니다.
확정 화면에서 새 피드 구성을 검토한 다음 제출 을 클릭합니다.
문제 해결
특정 엔드포인트에서 403 금지됨
피드에서 오류를 보고하거나 확인 curl 명령어가 특정 엔드포인트에 대해 403을 반환하는 경우 통합 시스템 사용자에게 권한이 없습니다.
| 실패한 엔드포인트 | 수정 |
|---|---|
/workers/{id}/timeOffEntries |
Worker Data: Time Off (Time Off Balances) 및 Worker Data: Time Off (Time Off Balances Manager View) 도메인에 대한 GET 액세스 권한을 추가합니다. API 클라이언트에 휴가 및 휴직 범위를 추가합니다. |
/workers/{id}/history |
Worker Data: Historical Staffing Information 도메인에 대한 GET 액세스 권한을 추가합니다. 인력 범위가 API 클라이언트에 할당되었는지 확인합니다. |
/supervisoryOrganizations |
Manage: Supervisory Organization 또는 View: Supervisory Organization 도메인에 대한 GET 액세스 권한을 추가합니다. API 클라이언트에 조직 및 역할 범위를 추가합니다. |
권한을 변경한 후 다음 단계를 따르세요.
- Workday에서 보류 중인 보안 정책 변경사항 활성화 를 실행합니다.
- API 클라이언트에 새 범위를 추가한 경우 통합을 위한 갱신 토큰 관리 를 통해 새 갱신 토큰을 생성한 다음 새 액세스 토큰을 생성합니다.
- 액세스 토큰이 변경된 경우 새 액세스 토큰으로 피드 구성을 업데이트합니다.
인증 오류
- 401 승인되지 않음: 액세스 토큰이 만료되었습니다. 갱신 토큰을 사용하여 새 토큰을 생성하고 피드를 업데이트합니다.
- 클라이언트가 유효하지 않음: 클라이언트 ID와 클라이언트 보안 비밀번호가 올바른지 확인합니다.
- 갱신 토큰이 유효하지 않음: 갱신 토큰이 취소되었을 수 있습니다. 통합을 위한 갱신 토큰 관리 를 통해 새 갱신 토큰을 생성합니다.
UDM 매핑 표
| 로그 필드 | UDM 매핑 | 논리 |
|---|---|---|
@timestamp |
metadata.event_timestamp.seconds |
Epoch 이후 초 단위로 타임스탬프로 파싱됨 |
businessTitle |
entity.entity.user.title |
직접 매핑됨 |
descriptor |
entity.entity.user.user_display_name |
직접 매핑됨 |
Employee_ID |
entity.entity.user.employee_id |
직접 매핑됨 |
Employee_ID |
entity.metadata.product_entity_id |
id가 없는 경우 매핑됨 |
gopher-supervisor.descriptor |
entity.entity.user.managers.user_display_name |
직접 매핑됨 |
gopher-supervisor.id |
entity.entity.user.managers.product_object_id |
직접 매핑됨 |
gopher-supervisor.primaryWorkEmail |
entity.entity.user.managers.email_addresses |
직접 매핑됨 |
gopher-time-off.date |
entity.entity.user.time_off.interval.start_time |
날짜로 파싱됨 |
gopher-time-off.descriptor |
entity.entity.user.time_off.description |
직접 매핑됨 |
Hire_Date |
entity.entity.user.hire_date |
날짜로 파싱됨 |
id |
entity.metadata.product_entity_id |
있는 경우 직접 매핑됨 |
Job_Profile |
entity.entity.user.title |
businessTitle이 없는 경우 매핑됨 |
Legal_Name_First_Name |
entity.entity.user.first_name |
직접 매핑됨 |
Legal_Name_Last_Name |
entity.entity.user.last_name |
직접 매핑됨 |
location.descriptor |
entity.entity.location.city |
직접 매핑됨 |
primarySupervisoryOrganization.descriptor |
entity.entity.user.department |
직접 매핑됨 |
primaryWorkEmail |
entity.entity.user.email_addresses |
직접 매핑됨 |
primaryWorkPhone |
entity.entity.user.phone_numbers |
직접 매핑됨 |
Termination_Date |
entity.entity.user.termination_date |
날짜로 파싱됨 |
Work_Email |
entity.entity.user.email_addresses |
primaryWorkEmail이 없는 경우 매핑됨 |
collection_time |
metadata.event_timestamp.collected_timestamp |
직접 매핑됨 |
도움이 더 필요하신가요? 커뮤니티 회원 및 Google SecOps 전문가에게 문의하여 답변을 받으세요.