Microsoft Sentinel 위한 Notebook 솔루션 개발

ISV 파트너는 Jupyter Notebook 분석 솔루션을 빌드, 테스트, 패키지 및 SaaS 제품으로 Microsoft Security Store에 게시할 수 있습니다. Microsoft Sentinel Data Lake는 대규모 보안 데이터 세트에 대해 관리되는 Spark 풀에서 실행되는 Jupyter Notebook을 지원합니다. 이러한 노트북은 은밀하고 장기적으로 진행되는 공격 탐지, 행위 기준선 설정, AI/ML 기반 분석, 민감한 데이터 경로 매핑, 데이터 시각화, 그리고 기존 KQL 탐지로는 표현할 수 없는 데이터 보강에 이상적입니다.

노트북 플랫폼 솔루션은 일반적으로 과거 분석, 복잡한 데이터 변환, 반복적인 데이터 처리 워크플로우를 위해 설계되었습니다. 출력은 데이터 레이크의 맞춤 테이블에 기록되며, 하위 분석 규칙, 헌팅 쿼리, Security Copilot 에이전트 또는 MCP 도구가 노트북 솔루션의 결과를 처리할 수 있습니다. Partner Center에 제출하는 .zip 패키지는 유형이 SentinelLake(으)로 선언되며, 노트북과 필요한 경우 노트북에 필요한 후속 Azure 리소스를 위한 ARM 템플릿을 포함합니다.

이 글에서는 Microsoft Sentinel 플랫폼 노트북 솔루션을 Microsoft Security Store에 구축, 테스트, 패키징 및 배포하는 과정을 안내합니다. 이 가이드를 완료하면 다음을 수행할 수 있습니다.

  • Sentinel 데이터 레이크의 데이터를 읽는 실행 가능한 Jupyter 노트북
  • 관리되는 Spark 풀에서 Notebook을 실행하는 예약된 작업
  • SentinelLake 패키지 ZIP 파일(PackageManifest + 노트북 폴더)
  • Microsoft Security 스토어의 파트너 센터 SaaS 제품 목록

사전 요구 사항

테넌트는 Microsoft Sentinel 데이터 레이크에 등록되어 있어야 합니다. Defender 포털에서 온보딩 상태를 확인합니다. 시스템>설정>Microsoft Sentinel>데이트 레이크로 이동합니다. 테넌트가 준비되면 상태는 Provisioned로 표시됩니다. 온보딩 지침은 Microsoft Sentinel 데이터 레이크에 온보딩을 참조하세요.

필요한 권한

운영/자원 필수 역할
센티넬 데이터 레이크로 탑승 Microsoft Entra ID - 보안 관리자 또는 전역 관리자
Defender 포털에 Sentinel 작업 영역 온보딩 구독 소유자 또는 구독 범위의 사용자 액세스 관리자 및 구독 또는 리소스 그룹 범위의 Microsoft Sentinel 기여자
Sentinel 작업 영역을 데이터 레이크에 온보딩 구독 또는 리소스 그룹 범위의 구독 소유자 또는 Microsoft Sentinel 기여자
데이터 레이크에서 노트북 실행 Microsoft Sentinel 읽기 권한자 또는 기여자
Log Analytics 작업 영역(분석 계층으로 다시 쓰기용) 데이터 레이크 관리 ID msg-resources-<guid>에 할당된 Log Analytics 기여자
Microsoft 파트너 센터 Marketplace Publisher 계정 (일회용; Security Copilot 에이전트 게시에 동일한 계정)

비고

일회성 데이터 레이크 온보딩 작업에는 구독 소유자 역할이 필요합니다. PIM(Microsoft Entra Privileged Identity Management)을 사용하여 필요할 때만 일시적으로 이 역할로 승격한 다음 온보딩이 완료된 후 액세스를 제거합니다.

필요한 도구

  • Visual Studio Code.
  • Microsoft Sentinel용 VS Code 확장
  • 노트북 작성 속도를 높이기 위해 GitHub Copilot VS Code 확장 프로그램이 추천됩니다.
  • Python 3.10 이상은 로컬에 설치되어 있습니다. Spark 커널은 Azure 실행되지만 VS Code는 셀 편집을 위해 로컬 인터프리터가 필요합니다.

프로세스 개요

게시 프로세스는 로컬 Notebook 개발이 Microsoft Security Store에서 검색 가능한 패키지된 SaaS 제품으로 이동하는 것으로 시작됩니다.

  1. 로컬 Notebook 개발(VS Code + Sentinel 확장)
  2. Sentinel 플랫폼에 대해 대화형으로 실행
  3. 대표 데이터로 테스트하고 출력 테이블이 올바르게 채워지는지 검증합니다.
  4. 작업으로 예약(주문형 또는 예약됨)
  5. SentinelLake .zip로 패키징(PackageManifest.yaml + 폴더)
  6. Microsoft Partner Center에서 SaaS 제안 만들기
  7. 패키지 업로드, 메타데이터 만들기, 계획 및 가격 책정
  8. 검토 및 게시, 자동화된 검토, 라이브로 전환
  9. Microsoft Security 스토어에서 제공 중

Visual Studio Code 및 Microsoft Sentinel 확장 설치

모든 Notebook 개발은 Microsoft Sentinel 확장이 설치된 VS Code에서 로컬로 수행됩니다. Spark 커널은 Azure 실행됩니다. VS Code는 편집기 및 제출 클라이언트입니다.

  1. Visual Studio Code https://code.visualstudio.com/ 다운로드하고 기본 옵션을 사용하여 설치합니다.

  2. VS Code >확장 마켓플레이스를 엽니다(Ctrl+Shift+X 또는 Cmd+Shift+X).

  3. Sentinel을 검색하고 Microsoft Sentinel 확장(게시자: ms-security)을 설치합니다.

    설치 후 왼쪽 도구 모음에 Microsoft Sentinel 아이콘이 나타납니다.

  4. (권장) 마켓플레이스에서 GitHub Copilot 검색하고, 설치하고, 메시지가 표시되면 GitHub 로그인합니다.

    Copilot은 MicrosoftSentinelProvider API를 이해하고 PySpark 변환을 자동 완성합니다.

  5. 왼쪽 도구 모음에서 Microsoft Sentinel 아이콘을 선택합니다.

  6. 로그인 대화 상자를 승인한 다음, 작업 영역에서 Sentinel 읽기 권한자/기여자가 있는 계정을 선택합니다.

왼쪽 창에는 Lake 테이블과 작업이 표시되어 확장이 데이터 레이크에 도달했음을 확인할 수 있습니다.

Lake 테이블, 작업 및 그래프 섹션을 보여 주는 Microsoft Sentinel VS Code 확장의 스크린샷

주의

여러 게스트 테넌트가 로그인되어 있는 경우 VS Code의 왼쪽 아래에 있는 계정을 전환하면 활성 PySpark 세션이 종료됩니다. 전환 후 커널을 다시 시작해야 합니다. 계정 전환은 실행 도중이 아니라 각 실행 사이에 계획하세요.

노트북을 개발하세요

Notebook은 다음 작성 패턴을 사용합니다.

  • 데이터 레이크 테이블을 Spark DataFrame으로 읽기
  • PySpark를 사용하여 변환
  • 필요에 따라 외부 데이터로 보강
  • Sentinel에서 사용할 수 있는 사용자 지정 테이블에 결과 작성

Lake 테이블 패널 살펴보기

Notebook에서 사용하는 입력 테이블을 식별하려면 Lake 테이블 패널을 탐색합니다.

  1. Sentinel 아이콘을 선택하고 Lake 테이블을 확장합니다.
  2. 테이블은 데이터베이스 및 범주(시스템, 사용자 지정, 페더레이션됨)로 그룹화됩니다. 열을 정의하고 형식을 보려면 테이블을 선택합니다.
  3. 전자 필기장이 읽는 입력 테이블을 식별하고 정확한 이름을 기록해 둡니다.

새 Notebook 만들기

솔루션에 대한 새 Jupyter Notebook을 만들려면 다음 단계를 완료합니다.

  1. Ctrl+Shift+P / Cmd+Shift+P>를 누른 다음 Create New Jupyter Notebook을(를) 입력하거나, 파일>새 파일>Jupyter Notebook을(를) 선택합니다.

    새로 만들기 Jupyter Notebook 명령을 보여 주는 VS Code의 스크린샷

  2. 설명이 포함된 이름으로 Notebook을 저장합니다(예: failed-signin-baseline.ipynb).

표 읽기

이 템플릿을 첫 번째 셀에 붙여넣고 표 이름을 사용자 이름으로 바꿉니다.

from sentinel_lake.providers import MicrosoftSentinelProvider
data_provider = MicrosoftSentinelProvider(spark)

# Read a table from the data lake
table_name = "EntraGroups"
df = data_provider.read_table(table_name)

# Quick sanity check—show 100 rows
df.select("displayName", "groupTypes", "mail", "tenantId").show(100, truncate=False)

런타임 풀을 선택하고 셀 실행

데이터 레이크에서 셀을 실행하려면 풀을 선택하고 제출하세요.

  1. 셀에서 실행 삼각형을 선택합니다.

  2. 메시지가 표시되면 런타임으로 Microsoft Sentinel 선택합니다.

    런타임 선택을 보여 주는 VS Code의 스크린샷.

  3. 풀 크기 선택: 탐색의 경우 작음 , 변환 의 경우 보통 , ML의 경우 큼 또는 수천만 개 이상의 행을 집계합니다.

첫 번째 실행은 Spark 세션을 스핀업하는 데 3~5분이 걸립니다. 후속 셀은 몇 초 안에 실행됩니다.

사용자 지정 테이블로 변환하여 다시 쓰기

이 메서드는 save_as_table() 데이터 프레임을 레이크 계층(또는 분석 계층)의 사용자 지정 테이블에 씁니다. 대상 테이블은 첫 번째 쓰기에 만들어집니다.

df_transformed = (
    df.filter(df.mail.isNotNull())
    .select("displayName", "groupTypes", "mail", "mailNickname", "description", "tenantId")
)

write_options = {"mode": "overwrite"}
data_provider.save_as_table(
    df_transformed,
    "EntraGroups_Processed_SPRK",
    write_options=write_options,
)

Notebook 작성 패턴

다음 패턴은 가장 일반적인 시나리오를 다룹니다.

패턴 사용 시기
기준선 + 드리프트 사용자별 또는 호스트별 정상 동작을 산출하고, 기준선에서 벗어나는 행에 플래그를 표시합니다. 실패한 로그인 및 프로세스 실행 분석을 위한 클래식입니다.
테이블 간 조인 공유 엔터티(UPN, 호스트, IP)의 기본 제공 테이블(SigninLogs, SecurityAlert, DeviceProcessEvents)을 사용하여 소유한 레이크 테이블을 조인합니다.
ML 점수 매기기 노트북에서 모델을 학습하거나 사전 학습된 모델을 로드합니다. 각 행의 점수를 매기고, 후속 경고를 위해 위험도가 높은 상위 N개 행을 사용자 지정 출력 테이블에 기록합니다.
시각적 조사 matplotlib 또는 plotly로 타임라인, 히트맵, 프로세스 트리를 작성할 수 있습니다; 노트북을 HTML로 내보내서 인수하세요.

팁 (조언)

markdown 셀을 자유롭게 사용하여 코드를 문서화합니다. 보안 저장소 검토자 및 Notebook을 실행하는 SOC 분석가는 코드를 읽지 않고 각 섹션이 수행하는 작업을 이해해야 합니다. 목적, 입력, 출력 및 예상 출력을 설명하는 모든 코드 블록 위에 markdown 셀을 배치합니다. 검토자는 불분명한 노트북은 즉시 불합격 처리합니다.

Notebook 테스트

테스트를 위해서는 노트북이 실제 데이터에서 전체 과정이 끝까지 실행되고 사용할 수 있는 출력 테이블을 생성한다는 점을 입증해야 합니다.

작은 수영장에서 스모크 테스트

노트북을 처음부터 끝까지 실행하여 각 셀이 오류 없이 완료되는지 확인하세요.

  1. 커널을 다시 시작하여 부실 상태를 지웁다.
  2. 위에서 아래로 모든 셀을 실행합니다. 모든 셀은 오류 없이 완료되어야 합니다.

Small에서 변환 셀이 5분 이상 걸리는 경우 입력 필터가 너무 느슨합니다. 확장하기 전에 날짜 또는 열 프로젝션을 조입니다.

출력 테이블의 유효성 검사

출력 테이블이 만들어졌으며 예상 데이터를 포함하는지 확인합니다.

  1. Sentinel 확장의 Lake 테이블 패널에서 출력 테이블이 예상 스키마와 함께 표시되는지 새로 고치고 확인합니다.
  2. 확인 셀을 실행합니다.
verify_df = data_provider.read_table("EntraGroups_Processed_SPRK")
print("Row count:", verify_df.count())
verify_df.printSchema()
verify_df.show(5, truncate=False)

중간 또는 큰 풀에서 크기 조정 테스트

풀 크기가 더 클 때도 notebook에서 일관된 결과가 나오는지 확인합니다.

  1. Medium에서 노트북을 다시 실행하세요(데이터 세트 규모에 따라 필요한 경우 Large에서도).
  2. 행 개수 및 열 분포가 Small 실행과 일치하는지 확인합니다. 서로 다르다면 조사가 필요한 비결정적 변환이라는 뜻입니다.

에지 사례 테스트

  • 빈 입력: 행이 0인 테이블 또는 날짜 범위를 가리킵니다. Notebook은 오류를 적절히 처리하거나 빈 출력을 생성해야 하며, 충돌해서는 안 됩니다.
  • 스키마 드리프트: 입력 테이블에 열이 추가되더라도 노트북은 계속 실행되어야 합니다. 위치 순서를 가정하지 않습니다.

노트북을 작업으로 예약하기

게시된 대부분의 Notebook 솔루션은 시간별 기준, 일일 변칙 검사 등 일정에 따라 실행됩니다. Sentinel 확장은 저장된 모든 Notebook을 관리되는 Spark 풀에서 무인으로 실행되는 예약된 작업으로 바꿉니다.

작업 만들기

Notebook을 예약된 작업으로 변환하려면 다음 단계를 완료합니다.

  1. VS Code에서 Notebook을 엽니다.
  2. Notebook에서 일정 작업 만들기 를 선택한 다음 메시지가 표시되면 기존 전자 필기장 사용을 선택합니다.

자세한 내용은 Jupyter Notebook 작업 만들기 및 관리를 참조하세요.

Notebook에서 예약된 작업을 만드는 방법을 보여 주는 스크린샷

작업 구성하기

예약된 작업을 구성하려면 다음 필드를 입력합니다.

  1. 노트북을 설명하는 kebab-case 형식의 작업 이름을 입력하세요(예: failed-signin-baseline-hourly).
  2. 작업의 용도 및 출력 테이블을 다루는 한 문장 설명을 입력합니다.
  3. 테스트 중에 유효성을 검사한 Spark 풀 크기를 선택합니다. 너무 크게 설정하지 마세요. 이 풀에서는 호출될 때마다 작업이 실행됩니다.
  4. 일정의 경우 수동 실행에 대한 주문형을 선택하거나 반복 빈도(분, 매시간, 매일, 매주 또는 매월)로 예약을 선택합니다.
  5. 제출을 선택하여 작업을 게시합니다.

작업 확인

제출한 후 작업이 올바르게 실행되고 있는지 확인합니다.

  1. Sentinel 확장의 작업 패널로 전환합니다. 작업이 표시됩니다.

  2. 즉시 유효성 검사를 실행하려면 >지금 실행 작업을 선택합니다.

  3. Notebook 작업을 즉시 실행하는 방법을 보여 주는 스크린샷

  4. 실행이 완료되면 실행 기록 탭으로 전환하여 로그 및 타이밍을 검사합니다.

중요합니다

제출된 작업은 로컬 .ipynb 파일에서 분리됩니다. 로컬 파일을 편집해도 실행 중인 작업이 업데이트되지 않습니다. 작업을 업데이트하려면: Jobs 패널에서 작업을 엽니다>노트북 다운로드>>작업 편집> 후 제출하여 업데이트된 버전을 업로드합니다.

Defender 포털에서 작업 보기

Microsoft Sentinel>데이타 레이크 탐색>작업으로 이동합니다. 여기에서 일정을 사용 또는 사용 중지하고 실행 기록을 볼 수 있지만, 포털에서는 노트북을 편집할 수 없습니다.

Notebook 솔루션 패키지 및 게시

노트북을 테스트하고 실체화한 후 고객에게 배포할 수 있도록 패키징하세요. 자세한 패키지 지침은 Microsoft Sentinel 그래프 및 노트북 솔루션 패키지 및 게시를 참조하세요.

Troubleshooting

전자 필기장 작성

증상 원인 및 수정 가능성
MicrosoftSentinelProvider 찾을 수 없음 확장이 로그인되지 않았거나 Spark가 아닌 커널을 열었습니다. Microsoft Sentinel 확장에 로그인하고 메시지가 표시되면 Microsoft Sentinel 런타임을 선택합니다.
"Spark 세션 시작"에서 셀이 중단됩니다. 첫 번째 셀 시작에는 3~5분이 걸립니다. 6분 후 상태 표시줄에서 vCore 사용률 표시기를 확인하세요. 풀이 최대 용량에 도달했을 수 있습니다. 더 작은 풀 크기를 사용해 보세요.
save_as_table 분석 계층에 대한 사용 권한이 거부된 상태에서 실패 data-lake 관리 ID msg-resources-<guid>에는 Log Analytics 작업 영역에 대한 Log Analytics Contributor 권한이 없습니다. 필수 구성 요소에 따라 할당하고 다시 시도합니다.
출력 테이블이 Lake 테이블 패널에 표시되지만 비어 있음 .filter() 모든 행이 제거되었을 가능성이 높습니다. 문제의 원인을 좁혀 나갈 수 있도록 save_as_table 바로 앞에 행 수를 출력하는 코드를 추가합니다.

자세한 내용은 Notebook 문제 해결을 참조하세요.

업무 일정 예약

증상 원인 및 수정 가능성
예약된 작업에 반영되지 않는 로컬 .ipynb 편집 제출된 작업은 로컬 파일에서 분리됩니다. VS Code에서 작업을 다운로드하고 편집한 다음 작업 제출 편집>을 사용하여 새 버전을 업로드합니다.
작업이 실행되지만 출력이 생성되지 않음 작업 패널에서 실행 기록 탭을 확인합니다. 실행 로그는 일반적으로 실패한 셀을 표시합니다. 가장 일반적인 원인은 노트북이 현재 실행 중인 ID에 액세스 권한이 없는 테이블을 읽고 있기 때문입니다.

자세한 내용은 Notebook 문제 해결을 참조하세요.