Azure Application Gateway 로그 수집
다음에서 지원:
    
      
      
        
        
        
  
    
      Google SecOps
    
  
      
    
      
      
        
        
        
  
    
      SIEM
    
  
      
    
    
  이 문서에서는 Google Security Operations 피드를 설정하여 Azure Application Gateway 로그를 수집하는 방법을 설명합니다. 이 파서는 단일 및 다중 레코드 JSON 구조를 모두 처리하고, 'records' 배열에서 필드를 추출하고, 데이터 유형 변환을 실행하고, 필드를 UDM에 매핑하고, 메타데이터 및 파생 필드(예: 네트워크 연결 유형)로 데이터를 보강합니다. 또한 다양한 operationName 값에 대한 특정 로직을 처리하여 관련 IP 주소, 서브넷, 기타 구성 세부정보를 추출합니다.
시작하기 전에
다음 기본 요건이 충족되었는지 확인합니다.
- Google SecOps 인스턴스
- Azure 구독에 대한 액세스 권한
- Azure의 Azure 애플리케이션 게이트웨이 환경 (테넌트)
Azure 스토리지 계정 구성
- Azure 콘솔에서 스토리지 계정을 검색합니다.
- 만들기를 클릭합니다.
- 다음 입력 파라미터의 값을 지정합니다.
- 구독: 구독을 선택합니다.
- 리소스 그룹: 리소스 그룹을 선택합니다.
- 리전: 리전을 선택합니다.
- 성능: 성능을 선택합니다 (표준 권장).
- 중복성: 중복성을 선택합니다 (GRS 또는 LRS 권장).
- 스토리지 계정 이름: 새 스토리지 계정의 이름을 입력합니다.
 
- 검토 + 만들기를 클릭합니다.
- 계정 개요를 검토하고 만들기를 클릭합니다.
- 스토리지 계정 개요 페이지의 보안 + 네트워킹에서 하위 메뉴 액세스 키를 선택합니다.
- key1 또는 key2 옆에 있는 표시를 클릭합니다.
- 클립보드에 복사를 클릭하여 키를 복사합니다.
- 나중에 사용할 수 있도록 키를 안전한 위치에 저장합니다.
- 스토리지 계정 개요 페이지의 설정에서 하위 메뉴 엔드포인트를 선택합니다.
- 클립보드에 복사를 클릭하여 Blob 서비스 엔드포인트 URL을 복사합니다. (예: https://<storageaccountname>.blob.core.windows.net)
- 나중에 사용할 수 있도록 엔드포인트 URL을 안전한 위치에 저장합니다.
Azure Application Gateway를 구성하는 방법
- Azure 포털에 로그인합니다.
- 원하는 리소스 그룹으로 이동합니다.
- 애플리케이션 게이트웨이를 선택합니다 (애플리케이션 게이트웨이 창이 표시됨).
- 모니터링 섹션에서 진단 설정 > 진단 사용 설정을 선택합니다.
- 진단 설정 추가를 선택합니다. 진단 설정 창에 진단 로그 설정이 표시됩니다.
- 로그 섹션에서 다음을 수행합니다.
- ApplicationGatewayAccessLog 체크박스를 선택합니다.
- ApplicationGatewayFirewallLog 체크박스를 선택합니다.
 
- 스토리지 계정에 로그를 저장하려면 다음 단계를 따르세요.
- 스토리지 계정에 아카이브 체크박스를 선택합니다.
- 구독 목록에서 기존 구독을 선택합니다.
- 스토리지 계정 목록에서 기존 스토리지 계정을 선택합니다.
 
피드 설정
Google SecOps 플랫폼에서 피드를 설정하는 방법은 두 가지입니다.
- SIEM 설정 > 피드 > 새 피드 추가
- 콘텐츠 허브 > 콘텐츠 팩 > 시작하기
Azure 애플리케이션 게이트웨이 피드를 설정하는 방법
- Azure 플랫폼 팩을 클릭합니다.
- Azure Application Gateway 로그 유형을 찾아 새 피드 추가를 클릭합니다.
- 다음 필드의 값을 지정합니다. - 소스 유형: Microsoft Azure Blob Storage V2
- Azure URI: blob 엔드포인트 URL입니다.
- ENDPOINT_URL/BLOB_NAME- 다음을 바꿉니다.- ENDPOINT_URL: blob 엔드포인트 URL입니다. (- https://<storageaccountname>.blob.core.windows.net)
- BLOB_NAME: Blob의 이름입니다. (예:- insights-logs-<logname>)
 
 
- 다음을 바꿉니다.
 
- 소스 삭제 옵션: 수집 환경설정에 따라 삭제 옵션을 선택합니다.
- 최대 파일 기간: 지난 일수 동안 수정된 파일을 포함합니다. 기본값은 180일입니다.
- 공유 키: Azure 리소스에 액세스하는 데 사용되는 공유 키 (base-64 인코딩의 512비트 무작위 문자열)입니다.
 - 고급 옵션 - 피드 이름: 피드를 식별하는 미리 채워진 값입니다.
- 애셋 네임스페이스: 피드와 연결된 네임스페이스입니다.
- 수집 라벨: 이 피드의 모든 이벤트에 적용되는 라벨입니다.
 
- 피드 만들기를 클릭합니다. 
이 제품군 내에서 다양한 로그 유형에 대해 여러 피드를 구성하는 방법에 관한 자세한 내용은 제품별 피드 구성을 참고하세요.
UDM 매핑 테이블
| 로그 필드 | UDM 매핑 | 논리 | 
|---|---|---|
| Category | metadata.product_event_type | Category필드에서 직접 매핑됩니다. | 
| ClientOperationId | additional.fields[].key:"ClientOperationId", value.string_value | ClientOperationId필드에서 직접 매핑됩니다. | 
| CorrelationRequestId | additional.fields[].key:"CorrelationRequestId", value.string_value | CorrelationRequestId필드에서 직접 매핑됩니다. | 
| GatewayManagerVersion | additional.fields[].key:"GatewayManagerVersion", value.string_value | GatewayManagerVersion필드에서 직접 매핑됩니다. | 
| category | metadata.product_event_type | category필드에서 직접 매핑됩니다. | 
| level | security_result.severity | level필드에서 직접 매핑되며 대문자로 변환됩니다. 값이 'WARNING'이면 심각도가 'HIGH'로 설정되고security_result.severity_details이 원래 값으로 설정됩니다. | 
| properties.clientIP | principal.ip,principal.asset.ip | properties.clientIP필드에서 직접 매핑됩니다. | 
| properties.clientPort | principal.port | properties.clientPort필드에서 직접 매핑되며 정수로 변환됩니다. | 
| properties.clientResponseTime | additional.fields[].key:"clientResponseTime", value.string_value | properties.clientResponseTime필드에서 직접 매핑됩니다. | 
| properties.configuration.BgpConfiguration.GatewayConfig.Asn | security_result.detection_fields[].key:"ASN", value | operationName이 'SetGatewayConfiguration'인 경우properties.configuration.BgpConfiguration.GatewayConfig.Asn필드에서 직접 매핑됩니다. | 
| properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress | target.ip,target.asset.ip | operationName이 'SetGatewayConfiguration'인 경우properties.configuration.BgpConfiguration.GatewayConfig.PeerAddress필드에서 직접 매핑됩니다. | 
| properties.configuration.BgpConfiguration.GatewayConfig.PeerType | security_result.detection_fields[].key:"PeerType", value | operationName이 'SetGatewayConfiguration'인 경우properties.configuration.BgpConfiguration.GatewayConfig.PeerType필드에서 직접 매핑됩니다. | 
| properties.configuration.IkeVersion | principal.resource.attribute.labels[].key:"ike_version", value | operationName이 'SetConnectionConfiguration'인 경우properties.configuration.IkeVersion필드에서 직접 매핑됩니다. | 
| properties.configuration.LocalSubnets | principal.resource.attribute.labels[].key:"local subnets", value | operationName이 'SetConnectionConfiguration'인 경우properties.configuration.LocalSubnets배열의 연결된 IP 주소 문자열입니다. | 
| properties.configuration.LocalTunnelEndpoint | principal.ip,principal.asset.ip | operationName이 'SetConnectionConfiguration'인 경우properties.configuration.LocalTunnelEndpoint필드에서 직접 매핑됩니다. | 
| properties.configuration.Name | principal.hostname,principal.asset.hostname | properties.configuration.Name필드에서 직접 매핑됩니다. 비어 있으면properties.instance에서 값이 가져옵니다. | 
| properties.configuration.RemoteSite | target.hostname,target.asset.hostname | properties.configuration.RemoteSite필드에서 직접 매핑됩니다. | 
| properties.configuration.RemoteSubnets | principal.resource.attribute.labels[].key:"remote subnets", value | operationName이 'SetConnectionConfiguration'인 경우properties.configuration.RemoteSubnets배열의 연결된 IP 주소 문자열입니다. | 
| properties.configuration.RemoteTunnelEndpoint | target.ip,target.asset.ip | operationName이 'SetConnectionConfiguration'인 경우properties.configuration.RemoteTunnelEndpoint필드에서 직접 매핑됩니다. | 
| properties.configuration.VIPAddress | principal.ip,principal.asset.ip | operationName이 'SetGatewayConfiguration'인 경우properties.configuration.VIPAddress필드에서 직접 매핑됩니다. | 
| properties.configuration.VirtualNetworkRanges | principal.resource.attribute.labels[].key:"virutal network ranges", value | operationName이 'SetGatewayConfiguration'인 경우properties.configuration.VirtualNetworkRanges배열의 연결된 IP 주소 문자열입니다. | 
| properties.configuration.VirtualNetworkSubnets | principal.resource.attribute.labels[].key:"virtual network subnets", value | operationName이 'SetGatewayConfiguration'인 경우properties.configuration.VirtualNetworkSubnets배열의 연결된 IP 주소 문자열입니다. | 
| properties.error_info | additional.fields[].key:"error_info", value.string_value | properties.error_info필드에서 직접 매핑됩니다. | 
| properties.host | principal.hostname,principal.asset.hostname | properties.originalHost이 비어 있는 경우properties.host필드에서 직접 매핑됩니다. | 
| properties.httpMethod | network.http.method | properties.httpMethod필드에서 직접 매핑됩니다. | 
| properties.httpStatus | network.http.response_code | properties.httpStatus필드에서 직접 매핑되며 정수로 변환됩니다. | 
| properties.httpVersion | network.application_protocol | properties.httpVersion필드에 'HTTP'가 포함된 경우 'HTTP'로 설정됩니다. | 
| properties.instance | principal.hostname,principal.asset.hostname | properties.configuration.Name이 비어 있는 경우principal.hostname의 값으로 사용됩니다. | 
| properties.message | metadata.description | properties.message필드에서 직접 매핑됩니다. | 
| properties.operationName | additional.fields[].key:"operationName", value.string_value | properties.operationName필드에서 직접 매핑됩니다. | 
| properties.operationStatus | security_result.category_details | properties.operationStatus필드에서 직접 매핑됩니다. 값이 'Success' 또는 'InProgress'인 경우security_result.action가 'ALLOW'로 설정됩니다. | 
| properties.originalHost | principal.hostname,principal.asset.hostname | properties.originalHost필드에서 직접 매핑됩니다. | 
| properties.originalRequestUriWithArgs | additional.fields[].key:"originalRequestUriWithArgs", value.string_value | properties.originalRequestUriWithArgs필드에서 직접 매핑됩니다. | 
| properties.receivedBytes | network.received_bytes | properties.receivedBytes필드에서 직접 매핑되며 부호 없는 정수로 변환됩니다. | 
| properties.requestQuery | additional.fields[].key:"requestQuery", value.string_value | properties.requestQuery필드에서 직접 매핑됩니다. | 
| properties.requestUri | target.url | properties.requestUri필드에서 직접 매핑됩니다. | 
| properties.sentBytes | network.sent_bytes | properties.sentBytes필드에서 직접 매핑되며 부호 없는 정수로 변환됩니다. | 
| properties.serverResponseLatency | additional.fields[].key:"Server Response Latency", value.string_value | properties.serverResponseLatency필드에서 직접 매핑됩니다. | 
| properties.serverRouted | target.ip,target.asset.ip,target.port | IP와 포트는 정규 표현식을 사용하여 properties.serverRouted필드에서 추출됩니다. | 
| properties.sslCipher | network.tls.cipher | properties.sslCipher필드에서 직접 매핑됩니다. | 
| properties.sslClientCertificateIssuerName | network.tls.server.certificate.issuer | properties.sslClientCertificateIssuerName필드에서 직접 매핑됩니다. | 
| properties.sslProtocol | network.tls.version | properties.sslProtocol필드에서 직접 매핑됩니다. | 
| properties.timeTaken | additional.fields[].key:"timeTaken", value.string_value | properties.timeTaken필드에서 직접 매핑됩니다. | 
| properties.transactionId | network.session_id | properties.transactionId필드에서 직접 매핑됩니다. | 
| properties.userAgent | network.http.user_agent,network.http.parsed_user_agent | properties.userAgent필드에서 직접 매핑됩니다. 또한 필드가 파싱된 사용자 에이전트로 변환되고network.http.parsed_user_agent에 매핑됩니다. | 
| properties.WAFEvaluationTime | additional.fields[].key:"WAFEvaluationTime", value.string_value | properties.WAFEvaluationTime필드에서 직접 매핑됩니다. | 
| properties.WAFMode | additional.fields[].key:"WAFMode", value.string_value | properties.WAFMode필드에서 직접 매핑됩니다. | 
| resourceId | target.resource.id | resourceId필드에서 직접 매핑됩니다. | 
| resourceid | target.resource.product_object_id | resourceid필드에서 직접 매핑됩니다. | 
| ruleName | security_result.rule_name | ruleName필드에서 직접 매핑됩니다. | 
| time/timeStamp | metadata.event_timestamp,timestamp | RFC 3339 또는 ISO8601 형식을 사용하여 타임스탬프로 파싱됩니다. timeStamp가 선호되지만timeStamp가 없으면time가 사용됩니다. | 
| (파서 로직) | metadata.event_type | 주 구성원과 대상이 모두 있는 경우 'NETWORK_CONNECTION', 주 구성원만 있는 경우 'STATUS_UPDATE', 그 외의 경우 'GENERIC_EVENT'로 설정됩니다. | 
| (파서 로직) | metadata.product_name | 'Azure 게이트웨이'로 설정합니다. | 
| (파서 로직) | metadata.vendor_name | 'Microsoft'로 설정됩니다. | 
| (파서 로직) | has_principal | 주 구성원 정보 (호스트 이름, IP 또는 포트)가 추출되면 'true'로 설정되고 그렇지 않으면 'false'로 설정되는 불리언 플래그입니다. | 
| (파서 로직) | has_target | 타겟 정보 (호스트 이름, IP, 포트, 리소스 ID 또는 URL)가 추출되면 'true'로 설정되고, 그렇지 않으면 'false'로 설정되는 불리언 플래그입니다. | 
| (파서 로직) | disambiguation_key | 단일 로그 항목에서 여러 이벤트가 추출될 때 추가됩니다. |