MAC 주소를 통한 NIC 제조사 분석

네트워크 인터페이스 카드는 고유의 MAC 주소가 할당되어 있습니다. MAC 주소는 48비트의 길이로, 3바이트는 제조사에 할당된 OUI (Organizationally unique identifier), 이어지는 3바이트는 일련번호가 지정됩니다. 시스템 사용자가 별도로 MAC 주소를 재지정하지 않았다면, MAC 주소를 통해 제조사 정보를 추출할 수 있습니다.

OUI 코드는 IEEE(Institute of Electrical and Electronics Engineers)에서 관리하며, https://standards-oui.ieee.org/oui/oui.txt에서 전체 데이터를 다운로드 할 수 있습니다. 하지만 이 정보는 구조화된 텍스트가 아니기 때문에, 분석에 사용하려면 가공이 필요합니다.

로그프레소에서 아래와 같은 쿼리로 구조화된 정보를 추출할 수 있습니다.

wget url="https://standards-oui.ieee.org/oui/oui.txt" | fields line 
| eval line = split(line, "\r\n\r\n") 
| explode line
| eval mapping = trim(valueof(line, 1)), street = trim(valueof(line, 2)), city = trim(valueof(line, 3)), country = trim(valueof(line, 4)) 
| eval mapping = split(mapping, "\t"), oui = left(valueof(mapping, 0), 6), company = valueof(mapping, 2)
| search len(company) > 0
| sort oui
| fields oui, company, country, city, street

OUI 추출 쿼리

각 명령어를 풀어서 설명하면 아래와 같습니다:

wget url="https://standards-oui.ieee.org/oui/oui.txt" | fields line 
| eval line = split(line, "\r\n\r\n") 
| explode line

다운로드 데이터 빈 줄 구분

wget 명령어를 이용하여 지정된 URL의 데이터를 다운로드하면 전체 텍스트가 line 필드에 할당됩니다. oui.txt 파일을 보면 각 OUI 엔트리가 빈 줄로 구분된 것을 볼 수 있습니다. 빈 줄은 개행 문자의 연속으로 볼 수 있으므로, split 함수를 사용하여 \r\n\r\n으로 분할하면 배열이 됩니다. 그 다음에 explode 명령어를 사용하여 이 배열을 독립된 레코드로 분할합니다.

레코드는 이제 아래의 형태로 구성되어 있습니다.

00-1C-14   (hex)		VMware, Inc.
001C14     (base 16)		VMware, Inc.
				3401 Hillview Avenue
				Palo Alto  CA  94304
				US

첫번째와 두번째 줄은 표현이 다르지만 같은 내용이고, 세번째 줄은 거리 주소, 네번째 줄은 도시와 지번, 다섯번째 줄은 국가 코드를 포함합니다. 따라서, 줄 단위로 다시 분할하여 번호 순으로 추출할 수 있습니다.

| eval line = split(line, "\n") 
| eval mapping = trim(valueof(line, 1)), street = trim(valueof(line, 2)), city = trim(valueof(line, 3)), country = trim(valueof(line, 4)) 
| eval mapping = split(mapping, "\t"), oui = left(valueof(mapping, 0), 6), company = valueof(mapping, 2)

eval line = split(line, "\n")은 line 필드의 값을 개행 문자로 분할하여 생성된 배열을 다시 line 필드에 할당합니다. valueof() 함수를 사용하면 배열 중 특정 위치의 값을 가져올 수 있습니다. 첫번째 배열 요소는 0번이므로, valueof(line, 2)는 line 배열의 세번째 값을 추출한다는 의미입니다. trim() 함수는 불필요한 앞뒤의 공백 문자를 제거합니다.

쿼리 구문의 세번째 줄은 mapping 필드에 할당된 레코드의 두번째 줄을 가져와서 탭 문자 기준으로 분할하여 다시 mapping 필드에 할당합니다. 첫번째 값에 대해 left() 함수를 사용하여 왼쪽 6개의 문자를 잘라 oui 필드에 할당하고, 탭 문자 뒤에 있는 VMware, Inc. 문자열을 company 필드에 할당합니다.

이제 나머지는 출력을 정리하는 용도입니다.

| search len(company) > 0
| sort oui
| fields oui, company, country, city, street

텍스트 파일 시작부의 설명문 등 불필요한 부분을 제거하고, sort 명령어를 사용하여 OUI 순서대로 정렬한 다음, fields 명령어를 사용하여 보기 좋게 필드 순서를 정리하였습니다.

이제 이 결과를 룩업에 등록하여 사용할 수 있습니다. 사실 로그프레소는 geomac 이름의 룩업을 내장하고 있으며 MAC 주소에서 제조사 이름과 국가를 추출하는 기능을 제공합니다. 예를 들면 아래와 같이 쿼리할 수 있습니다.

json "{}" | eval mac = "00:1C:14:00:11:22" | lookup geomac mac output country, name

geomac 룩업 활용 쿼리

네트워크 접근 제어(NAC) 솔루션 등으로부터 MAC 주소가 수집되면 이제 이렇게 기기 정보를 분석해보세요.

둘러보기

더보기

RFC6587: TCP를 통한 SYSLOG 전송 규약

SYSLOG는 UDP 뿐 아니라 TCP로 전송할 수도 있습니다. 이 때 메시지는 어떤 규칙으로 작성되어야 하는지 간단하게 알아봅니다.

2023-05-20