본문으로 바로가기

SE. Jungs 엔지니어 생활 로그 - messages.170802.1

category 엔지니어 Life/6. ETC 2017.08.02 17:07

덧붙이는글

(이글은 뻘소리도 길고 헛소리도 길고 잡소리도 길고 글쓰기 초반 버프가 걸려있어서 키보드 워리어들의 접근을 금합니다.)

최근에는 시스템 보안 점검 스크립트를 짜고 있는데... (기준은 CentOS 6 기준입니다.)

 

물론 커널 버전을 체크해서 OS 를 판별후 해당 스크립트를 돌면 되겠지만... 일단 그림을 그려봤어요..


1. 스크립트를 하나하나 복사하기가 너무 귀찮습니다.

2. 내가 혹시나 스크립트를 돌리다가 부하가 걸렸다고 해도... 나 이외의 사람들은 몰랐으면 좋겠습니다.

3. 스크립트를 버전을 일괄 관리 하고 싶어졌습니다.

4. 내가 스크립트는 좀 짠다라는걸 보여주고 싶었습니다.


이런 그림을 그려놓고 보니.. 곰곰히 생각하게 된 부분이... 오픈소스와 상용소스의 차이 였어요..

 

예를 들어보죠...

https://www.facebook.com/Kicomav/


여기 키콤백신이라는 백신이 있습니다. (여기서 av는 Adult Video가 아닙니다. This is not Adult Video)

이 백신에다가 GUI를 입히면 뭐가 될까요 ?

흔히 말하는 V3같은 상용 백신이 됩니다. 참 쉽죠 ? 

( 뭐 아니라고 생각하시는 분들은 그냥 아니라고 생각하세요. 저도 사실 아니라고 생각하긴 하지만요... )


하여튼 그래서 전 이렇게 생각했죠.

상용 시스템 점검 도구에서 점검하는 내용을 스크립트에다가 넣어서 오픈소스도 아닌 날 소스에다가... 

뭔가 그럴싸하게 색을 입혀보자.... (이렇게 생각하게 된 동기는 지난글을 참고 부탁드려요.)

그래서 시스템 정보를 취합하는 스크립트 라고 쓰고 취약점도 같이 보는 스크립트라고 읽는 스크립트 제작에 들어갔어요.


여태까지 제가 보아온 스크립트는 늘 이랬어요.


예전 XX증권사에 있을때도 스크립트를 썻었는데 그냥 수집 후에 데이터를 모아주는 역활만 하던 스크립트였습니다.

그래서 결과값을 사람이 일일히 다 육안으로 점검을 했엇죠

너무 비효율적이었습니다.

완전 오나전...

그후 ISMS용으로 보안 점검 스크립트를 많이 돌려봤는데, 보고서라기 보다는 데이터 수집용 스크립트에 가까웠어요.......

이건 로그를 제가 읽을 수도 없었어요.

로그를 특정 프로그램이 읽어서 그걸 CSV나 xls로 만들어주는 프로그램이었거든요.

그래서 저는 이렇게 생각했죠.

"다 필요없어! 그냥 실행시키면 겁나 화려하게 보여야겠어! 2020년까지 유지보수를 해주마 "

 

그리고 소스를 짜게 되죠....


먼저 변수는 최소화 했어요.

내 머리를 신뢰할 수 없기 때문이죠. 변수 충돌을 우려했어요. 

제가 생각하기로 변수는 절대값 같은게 들어가야한다고 생각했는데...

폰트 같은 부분을 일부러 함수처럼 만들어 봤어요.

옵션을 외우기 귀찮았기 때문에요..

그리고 FontReset 변수를 만들어서 마치 html의 <font color=red> 빨강 </font> 처럼 구현을 해봤어요.

제가 봐도 심하게 허접하네요.

역시 기본이 안되있어서 변수에 규칙같은 부분은 없고 그냥 생각나는데로 네이밍 처리 했어요. 제가 좀 네이밍 센스가 없어요....(나중에 애를 놓으면 하현수라고 지을려고 했... 이상한가요?)

#Font 변수

FontYellow='\033[1;93m'

FontGreen='\033[1;92m'

FontCyan='\033[1;36m'

FontRed='\033[1;5;91m'

FontReds='\033[1;91m'

FontReset='\033[0;0m'

FontWhite='\033[1;0m'

그 다음은 OS 정보 수집 부분인데 이때까지만 해도 함수를 써야지라는 생각이 없었기 때문에 다 일괄 변수로 처리했어요.

# OS 정보

OS=$(awk '{print $1}' /etc/redhat-release|uniq)

ARCH=$(uname -m | sed 's/x86_//;s/i[3-6]86/32/')

보시다 시피 조잡하고 이쁘지 않은데 마구잡이로 씌어넣었어요.

뭐 2줄 밖에 안돼니 양해바래요  :)


하여튼 그 다음은 함수로 처리했어요.

제가 만든 함수가 3종류로 들어가요..

3종류로 들어가는 이유는 ...

그냥 하면서 그때그때 떠오르는대로 설계했더니 개판이라 그래요...

function OS_STATUS(){

if [ -z "$OS" ]; then

    CHECK=0

else

    CHECK=1

fi

CODE

}


# 결과값 도출함수 FOUND , NOT FOUND

function CODE1(){

   if [ ${CHECK} -eq 1 ];then

   echo ${FontGreen}FOUND ${FontReset}

   else

   echo ${FontRed}NOT FOUND ${FontReset}

fi

}


먼저 결과 값 변수는 CHECK라는 변수를 줬고 CHECK 값에 따라 옵션을 줬어요.

지금 생각해보니... 좀더 최적화 할 수 있겠네요.

간단히 보자면 아래와 같이 거의 html 수준으로 함수를 구현했어요.

지저분 하죠 ? 제 생각과 같네요.

버전 업그레이드 하면서 CODE를 나누지말고 CHECK값을 다양하게 뽑아서 하나의 함수로 합치면 좋을꺼같네요.


그리고 마지막으로 본문입니다.

printf "${FontYellow}[+] Gathering Info${FontReset}\n"

echo "------------------------------------"

printf " Program version: \t\t\t\t$PVERSION\n"

printf " Gathering Date: \t\t\t\t$(date +%Y)/$(date +%m)/$(date +%d)\n"

echo ""

printf "${FontYellow}[+] OS Info${FontReset}\n"

echo "------------------------------------"

printf " Detecting OS...\t\t\t\t[ `OS_STATUS`]\n" 

printf " Operating system: \t\t\t\t`uname -s`\n"

printf " Operating system name: \t\t\t$OS\n"

printf " Operating system version: \t\t\t`cat /etc/redhat-release`\n"

printf " Kernel version: \t\t\t\t"$(uname -r |cut -d- -f1)"\n"

printf " Hardware platform: \t\t\t\t"$ARCH" Bit \n"

printf " Hostname: \t\t\t\t\t"$(hostname)" \n"

echo ""

printf "${FontYellow}[+] Boot and services${FontReset}\n"

echo "---------------------------------------------------"

printf " Check enabled services at boot\t\t\t[ `PROCESSCOUNT`]\n"

본문에 라인 관리를 위해서 \t로 TAB 처리를 좀 많이 했는데, 소스상은 지저분 해보이는데... 이것도 방법을 못찾아서...

결과 적으로 ....

허접한 소스를 굳이 시간낭비하면서 보고싶으시다면 소스 주소를 복사해서 붙여 넣으시면 다운받으실수 있어요.

소스주소 : http://goo.gl/rZSouj
클릭하시면 멘붕의 세계로 GOGOGO!!!









댓글을 달아 주세요