2016년 8월 18일 목요일

VIM 사용 설명서(secure 로그 분석 - 5th)

지난 시간에 secure 로그를 6개의 필드로 나뉜 테이블로 만들었으며, 프로세스/키워드별 발생 통계 및 발생 추이를 추적할 수 있게 되었다.


대량의 SSH(Secure SHell) 접속 시도를 확인한 김에 접속을 시도한 IP와 ID 현황도 파악해보자. 일단 IP 먼저.

그런데 사실 정확하게 IP 주소만을 검사하려면 좀 복잡해진다. 3개의 .으로 구분되는 4개의 8 bit 단위(Octet) IP 주소는 각 옥텟이 0 ~ 255까지 총 256개의 숫자로 이루어지기 때문에, 각 옥텟을 구성하는 숫자가 255보다 크면 안 된다.

하지만 해당 로그에서 3개의 .으로 구분된 숫자 형태의 문자열은 IP 정보 밖에 없기 때문에  '(하나 이상의) 숫자.숫자.숫자.숫자'를 의미하는 단순한 정규표현식으로도 IP 정보만을 쉽게 추출할 수 있다. 검사 대상 문자열의 성격에 맞는 정규표현식을 사용하는 것이 중요하다는 얘기.
  • \v\d+\.\d+\.\d+\.\d+

해당 정규표현식은 '숫자.' 형식이 3번 반복되는 점을 이용해서 다음과 같이 축약할 수도 있다.
  • \v(\d+\.){3}\d+

나머지 추출 과정이야 뻔하니 패스. 이제 SSH 접속 시도에 사용된 ID 정보를 추출해보자. ID 추출을 위해 사용한 정규표현식은 다음과 같다.
  • \vfor\s\S+

해당 정규표현식은 'for공백(for\s)' 이후, '하나 이상의 공백이 아닌 문자열(\S+)'을 검사한다. ('공백이 아닌 문자열'을 검사하므로 공백을 만나면 검사는 중지됨) '메시지공백for공백주체ID공백' 형식의 로그에서 ID 문자열을 추출하기 위한 검색어인데 다음 그림처럼 완벽하지 않다.


모든 ID 문자열을 추출할 수 있는 정규표현식을 만들 수 있을 것도 같은데 잘 안 된다. 정규표현식은 많은 걸 할 수 있지만, 모든 걸 해주지는 않는다. 적당히 요령을 부려보자. 

일단 ID 문자열이 아예 없는 줄은 지우자.
  • .*\sfor\s::.*

검색 결과 중 '공백for공백user공백ID' 문자열이 포함된 줄도지우고,
  • .*\sfor\suser\s.*

'Invalid공백user공백ID' 로 시작(^)하는 문자열이 포함된 줄도 지우고,
  • ^invalid\suser\s.*

'공백for공백invalid공백user공백' 문자열이 포함된 줄도 지우고
  • .*\sfor\sinvalid\suser\s.*

정규표현식 '\vfor\s\S+'로 ID 문자열이 정확히 검사되지 않는 줄은 모두 지웠다. 물론 해당 정규표현식도 ID 문자열을 포함할 뿐, ID 만을 검사하지는 못한다. 그럼 어쩐다? 

'VIM 사용 설명서(secure 로그 분석 - 2nd)' 편에서 살펴봤던 '후방탐색' 기능을 써먹을 때가 온 것. 해당 기능을 이용하면 'for공백ID' 문자열 중 'for공백'을 제외한 ID 문자열만 추출 가능.
  • \v(for\s)@<=\S+

이제 앞서 삭제했던 줄에 포함된 ID 문자열만 추출하면 된다. 그런데 글이 너무 길어질 듯. 오늘 쫑낼 생각이었는데(..) 마무리는 다음에~

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스