'운영체제 (L,B,WIN)'에 해당되는 글 609건

  1. 2008.10.10 리눅스 시스템의 소프트레벨 커널 튜닝
  2. 2008.10.10 사용자 계정 암호 분실로 로그인 불능 시의 대책 (7)
  3. 2008.09.11 로그 모니터링시 특정 문자를 highlight 하기 (2)
2008.10.10 19:20

리눅스 시스템의 소프트레벨 커널 튜닝

################################################################################

  리눅스에서 syn flooding 등 각종 공격에 대응하기 위하여 시스템의 kernel 튜닝을
  하는 것이 좋다.
  다음의 기능이 작동하도록 커널 튜닝을 하여라.

   * ping 요청에 반응하지 않도록 설정한다.
   * 소스 라우팅을 차단한다.
   * synflooding 에 대응하기 위해 syncookie를 설정한다.
   * ICMP Redirect를 차단한다.
   * 스푸핑, 소스 라우팅 및 리다이렉트된 패킷은 로그에 남긴다.
   * 패킷 포워딩을 차단한다.

################################################################################
---]]]
syncookies 기능을 켠다

Syncookies('신쿠키'라고 발음한다)는 'Three-way handshake'진행과정을 다소 변경 하는 것으로 Alex Yuriev와 Avi Freedman에 의해 제안되었는데, TCP 헤더의 특정한 부분을 뽑아내어 암호화 알고리즘을 이용하는 방식으로 Three-way Handshake가 성공적으로 이루어지지 않으면 더 이상 소스 경로를 거슬러 올라가지 않는다. 따라서 적절한 연경 요청에 대해서만 연결을 맺기 위해 리소스를 소비하게 되는 것이다.

syncookies 기능은 TCP_Syn_Flooding 공격을 차단하기 위한 가장 확실한 방법으로 이 기능을 이용하려면 일단 커널 컴파일 옵션에서 CONFIF_SYN_COOKIES이 Y로 선택되어 있어야 한다. 자신의 커널 옵션에 이 기능이 설정되어 있는지 /usr/src/linux 디렉토리로 이동 후 make menuconfig 후 다음과 같이 확인하면 된다.

Networking options ---> [*] IP: TCP syncookies support (disabled per default)

만약 설정이 되어 있지 않다면 선택 후 커널 컴파일을 다시 하여야 하지만 대부분 배포본은 기본적으로 이 옵션이 선택되어 있으므로 걱정할 필요는 없다. 그러나 위와 같이 커널 옵션에 설정되어 있다 하더라도 실제 syncookies 적용은 꺼져 있으므로 이 값을 다음과 같은 방법으로 활성화해야 한다.

[root@control src]# sysctl -a | grep syncookienet.ipv4.tcp_syncookies = 0

0으로 설정되어 있으므로 현재 syncookies는 적용되지 않는다. 따라서 다음과 같이 1을 설정하여 syncookies 기능을 활성화도록 한다.

[root@control src]# sysctl -w net.ipv4.tcp_syncookies=1

syncookies는 백로그큐가 가득 찼을 경우에도 정상적인 접속요구를 계속 받아들일수 있도록 해주므로 SYN_Flooding 공격에 대비한 가장 효과적인 방법중 하나다. 만약 공격을 당해 syncookies가 작동할 때에는 /var/log/message 파일에 아래와 같이 SynFlooding 공격이 진행중이라는 메시지가 출력된다.

Jun 11 18:54:08 net kernel: possible SYN flooding on port 80. Sending cookies.

SYN_Flooding 공격이 지속적으로 매우 심하게 진행중일 때에는 syncookies 기능이 작동한다 하더라도 네트워크가 다운되는 현상이 가끔 확인되었다. 따라서 syncookies 기능 외에 몇 가지 설정도 함께 적용하는 것이 시스템의 안정성을 위해 권장하는 방법이다. 아울러 네트워크가 다운되었을 경우에는 /etc/rc.d/init.d/network restart로 네트워크를 재설정해 보거나 리부트해야 한다.

----------------------------------------------------------------------
기타 시스템의 네트워크 설정을 최적화한다

다음 설정은 비단 TCP Syn_Flooding 공격뿐만 아니라 다른 여타 DoS공격에도 효과적으로 방어하므로 적절히 설정할 것을 권장한다.

sysctl -w net.ipv4.icmp_destunereach_rate=1
# 1/100초 동안 받아들일 수 있는 "dest unreach (type 3) icmp"의 개수

sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
# Broadcast로부터 오는 핑을 차단함(Smurt 공격을 차단함).

sysctl -w net.ipv4.icmp_echoreply_rate=1
# 1/100초에 반응하는 핑의 최대 숫자

sysctl -w net.ipv4.icmp_echo_ignore_all=1
# 모든 핑을 차단함

sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
# IP 나 TCP 헤더가 깨진 bad icmp packet을 무시한다.

sysctl -w net.ipv4.icmp_paramprob_rate=1
# 1/100 초에 받아들이는 param probe packet의 수

sysctl -w net.ipv4.icmp_timeexceed_rate=1
# 1/100 초에 받아들이는 timeexceed 패킷의 수(traceroute와 관련)

sysctl -w net.ipv4.igmp_max_memberships=1
# 1/100초에 받아들이는 igmp "memberships"의 수

sysctl -w net.ipv4.ip_default_ttl=64
# 매우 복잡한 사이트에서는 이 값을 늘리는 것도 가능하지만 64로 두는
  것이 적당하며 더 늘렸을 경우에는 큰 문제가 발생할 수도 있다.

sysctl -w net.ipv4.ip_forward=0
# 게이트웨이 서버가 아닌 이상 패킷을 포워딩 할 필요는 없다.

sysctl -w net.ipv4.ipfrag_time=15
# fragmented packet이 메모리에 존재하는 시간을 15초로 설정한다.

sysctl -w net.ipv4.tcp_syn_retries=3
# 일정한 시간과 IP별로 보내고 받는 SYN 재시도 횟수를 3회로 제한한다.
  이 옵션은 스푸핑된(위조된) 주소로 오는 SYN 연결의 양을 줄여준다.
  기본 값은 5이며 255를 넘지 않아야 한다.

sysctl -w net.ipv4.tcp_retries1=3
# 무언가 문제가 있을 때 연결을 위해 재시도 할 횟수,
  최소 값과 기본 값은 3이다.

sysctl -w net.ipv4.tpc_retries2=7
# TCP 연결을 끊기 전에 재시도할 횟수.

sysctl -w net.ipv4.conf.eth0.rp_filter=2
sysctl -w net.ipv4.conf.lo.rp_filter=2
sysctl -w net.ipv4.conf.default.rp_filter=2
sysctl -w net.ipv4.conf.all.rp_filter=2
# 이 설정은 자신의 네트워크가 스푸핑된 공격지의 소스로 쓰이는 것을
  차단한다. 모든 인터페이스에서 들어오는 패킷에 대해 reply를 하여
  들어오는 인터페이스로 나가지 못하는 패킷을 거부한다.

sysctl -w net.ipv4.conf.eth0.accept_redirect=0
sysctl -w net.ipv4.conf.lo.accept_redirect=0
sysctl -w net.ipv4.conf.default.accept_redirect=0
sysctl -w net.ipv4.conf.all.accept_redirect=0
# icmp redirects를 허용하지 않는다.
  만약 ICMP Redirect를 허용할 경우에는 공격자가 임의의 라우팅 테이블을
  변경할 수 있게 되어 자신이 의도하지 않는 경로, 즉 공격자가 의도한
  경로로 트래픽이 전달될 수 있는 위험이 있다.

sysctl -w net.ipv4.conf.eth0.accept_source_route=0
sysctl -w net.ipv4.conf.lo.accept_source_route=0
sysctl -w net.ipv4.conf.default.accept_source_route=0
sysctl -w net.ipv4.conf.all.accept_source_route=0
# 스푸핑을 막기 위해 source route 패킷을 허용하지 않는다.
  소스 라우팅을 허용할 경우 악의적인 공격자가 IP 소스 라우팅을
  사용해서 목적지의 경로를 지정할 수도 있고, 원래 위치로 돌아오는
  경로도 지정할 수 있다. 이러한 소스 라우팅이 가능한 것을 이용해 공격
  자가 마치 신뢰받는 호스트나 클라이언트인 것처럼 위장할수 있는것이다.
sysctl -w net.ipv4.conf.eth0.bootp_relay=0
sysctl -w net.ipv4.conf.lo.bootp_relay=0
sysctl -w net.ipv4.conf.default.bootp_relay=0
sysctl -w net.ipv4.conf.all.bootp_relay=0
# bootp 패킷을 허용하지 않는다.

sysctl -w net.ipv4.conf.eth0.log_martians=0
sysctl -w net.ipv4.conf.lo.log_martians=0
sysctl -w net.ipv4.conf.default.log_martians=0
sysctl -w net.ipv4.conf.all.log_martians=0
# 스푸핑된 패킷이나 소스라우팅, Redirect 패킷에 대해 로그파일에 정보를 남긴다.

sysctl -w net.ipv4.conf.eth0.secure_redirects=0
sysctl -w net.ipv4.conf.lo.secure_redirects=0
sysctl -w net.ipv4.conf.default.secure_redirects=0
sysctl -w net.ipv4.conf.all.secure_redirects=0
# 게이트웨이로부터의 redirect를 허용하지 않음으로써 스푸핑을 막기 위해 설정한다.

sysctl -w net.ipv4.conf.eth0.send_redirects=0
sysctl -w net.ipv4.conf.lo.send_redirects=0
sysctl -w net.ipv4.conf.default.send_redirects=0
sysctl -w net.ipv4.conf.all.send_redirects=0
# icmp redirects를 보내지 않는다.

sysctl -w net.ipv4.conf.eth0.proxy_arp=0
sysctl -w net.ipv4.conf.lo.proxy_arp=0
sysctl -w net.ipv4.conf.default.proxy_arp=0
sysctl -w net.ipv4.conf.all.proxy_arp=0
# proxy arp를 설정하지 않는다. 이 값이 1로 설정되었을 경우
  proxy_arp가 설정된 인터페이스에 대해 arp 질의가 들어왔을 때
  모든 인터페이스가 반응하게 된다.

sysctl -w net.ipv4.tcp_keealive_time=30
# 이미 프로세스가 종료되어 불필요하게 남아 있는 연결을 끊는 시간을 줄이도록 한다.

sysctl -w net.ipv4.tcp_fin_timeout=30
# 연결을 종료시 소요되는 시간을 줄여준다(기본 설정값: 60).

sysctl -w net.ipv4.tcp_tw_buckets=720000
# 동시에 유지 가능한 timewait 소켓의 수이다. 만약 지정된 숫자를 초과하였을 경우에는 timewait 소켓이 없어지며 경고 메시지가 출력된다. 이 제한은 단순한 DoS 공격을 차단하기 위해 존재하는데, 임의로 이 값을 줄여서는 안되며 메모리가 충분하다면 적절하게 늘려주는 것이 좋은데, 64M 마다 180000으로 설정하면 된다. 따라서 256M일 경우에는 256/4=4 4*180000=720000

sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_max_ka_probes=100
# 간단한 DoS 공격을 막아준다.

위의 모든 설정은 재부팅 후에 원래의 값으로 다시 초기화되므로 /etc/rc.d/rc.local 에 두어 부팅시마다 실행하도록 하여야 한다. 그리고 리눅스의 버전이 낮아 sysctl 명령어가 없는 경우에는 echo 0 or 1 > /proc/sys/net/*와 같이 직접 /proc 이하의 값을 직접 설정해 주어도 된다. echo 명령어 역시 재부팅되면 초기화되므로 /etc/rc.d/rc.local 에 설정해 두어야 재부팅후에도 적용이 된다. 아울러 레드헷 6.2 이상일 경우에는 /etc/sysctl.conf 파일에 net.ipv4.tcp_syncookies=1과 같이 설정한 후 네트워크를 재시작하는 방법도 있다.


[[[---G
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_always_defrag = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_max_syn_backlog=1280
net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.all.accept_source_route=0
net.ipv4.tcp_syncookies=1
net.ipv4.conf.all.accept_redirect=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.log_martians=1
net.ipv4.ip_forward=0


Trackback 0 Comment 0
2008.10.10 17:34

사용자 계정 암호 분실로 로그인 불능 시의 대책


시작하기

아래에 설명하는 방법은 Windows Vista의 모든 에디션에 적용됩니다.

아래에 설명하는 방법은 OEM 메이커의 Recovery DVD 또는 일반 Vista 설치 DVD로 부팅하여 Windows RE의 [시동 복구]에서 복구하는 방법을 중심으로 설명하고 있습니다.

그러나, 결론적으로 Vista는 정히 원한다면 FAT32에서도 설치 가능하지만 일반적으로 NTFS의 파일 시스템에서 설치하여 사용하기에, 좌우지간에 NTFS를 인식하는 부팅 매체로 부팅하여 'Copy' 명령어를 사용할 수 있는 환경이라면 목적으로 하는 이 작업이 가능합니다.

아래 링크는 참고 사항입니다.

예를 들면, Windows 98 SE의 부팅 디스켓을 변형하여 NTFS를 인식하도록 만든 디스켓이나 시디로 부팅하여 이 작업을 하여도 된다는 뜻입니다.


2. 주의 사항

Windows Vista에도 XP와 마찬가지로 암호 관련 레지스트 파일인 SAM 파일이 존재합니다.

VIsta의 경우엔 이 SAM 파일이 XP와는 달리 아래 폴더 안에 있음이 이 작업의 주안점입니다.

  • C:\windows\system32\config\regback

사용자 계정 암호가 저장 되어 있는 SAM 파일을 초기화하는 방법(삭제로는 안 됨)으로 이 문제를 해결할 수 있습니다.

CD롬으로 우선 부팅되도록 CMOS Setup에서 설정합니다.

'CD롬 우선 부팅 순서 설정'에 대한 방법은 웹 검색하여 그 방법을 숙지토록 합니다.


3. 작업의 실제

시스템의 전원을 인가한 후 제공받은 비스타 복구 DVD(OEM 메이커의 Recovery DVD 또는 Windows Vista 설치 DVD)를 ODD에 넣습니다.

복구 DVD는 제품 사양에 따라 다를 수 있습니다.

아래와 같은 메세지가 나오면 CD롬로 부팅하기 위하여 키보드의 아무 키나 누릅니다.


잠시 기다린 후 [백업 및 복원 센터]를 선택합니다.

OEM 메이커에서 제공한 'Recovery CD'가 아닌 일반 Windows Vista 설치 매체(보통 DVD)로 이 작업을 시작하는 경우는 아래 그림 바로 밑의 그림이 화면에 나타납니다.


[시스템 복구 옵션]에서 한국어를 선택 후 [다음] 버튼을 누릅니다.


'윈도우 설치 검색 중'이라는 메세지가 나오면 잠시 기다립니다.


[시스템 복구 옵션]에서 설치된 비스타를 선택 후, [다음] 버튼을 클릭합니다.


[시스템 복구 옵션] 대화 상자의 [명령 프롬프트] 링크를 클릭합니다.


명령 프롬프트 창이 나오면 하드디스크의 루트로 디렉토리를 옮기기 위하여 'c:'을 타자 후 엔터키를 누릅니다.


아래를 타자 후 엔터키를 누릅니다.

  • copy C:\windows\system32\config\regback\sam C:\windows\system32\config /y

단 이 위 명령어는 사용자의 Vista가 C 하드 디스크에 설치된 경우의 명령줄이므로 멀티 부팅 환경 등에서는 하드 디스크의 드라이브 문자가 다르기에 명령줄의 적절한 편집이 필요함에 유의합니다.


'1개의 파일이 복사되었습니다'라는 메시지를 확인할 수 있습니다.


명령 프롬프트에서 'EXIT'를 입력 후 엔터키를 눌러 명령 프롬프트 창을 닫습니다.


[시스템 복구 옵션] 상자의 하단에 위치한 [다시 시작] 버튼을 클릭하여 시스템을 재부팅합니다.


컴퓨터가 재시작되면, 사용자 계정 암호가 초기화되었음을 확인할 수 있습니다.

사용자가 원하는 암호로 재설정할 수도 있습니다.  


Trackback 1 Comment 7
  1. 박재하 2009.02.20 21:35 address edit & del reply

    친절하고 유용한 답변 감사합니다. 그런데 님이 말씀하신대로 하면, 암호 입력란과 하단에 암호초기화라 나오는데, 암호초기화는 비번을 잊어버렸을 경우를 대비하여, 이동식 디스크에 저장했을경우에만 사용할수 있는게 아닌지요. 님이 얘기한데로 해 봤지만, 안됩니다. 해결책을 알려주시면 감사하겟습니다. jaehap@hanmail.net

    • 윈도우 2009.02.23 14:29 address edit & del

      기본적으로 암호 초기화 하는 파일은 위에서 제시한 폴더에 존재합니다. 참고로 XP의 경우 C:₩windows₩repair 폴더에 있지만, VIsta의 경우엔 C:₩windows₩system32₩config₩regback 폴더에 있습니다. 실제 사용중인 config 폴더 아래의 sam 파일을 초기화 파일로 덮어씌워주면 비밀번호가 초기화 되어서 재부팅 하시면 비밀번호 없이 로그인이 가능합니다.

  2. 김현주 2009.05.23 13:51 address edit & del reply

    이대로 해봤는데 계속 로그인 창 뜨면서 하기전이랑 똑같아요.. 어떻게 방법 없을까요?ㅜ
    저 오늘 하루 종일 이것때문에 너무 힘듭니다 ㅠㅠ

    • 복구 2009.05.24 21:53 address edit & del

      위 모든 절차가 정상적으로 되었는지요...

      윈도우 버젼은 Vista 가 맞으시죠?

      제가 알기로도 초기 SAM 파일만 복사하면 되는걸고 알고 있는데~

  3. elie 2009.08.30 12:00 address edit & del reply

    같은 프로그램으로 처음부터 쭈욱 따라해서 파일도 복사하고 다시시작 눌렀는데 로그인 창 떠요.. CD를 언제 빼야할지도 잘 모르겠고 몇 번을 따라해봐도 안 되네요 ㅠ

  4. 이은숙 2010.01.07 10:22 address edit & del reply

    안전모드 세가지 모두 해봤지만 모두가 암호치라고 나옵니다,,,정말 포맷해야하는 방법뿐인가요?

  5. 김용장 2010.11.05 09:41 address edit & del reply

    저도 여기 방법되로 해 봤지만 여전히 해결 안됩니다.
    offline NT password & Registry Editior'라는 프로그램으로 어드민 패스워드 리셋시킬수 있다고 합니다. 참고하시길

2008.09.11 17:57

로그 모니터링시 특정 문자를 highlight 하기

apache 웹로그, php 에러로그, syslog를 통한 로그를 모니터링할 때 특정 문자열에 대해서는 highlight해주면 원하는 부분만 쉽게 볼 수 있을 것이다. 또한 수치를 모니터링하는 경우, 0~59는 양호, 60~79 주의, 80~99는 경고를 나타내기위해 각각 녹색, 파란색, 빨간색으로 표시해준다면, 많은 로그가 순간적으로 스크롤되더라도 눈에 쉽게 띌 것이다.
이 글은 highlight 처리를 해주는 1) sed를 이용한 쉘스크립트와 2) 이보다 더 나은 perl 스크립트를 통해 모니터링하는 방법을 설명한다.

1. sed를 이용한 highlight 스크립트

* view.sh 내려받기

#!/bin/bash
#
# 특정 문자를 highlight한다. (view.sh)
#
# by 좋은진호(truefeel, http://coffeenix.net/ )

# color
szColBk="^[[;30m";      szColBk1="^[[1;30m"     # black
szColRe="^[[;31m";      szColRe1="^[[1;31m"     # red
szColGr="^[[;32m";      szColGr1="^[[1;32m"     # green
szColYe="^[[;33m";      szColYe1="^[[1;33m"     # yellow
szColBl="^[[;34m";      szColBl1="^[[1;34m"     # blue
szColPu="^[[;35m";      szColPu1="^[[1;35m"     # magenta(purple)
szColCy="^[[;36m";      szColCy1="^[[1;36m"     # cyan
szColGy="^[[;37m";      szColWh="^[[1;37m"      # white
szNormal="^[[;m"

#
sed \
        -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \
        \
        -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
        \
        -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(proftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(ftpd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(sshd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(xinetd\)/${szColCy}\\1$szNormal/g" \
        -e "s/\(Connection attempt\)/${szColRe1}\\1$szNormal/g" \
        -e "s/\(authentication failure\)/${szColRe1}\\1$szNormal/g" \
        -e "s/\(BAD SU\)/${szColRe1}\\1$szNormal/g" \
        \
        -e "s/\(nfs server\)/${szColYe}\\1/g" \
        \
        -e "s/$/$szNormal/g"
[/quote]

사용은 tail -f 로그파일명 |./view.sh 형태로 사용하면 된다.

첫번째 부분은 색깔을 정의한 변수이다. 여기서 ^[[;31m ANSI코드로, ^[ 문자는 ESC키를 의미한다. 쉘에서 입력할 때 Ctrl+V를 누른 후 ESC키를 누르면 입력할 수 있다. 색깔은 사용하는 터미널에 따라서 약간 다르게 표시될 수도 있다.


그 다음부터는 sed를 이용해서 문자열을 변환처리하며, 한줄당 하나의 정규표현식을 사용하였다. 부분적으로 살펴보자.

 1:     -e "s/^[A-Z][a-z][a-z] *[0-9]* //g" \

기본적으로 -e s/변환전문자열/변환후문자열/g 형식을 사용하는데, 위는 syslog를 통해 남은 로그중 'Oct 30'과 같이 '월일'을 표시하지 않기 위한 정규표현식이다.
 
 1:     -e "s/ \(192.168.123.[0-9]*\)/${szColGr} \\1$szNormal/g" \
 2:     \
 3:     -e "s/\(httpd\)/${szColCy}\\1$szNormal/g" \
 4:     -e "s/\(vsftpd\)/${szColCy}\\1$szNormal/g" \

첫번째줄은 특정 IP대역을 highlight하기 위한 것으로 서버의 IP, 접속하는 PC의 IP등을 한줄에 하나씩 적어주면 좋을 것이다. 두번째줄의 \ 은 보기 좋게 구분하기 위한 것이며, 세번째와 네번째줄은 각각 httpd와 vsftpd를 highlight한다.

 1:     -e "s/\(nfs server\)/${szColYe}\\1/g" \
 2:     \
 3:     -e "s/$/$szNormal/g"

첫번째줄은 'nfs server'로 문자열이 나온다면, 해당 줄 끝까지 highlight한다. ${szColYe}\\1과 server과 ${szColYe}\\1$szNormal 의 차이를 생각하면 쉽게 이해가 될 것이다. 세번째줄은 줄의 끝부분에서 색깔 표시는 정상으로 돌려놓으라는 의미이다.

2. perl을 이용한 highlight 스크립트


위의 예제를 통해서 원하는 문자열을 원하는 색깔로 highlight하는 것은 쉽게 할 수 있을 것이다. 이젠 perl이용한 방법을 소개한다.

* view.pl 내려받기

#!/usr/bin/perl
#
# 특정 문자를 highlight한다. (view.pl)
#
# by 좋은진호(truefeel, http://coffeenix.net/ )

# color
$szColBk ="^[[;30m";    $szColBk1 ="^[[1;30m";  # black
$szColRe ="^[[;31m";    $szColRe1 ="^[[1;31m";  # red
$szColGr ="^[[;32m";    $szColGr1 ="^[[1;32m";  # green
$szColYe ="^[[;33m";    $szColYe1 ="^[[1;33m";  # yellow
$szColBl ="^[[;34m";    $szColBl1 ="^[[1;34m";  # blue
$szColPu ="^[[;35m";    $szColPu1 ="^[[1;35m";  # magenta(purple)
$szColCy ="^[[;36m";    $szColCy1 ="^[[1;36m";  # cyan
$szColGy ="^[[;37m";    $szColWh  ="^[[1;37m";  # white
$szNormal="^[[;m";

#
$szBeep="\a";

#
while(<STDIN>) {
    # log에서 필요없는 부분 삭제
        s/^[A-Z][a-z][a-z] *[0-9]* //g;

    # IP
        s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;

    # 줄 끝은 정상 색으로 변경
    s/$/$szNormal/;

    # 원하는 문자열에 색을 입힌다
        s/(httpd)/$szColCy$1$szNormal/g;
        s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;
        s/(sshd)/$szColCy$1$szNormal/g;
        s/(xinetd)/$szColCy$1$szNormal/g;
        s/(Connection attempt)/$szColRe1$1$szNormal/g;
        s/(authentication failure)/$szColRe1$1$szNormal/g;
        s/(BAD SU)/$szColRe1$1$szNormal/g;

    # 원하는 문자열을 찾으면 줄 끝까지 색을 읽힌다.
        s/(nfs server)/$szColYe$1/g;

    print $_;
}

사용은 shell스크립트를 사용할 때와 동일하게 tail -f 로그파일명 |./view.pl 형태로 사용하면 된다.

 1:     s/(192\.168\.123\.[1-9][0-9]{0,2})/$szColGr$1$szNormal/g;
 2:     ... 생략...
 3:     s/(vsftpd|proftpd|ftpd)/$szColCy$1$szNormal/g;

첫번째줄에서 192\.168\.123\.[1-9][0-9]{0,2} 은 sed를 이용할 때보다 더 정교하게 IP를 체크한 것으로, 1) 192.168.123. 시작하는 IP대역 2) 그 다음 1~9까지 숫자이고, 그다음에 숫자가 오게된다면 0~9까지 숫자가 0자리~2자리까지 가능하다. 정규 표현식에 대한 자세한 사항은 이 글의 주제를 벗어나는 내용이므로 '4 참고 자료'를 살펴보기 바란다. 세번째줄은 vsftpd, proftpd, ftpd 등의 문자를 highlight한다.

다음은 위의 스크립트를 이용하여 로그를 모니터링한 화면이다.

3. 수치에 따라 다른 색으로 표시

어떤 로그에 수치가 다음과 같이 실시간으로 쌓인다고 가정하자. 그리고, 그 수치는 'disk 54'와 같은 형태로 되어 있다.

---------  ------   --------
측정수치    상태     색깔
---------  ------   --------
0~59       양호      녹  색
60~79      주의      파란색
80~100     경고      빨간색
---------  ------   --------

다음은 perl을 이용하여 색을 표시하는 예이다. 그리고, 수치가 80이상일 땐 beep음을 발생한다. 이런한 방법은 서버의 load, disk 사용량, disk I/O, 커넥션 수, 메모리 사용량 등을 모니터링할 때 유용하게 사용할 수 있다.

 s/(disk [0-9][^0-9])/$szColGr$1$szNormal/;
 s/(disk [1-5][0-9][^0-9])/$szColGr$1$szNormal/;
 s/(disk [6-7][0-9])/$szColBl$1$szNormal/;
 s/(disk [8-9][0-9])/$szColRe1$1$szNormal$szBeep/;
 s/(disk 100)/$szColRe1$1$szNormal$szBeep/;

4. 참고 자료

* ANSI color codes
  http://pueblo.sourceforge.net/doc/manual/ansi_color_codes.html
* 정규표현식
  http://coffeenix.net/dir_catagory.php?cata_code=99
* Perl regular expressions
  http://www.perl.com/doc/manual/html/pod/perlre.html


출처 : 커피닉스( http://coffeenix.net/ )

Trackback 0 Comment 2
  1. 쇼코 2008.09.12 04:58 address edit & del reply

    허긍..이것이 다 모다요? 어렵잖아..전문가들이 쓰는거네=_=

  2. 2008.12.30 00:10 address edit & del reply

    비밀댓글입니다