- OperatingSystem

서버 취약점 분석결과 정리하기

n3015m 2012. 10. 30. 10:59
최강 문자열 처리 유틸리티... grep awk 사용기

서버 취약점 진단을 할때 50여개의 항목을 효율적으로 점검하기 위해  Batch 파일이나 Shell Script를 많이 사용합니다. 수많은 항목을 수작업으로 확인하기에는 너무나 비효율적일 것입니다.  


쉘 스크립트를 잘만들어서 결과를 취합했다면, 결과 분석이 만만치가 않습니다. 몇 대가 안되면 어려움이 없겠지만 수십대를 넘어가게 되면 스크립트 결과 분석툴을 별도로 만들거나, 텍스트 처리 유틸리티를 사용하지 않으면 하루종일 점검결과를 분석하느라 많은 노력이 필요하게 됩니다.

몇 일 전에 익숙한 스크립트가 아닌 생소한 감사용으로 입수한 스크립트로 점검하려니, 항목 확인부터 점검결과 분석 작업까지 생각만으로도 골치거리였습니다. 그 것도 한 두대도 아니고 300여대를 분석하려고 하니까요.

항목은 무슨 의미인지 회사 직원들과 3등분해서 분석하니 대충 윤곽을 잡았지만 결과 분석은 까마득하고 3일안에는 죽어도 못한다고 누가 하냐고 방어적인 자세로 나왔는데, 머리속에는 벌써 이렇게 하면 되겠다는 생각이 뇌리를 스쳐가네요. 이것도 직업병인지는 모르겠네요.

Grep과 Findstr 명령어는 여러개의 텍스트파일에서 특정 키워드를 검색하면 해당 결과의 줄과 접두에 파일명을 표시해 줍니다. 이러한 특징을 이용하면 매우 유용하고 효율적으로 분석이 가능합니다.
(awk, cat, type 등의 명령어는 텍스트의 내용만 나열)

명령어 : grep "PASSWORD_MAXDAYS" *.txt
결과 :
localhost1.txt:# PASSWORD_MAXDAYS=14
localhost2.txt:PASSWORD_MAXDAYS=60
localhost3.txt:#  PASSWORD_MAXDAYS=20

파일명을 서버의 호스트명으로 하면 위에처럼 결과가 나열되며 분석하려는 항목에 따라서 다양한 정규식 패턴을 사용하면 정확하게 뭔하는 데이터만 추출할 수 있습니다.

 Grep 명령어의 기본적인 사용 방법과 점검결과 분석에 유용한 옵션을 몇개 정리해 봤습니다.

 Grep 기본 사용법

기본 사용법 : grep "pattern" *.txt
옵션 :
  -B [숫자] 라인에서 매치된 패턴과 매치되는 문자열을 찾아서 그 이전의 라인을 숫자만큼 출력 
  -A [숫자] 라인에서 매치된 패턴과 매치되는 문자열을 찾아서 그 이후의 라인을 숫자만큼 출력
  -v "pattern" 매치되지 않는 라인을 출력 

(분석에 필요한 옵션만 일부 나열했습니다. 다양한 기능은 인터넷을 검색하면 자료가 많습니다.)

분석결과는 보통 상세 내용을 많이 출력하며 해당 항목의 시작과 끝을 표기하여 구분하는 방식을 많이 사용하는데 아래와 같은 경우는 -A 옵션을 사용해서 분석하면 좋습니다.

※ A 옵션 
 

.....
[SSH 설정]

/opt/ssh/etc/sshd_config 설정 내용
--------------------------------------------
#MaxAuthTries 6
MaxAuthTries 6

--------------------------------------------
[SSH 설정 END]
..... 

Grep으로 아래와 같이 분석을 하면 많이야 검색키워드로 부터 4줄이상을 사용하지 않습니다. 이럴경우 아래와 같이 검색하면 위의 내용만을 출력해 줍니다. 
Grep -A 4 "/opt/ssh/etc/sshd_config" *.txt


점검결과에서 특정 문장이나 워드를 기준으로 앞의 글자를 추출해야 할 경우도 있다 이럴때는 -B 옵션을 사용해서 분석하면 좋습니다. 
 
※ B 옵션 

.....
[패스워드 최소 길이]

--------------------------------------------
default:
minlen=8
root:
daemon:
oracle:
minlen=6
weblogic
minlen=6
--------------------------------------------
[패스워드 최소길이 END]
..... 

계정별로 minlen의 길이를 확인 하려고 할때 검색 키워드를 minlen으로 하고 계정명을 알기 위해서 위의 한줄을 출력해 주어야만 한다. 이럴경우 아래와 같이 검색하면 위의 내용만을 출력해 줍니다. 
Grep -B 1 "minlen" *.txt

기본적으로 위의 기능만 활용해서 수십 수백개의 분석결과 파일에서 호스트 명과 점검결과를 빠르게 분석이 가능합니다.

좀더 정확한 결과만을 추출하기 위해서는 결과와 상관이 없는 불필요한 줄은 제거해 주는게 좋습니다. 이럴대는 -v옵션을 쓰면 좋습니다.

※ V 옵션 

localhost.txt-default:
localhost.txt:    minlen=8
--
localhost.txt-oracle:
localhost.txt:    minlen=6
--
localhost.txt-weblogic:
localhost.txt:    minlen=6
===================================

위의 예에서 필요한 분석에 유용한 정보인 호스트명, 계정명, minlen 설정 값을 제외하고 불필요하면 텍스트인 "--" 와 "====~"은 결과와 무관해서 제거하면 보기가 훨씬 편해진다.

Grep -B 1 "minlen" *.txt | Grep -Ev "\-\-|==="

어렇게하면 원하는 결과만 출력해 줍니다.

localhost.txt-default:
localhost.txt:    minlen=8
localhost.txt-oracle:
localhost.txt:    minlen=6
localhost.txt-weblogic:
localhost.txt:    minlen=6

이렇게 원하는 결과만 출력되면 이제 Excel 등에 취합을 하면 된다. Excel에서 문자열 처리를 편리하게 하기 위해서 notepad++의 정규식이나 엑셀에서 지원하는 다양한 기능을 사용하면 손쉽게 취합이 가능하다.

그래도 아쉬운 점이 있다. Grep은 특정 키워드로 시작해서 종료하는 구간의 내용이 가변적일 경우 위의 방식으로 해당 내용만 찾아서 처리하기가 어렵고 Grep은 이런 기능을 지원하지 않는다.

대신에 가변 적인 특정 구간의 내용이 필요하다면 awk 사용하면 됩니다.

awk "/pattern1/,/pattern2/" *.txt 


많이 사용하기도 했지만 오랜만에 grep하고 awk 사용해보니 새삼스럽게 너무 좋은거 같아서 장문에 글을 썻네요. ^^;