2016년 8월 19일 금요일

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

VIM 사용법을 시작으로 secure 로그 분석을 진행하고 있는데 한 달 넘게 질질 끄는 느낌이라 뭔가 좀 찜찜하다. 말이나 글로 설명하는 게 적성에 안 맞나? 그냥 작업만 하면 하루도 안 걸리는데(..)

어쨌든 오늘은 쫑낼 생각. 어제 1차 ID 추출을 완료했다. 이제 1차 ID 추출 전에 삭제했던 줄에서만 ID 문자열을 추출하면 된다. 다 지워버렸는데? Undo 명령어를 이용하면, 'u' 키를 세 번만 누르면 세 번의 삭제 작업이 취소된다. (아예 ID 문자열이 없었던 줄은 계속 삭제된 상태)

삭제 작업 취소 후, 중복 추출을 막기 위해 1차로 ID를 추출했던 줄은 삭제해야 한다. 일단 '\vfor\s\S+'로 검사할 수 없었던 ID 문자열을 검사해보자.

다음 정규표현식은 'for공백user' 또는 'for공백invalid공백user' 또는 시작 문자열인 'invalid공백user'를 검사한다.
  • \vfor\s(user|invalid\suser)\s|^invalid\suser\s


이제 해당 문자열을 포함하지 않는 줄만 삭제하면 된다. 'VIM 사용 설명서 - 3rd' 편에서 살펴봤던 글로벌 명령어를 써먹을 때가 왔다. 다음 명령어는 검사되지 않는 문자열을 포함한 줄만을 골라서 빈 줄로 만들어준다.


① 검색어를 제외한 문자열을 포함한 줄 검사
② 치환(substitute) 명령 전환
③ 검색어를 제외한 문자열을 포함한 줄의 모든 문자열을
④ 삭제한다.

  • g!/\vfor\s(user|invalid\suser)\s|^invalid\suser\s/s/.*//

이제 ID만 추출하면 된다.
  • \v(for\s(user|invalid\suser)\s)@<=\S+|(^invalid\suser\s)@<=\S+


추출한 ID를 엑셀로 정리한 결과는 다음과 같다. 이제 2차 추출 ID를 1차 추출 ID와 합치면 끝. (거의 다 왔다 ㅠㅠ)


ID 필드는 1차 추출 ID만 적재되어 있기 때문에 2차 추출 ID가 원래 있어야 할 공간이 비어있다. 그런데 어떻게 그 빈 공간만 찾아서 채워 넣지? ID 필드에서 빈 셀만을 선택해보자.


그 빈 셀 공간이 바로 2차 추출 ID가 있어야할 자리. 복사할 영역을 선택해서 드래그하면 된다. 2차 추출 ID 영역 전체를 선택해서 드래그하자.


결과는 다음과 같다. 안 보이던 ID들이 보인다.


이제 분석을 해볼까나. 참고로 SSH 접속에 성공하면 다음 두 줄의 로그를 남긴다.

Aug 17 19:33:44 Sensor sshd[1744]: Accepted password for root from 192.168.56.1 port 1577 ssh2
Aug 17 19:33:44 Sensor sshd[1744]: pam_unix(sshd:session): session opened for user root by (uid=0)

해당 로그를 남긴, 즉 접속에 성공한 ID와 IP 현황을 살펴볼 필요가 있는데 엑셀의 필터링이나 피벗 테이블 기능도 좋지만 데이터가 많고 필드간 관계가 복잡할 때는 한계가 있다. 관계 분석은 역시 SQL이 짱! 정리된 엑셀 파일을 CSV 형식으로 저장한 후, LogParser로 분석을 해보자.

CSV 저장 시 필드 제목은 쿼리문 작성 편의를 위해 영어로

9월에 접속에 성공한 ID와 IP 현황은 다음과 같다. 걱정 안 해도 되겠다.


사용된 쿼리문은 9월에 'session opened' 로그 발생 시간과 같은 시간에 'accepted password' 로그를 발생시킨, 즉 접속에 성공한 ID와 IP 현황을 조회한다.

① select id, ip, count(*)
② from d:\secure.csv
③ where substr(date,0,3) = 'Sep'
    and msg like '%accepted password%'  # 'accepted password' 문자열을 포함한 데이터 조회
    and time in (
             select distinct time
             from d:\secure.csv
             where substr(date,0,3) = 'Sep'
             and msg like '%session opened%'
             )
④ group by id, ip

전체 접속 성공 현황도 살펴보자. 동일 ID임에도 접속 시도 IP가 다른 경우는 추가 분석이 필요해 보인다. ID 사용자를 불러다 닥달하자.


① select id, ip, count(*)
② from d:\secure.csv
③ where msg like '%accepted password%' 
    and time in (
             select distinct time
             from d:\secure.csv
             where msg like '%session opened%'
             )
④ group by id, ip
⑤ order by id

사실 지난주쯤부터 괜히 시작했다 싶을 만큼 후달리고 있었는데 겨우 일단락을 했다. 고생한 거에 비해 분석이 싱거워 보일 수도 있지만 데이터가 정리됐으니 맘만 먹으면 할 건 많다. 하지만 역시 지겨워 -_-

나가며

그런데 로그 분석을 잘 하려면 꼭 이런 노가다를 해야 하는 걸까? 알아서 다 해줄 것 같은 제품 많은데 그냥 사다 쓰면 되지 않을까?


글쎄, 제품이 필요한 데이터가 무엇인지, 어떻게 정리해야 원하는 결과를 얻을 수 있을지에 대한 고민을 스스로 할 수 있을까? 역할을 정의하고 과정을 수립하며 끊임없이 검증해줄 사람이 필요하다는 얘기. 돌도끼 쓰다 보니 쇠도끼 나오는 것처럼 결국 사람이 고생해야 도구도 발전한다.

그런데 왜 제품 광고는 다 알아서 해줄 것처럼 얘기할까? 그래야 팔리지(..) 데이터 분석 분야가 앞으로 유망하다는 얘기가 많은데 대부분의 시간을 노가다에 보내야 한다고 하면 반응이 어떨까 싶다.
데이터를 분석에 적합하도록 형식화하고 정리하는데 대부분의 시간을 보내는 경우가 꽤 자주 있다. - 해커스타일로 배우는 기계학습 (12 페이지)

그런데 사실 세상만사 중에 노가다 없이 뭐 하나 제대로 되는 게 있을까? 요새 병원을 자주 가는데 의사도 보통 노가다가 아니더라. 그나저나 쉽고 편한 로그 분석 방법을 공유해보고 싶어서 블로그를 시작했는데 이거 보면 더 하기 싫어질래나? 컴퓨터가 알아서 다 해주는 세상이 올테니 너무 걱정 마시길(..)

공대생 만화

관련 글

댓글 없음:

댓글 쓰기

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