Jupyter Notebook은 Microsoft Sentinel 데이터 레이크에서 데이터를 탐색, 분석 및 시각화하기 위한 대화형 환경을 제공합니다. Notebook을 사용하면 코드를 작성하고 실행하고, 워크플로를 문서화하고, 결과를 한 곳에서 볼 수 있습니다. 이렇게 하면 데이터 탐색을 쉽게 수행하고, 고급 분석 솔루션을 빌드하고, 다른 사용자와 인사이트를 공유할 수 있습니다. Visual Studio Code 내에서 Python 및 Apache Spark를 활용하여 Notebook을 사용하면 원시 보안 데이터를 실행 가능한 인텔리전스로 변환할 수 있습니다.
이 문서에서는 Visual Studio Code에서 Jupyter Notebook을 사용하여 데이터 레이크 데이터를 탐색하고 상호 작용하는 방법을 보여 줍니다.
비고
Microsoft Sentinel 확장은 현재 미리 보기로 제공됩니다. 새 릴리스를 사용할 수 있게 됨에 따라 일부 기능 및 성능 제한이 변경될 수 있습니다.
필수 조건
Microsoft Sentinel 데이터 레이크에 등록하기
Microsoft Sentinel 데이터 레이크에서 Notebook을 사용하려면 먼저 데이터 레이크에 온보딩해야 합니다. Microsoft Sentinel 데이터 레이크에 온보딩하지 않은 경우 Microsoft Sentinel 데이터 레이크에 온보딩을 참조하세요. 최근에 데이터 레이크에 온보딩한 경우 Notebook을 사용하여 의미 있는 분석을 수행하기 전에 충분한 양의 데이터가 수집될 때까지 어느 정도 시간이 필요할 수 있습니다.
권한
Microsoft Entra ID 역할은 데이터 레이크의 모든 작업 영역에서 광범위한 액세스를 제공합니다. 또는 Azure RBAC 역할을 사용하여 개별 작업 영역에 대한 액세스 권한을 부여할 수 있습니다. Microsoft Sentinel 작업 영역에 대한 Azure RBAC 권한이 있는 사용자는 데이터 레이크 계층의 해당 작업 영역에 대해 Notebook을 실행할 수 있습니다. 자세한 내용은 Microsoft Sentinel의 역할 및 권한을 참조하세요.
분석 계층에서 새 사용자 지정 테이블을 만들려면 데이터 레이크 관리 ID에 Log Analytics 작업 영역에서 Log Analytics 기여자 역할이 할당되어야 합니다.
역할을 할당하려면 다음 단계를 수행합니다.
- Azure Portal에서 역할을 할당하려는 Log Analytics 작업 영역으로 이동합니다.
- 왼쪽 탐색 창에서 액세스 제어(IAM)를 선택합니다.
- 역할 할당 추가를 선택합니다.
- 역할 테이블에서 Log Analytics 기여자를 선택한 다음, 다음을 선택합니다.
- 관리 ID를 선택한 다음 멤버 선택을 선택합니다.
- 귀하의 데이터 레이크 관리 ID는
msg-resources-<guid>
라는 이름이 지정된 시스템 할당 관리 ID입니다. 관리 ID를 선택한 다음, 선택을 선택합니다. - 검토 및 할당을 선택합니다.
관리 ID에 역할을 할당하는 방법에 대한 자세한 내용은 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.
Visual Studio Code 및 Microsoft Sentinel 확장 설치
Visual Studio Code가 아직 없는 경우 Mac, Linux 또는 Windows용 Visual Studio Code를 다운로드하여 설치 합니다.
VS Code(Visual Studio Code)용 Microsoft Sentinel 확장은 확장 마켓플레이스에서 설치됩니다. 확장을 설치하려면 다음 단계를 수행합니다.
- 왼쪽 도구 모음에서 확장 마켓플레이스를 선택합니다.
- Sentinel을 검색합니다.
- Microsoft Sentinel 확장을 선택하고 설치를 선택합니다.
- 확장이 설치되면 왼쪽 도구 모음에 Microsoft Sentinel 방패 아이콘이 나타납니다.
Visual Studio Code용 GitHub Copilot 확장을 설치하여 Notebook에서 코드 완성 및 제안을 사용하도록 설정합니다.
- 확장 마켓플레이스에서 GitHub Copilot 를 검색하여 설치합니다.
- 설치 후 GitHub 계정을 사용하여 GitHub Copilot에 로그인합니다.
데이터 레이크 계층 테이블 탐색
Microsoft Sentinel 확장을 설치한 후 데이터 레이크 계층 테이블을 탐색하고 Jupyter Notebook을 만들어 데이터를 분석할 수 있습니다.
Microsoft Sentinel 확장에 로그인
왼쪽 도구 모음에서 Microsoft Sentinel 방패 아이콘을 선택합니다.
다음 텍스트와 함께 대화 상자가 나타납니다. "Microsoft Sentinel" 확장은 Microsoft를 사용하여 로그인하려고 합니다. 허용을 선택합니다.
계정 이름을 선택하여 로그인을 완료합니다.
데이터 레이크 테이블 및 작업 보기
로그인하면 Microsoft Sentinel 확장은 왼쪽 창에 Lake 테이블 및 작업 목록을 표시합니다. 테이블을 선택하여 열 정의를 확인합니다.
작업에 대한 자세한 내용은 작업 및 예약을 참조하세요.
새 Notebook 만들기
새 Notebook을 만들려면 다음 방법 중 하나를 사용합니다.
검색 상자에 입력 > 하거나 Ctrl+Shift+P 를 누른 다음 새 Jupyter Notebook 만들기를 입력합니다.
새 Notebook에서 다음 코드를 첫 번째 셀에 붙여넣습니다.
from sentinel_lake.providers import MicrosoftSentinelProvider data_provider = MicrosoftSentinelProvider(spark) table_name = "EntraGroups" df = data_provider.read_table(table_name) df.select("displayName", "groupTypes", "mail", "mailNickname", "description", "tenantId").show(100, truncate=False)
실행 삼각형을 선택하여 Notebook에서 코드를 실행합니다. 결과는 코드 셀 아래의 출력 창에 표시됩니다.
보통을 선택하여 중간 크기의 런타임 풀에서 Notebook을 실행합니다. 다른 런타임에 대한 자세한 내용은 적절한 Microsoft Sentinel 런타임 선택을 참조하세요.
비고
커널을 선택하면 Spark 세션이 시작되고 Notebook에서 코드가 실행됩니다. 풀을 선택한 후 세션을 시작하는 데 3-5분이 걸릴 수 있습니다. 세션이 이미 활성화되어 있으므로 후속 실행 속도가 더 빨라집니다.
세션이 시작되면 Notebook의 코드가 실행되고 결과가 코드 셀 아래의 출력 창에 표시됩니다(예:
Microsoft Sentinel 데이터 레이크와 상호 작용하는 방법을 보여 주는 샘플 노트북은 Microsoft Sentinel 데이터 레이크에 대한 샘플 노트북을 참조하세요.
Notebook에서 GitHub Copilot 사용
GitHub Copilot를 사용하여 Notebook에서 코드를 작성할 수 있습니다. GitHub Copilot는 코드 컨텍스트에 따라 코드 제안 및 자동 완성을 제공합니다. GitHub Copilot를 사용하려면 Visual Studio Code에 GitHub Copilot 확장 이 설치되어 있는지 확인합니다.
Microsoft Sentinel 데이터 레이크용 샘플 노트북에서 코드를 복사하여 노트북 폴더에 저장하면 GitHub Copilot에 대한 문맥을 제공합니다. 그러면 GitHub Copilot는 Notebook의 컨텍스트에 따라 코드 완성을 제안할 수 있습니다.
다음 예제에서는 코드 검토를 생성하는 GitHub Copilot를 보여줍니다.
Microsoft Sentinel 공급자 클래스
Microsoft Sentinel 데이터 레이크에 연결하려면 클래스를 SentinelLakeProvider
사용합니다.
이 클래스는 모듈의 access_module.data_loader
일부이며 데이터 레이크와 상호 작용하는 메서드를 제공합니다. 이 클래스를 사용하려면 해당 클래스를 가져오고 세션을 사용하여 클래스의 인스턴스를 만듭니다 spark
.
from sentinel_lake.providers import MicrosoftSentinelProvider
data_provider = MicrosoftSentinelProvider(spark)
사용 가능한 메서드에 대한 자세한 내용은 Microsoft Sentinel Provider 클래스 참조를 참조하세요.
적절한 런타임 풀 선택
Microsoft Sentinel 확장에서 Jupyter Notebook을 실행할 수 있는 세 개의 런타임 풀이 있습니다. 각 풀은 다양한 워크로드 및 성능 요구 사항을 위해 설계되었습니다. 런타임 풀 선택은 Spark 작업의 성능, 비용 및 실행 시간에 영향을 줍니다.
런타임 풀 | 권장 사용 사례 | 특징 |
---|---|---|
소형 | 개발, 테스트 및 간단한 예비 분석. 간단한 변환을 사용하는 소규모 워크로드. 비용 효율성이 우선 순위가 지정되었습니다. |
소규모 워크로드에 적합 간단한 변환. 더 낮은 비용, 더 긴 실행 시간. |
중간 | 조인, 집계 및 ML 모델 학습을 사용하는 ETL 작업입니다. 복잡한 변환을 사용하여 워크로드를 조정합니다. |
Small보다 성능이 향상되었습니다. 병렬 처리 및 메모리를 많이 사용하는 작업을 처리합니다. |
대형 | 딥 러닝 및 ML 워크로드. 광범위한 데이터 이동, 대규모 결합 또는 실시간 처리 중요한 실행 시간입니다. |
높은 메모리 및 컴퓨팅 능력. 최소 지연. 크고 복잡하거나 시간이 중요한 워크로드에 가장 적합합니다. |
비고
처음 액세스할 때 커널 옵션을 로드하는 데 약 30초가 걸릴 수 있습니다.
런타임 풀을 선택한 후 세션을 시작하는 데 3~5분이 걸릴 수 있습니다.
로그 보기
로그는 Visual Studio Code의 출력 창에서 볼 수 있습니다.
- 출력 창의 드롭다운에서 Microsoft Sentinel을 선택합니다.
- 자세한 로그 항목을 포함하려면 디버그 를 선택합니다.
작업 및 일정
Visual Studio Code용 Microsoft Sentinel 확장을 사용하여 특정 시간 또는 간격으로 작업을 실행하도록 예약할 수 있습니다. 작업을 사용하면 데이터 처리 작업을 자동화하여 Microsoft Sentinel 데이터 레이크의 데이터를 요약, 변환 또는 분석할 수 있습니다. 작업은 데이터 레이크 계층 또는 분석 계층의 사용자 지정 테이블에 데이터를 처리하고 결과를 쓰는 데도 사용됩니다. 작업을 만들고 관리하는 방법에 대한 자세한 내용은 Jupyter Notebook 작업 만들기 및 관리를 참조하세요.
VS Code Notebook에 대한 서비스 매개 변수 및 제한
다음 섹션에서는 VS Code Notebook을 사용할 때 Microsoft Sentinel 데이터 레이크(미리 보기)에 대한 서비스 매개 변수 및 제한을 나열합니다.
카테고리 | 매개 변수/제한 |
---|---|
분석 계층의 사용자 지정 테이블 | 분석 계층의 사용자 지정 테이블은 Notebook에서 삭제할 수 없습니다. Log Analytics를 사용하여 이러한 테이블을 삭제합니다. 자세한 내용은 Azure Monitor 로그에서 테이블 및 열 추가 또는 삭제를 참조하세요. |
게이트웨이 웹 소켓 시간 제한 | 2시간 |
대화형 쿼리 시간 제한 | 2시간 |
대화형 세션 비활성 시간 제한 | 20분 |
언어 | 파이썬 |
최대 동시 Notebook 작업 | 3, 후속 작업이 큐에 대기됨 |
대화형 쿼리에서 최대 동시 사용자 수 | 큰 풀에서 8-10 |
세션 시작 시간 | Spark 컴퓨팅 세션을 시작하는 데 약 5-6분이 걸립니다. VS Code Notebook 아래쪽에서 세션의 상태를 볼 수 있습니다. |
지원되는 라이브러리 | 추상화된 함수에 대한 Azure Synapse 라이브러리 3.4 및 Microsoft Sentinel 공급자 라이브러리만 데이터 레이크 쿼리에 지원됩니다. Pip 설치 또는 사용자 지정 라이브러리는 지원되지 않습니다. |
레코드를 표시하는 VS Code UX 제한 | 100,000개 행 |
문제 해결
다음 표에서는 Notebook을 사용할 때 발생할 수 있는 일반적인 오류, 근본 원인 및 해결을 위한 제안된 작업을 나열합니다.
Spark 컴퓨팅
오류 메시지 | 디스플레이 표면 | 메시지 설명 | 근본 원인 | 제안된 작업 |
---|---|---|---|---|
LIVY_JOB_TIMED_OUT: Livy 세션이 실패했습니다. 세션 상태: 중단됨. 오류 코드: LIVY_JOB_TIMED_OUT. state=[dead]를 사용하여 런타임 중에 작업이 실패했습니다. 출처: 알 수 없음. | 인라인. | 세션 시간이 초과되었거나 사용자가 세션을 중지했습니다. | 세션 시간이 초과되었거나 사용자가 세션을 중지했습니다. | 셀을 다시 실행합니다. |
용량이 부족합니다. 사용자가 X vCore를 요청했지만 {number-of-cores} vCore만 사용할 수 있습니다. | 출력 채널 – "Window". | Spark 컴퓨팅 풀을 사용할 수 없습니다. | 컴퓨팅 풀이 시작되지 않았거나 다른 사용자 또는 작업에서 사용되고 있습니다. | 더 작은 풀을 사용하여 다시 시도하거나, 활성 Notebook을 로컬로 중지하거나, 활성 Notebook 작업 실행을 중지합니다. |
Spark 풀에 액세스할 수 없음 – 403 사용할 수 없습니다. | 출력 채널 – "Window". | 스파크 풀이 표시되지 않습니다. | 사용자에게 대화형 Notebook을 실행하거나 작업을 예약하는 데 필요한 역할이 없습니다. | 대화형 노트북 또는 노트북 작업에 필요한 역할이 있는지 확인하세요. |
Spark 풀 - <이름> - 업그레이드 중입니다. | 토스트 알림. | Spark 풀 중 하나를 사용할 수 없습니다. | Spark 풀이 최신 버전의 Microsoft Sentinel 공급자로 업그레이드되고 있습니다. | 풀을 사용할 수 있을 때까지 최대 20-30분 동안 기다립니다. |
z:org.apache.spark.api.python.PythonRDD.collectAndServe를 호출하는 동안 오류가 발생했습니다. : org.apache.spark.SparkException: 스테이지 오류로 인해 작업이 중단됨: 직렬화된 결과의 총 크기(4.0GB)가 spark.driver.maxResultSize(4.0GB)보다 큽니다. | 인라인. | 드라이버 메모리가 초과되었거나 실행기 오류가 발생했습니다. | 작업이 드라이버 메모리가 부족하거나 하나 이상의 실행기가 실패했습니다. | 작업 실행 로그를 보거나 쿼리를 최적화합니다. 큰 데이터 세트에 toPandas()를 사용하지 마세요. 필요한 경우 spark.conf.set("spark.sql.execution.arrow.pyspark.enabled", "true") 을 설정하십시오. |
원격 Jupyter Server ''https://api.securityplatform.microsoft.com/spark-notebook/interactive에 연결하지 못했습니다. 서버가 실행 중이고 연결할 수 있는지 확인합니다. | 토스트 알림 | 사용자가 세션을 중지하고 서버에 연결하지 못했습니다. | 사용자가 세션을 중지했습니다. | 셀을 다시 실행하여 세션을 다시 연결합니다. |
VS Code 런타임
오류 메시지 | 디스플레이 표면 | 메시지 설명 | 근본 원인 | 제안된 작업 |
---|---|---|---|---|
ID가 k1인 커널이 삭제되었습니다. | 출력 채널 – "Jupyter". | 커널이 연결되지 않았습니다. | VS Code에서 컴퓨팅 커널에 대한 연결이 끊겼습니다. | Spark 풀을 다시 선택하고 셀을 실행합니다. |
ModuleNotFoundError: 'MicrosoftSentinelProvider'라는 모듈이 없습니다. | 인라인. | 모듈을 찾을 수 없습니다. | 가져오기 누락(예: Microsoft Sentinel 라이브러리) | setup/init 셀을 다시 실행합니다. |
셀 In[{cell number}], 줄 1 if: ^ SyntaxError: 잘못된 구문입니다. | 인라인. | 잘못된 구문입니다. | Python 또는 PySpark 구문 오류입니다. | 코드 구문을 검토합니다. 누락된 콜론, 괄호 또는 따옴표를 확인합니다. |
NameError Traceback(가장 최근 호출) Cell In[{cell number}], 줄 1 ----> 1 data_loader12 NameError: 이름 'data_loader'이 정의되지 않았습니다. | 인라인. | 언바운드 변수입니다. | 할당 전에 사용되는 변수입니다. | 필요한 모든 설정 셀이 순서대로 실행되었는지 확인합니다. |
대화형 전자 필기장
오류 메시지 | 디스플레이 표면 | 메시지 설명 | 근본 원인 | 제안된 작업 |
---|---|---|---|---|
{"level": "ERROR", "run_id": "...", "message": "{table-name} 테이블을 로드하는 중 오류: 테이블 '...|{table-name}'에 대해 'DeltaParquet' 종류의 컨테이너가 없습니다."}. | 인라인. | 지정된 원본 테이블이 없습니다. | 하나 이상의 원본 테이블이 지정된 작업 영역에 존재하지 않습니다. 최근에 작업 영역에서 테이블이 삭제되었을 수 있습니다. | 원본 테이블이 작업 영역에 있는지 확인합니다. |
{"level": "ERROR", "run_id": "...", "message": "Database Name {table-name}이(가) 없습니다."}. | 인라인. | 쿼리에 제공된 작업 영역 또는 데이터베이스 이름이 잘못되었거나 액세스할 수 없습니다. | 참조된 데이터베이스가 없습니다. | 데이터베이스 이름이 올바른지 확인합니다. |
401 권한 없음. | 출력 채널 – "Window". | 게이트웨이 401 오류입니다. | 게이트웨이의 시간 제한이 1시간에 도달했습니다. | 셀을 다시 실행하여 새 연결을 설정합니다. |
라이브러리
오류 메시지 | 디스플레이 표면 | 메시지 설명 | 근본 원인 | 제안된 작업 |
---|---|---|---|---|
403 금지. | 인라인. | 액세스가 거부되었습니다. | 사용자에게 지정된 테이블을 읽거나 쓰거나 삭제할 수 있는 권한이 없습니다. | 사용자에게 필요한 역할이 있는지 확인합니다. |
TableOperationException: 테이블 {table-name}_SPRK: 'schema'에 DataFrame을 저장하는 동안 오류가 발생했습니다. | 인라인. | 쓰기 시 스키마가 일치하지 않습니다. | save_as_table()는 기존 스키마와 일치하지 않는 데이터를 작성합니다. | 데이터 프레임 스키마를 확인하고 대상 테이블과 정렬합니다. |
{"level": "ERROR", "run_id": "...", "message": "DataFrame을 테이블 {table-name}에 저장하는 동안 오류가 발생했습니다. MSG 데이터베이스에서 만든 테이블에는 접미사가 '_SPRK'"}이어야 합니다. | 인라인. | 데이터 레이크에 테이블을 쓰기 위한 접미사 _SPRK 없습니다. | save_as_table()는 _SPRK 필요한 테이블에 데이터를 쓰고 있습니다. | 데이터 레이크의 사용자 지정 테이블에 쓰기 위한 접미사로 _SPRK 추가합니다. |
{"level": "ERROR", "run_id": "...", "message": "DataFrame을 테이블 siva_test_0624_1에 저장하는 중 오류가 발생했습니다. LA 데이터베이스에 생성된 테이블은 접미사 '_SPRK_CL'을 가져야 합니다."}. | 인라인. | 분석 계층에 테이블을 작성하기 위한 접미사 _SPRK_CL 누락됨 | save_as_table()는 _SPRK_CL 필요한 테이블에 데이터를 쓰고 있습니다. | 분석 계층에서 사용자 지정 테이블에 쓰기 위한 접미사로 _SPRK_CL 추가합니다. |
{"level": "ERROR", "run_id": "...", "message": "DataFrame을 EntraUsers 테이블에 저장하는 동안 오류가 발생했습니다. MSG 데이터베이스에서 만든 테이블에는 접미사가 '_SPRK'"}이어야 합니다. | 인라인. | 쓰기가 잘못되었습니다. | 시스템 테이블에 쓰려고 하면 이 작업이 허용되지 않습니다. | 쓸 사용자 지정 테이블을 지정합니다. |
TypeError: DataProviderImpl.save_as_table()에 필요한 위치 인수 'table_name'이 1개 없습니다. | 인라인. | 유효하지 않은 전자 필기장입니다. | 라이브러리 메서드에 잘못된 인수가 전달되었습니다(예: save_as_table 'mode'가 누락됨). | 매개 변수 이름 및 값의 유효성을 검사합니다. 메서드 설명서를 참조하세요. |
직업
오류 메시지 | 디스플레이 표면 | 메시지 설명 | 근본 원인 | 제안된 작업 |
---|---|---|---|---|
작업 실행 상태는 실패 상태로 표시됩니다. | 인라인. | 작업 실행 실패. | Notebook이 손상되었거나 예약된 실행에 대해 지원되지 않는 구문을 포함합니다. | Notebook 실행 스냅샷을 열고 모든 셀이 수동 입력 없이 순차적으로 실행되는지 확인합니다. |