요약 규칙을 사용하여 Microsoft Sentinel 데이터 집계(미리 보기)

Microsoft Sentinel에서 요약 규칙을 사용하여 모든 로그 계층에 걸쳐 더 원활한 보안 작업 환경을 제공할 수 있도록 백그라운드에서 대규모 데이터 집합을 집계합니다. 요약 데이터는 사용자 지정 로그 표에 미리 컴파일되며, 저비용 로그 계층에서 파생된 데이터에서 실행되는 쿼리를 포함하여 빠른 쿼리 성능을 제공합니다. 요약 규칙은 데이터를 최적화하는 데 도움이 되어 다음 이점을 얻을 수 있습니다.

  • 분석 및 보고서: 특히 보안 및 인시던트 분석, 월별 또는 연간 비즈니스 보고서 등에 필요한 대규모 데이터 세트 및 시간 범위에 대해 사용합니다.
  • 자세한 로그에 대한 비용 절감: 비용이 덜 드는 로그 계층에서는 필요한 기간만큼 짧게 또는 길게 보관할 수 있으며, 분석 및 보고서를 위해 요약된 데이터만 Analytics 표로 보낼 수 있습니다.
  • 보안 및 데이터 프라이버시: 공유 가능한 요약 데이터에서 개인 정보 세부 정보를 제거하거나 난독 처리하고, 원시 데이터가 있는 표에 대한 액세스를 제한합니다.

감지, 조사, 헌팅 및 보고 활동에서 KQL(Kusto 쿼리 언어)을 통해 요약 규칙 결과에 액세스합니다. 기록 조사, 헌팅 및 규정 준수 활동에서 더 오랫동안 요약 규칙 결과를 사용합니다.

요약 규칙 결과는 Analytics 데이터 계획에 따라 별도의 표에 저장되며 그에 따라 요금이 청구됩니다. 데이터 계획 및 스토리지 비용에 관한 자세한 내용은 Log Analytics 작업 영역에서 사용량 패턴에 따라 표 계획 선택을 참조하세요.

Important

요약 규칙은 현재 미리 보기로 제공됩니다. 베타 또는 미리 보기로 제공되거나 아직 일반 공급으로 릴리스되지 않은 Azure 기능에 적용되는 추가 약관은 Microsoft Azure 미리 보기에 대한 추가 사용 약관을 참조하세요.

이제 Microsoft Sentinel은 Microsoft Defender 포털의 Microsoft 통합 보안 운영 플랫폼 내에서 일반 공급됩니다. 자세한 내용은 Microsoft Defender 포털의 Microsoft Sentinel을 참조하세요.

필수 조건

Microsoft Sentinel에서 요약 규칙을 만들려면:

규칙을 만들기 전에 로그 페이지에서 요약 규칙 쿼리를 실험하는 것이 좋습니다. 쿼리가 쿼리 제한에 도달하거나 근접하지 않는지 확인하고, 쿼리가 의도한 스키마 및 예상 결과를 생성하는지 확인합니다. 쿼리가 쿼리 제한에 근접한 경우 더 작은 binSize를 사용하여 bin당 더 적은 데이터를 처리하는 것이 좋습니다. 더 적은 레코드를 반환하거나 볼륨이 높은 필드를 제거하도록 쿼리를 수정할 수도 있습니다.

요약 규칙 만들기

특정 대용량 데이터 집합을 동적 표로 집계하는 새 요약 규칙을 만듭니다. 집계된 데이터 집합이 원시 데이터에서 업데이트되는 빈도를 결정하는 규칙 빈도를 구성합니다.

  1. Azure Portal의 Microsoft Sentinel 탐색 메뉴에서 구성아래에 있는 요약 규칙(미리 보기)을 선택합니다. Defender 포털에서 Microsoft Sentinel > 구성 > 요약 규칙(미리 보기)를 선택합니다. 예시:

    Azure Portal의 요약 규칙 페이지 스크린샷.

  2. + 만들기를 선택하고, 다음 세부 정보를 입력합니다.

    • Name(이름): 규칙의 의미 있는 이름을 입력합니다.

    • 설명. 선택적 설명을 입력합니다.

    • 대상 표. 데이터가 집계되는 사용자 지정 로그 표를 정의합니다.

      • 기존 사용자 지정 로그 표를 선택하는 경우 사용할 표를 선택합니다.

      • 새 사용자 지정 로그 표를 선택하는 경우 표에 대한 의미 있는 이름을 입력합니다. 전체 표 이름은 <tableName>_CL 구문을 사용합니다.

  3. 이전의 실행 및 실패에 대한 가시성을 얻으려면 작업 영역에서 SummaryLogs 진단 설정을 사용하도록 설정하는 것이 좋습니다. SummaryLogs 진단 설정을 사용하도록 설정하지 않으면 진단 설정 영역에서 사용으로 설정하라는 메시지가 표시됩니다.

    SummaryLogs 진단 설정이 이미 사용하도록 설정되어 있지만 설정을 수정하려면 고급 진단 설정 구성을 선택합니다. 요약 규칙 마법사 페이지로 돌아올 때 새로 고침을 선택하여 설정 세부 정보를 새로 고쳐야 합니다.

    Important

    SummaryLogs 진단 설정에는 추가 비용이 있습니다. 자세한 내용은 Azure Monitor의 진단 설정을 참조하세요.

  4. 계속하려면 다음: 요약 논리 설정 >을 선택합니다.

  5. 요약 논리 설정 페이지에서 요약 쿼리를 입력합니다. 예를 들어 Google Cloud Platform에서 콘텐츠를 가져오려면 다음을 입력할 수 있습니다.

    GCPAuditLogs
    | where ServiceName == 'pubsub.googleapis.com'
    | summarize count() by Severity
    

    자세한 내용은 Azure Monitor의 샘플 요약 규칙 시나리오KQL(Kusto 쿼리 언어)을 참조하세요.

  6. 구성된 쿼리를 사용해 수집할 데이터의 예를 표시하려면 결과 미리 보기를 선택합니다.

  7. 쿼리 예약 영역에서 다음 세부 정보를 정의합니다.

    • 규칙을 실행하는 빈도
    • 어떤 종류의 지연으로든 몇 분 안에 규칙을 실행할지 여부
    • 규칙 실행을 시작하려는 때

    예약에 정의된 시간은 데이터의 timegenerated 열을 기반으로 합니다.

  8. 다음: 검토 + 만들기 >>저장을 선택하여 요약 규칙을 완료합니다.

기존 요약 규칙은 요약 규칙(미리 보기) 페이지에 나열되며, 여기서 규칙 상태를 검토할 수 있습니다. 각 규칙에 대해 행 끝에 있는 옵션 메뉴를 선택하여 다음 작업을 수행합니다.

  • 쿼리를 즉시 실행할 것처럼 로그 페이지에서 규칙의 현재 데이터 확인
  • 선택한 규칙의 실행 기록 보기
  • 규칙을 사용 안 함 또는 사용으로 설정합니다.
  • 규칙 구성 편집

규칙을 삭제하려면 규칙 행을 선택한 다음 페이지 맨 위에 있는 도구 모음에서 삭제를 선택합니다.

참고 항목

또한 Azure Monitor는 API 또는 ARM(Azure Resource Monitor) 템플릿을 통해 요약 규칙 만들기를 지원합니다. 자세한 내용은 요약 규칙 만들기 또는 업데이트를 참조하세요.

샘플 요약 규칙 시나리오

이 섹션에서는 Microsoft Sentinel에서 요약 규칙을 만드는 일반적인 시나리오와 각 규칙을 구성하는 방법에 대한 권장 사항을 검토합니다. 자세한 내용과 예시는 보조 로그(샘플 프로세스)를 통해 요약 규칙 사용보조 로그 수집에 사용할 로그 원본을 참조하세요.

네트워크 트래픽에서 악성 IP 주소를 빠르게 찾기

시나리오: 여러분은 위협 사냥꾼이고, 팀 목표 중 하나는 지난 90일 동안 활성 인시던트의 네트워크 트래픽 로그에서 악성 IP 주소가 상호 작용한 모든 인스턴스를 식별하는 것입니다.

당면 과제: Microsoft Sentinel은 현재 하루에 수 테라바이트의 네트워크 로그를 수집합니다. 악성 IP 주소와 일치하는 항목을 찾으려면 빠르게 탐색해야 합니다.

솔루션: 요약 규칙을 사용하여 다음을 수행하는 것이 좋습니다.

  1. SourceIP, DestinationIP, MaliciousIP, RemoteIP을(를) 포함하여 인시던트와 관련된 각 IP 주소에 대한 요약 데이터 집합을 만듭니다. 여기는 IPType, FirstTimeSeen, LastTimeSeen 등의 중요한 특성이 나열됩니다.

    요약 데이터 세트를 사용하면 특정 IP 주소를 빠르게 검색하고 IP 주소를 발견할 수 있는 시간 범위를 좁힐 수 있습니다. 검색된 이벤트가 작업 영역 보존 기간을 초과하는 90일 이상 전에 발생한 경우에도 이 작업을 수행할 수 있습니다.

    이 예시에서는 쿼리가 만료될 때까지 매일 실행되어 매일 새 요약 레코드를 추가하도록 요약을 구성합니다.

  2. 요약 데이터 세트에 대해 2분 이내에 실행되는 분석 규칙을 만들고 악성 IP 주소가 회사 네트워크와 상호 작용할 때 특정 시간 범위로 신속하게 드릴다운합니다.

    다른 요약 페이로드 크기를 수용하려면 최소 5분까지의 실행 간격을 구성해야 합니다. 이렇게 하면 이벤트 수집 지연이 있는 경우에도 손실이 발생하지 않습니다.

    예시:

    let csl_columnmatch=(column_name: string) {
    CommonSecurityLog
    | where isnotempty(column_name)
    | extend
        Date = format_datetime(TimeGenerated, "yyyy-MM-dd"),
        IPaddress = column_ifexists(column_name, ""),
        FieldName = column_name
    | extend IPType = iff(ipv4_is_private(IPaddress) == true, "Private", "Public")
    | where isnotempty(IPaddress)
    | project Date, TimeGenerated, IPaddress, FieldName, IPType, DeviceVendor
    | summarize count(), FirstTimeSeen = min(TimeGenerated), LastTimeSeen = min(TimeGenerated) by Date, IPaddress, FieldName, IPType, DeviceVendor
    };
    union csl_columnmatch("SourceIP")
        , csl_columnmatch("DestinationIP") 
        , csl_columnmatch("MaliciousIP")
        , csl_columnmatch("RemoteIP")
    // Further summarization can be done per IPaddress to remove duplicates per day on larger timeframe for the first run
    | summarize make_set(FieldName), make_set(DeviceVendor) by IPType, IPaddress
    
  3. 후속 검색을 실행하거나 다른 데이터와의 상관 관계를 분석하여 공격 스토리를 완성합니다.

네트워크 데이터와 위협 인텔리전스의 일치에 대한 경고 생성

노이즈가 많고, 볼륨이 크고, 보안성이 낮은 네트워크 데이터와 위협 인텔리전스의 일치에 대한 경고를 생성합니다.

시나리오: 시스템에서 위협 인텔리전스 도메인 이름 목록에 대해 방문한 도메인 이름과 일치하도록 방화벽 로그에 대한 분석 규칙을 빌드해야 합니다.

대부분의 데이터 원본은 노이즈가 많고 볼륨이 큰 원시 로그이지만, IP 주소, Azure Firewall 트래픽, Fortigate 트래픽 등을 포함하여 보안 가치가 낮습니다. 하루에 약 총 1TB의 볼륨이 있습니다.

당면 과제: 별도의 규칙을 만들려면 여러 논리 앱이 필요하며, 추가 설정, 유지 관리 오버헤드 및 비용이 발생합니다.

솔루션: 요약 규칙을 사용하여 다음을 수행하는 것이 좋습니다.

  1. McAfee 방화벽 로그를 10분마다 요약하여 각 실행에서 동일한 사용자 지정 표의 데이터를 업데이트합니다. ASIM 함수는 McAfee 로그와 상호 작용할 때 요약 쿼리에 유용할 수 있습니다.

  2. 요약 데이터의 도메인 이름이 위협 인텔리전스 목록의 항목과 일치할 때마다 경고를 트리거하는 분석 규칙을 만듭니다. 예시:

    //let timeRange = 5m;
    //let httpstrim = "https://";
    //let httptrim = "http://";
    let timeRangeStart = now (-10m);
    let timeRangeEnd = (timeRangeStart + 10m);
    //Take visited domains from McAfee proxy
    adx('https://adxfwlog01.northeurope.kusto.windows.net/nwlogs').MappedMcAfeeSyslog
    | where timestamp between (timeRangeStart .. timeRangeEnd)
    | where isnotempty(URL)
    | extend URLDomain = parse_url(URL).Host
    | extend URLDomain = iff(isempty(URLDomain),URL,URLDomain)
    | extend URLDomain = extract(@"([0-9a-zA-Z-]{1,}\.[0-9a-zA-Z-]{2,3}\.[0-9a-zA-Z-]{2,3}|[0-9a-zA-Z-]{1,}\.[0-9a-zA-Z-]{2,10})$", 0, URLDomain)
    | where isnotempty(URLDomain)
    | summarize by URLDomain
    //Match visited domains with TI DomainName list
    | join kind=inner (ThreatIntelligenceIndicator
        | where isnotempty(DomainName)
        | where Active == true
        | where ExpirationDateTime > now()
        | summarize LatestIndicatorTime = arg_max(TimeGenerated, *) by DomainName
          ) on $left.URLDomain == $right.DomainName
    | extend LogicApp = "SOC-McAfee-ADX-DstDomainAgainstThreatIntelligence"
    | project LatestIndicatorTime, TI_Domain = DomainName, Description, ConfidenceScore, AdditionalInformation, LogicApp
    

보조 로그를 통해 요약 규칙 사용(샘플 프로세스)

이 과정에서는 ARM 템플릿을 통해 만든 사용자 지정 연결을 사용하여 Logstash에서 CEF 데이터를 수집하는 보조 로그 요약 규칙을 사용하는 샘플 프로세스를 설명합니다.

  1. Logstash에서 사용자 지정 CEF 커넥터를 설정합니다.

    1. 다음 ARM 템플릿을 Microsoft Sentinel 작업 영역에 배포하여 DCR(데이터 수집 규칙)과 DCE(데이터 수집 엔드포인트)와 함께 사용자 지정 표를 만듭니다.

      Azure에 배포

    2. ARM 템플릿 출력에서 다음 세부 정보를 확인합니다.

      • tenant_id
      • data_collection_endpoint
      • dcr_immutable_id
      • dcr_stream_name
    3. Microsoft Entra 애플리케이션을 만들고 애플리케이션의 클라이언트 ID암호를 기록해 둡니다. 자세한 내용은 자습서: 로그 수집 API(Azure Portal)를 통해 Azure Monitor 로그로 데이터 보내기를 참조하세요.

    4. 샘플 스크립트를 사용하여 Logstash 구성 파일을 업데이트합니다. 업데이트는 ARM 템플릿에서 만든 사용자 지정 표에 CEF 로그를 보내 JSON 데이터를 DCR 형식으로 변환하도록 Logstash를 구성합니다. 이 스크립트에서 자리 표시자 값을 이전에 만든 사용자 지정 표 및 Microsoft Entra 앱의 고유한 값으로 바꿔야 합니다.

  2. CEF 데이터가 예상대로 Logstash에서 흐르는지 확인합니다. 예를 들어 Microsoft Sentinel에서 로그 페이지로 이동하여 다음 쿼리를 실행합니다.

    CefAux_CL
    | take 10
    
  3. CEF 데이터를 집계하는 요약 규칙을 만듭니다. 예시:

    • IoC(관심 항목 조회) 데이터: 집계된 요약 쿼리를 실행함으로써 특정 IoC를 헌팅하여 고유 항목을 가져온 다음 해당 항목만 쿼리하여 더 빠른 결과를 가져옵니다. 다음 예시는 다른 메타데이터와 함께 고유한 Source Ip 피드를 가져오는 방법을 보여줍니다. 이는 IoC 조회에 사용할 수 있습니다.

      // Daily Network traffic trend Per Destination IP along with Data transfer stats 
      // Frequency - Daily - Maintain 30 day or 60 Day History. 
        Custom_CommonSecurityLog 
        | extend Day = format_datetime(TimeGenerated, "yyyy-MM-dd") 
        | summarize Count= count(), DistinctSourceIps = dcount(SourceIP), NoofByesTransferred = sum(SentBytes), NoofBytesReceived = sum(ReceivedBytes)  
        by Day,DestinationIp, DeviceVendor 
      
    • 변칙 감지에 대한 요약 기준을 쿼리합니다. 30일 또는 60일과 같은 장시간 기록 기간에 대해 쿼리를 실행하는 대신 사용자 지정 로그로 데이터를 수집한 다음 시계열 변칙 감지와 같은 요약 기준 데이터만 쿼리하는 것이 좋습니다. 예시:

      // Time series data for Firewall traffic logs 
      let starttime = 14d; 
      let endtime = 1d; 
      let timeframe = 1h; 
      let TimeSeriesData =  
      Custom_CommonSecurityLog 
        | where TimeGenerated between (startofday(ago(starttime))..startofday(ago(endtime))) 
        | where isnotempty(DestinationIP) and isnotempty(SourceIP) 
        | where ipv4_is_private(DestinationIP) == false 
        | project TimeGenerated, SentBytes, DeviceVendor 
        | make-series TotalBytesSent=sum(SentBytes) on TimeGenerated from startofday(ago(starttime)) to startofday(ago(endtime)) step timeframe by DeviceVendor