> ## Content Index
> Fetch the complete content index at: https://www.popit.kr/llms.txt
> Use this file to discover other available public pages before exploring further.

# Logstash 필터 useragent
- URL: https://www.popit.kr/logstash-filter-useragent/
- Published: 2019-11-18T12:08:14.000Z
- Updated: 2019-11-18T12:09:12.000Z
- Author: 강 명훈
- Tags: #데이터분석, logstash, #보안, useragent

웹 요청 트래픽에는 useragent라는 웹 요청을 시도할 때 사용된 도구에 대한 정보가 있다.

![1](https://www.popit.kr/content/images/wp/2019/11/1.png)

이걸 분석해보겠다고 예전엔 정규표현식으로 웹 로그의 useragent 문자열을 추출한 후, 유형과 운영체제 등을 일일이 분류하는 노가다를 했었는데(..)

![2](https://www.popit.kr/content/images/wp/2019/11/2.png)

그런데 이걸 자동으로 분석해주는 [useragent](https://www.elastic.co/guide/en/logstash/current/plugins-filters-useragent.html?ref=popit.kr)라는 필터 플러그인을 엘라스틱이 제공한다. 다음은 샘플 로그.  

```
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; MS-RTC EA 2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij
Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727) NOSEC.JSky/1.0
```

다음은 로그스태시 파이프라인 설정. useragent 분석 결과 필드가 너무 많아서 name 하나만 남겨 두고 remove\_field 옵션으로 다 지웠다.  

```
input {
 file {
  path => "d:/test.log"
  start_position => "beginning"
  sincedb_path => "nul"
 }
}
 ­
filter {
 useragent { 
  source => "message"
  remove_field => [ "build", "os", "device", "os_name", "major", "minor", "os_major", "os_minor", "patch" ]
 }
}
­
output {
 stdout {}
}
```

실행 결과는 이렇다.  

```
{
 "name" => "IE",
 "@version" => "1",
 "message" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; MS-RTC EA 2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r",
 "path" => "d:/test.log",
 "@timestamp" => 2019-10-31T17:11:34.741Z,
 "host" => "MHKANG"
}
{
 "name" => "IE",
 "@version" => "1",
 "message" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij\r",
 "path" => "d:/test.log",
 "@timestamp" => 2019-10-31T17:11:34.742Z,
 "host" => "MHKANG"
}
{
 "name" => "Firefox",
 "@version" => "1",
 "message" => "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2\r",
 "path" => "d:/test.log",
 "@timestamp" => 2019-10-31T17:11:34.742Z,
 "host" => "MHKANG"
}
{
 "name" => "IE",
 "@version" => "1",
 "message" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727) NOSEC.JSky/1.0\r",
 "path" => "d:/test.log",
 "@timestamp" => 2019-10-31T17:11:34.742Z,
 "host" => "MHKANG"
}
```

Havij와 JSky라는 웹 취약점 점검툴(=해킹툴)이 쓰였는데 그냥 IE로 표시된다. useragent 플러그인은 내부적으로 정규표현식을 사용하는데 Havij와 JSky를 검사하는 정규표현식이 없다는 얘기.

원하는 useragent의 유형을 name 필드로 추출하려면 해당 useragent를 검사하는 정규표현식을 추가해야 한다. [useragent 플러그인이 사용하는 정규표현식](https://github.com/tobie/ua-parser/blob/master/regexes.yaml?ref=popit.kr)을 긁어와서 다음처럼 수정한 후, ua\_regex.yaml로 저장했다.

![3](https://www.popit.kr/content/images/wp/2019/11/3.png)

다음은 수정된 로그스태시 파이프라인. regexes 옵션으로 사용할 정규표현식을 지정했으며, prefix 옵션은 useragent 플러그인이 추출하는 필드에 'agent\_'란 접두어를 붙여서 가독성을 높여준다.  

```
input {
 file {
  path => "d:/test.log"
  start_position => "beginning"
  sincedb_path => "nul"
 }
}
­
filter {
 useragent { 
  regexes => "d:/ua_regex.yaml"
  source => "message"
  prefix => "agent_"
  remove_field => [ "agent_build", "agent_os", "agent_device", "agent_os_name", "agent_major", "agent_minor", "agent_os_major", "agent_os_minor", "agent_patch" ]
 }
}
­
output {
 stdout {}
}
```

다음은 실행 결과. 의도대로 원하는 useragent 유형을 뽑아냈다.  

```
{
 "host" => "MHKANG",
 "@version" => "1",
 "message" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; InfoPath.2; MS-RTC EA 2; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)\r",
 "path" => "d:/test.log",
 "@timestamp" => 2019-10-31T17:32:52.461Z,
 "agent_name" => "IE"
}
{
 "message" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Havij\r",
 "@timestamp" => 2019-10-31T17:32:52.462Z,
 "agent_name" => "Havij",
 "path" => "d:/test.log",
 "@version" => "1",
 "host" => "MHKANG"
}
{
 "host" => "MHKANG",
 "@version" => "1",
 "message" => "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.1.2) Gecko/20070219 Firefox/2.0.0.2\r",
 "path" => "d:/test.log",
 "@timestamp" => 2019-10-31T17:32:52.463Z,
 "agent_name" => "Firefox"
}
{
 "host" => "MHKANG",
 "@version" => "1",
 "message" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727) NOSEC.JSky/1.0\r",
 "path" => "d:/test.log",
 "@timestamp" => 2019-10-31T17:32:52.463Z,
 "agent_name" => "JSky"
}
```

다음은 내장된 정규표현식을 이용한 useragent 유형별 발생 추이.

![4](https://www.popit.kr/content/images/wp/2019/11/4.png)

다음은 직접 작성한 정규표현식을 이용한 useragent 유형별 발생 추이.

![5](https://www.popit.kr/content/images/wp/2019/11/5.png)

해킹인지 아닌지는 URI를 까봐야 알 수 있겠지만, 이상징후 분석 관점에서는 useragent도 꽤 쓸만한 지표인 듯하다.