Logstash를 사용하여 DCR 기반 API를 통해 파이프라인 변환으로 로그 스트림

Important

DCR(데이터 수집 규칙)과 함께 Logstash 출력 플러그 인을 사용하는 데이터 수집은 현재 퍼블릭 미리 보기로 제공됩니다. 해당 기능은 별도의 서비스 수준 규약 없이 이용할 수 있습니다. 자세한 내용은 Microsoft Azure Preview에 대한 추가 사용 약관을 참조하세요.

Microsoft Sentinel의 새로운 Logstash 출력 플러그 인은 DCR(데이터 수집 규칙)을 통해 파이프라인 변환 및 고급 구성을 지원합니다. 플러그 인은 모든 유형의 로그를 외부 데이터 원본에서 Log Analytics 또는 Microsoft Sentinel의 사용자 지정 또는 표준 테이블로 전달합니다.

이 문서에서는 출력 스키마를 완전히 제어하면서 DCR을 사용하여 Log Analytics 또는 Microsoft Sentinel로 데이터를 스트림하도록 새 Logstash 플러그 인을 설정하는 방법을 알아봅니다. 플러그 인을 배포하는 방법을 알아봅니다.

참고 항목

이전 버전의 Logstash 플러그 인을 사용하면 데이터 수집 API를 통한 Logstash를 통해 데이터 원본을 연결할 수 있습니다.

새 플러그 인을 사용하면 다음을 수행할 수 있습니다.

  • 열 이름 및 형식의 구성을 제어합니다.
  • 필터링 또는 보강과 같은 수집 시간 변환을 수행합니다.
  • 사용자 지정 로그를 사용자 지정 테이블에 수집하거나 Syslog 입력 스트림을 Log Analytics Syslog 테이블에 수집합니다.

표준 테이블에 수집하는 작업은 사용자 지정 로그 수집에 대해 지원되는 표준 테이블로만 제한됩니다.

Logstash 데이터 수집 엔진 사용에 대해 자세히 알아보려면 Getting started with Logstash(Logstash 시작)를 참조하세요.

개요

아키텍처 및 배경

Logstash 아키텍처의 다이어그램

Logstash 엔진은 세 가지 구성 요소로 구성됩니다.

  • 입력 플러그 인: 다양한 원본의 사용자 지정된 데이터 컬렉션입니다.
  • 필터 플러그 인: 지정된 조건에 따라 데이터를 조작하고 정규화합니다.
  • 출력 플러그 인: 수집되고 처리된 데이터를 다양한 대상으로 보내기를 사용자 지정합니다.

참고 항목

  • Microsoft는 여기에 설명된 Microsoft Sentinel 제공 Logstash 출력 플러그 인만 지원합니다. 현재 플러그 인의 이름은 microsoft-sentinel-log-analytics-logstash-output-plugin v1.1.0입니다. 출력 플러그 인과 관련된 모든 문제에 대해 지원 티켓을 열 수 있습니다.

  • Microsoft는 Microsoft Sentinel용 타사 Logstash 출력 플러그 인 또는 기타 모든 Logstash 플러그 인 또는 모든 유형의 구성 요소를 지원하지 않습니다.

  • 플러그 인의 Logstash 버전 지원에 대한 필수 조건을 참조하세요.

Logstash용 Microsoft Sentinel 출력 플러그 인은 Log Analytics 로그 수집 API를 사용하여 JSON 형식 데이터를 Log Analytics 작업 영역으로 보냅니다. 데이터는 사용자 지정 로그 또는 표준 테이블에 수집됩니다.

Logstash에 Microsoft Sentinel 출력 플러그 인 배포

플러그 인을 설정하려면 다음 단계를 수행합니다.

  1. 필수 구성 요소 검토
  2. 플러그 인 설치
  3. 샘플 파일 만들기
  4. 필요한 DCR 관련 리소스 만들기
  5. Logstash 구성 파일 구성
  6. Logstash 다시 시작
  7. Microsoft Sentinel에서 수신 로그 보기
  8. 출력 플러그 인 감사 로그 모니터링

필수 조건

  • 지원되는 Logstash 버전을 설치합니다. 플러그 인은 다음 Logstash 버전을 지원합니다.

    • 7.0 - 7.17.13
    • 8.0 - 8.9
    • 8.11 - 8.13

    참고 항목

    Logstash 8을 사용하는 경우 파이프라인에서 ECS를 사용하지 않도록 설정하는 것이 좋습니다.

  • 기여자 이상의 권한이 있는 Log Analytics 작업 영역이 있는지 확인합니다.

  • 작업 영역에서 DCR 개체를 만들 수 있는 권한이 있는지 확인합니다.

플러그 인 설치

Microsoft Sentinel 출력 플러그 인은 Logstash 컬렉션에서 사용할 수 있습니다.

샘플 파일 만들기

이 섹션에서는 다음 시나리오 중 하나에서 샘플 파일을 만듭니다.

사용자 지정 로그에 대한 샘플 파일 만들기

이 시나리오에서는 Microsoft Sentinel에 이벤트를 보내도록 Logstash 입력 플러그 인을 구성합니다. 이 예제에서는 생성기 입력 플러그 인을 사용하여 이벤트를 시뮬레이션합니다. 다른 입력 플러그 인을 사용할 수 있습니다.

이 예제에서 Logstash 구성 파일은 다음과 같이 표시됩니다.

input {
      generator {
            lines => [
                 "This is a test log message"
            ]
           count => 10
      }
}
  1. 아래 출력 플러그 인 구성을 Logstash 구성 파일에 복사합니다.

    output {
        microsoft-sentinel-log-analytics-logstash-output-plugin {
          create_sample_file => true
          sample_file_path => "<enter the path to the file in which the sample data will be written>" #for example: "c:\\temp" (for windows) or "/tmp" for Linux. 
        }
    }
    
  2. 샘플 파일을 만들기 전에 참조된 파일 경로가 있는지 확인하려면 Logstash를 시작합니다.

    플러그 인은 구성된 경로에 있는 sampleFile<epoch seconds>.json라는 샘플 파일에 10개 레코드를 씁니다. 예: c:\temp\sampleFile1648453501.json. 플러그 인이 만드는 샘플 파일의 일부는 다음과 같습니다.

    [
            {
                "host": "logstashMachine",
                "sequence": 0,
                "message": "This is a test log message",
                "ls_timestamp": "2022-03-28T17:45:01.690Z",
                "ls_version": "1"
            },
            {
                "host": "logstashMachine",
                "sequence": 1
        ...
    
        ]    
    

    플러그 인은 모든 레코드에 다음 속성을 자동으로 추가합니다.

    • ls_timestamp: 입력 플러그 인에서 레코드를 수신한 시간입니다.
    • ls_version: Logstash 파이프라인 버전입니다.

    DCR을 만들 때 이 필드를 제거할 수 있습니다.

샘플 파일을 만들어 Syslog 테이블에 로그 수집

이 시나리오에서는 Microsoft Sentinel에 syslog 이벤트를 보내도록 Logstash 입력 플러그 인을 구성합니다.

  1. Logstash 머신에 전달된 syslog 메시지가 아직 없는 경우 로거 명령을 사용하여 메시지를 생성할 수 있습니다. 예(Linux의 경우):

    logger -p local4.warn --rfc3164 --tcp -t CEF: "0|Microsoft|Device|cef-test|example|data|1|here is some more data for the example" -P 514 -d -n 127.0.0.1
    Here is an example for the Logstash input plugin:
    input {
         syslog {
             port => 514
        }
    }
    
  2. 아래 출력 플러그 인 구성을 Logstash 구성 파일에 복사합니다.

    output {
        microsoft-sentinel-log-analytics-logstash-output-plugin {
          create_sample_file => true
          sample_file_path => "<enter the path to the file in which the sample data will be written>" #for example: "c:\\temp" (for windows) or "/tmp" for Linux. 
        }
    }
    
  3. 샘플 파일을 만들기 전에 파일 경로가 있는지 확인하려면 Logstash를 시작합니다.

    플러그 인은 구성된 경로에 있는 sampleFile<epoch seconds>.json라는 샘플 파일에 10개 레코드를 씁니다. 예: c:\temp\sampleFile1648453501.json. 플러그 인이 만드는 샘플 파일의 일부는 다음과 같습니다.

    [
        	{
        		"logsource": "logstashMachine",
        		"facility": 20,
        		"severity_label": "Warning",
        		"severity": 4,
        		"timestamp": "Apr  7 08:26:04",
        		"program": "CEF:",
        		"host": "127.0.0.1",
        		"facility_label": "local4",
        		"priority": 164,
        		"message": 0|Microsoft|Device|cef-test|example|data|1|here is some more data for the example",
        		"ls_timestamp": "2022-04-07T08:26:04.000Z",
        		"ls_version": "1"
        	}
    ]    
    
    

    플러그 인은 모든 레코드에 다음 속성을 자동으로 추가합니다.

    • ls_timestamp: 입력 플러그 인에서 레코드를 수신한 시간입니다.
    • ls_version: Logstash 파이프라인 버전입니다.

    DCR을 만들 때 이 필드를 제거할 수 있습니다.

필요한 DCR 리소스 만들기

Microsoft Sentinel DCR 기반 Logstash 플러그 인을 구성하려면 먼저 DCR 관련 리소스를 만들어야 합니다.

이 섹션에서는 다음 시나리오 중 하나에서 DCR에 사용할 리소스를 만듭니다.

사용자 지정 테이블에 수집하기 위한 DCR 리소스 만들기

사용자 지정 테이블에 데이터를 수집하려면 다음 단계를 수행합니다(Rest API(Azure Portal)를 사용하여 Azure Monitor 로그에 데이터 보내기 자습서를 기반으로 함).

  1. 필수 구성 요소를 검토하세요.

  2. 애플리케이션 구성.

  3. 사용자 지정 로그 테이블을 추가합니다.

  4. 이전 섹션에서 만든 샘플 파일을 사용하여 샘플 데이터를 구문 분석하고 필터링합니다.

  5. DCR에서 정보를 수집합니다.

  6. DCR에 권한을 할당합니다.

    샘플 데이터 보내기 단계를 건너뜁니다.

문제가 발생하는 경우 문제 해결 단계를 참조하세요.

표준 테이블에 수집하기 위한 DCR 리소스 만들기

Syslog 또는 CommonSecurityLog 같은 표준 테이블에 데이터를 수집하려면 REST API(Resource Manager 템플릿)를 사용하여 Azure Monitor 로그에 데이터 보내기 자습서를 기반으로 하는 프로세스를 사용합니다. 자습서에서는 사용자 지정 테이블에 데이터를 수집하는 방법을 설명하지만, 표준 테이블에 데이터를 수집하도록 프로세스를 쉽게 조정할 수 있습니다. 아래 단계는 단계의 관련 변경 내용을 나타냅니다.

  1. 필수 구성 요소를 검토하세요.

  2. 작업 영역 세부 정보를 수집합니다.

  3. 애플리케이션을 구성합니다.

    Log Analytics 작업 영역에서 새 테이블 만들기 단계를 건너뜁니다. 테이블이 Log Analytics에 이미 정의되어 있기 때문에 표준 테이블에 데이터를 수집하는 경우에는 이 단계가 관련이 없습니다.

  4. DCR을 만듭니다. 이 단계에서:

    • 이전 섹션에서 만든 샘플 파일을 제공합니다.
    • 만든 샘플 파일을 사용하여 streamDeclarations 속성을 정의합니다. 샘플 파일의 각 필드에는 동일한 이름과 적절한 형식의 해당 열이 있어야 합니다(아래 예제 참조).
    • 사용자 지정 테이블 대신 표준 테이블의 이름으로 outputStream 속성 값을 구성합니다. 사용자 지정 테이블과 달리 표준 테이블 이름에는 _CL 접미사가 없습니다.
    • 테이블 이름의 접두사는 Custom- 대신 Microsoft-이어야 합니다. 이 예제에서 outputStream 속성 값은 Microsoft-Syslog입니다.
  5. DCR에 권한을 할당합니다.

    샘플 데이터 보내기 단계를 건너뜁니다.

문제가 발생하는 경우 문제 해결 단계를 참조하세요.

예: Syslog 테이블에 데이터를 수집하는 DCR

다음 사항에 유의합니다.

  • streamDeclarations 열 이름 및 형식은 샘플 파일 필드와 동일해야 하지만 모두 지정할 필요는 없습니다. 예를 들어, 아래 DCR에서는 streamDeclarations 열에서 PRI, typels_version 필드를 생략합니다.
  • dataflows 속성은 입력을 Syslog 테이블 형식으로 변환하고 outputStreamMicrosoft-Syslog로 설정합니다.
{
	"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
	"contentVersion": "1.0.0.0",
	"parameters": {
		"dataCollectionRuleName": {
			"type": "String",
			"metadata": {
				"description": "Specifies the name of the Data Collection Rule to create."
			}
		},
		"location": {
			"defaultValue": "westus2",
			"allowedValues": [
				"westus2",
				"eastus2",
				"eastus2euap"
			],
			"type": "String",
			"metadata": {
				"description": "Specifies the location in which to create the Data Collection Rule."
			}
		},
        "location": {
            "defaultValue": "[resourceGroup().location]", 
            "type": "String", 
            "metadata": {
                "description": "Specifies the location in which to create the Data Collection Rule." 
            } 
        },
		"workspaceResourceId": {
			"type": "String",
			"metadata": {
				"description": "Specifies the Azure resource ID of the Log Analytics workspace to use."
			}
		}
	},
	"resources": [
		{
			"type": "Microsoft.Insights/dataCollectionRules",
			"apiVersion": "2021-09-01-preview",
			"name": "[parameters('dataCollectionRuleName')]",
			"location": "[parameters('location')]",
			"properties": {
				"streamDeclarations": {
					"Custom-SyslogStream": {
						"columns": [
							{
                        "name": "ls_timestamp",
                        "type": "datetime"
                    },	{
                        "name": "timestamp",
                        "type": "datetime"
                    },
                    {
                        "name": "message",
                        "type": "string"
                    }, 
					{
                        "name": "facility_label",
                        "type": "string"
                    },
					{
                        "name": "severity_label",
                        "type": "string"
                    },
                    {
                        "name": "host",
                        "type": "string"
                    },
                    {
                        "name": "logsource",
                        "type": "string"
                    }
	]
				      }
				},
				"destinations": {
					"logAnalytics": [
						{
							"workspaceResourceId": "[parameters('workspaceResourceId')]",
							"name": "clv2ws1"
						}
					]
				},
				"dataFlows": [
					{
					"streams": [
						"Custom-SyslogStream"
					],
					"destinations": [
						"clv2ws1"
					],
					"transformKql": "source | project TimeGenerated = ls_timestamp, EventTime = todatetime(timestamp), Computer = logsource, HostName = logsource, HostIP = host, SyslogMessage = message, Facility = facility_label, SeverityLevel = severity_label",
						"outputStream": "Microsoft-Syslog"
					}
				]
			}
		}
	],
	"outputs": {
		"dataCollectionRuleId": {
			"type": "String",
			"value": "[resourceId('Microsoft.Insights/dataCollectionRules', parameters('dataCollectionRuleName'))]"
		}
	}
}

Logstash 구성 파일 구성

로그를 사용자 지정 테이블에 수집하도록 Logstash 구성 파일을 구성하려면 다음 값을 검색합니다.

필드 검색하는 방법
client_app_Id 이 섹션에서 사용한 자습서에 따라 DCR 리소스를 만들 때 3단계에서 만드는 Application (client) ID 값.
client_app_secret 이 섹션에서 사용한 자습서에 따라 DCR 리소스를 만들 때 5단계에서 만드는 Application (client) ID 값.
tenant_id 구독의 테넌트 ID. 홈 > Microsoft Entra ID > 개요 > 기본 정보에서 테넌트 ID를 찾을 수 있습니다.
data_collection_endpoint 이 섹션에서 사용한 자습서에 따라 DCR 리소스를 만들 때 3단계에 있는 logsIngestion URI 값.
dcr_immutable_id 이 섹션에서 사용한 자습서에 따라 DCR 리소스를 만들 때 6단계에 있는 DCR immutableId 값.
dcr_stream_name 사용자 지정 테이블의 경우 DCR 리소스를 만들 때 6단계에서 설명한 대로 DCR의 JSON 뷰로 이동하고 dataFlows>streams 속성을 복사합니다. 아래 예제에서 dcr_stream_name을 참조하세요.

표준 테이블의 경우 값은 Custom-SyslogStream입니다.

필요한 값을 검색한 후:

  1. 이전 단계에서 만든 Logstash 구성 파일의 출력 섹션을 아래 예제로 바꿉니다.
  2. 아래 예제의 자리 표시자 문자열을 검색한 값으로 바꿉니다.
  3. create_sample_file 특성을 false로 변경해야 합니다.

선택적 구성

필드 Description 기본값
azure_cloud 사용 중인 Azure 클라우드의 이름을 지정하는 데 사용 가능한 값은 AzureCloud, AzureChinaCloudAzureUSGovernment입니다. AzureCloud
key_names 문자열 배열입니다. 열의 하위 집합을 Log Analytics에 보내려면 이 필드를 제공합니다. 없음(필드가 비어 있음)
plugin_flush_interval Log Analytics에 두 메시지를 보내는 사이의 최대 시간 차이(초)를 정의합니다. 5
retransmission_time 전송에 실패한 후 메시지를 다시 전송하는 데 걸리는 시간(초)을 설정합니다. 10
compress_data 이 필드가 True이면 API를 사용하기 전에 이벤트 데이터가 압축됩니다. 높은 처리량 파이프라인에 권장됩니다. False
proxy 모든 API 호출에 사용할 프록시 URL을 지정합니다. 없음(필드가 비어 있음)
proxy_aad Microsoft Entra ID에 대한 API 호출에 사용할 프록시 URL을 지정합니다. 'proxy'와 동일한 값(필드가 비어 있음)
proxy_endpoint 데이터 컬렉션 엔드포인트에 대한 API 호출에 사용할 프록시 URL을 지정합니다. 'proxy'와 동일한 값(필드가 비어 있음)

예: 출력 플러그 인 구성 섹션

output {
    microsoft-sentinel-log-analytics-logstash-output-plugin {
      client_app_Id => "<enter your client_app_id value here>"
      client_app_secret => "<enter your client_app_secret value here>"
      tenant_id => "<enter your tenant id here> "
      data_collection_endpoint => "<enter your logsIngestion URI here> "
      dcr_immutable_id => "<enter your DCR immutableId here> "
      dcr_stream_name => "<enter your stream name here> "
      create_sample_file=> false
      sample_file_path => "c:\\temp"
      proxy => "http://proxy.example.com"
    }
}

Microsoft Sentinel Logstash 출력 플러그 인에 대한 다른 매개 변수를 설정하려면 출력 플러그 인의 추가 정보 파일을 참조하세요.

참고 항목

보안상 이유로 Logstash 구성 파일에서 client_app_Id, client_app_secret, tenant_id, data_collection_endpointdcr_immutable_id 특성을 암시적으로 명시하지 않는 것이 좋습니다. 이 중요한 정보를 Logstash 키 저장소에 저장하는 것이 좋습니다.

Logstash 다시 시작

업데이트된 출력 플러그 인 구성을 사용하여 Logstash를 다시 시작하고 DCR 구성에 따라 데이터가 적합한 테이블에 수집되는지 확인합니다.

Microsoft Sentinel에서 수신 로그 보기

  1. 메시지가 출력 플러그 인으로 전송되고 있는지 확인합니다.

  2. Microsoft Sentinel 탐색 메뉴에서 로그를 클릭합니다. Tables 제목 아래에서 사용자 지정 로그 범주를 확장합니다. 구성에서 _CL 접미사를 사용하여 지정한 테이블의 이름을 찾아 클릭합니다.

    Logstash 사용자 지정 로그 스크린샷.

  3. 테이블의 레코드를 보려면 테이블 이름을 스키마로 사용하여 테이블을 쿼리합니다.

    Logstash 사용자 지정 로그 쿼리 스크린샷.

출력 플러그 인 감사 로그 모니터링

Microsoft Sentinel 출력 플러그 인의 연결 및 작업을 모니터링하려면 적절한 Logstash 로그 파일을 사용하도록 설정합니다. 로그 파일 위치는 Logstash Directory Layout(Logstash 디렉터리 레이아웃) 문서를 참조하세요.

이 로그 파일에 데이터가 표시되지 않는 경우 입력 및 필터 플러그 인을 통해 일부 이벤트를 생성하고 로컬로 전송하여 출력 플러그 인에서 데이터를 수신하는지 확인합니다. Microsoft Sentinel은 출력 플러그 인과 관련된 문제만 지원합니다.

네트워크 보안

네트워크 설정을 정의하고 네트워크 격리를 Microsoft Sentinel Logstash 출력 플러그 인에 사용하도록 설정합니다.

가상 네트워크 서비스 태그

Microsoft Sentinel 출력 플러그 인은 Azure 가상 네트워크 서비스 태그를 지원합니다. AzureMonitorAzureActiveDirectory 태그가 모두 필요합니다.

Azure Virtual Network 서비스 태그를 사용하여 네트워크 보안 그룹, Azure Firewall 및 사용자 정의 경로에 대한 네트워크 액세스 제어를 정의할 수 있습니다. 보안 규칙 및 경로를 만들 때 특정 IP 주소 대신 서비스 태그를 사용합니다. Azure Virtual Network 서비스 태그를 사용할 수 없는 시나리오의 경우 방화벽 요구 사항은 다음과 같습니다.

방화벽 요구 사항

다음 표에서는 Azure 가상 네트워크 서비스 태그를 사용할 수 없는 시나리오에 대한 방화벽 요구 사항이 나열되어 있습니다.

클라우드 엔드포인트 목적 포트 Direction HTTPS 검사 안 함
Azure Commercial https://login.microsoftonline.com 권한 부여 서버(Microsoft ID 플랫폼) 포트 443 아웃바운드
Azure Commercial https://<data collection endpoint name>.<Azure cloud region>.ingest.monitor.azure.com 데이터 수집 엔드포인트 포트 443 아웃바운드
Azure Government https://login.microsoftonline.us 권한 부여 서버(Microsoft ID 플랫폼) 포트 443 아웃바운드
Azure Government 위의 '.com'을 '.us'로 바꿉니다. 데이터 수집 엔드포인트 포트 443 아웃바운드
21Vianet에서 운영하는 Microsoft Azure https://login.chinacloudapi.cn 권한 부여 서버(Microsoft ID 플랫폼) 포트 443 아웃바운드
21Vianet에서 운영하는 Microsoft Azure 위의 '.com'을 '.cn'으로 바꿉니다. 데이터 수집 엔드포인트 포트 443 아웃바운드

제한 사항

  • 표준 테이블에 수집하는 작업은 사용자 지정 로그 수집에 대해 지원되는 표준 테이블로만 제한됩니다.
  • streamDeclarations 속성의 입력 스트림 열은 문자로 시작해야 합니다. 다른 문자(예: @ 또는 _)로 열을 시작하면 작업이 실패합니다.
  • TimeGenerated 날짜/시간 필드가 필요합니다. 이 필드를 KQL 변환에 포함해야 합니다.
  • 추가적인 가능한 문제는 자습서의 문제 해결 섹션을 검토하세요.

다음 단계

이 문서에서는 Logstash를 사용하여 외부 데이터 원본을 Microsoft Sentinel에 연결하는 방법을 알아보았습니다. Microsoft Sentinel에 대해 자세히 알아보려면 다음 문서를 참조하세요.