ElasticStack

ElasticSearch에 내 컴퓨터 패킷 데이터 매핑

엘라스틱 서치에 패킷데이터를 수집해서 실시간으로 저장하고 싶었다.
그래서 와이어샤크 명령어중에 tshark라는 기능이 있다는 것을 알게 되었다.
이 사이트 에서 tshark관련된 명령어를 확인해볼 수 있다.

이번에는 실시간은 아니고, 샘플로 데이터를 생성한 다음에 삽입해주는 과정을 살펴보려고 한다.

1. t-shark 명령어 사용하기

터미널을 열고 다음과 같은 명령어를 입력해준다.

brew install wireshark
tshark -T ek -j "http tcp ip" -P -c 10> file.json

나는 맥OS 기준이기 때문에 brew명령어를 사용했다.
이후 패킷이 수집되는 모습이 보인다. 나는 일단 테스트를 진행하기 위해 10개의 패킷만 먼저 수집했다.

2. ElasticSearch 켜기

일단 ES를 켜야한다.

elasticsearch

이렇게 켜지면, postman을 실행시켜서 인덱싱 정보를 날려본다.

3. 패킷데이터 인덱스 정보 매핑

http://localhost:9200/_template/packets
{
  "template": "packets-*",
  "mappings": {
      "dynamic": "false",
      "properties": {
        "timestamp": {
          "type": "date"
        },
        "layers": {
          "properties": {
            "frame": {
              "properties": {
                "frame_frame_len": {
                  "type": "long"
                },
                "frame_frame_protocols": {
                  "type": "keyword"
                }
              }
            },
            "ip": {
              "properties": {
                "ip_ip_src": {
                  "type": "ip"
                },
                "ip_ip_dst": {
                  "type": "ip"
                }
              }
            },
            "udp": {
              "properties": {
                "udp_udp_srcport": {
                  "type": "integer"
                },
                "udp_udp_dstport": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    }
}

이렇게 하면 밑의 결과가 다음과 같이 보인다.

4. bulkAPI로 삽입

그리고 나서 bulk API를 사용해 데이터를 삽입해주려고 한다.

curl -s -H "Content-Type: application/x-ndjson" -XPOST "localhost:9200/_bulk" --data-binary "@file.json"

그런데 이 오류가 발생했다.

{
"index":{
          "_index":"packets-2021-08-12",
          "_type":"doc",
          "_id":"7YJ9OXsBmTkfGvNThnG9",
          "status":400,
          "error":{
          "type":"illegal_argument_exception",
          "reason":"Rejecting mapping update to [packets-2021-08-12] as the final mapping would have more than 1 type: [_doc, doc]"
          }
    }
}

이 오류는 이전에 ES트러블 슈팅 관련해서 포스팅한적이 있는 오류였다. 7버전 부터는 타입이 필요 없는데, (6버전 부터는 단일 타입으로 doc만 지원함 이후 7버전부터는 다 똑같아서 사라짐) 타입 속성이 있어서 충돌이 나는 것이다.

지금 json으로 파싱된 데이터는 내가 변경해서 type필드를 없애준 다음에 bulkAPI를 사용해야겠다.

json 데이터를 vi 편집기를 열어 다음과 같이 수정해줬다.

{"index":{"_index":"packets-2021-08-12"}}
{"timestamp":"1628716896960","no_":"1","time":"0.000000","source":"X.X.X.X","destination":"X.X.X.X","protocol":"TCP","length":"54","info":"443 → 58739 [ACK] Seq=1 Ack=1 Win=775 Len=0"}

이후, 다시 bulk API를 사용하면 다음과 같은 결과가 나온다.

5. searchAPI로 데이터 확인하기

postman으로 확인하는게 쉬워서 다음과 같이 해줬다.

결과는 이렇게 넣어준 2개의 패킷 데이터가 확인되었다.

6. Kibana 로 데이터 확인하기

맥북으로 컴퓨터를 바꾸면서 설치가 안되어 있었다. 빠르게 설치해주도록 하겠다.

brew install elastic/tap/kibana-full

이후 kibana를 실행해보자. 음.. 기본적으로 세팅되어야할 대시보드 내용이 하나도 없어서 맥북 기준으로 키바나를 세팅하는 내용을 따로 포스팅 해야겠다.

다음 포스팅에서 확인하자!!

  • 키바나 셋업
  • ElasticSearch에 실시간으로 데이터 수집하도록하기(beats, Logstash사용)