참고:
- 이 사용지침서에서는 Oracle Cloud에 접근해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure Free Tier 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 완료하면 이러한 값을 클라우드 환경에 고유한 값으로 대체합니다.
OCI Audit을 사용하여 OCI Identity and Access Management에서 이벤트를 캡처하는 멀티 클라우드 보안 구현
소개
Oracle Cloud Infrastructure Identity and Access Management(OCI IAM) ID 도메인은 관리자 및 최종 사용자가 수행한 작업에 대한 응답으로 감사 데이터를 생성합니다. 감사 이벤트는 사용자 계정 또는 그룹 멤버쉽의 생성 또는 업데이트와 같은 작업 및 성공 또는 실패한 로그인 시도에 대해 생성됩니다.
이 감사 데이터에 액세스하려면 OCI(Oracle Cloud Infrastructure) 콘솔에서 직접 보고서를 생성하거나 외부 클라우드 플랫폼에서 작동 중인 외부 보안 모니터링 솔루션으로 이러한 이벤트를 전송할 수도 있습니다. 조직은 타사 SIEM(보안 인시던트 및 이벤트 관리) 솔루션을 활용하는 것이 일반적이며, 일반적인 요구사항은 위협 분석 및 준수를 위해 OCI IAM 감사 데이터를 SIEM에 수집하는 것입니다. 이러한 요구사항을 충족하는 한 가지 방법은 OCI IAM ID 도메인 AuditEvents API를 활용하는 것이지만, ID 도메인은 일부 조직에 더 쉽게 구현할 수 있는 또 다른 옵션을 제공하며 다중 클라우드 환경에서 감사 이벤트 공유를 지원합니다.
OCI 감사는 지원되는 모든 OCI API에 대한 호출을 이벤트로 자동으로 기록하는 OCI 서비스입니다. OCI IAM ID 도메인 API를 사용하는 대신 OCI 감사 서비스에서 OCI IAM 감사 이벤트를 가져오도록 선택할 수 있는 몇 가지 일반적인 이유가 있습니다. OCI Audit은 다음과 같은 이점을 제공합니다.
- ID 도메인이 여러 개인 고객에 대한 모든 감사 데이터를 한 곳에서 사용할 수 있습니다. OCI IAM API를 사용하면 각 ID 도메인을 별도로 쿼리해야 하므로 추가 오버헤드가 발생합니다.
- 데이터를 SIEM과 같은 외부 시스템으로 푸시할 수 있으며 OCI IAM AuditEvents API에는 폴링이 필요합니다.
- OCI Audit은 1년 동안 이벤트 데이터를 저장하며, OCI IAM은 90일 동안 감사 이벤트를 저장합니다.
목표
OCI IAM ID 도메인에서 생성된 감사 이벤트를 외부 저장소에 동기화합니다.
필요 조건
- ID 도메인이 있는 OCI 테넌시
- Azure Log Analytics Workspace의 Azure 클라우드 계정
작업 1: OCI Audit을 활용하여 OCI IAM에서 감사 이벤트를 캡처하는 방법 이해
OCI Audit을 사용하여 OCI IAM에서 감사 이벤트를 캡처하는 접근 방식을 설명하기 위해 다음 시나리오를 사용합니다.
OCI IAM ID 도메인이 두 개 있는 테넌시가 있습니다. 테넌시 관리에 사용되는 테넌시 기본 도메인의 도메인 유형은 Free입니다. 이를 관리자 도메인이라고 합니다. 도메인 유형이 Oracle Apps Premium인 추가 ID 도메인이 있으며 모든 직원은 Oracle SaaS 및 온프레미스 애플리케이션에 액세스할 수 있도록 프로비저닝됩니다. 이를 직원 도메인이라고 합니다. 계정이 Microsoft Azure AD에서 직원 도메인에 프로비전됩니다. 이 문제는 여러 가지 방법(System for Cross-domain Identity Management [SCIM], Just-in-Time Provisioning 또는 대량 유저 임포트) 중 하나로 발생할 수 있습니다. 또한 환경의 여러 시스템에서 감사 데이터를 수집하는 SIEM 솔루션(예: Microsoft Sentinel)도 있으며, 두 ID 도메인의 모든 감사 이벤트를 거의 실시간으로 SIEM에 게시해야 합니다.
요구 사항을 해결하기 위해 취할 수 있는 전반적인 접근 방식에는 OCI 감사 서비스, OCI 이벤트 서비스, OCI Functions 서비스 및 Azure Log Analytics Workspace 사용이 포함됩니다. 기본 플로우는 다음과 같습니다.
- OCI IAM ID 도메인은 OCI 감사에 감사 이벤트를 기록합니다.
- OCI 이벤트 서비스에는 OCI IAM의 특정 감사 이벤트 유형에 대해 OCI 감사를 감시하는 규칙이 있습니다. 규칙이 트리거되면 OCI 함수에서 함수를 호출합니다.
- 함수는 페이로드에서 원시 감사 로그를 수신하고 Azure Log Analytics 데이터 수집기 API를 호출하여 Azure Log Analytics 작업 영역으로 데이터를 전송합니다.
- Azure Log Analytics Workspace는 Microsoft Sentinel의 데이터 저장소 역할을 합니다.

작업 2: OCI 감사를 사용하여 OCI IAM에서 감사 이벤트 캡처
-
이 예에서는 Azure 포털에서 Azure Log Analytics Workspace를 설정했다고 가정합니다. 설정했으면 작업 영역 ID 및 기본(또는 보조) 키를 작업 영역 이름, 설정, 에이전트, Log Analytics 에이전트 지침에 복사합니다. OCI 함수로 사용자정의 함수를 작성하는 동안 이 값이 필요합니다.

-
OCI 콘솔에 테넌시 관리자로 로그인합니다.
-
OCI 함수와 함께 배치될 사용자정의 함수를 작성합니다. 다음 코드 예제는 Python을 사용하지만 사용자가 선택한 언어로 함수를 쉽게 구현할 수 있습니다. 간단한 세 단계로 함수 코드를 추가해 보겠습니다.
-
func.py라는 Python 파일을 만들고 다음과 같은 필수 import 문과 매개변수 선언을 추가합니다. 매개변수 값은 Log Analytics 작업영역 환경과 일치해야 합니다. Azure Portal의 Log Analytics 작업 영역, 작업 영역 이름 및 에이전트 관리 페이지에서 고객 ID(포털의 작업 영역 ID) 및 공유 키 값을 찾을 수 있습니다. 로그 유형 매개변수는 Azure Log Analytics 작업영역의 새 사용자정의 로그(또는 기존 사용자정의 로그 선택) 및 데이터 업로드의 대상 위치를 정의하는 데 사용되는 친숙한 이름입니다.Log Analytics 작업영역 고객 ID 및 공유 키 값을 하드코딩하는 대신, OCI Secrets 서비스를 사용하여 OCI 함수의 값에 대한 보안 액세스를 제공할 수 있습니다. 코드에 OCI 암호 사용 단계에 대한 자세한 내용은 다음 문서를 참조하십시오.
이 자습서에서는 저장소에 저장된 암호가 있다고 가정하고 OCI 함수 인스턴스 주체에 대한 액세스 권한을 부여하도록 IAM 정책을 설정합니다.
{.python .numberLines .lineAnchors} import oci import io import json import requests import datetime import hashlib import hmac import base64 import logging from fdk import response # Get instance principal context, and initialize secrets client signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner() secret_client = oci.secrets.SecretsClient(config={}, signer=signer) # Replace values below with the ocids of your secrets customer_id_ocid = "ocid1.vaultsecret.oc1.<customer_id_ocid>" shared_key_ocid = "ocid1.vaultsecret.oc1.<shared_key_ocid>" # Retrieve secret def read_secret_value(secret_client, secret_id): response = secret_client.get_secret_bundle(secret_id) base64_Secret_content = response.data.secret_bundle_content.content base64_secret_bytes = base64_Secret_content.encode('ascii') base64_message_bytes = base64.b64decode(base64_secret_bytes) secret_content = base64_message_bytes.decode('ascii') return secret_content # Retrieve the customer ID using the secret client. customer_id = read_secret_value(secret_client, customer_id_ocid) # For the shared key, use either the primary or the secondary Connected Sources client authentication key _shared_key = read_secret_value(secret_client, shared_key_ocid) # The log type is the name of the event that is being submitted log_type = 'OCILogging' -
다음 코드 행을 추가하여 Azure 데이터 업로드 끝점에 대한 보안 REST 호출을 수행하는 작업을 정의합니다. Microsoft의 최신 끝점 또는 버전 구문에 대해 구문을 확인하려면 이 코드를 검증해야 할 수 있습니다.
참고: 이 코드의 일부는 다음 Microsoft 설명서에서 복사됩니다.
{.python .numberLines .lineAnchors} # Build the API signature def build_signature(customer_id, shared_key, date, content_length, method, content_type, resource): x_headers = 'x-ms-date:' + date string_to_hash = method + "\n" + str(content_length) + "\n" + content_type + "\n" + x_headers + "\n" + resource bytes_to_hash = bytes(string_to_hash, encoding= "utf-8" ) decoded_key = base64.b64decode(shared_key) encoded_hash = base64.b64encode(hmac.new(decoded_key, bytes_to_hash, digestmod=hashlib.sha256).digest()).decode() authorization = "SharedKey {}:{}" .format(customer_id,encoded_hash) return authorization # Build and send a request to the POST API def post_data(customer_id, shared_key, body, log_type, logger): method = 'POST' content_type = 'application/json' resource = '/api/logs' rfc1123date = datetime.datetime.utcnow().strftime( '%a, %d %b %Y %H:%M:%S GMT' ) content_length = len(body) signature = build_signature(customer_id, shared_key, rfc1123date, content_length, method, content_type, resource) uri = 'https://' + customer_id + '.ods.opinsights.azure.com' + resource + '?api-version=2016-04-01' headers = { 'content-type' : content_type, 'Authorization' : signature, 'Log-Type' : log_type, 'x-ms-date' : rfc1123date } response = requests.post(uri,data=body, headers=headers) if (response.status_code >= 200 and response.status_code <= 299 ): logger.info( 'Upload accepted' ) else : logger.info( "Error during upload. Response code: {}" .format(response.status_code)) print(response.text) -
다음 코드 블록을
func.py코드 파일에 추가하여 실행 시작점 및 프레임워크 세부정보를 정의합니다. 고급 데이터 구문 분석, 형식 지정 또는 사용자정의 예외 처리와 같은 선택적 기능을 추가하려는 경우가 아니면 변경할 필요가 없습니다.{.python .numberLines .lineAnchors} """ Entrypoint and initialization """ def handler(ctx, data: io.BytesIO= None ): logger = logging.getLogger() try : _log_body = data.getvalue() post_data(_customer_id, _shared_key, _log_body, _log_type, logger) except Exception as err: logger.error( "Error in main process: {}" .format(str(err))) return response.Response( ctx, response_data=json.dumps({ "status" : "Success" }), headers={ "Content-Type" : "application/json" } )
-
-
이 설명서에 따라 CloudShell: CloudShell의 함수 빠른 시작을 사용하여 함수를 배치합니다.
-
OCI Events 서비스에서 기준과 일치하는 감사 로그를 찾고 단계 3 및 4에서 생성 및 배치한 함수를 호출하는 규칙을 생성합니다.
-
이벤트 서비스로 이동하여 콘솔 검색 표시줄 또는 왼쪽의 서비스 메뉴 내부의 검색 표시줄에서 "이벤트"를 검색합니다. 검색 결과에서 규칙을 누릅니다.


-
관리자 및 사원 도메인에서 이벤트를 생성, 업데이트 또는 삭제하는 조건을 사용하여 규칙을 생성합니다.
-
사용자 생성, 업데이트 및 삭제 이벤트 유형은 ID 서비스에서 사용할 수 있습니다.
-
두 ID 도메인의 GUID로 "속성" 조건을 더 추가합니다.
주: 선택 사항입니다. 기본적으로 클라우드 계정의 모든 ID 도메인에 대한 감사 이벤트가 일치합니다. 하지만 ID 도메인의 하위 집합에만 관심이 있는 경우 범위 내 도메인을 명시적으로 지정할 수 있습니다.) ID 도메인 개요 페이지에서 ID 도메인 GUID를 찾을 수 있습니다.
-
작업 패널에서 함수 작업 유형을 선택하고 위의 3단계와 4단계에서 생성 및 배포한 기능을 선택합니다.

-
-
-
이제 ID 도메인 중 하나에서 사용자를 생성, 업데이트 또는 삭제할 때 원시 감사 로그를 페이로드로 사용하여 OCI 함수가 호출됩니다. OCI Function은 데이터를 Azure Log Analytics Workspace에 게시합니다. 이름이
OCILogging_CL인 사용자정의 테이블에 데이터가 표시됩니다.
관련 링크
승인
- Authors: Ari Kermaier(Consulting Member of Technical Staff, OCI Identity) 및 Manoj Gaddam(OCI Identity 수석 제품 관리자)
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 살펴보거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer를 방문하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Implement multicloud security using OCI Audit to capture events from OCI Identity and Access Management
F83130-01
June 2023
Copyright © 2023, Oracle and/or its affiliates.