azure-networkwatcher-flow-logs
Azure 스토리지 계정에서 지정된 시간 범위의 Network Watcher 흐름 로그를 다운로드합니다.
문법
azure-networkwatcher-flow-logs [profile=PROFILE] [duration=NUM{mon|w|d|h|m|s}] [from=yyyyMMddHHmmss] [to=yyyyMMddHHmmss]
옵션
- profile=PROFILE
- 선택 옵션. Azure Network Watcher flow logs 접속 프로파일 식별자
- duration=NUM{mon|w|d|h|m|s}
- 선택 옵션. 현재 시각으로부터 일정 시간 범위 이내의 로그로 한정. s(초), m(분), h(시), d(일), mon(월) 단위로 지정할 수 있습니다. 예를 들면, 10s의 경우 현재 시각으로부터 10초 이전까지의 범위를 의미합니다.
- from=yyyyMMddHHmmss
- 선택 옵션. yyyyMMddHHmmss 포맷으로 범위의 시작을 지정합니다. 뒷자리를 쓰지 않으면 0으로 채워집니다.
- to=yyyyMMddHHmmss
- 선택 옵션. yyyyMMddHHmmss 포맷으로 범위의 끝을 지정합니다. 뒷자리를 쓰지 않으면 0으로 채워집니다.
출력 필드
| 필드 | 타입 | 이름 | 설명 |
|---|---|---|---|
| _time | 날짜 | 시각 | |
| profile | 문자열 | 접속 프로파일 | Azure Network Watcher flow logs 접속 프로파일 식별자 |
| cloud_resource_group | 문자열 | 클라우드 리소스 그룹 | 리소스 그룹 이름 |
| cloud_resource_name | 문자열 | 클라우드 리소스 이름 | 리소스 이름 |
| direction | 문자열 | 방향 | 예: outbound, inbound |
| src_ip | IP 주소 | 출발지 IP | |
| src_port | 32비트 정수 | 출발지 포트 | |
| dst_ip | IP 주소 | 목적지 IP | |
| dst_port | 32비트 정수 | 목적지 포트 | |
| protocol | 문자열 | 프로토콜 | 예: TCP, UDP |
| policy | 문자열 | 정책 | 보안 규칙 이름 |
| action | 문자열 | 대응 | 예: PERMIT, DENY |
| state | 문자열 | 상태 | 예: start, end, continue, deny |
| total_bytes | 64비트 정수 | 전체 바이트 | sent_bytes와 rcvd_bytes 필드의 합 |
| sent_bytes | 64비트 정수 | 송신 바이트 | 클라이언트에서 서버로 전송한 바이트 수 |
| rcvd_bytes | 64비트 정수 | 수신 바이트 | 서버에서 클라이언트로 전송한 바이트 수 |
| total_pkts | 64비트 정수 | 전체 패킷 | sent_pkts와 rcvd_pkts 필드의 합 |
| sent_pkts | 64비트 정수 | 송신 패킷 | 클라이언트에서 서버로 전송한 패킷 수 |
| rcvd_pkts | 64비트 정수 | 수신 패킷 | 서버에서 클라이언트로 전송한 패킷 수 |
| cloud_resource | 문자열 | 클라우드 리소스 | Azure 리소스 경로 |
| blob_path | 문자열 | Blob 경로 | 로그 원본 Blob 경로 |
| acl_id | 문자열 | ACL ID | |
| mac | 문자열 | MAC 주소 | |
| encryption | 문자열 | 암호화 상태 | 예: X, NX, NX_HW_NOT_SUPPORTED ... |
오류 코드
런타임 오류
| 오류 메시지 | 원인 | 해결 |
|---|---|---|
nsgflow error, profile={프로파일명} - {메시지} | Azure Storage 접근 실패 (connection string 오류, 컨테이너 미존재, 네트워크 오류 등) | 접속 프로파일의 connection string과 컨테이너 이름을 확인합니다 |
설명
지정된 시간 범위에 해당하는 PT1H.json Blob 파일을 Azure Storage 컨테이너에서 다운로드하여 흐름 레코드를 파싱합니다. VNet Flow Log v4, NSG Flow Log v1/v2를 모두 지원합니다.
Azure는 1시간 동안 PT1H.json 파일에 계속 쓰기 작업을 수행합니다. 미완성 파일을 읽지 않기 위해, 이 명령어는 쓰기가 시작된 시점으로부터 최소 1시간 5분이 경과한 파일만 처리합니다.
duration= 또는 from=/to= 옵션을 지정하지 않으면 컨테이너 내 모든 Blob을 스캔합니다.
acl_id, mac, encryption 필드는 VNet Flow Log v4 레코드에만 존재하며, NSG Flow Log v1/v2 레코드에는 포함되지 않습니다.
사용 예
예시 1: 특정 시간 범위의 로그 다운로드
상황: 특정 일시의 인바운드 트래픽을 조사합니다.
azure-networkwatcher-flow-logs profile=azure_nw_prod from=20260624140000 to=20260624150000
| search direction == "inbound"
| stats count as flow_count by action, protocol
| sort -flow_count
예상 결과:
| action | protocol | flow_count |
|---|---|---|
| DENY | TCP | 4231 |
| PERMIT | TCP | 1823 |
| DENY | UDP | 312 |
결과 해석: 특정 출발지 IP의 DENY 횟수가 많으면 포트 스캔 또는 무차별 대입 시도일 수 있습니다.
예시 2: 최근 1시간 반복 차단 출발지 IP 탐지
상황: 최근 1시간 동안 인바운드 차단 횟수가 많은 출발지 IP를 집계하여 위협을 탐지합니다.
azure-networkwatcher-flow-logs profile=azure_nw_prod duration=1h
| search direction == "inbound" and action == "DENY"
| stats count as deny_count by src_ip
| sort -deny_count
| limit 20
예상 결과:
| src_ip | deny_count |
|---|---|
| 192.0.2.50 | 1423 |
| 192.0.2.51 | 876 |
결과 해석: DENY 횟수가 높은 IP는 위협 조사 대상입니다.