12. 문제 해결 (Trouble Shooting)

 

  이번 장에서는 서버를 운영하면서 만나게 되는 장애들 중에서 호스트웨이의 온라인 고객지원과,

  개인적으로 질문받는 것들중에서 대표적인 것들에 대한 해결책을 제시하고자 한다.

 

 1. 웹 속도가 갑자기 느려졌습니다.

    → 웹 속도가 느려졌을 때 문제를 해결해 보기 위해서는 다음과 같은 방법들을 사용해 보면 됩니다

      1) 현재 사용하는 컴퓨터에서 느려지는 해당 서버로 ping을 보내본다.

         ( time<10ms이면 지극히 정상이다. 네트워크 쪽으로는 문제가 없는 것이다. )

      2) 아파치 웹로그가 많이 쌓여 있는지 체크한다.

         ( 아파치의 웹로그는 최대 생성할 수 있는 크기가 2G이며, 웹 로그의 크기가 커질수록 로그 파일을

          읽어서 제일 하단에 로그를 쌓아야 하므로 로그파일이 클 수로 웹 접속속도가 떨어질 수밖에

          없다. )

     3) 현재 80번 포트를 사용해서 웹에 접속중인 사용자들의 현황을 살펴본다.

         netstat -nap | grep :80 | grep EST | wc -l 이란 명령을 사용하면 현재 웹에 접속되어 있는

        프로 세서 수를 확인할 수 있다. 이 수가 httpd.conf에서 설정한 Maxclient와 가깝거나 혹은 더

        많지는 않은지 살펴본다.

     4) top 명령으로 현재 cpu의 사용률이나, 메모리 사용량등을 체크해본다.


 2. 웹이 뜨지 않습니다.

  → 대부분의 경우는 apache 데몬이 다운된 것이 원인이 될 수 있다.

     /usr/local/apache/bin/apachec시 [start|stop|restart] 명령을 사용하여 재가동 하면 된다.


 3. mysql에 접속되지 않습니다.

  → mysql 데몬이 떠있는지 확인하는 것이 중요하다.

     ps -aef | grep mysql 이란 명령으로 mysql데몬이 떠있는지 확인하시고, 만약 떠있지 않다면

     /usr/local/mysql/bin/safe_mysqld & 명령으로 재가동 한다.

     과거에 설치된 소스의 경우에는

     cd /usr/local/mysql

     bin/safe_mysqld & 라고 해야 mysql이 정상 부팅 되는 것도 있으므로 참고하시기 바랍니다.

     만약 데몬이 동작하고 있는데 제대로 연결이 안 될때는 mysql데몬을 내렸다가 (pkill mysql)

     재 가동 하시면 됩니다. (이때는 apache데몬이 mysql과 같이 연동되어 제대로 종료가 안될 수도

     있으므로 apache와 mysql 동시에 다운시켰다가 재 가동해야 합니다.)


 4. mysql의 table이 깨졌다는 메시지가 출력됩니다.

  → mysql의 table이 깨졌다고 나오는 것은 mysql데이터가 뒤섞여서 일어나는 일이 많습니다.

    이때에는 myisamchk 라는 명령으로 복구를 해주시면 됩니다.

    즉, /usr/local/mysql/data/columns_priv.MYI(D) 라는 것이 table이 깨졌다는 메시지가 출력된다면,

    /usr/local/mysql/bin/myisamchk -r /usr/local/mysql/data/columns_priv 라고 해주면 깨진 table

    을 정상적으로 복구 시켜 주게 됩니다. 이때 먼저 mysql을 중지시키고 하시는 것이 안전합니다.


    복구를 시켰는데도 불구하고 복구 시킬당시에는 정상작동 되다가 얼마후에 또다시 깨지는 일이 발

    생 한다면 그것은 디스크 공간을 의심해 볼 필요가 있습니다.

    df 명령으로 파티션 정보를 출력하여 mysql data가 들어있는 /usr의 파티션 용량이 100%는 아닌지

    확인해 주시기 바랍니다.


 5. mysql 의 root 패스워드를 분실 했습니다.

  → 이럴때에는 우선 mysql 데몬을 중지 시킵니다.

     그리고 나서 /usr/local/mysql/bin/safe_mysqld -Sg & 옵션으로 부팅을 하면 루트 패스워드 없이

      mysql에 접속할수 있습니다. 접속후 root패스워드를 변경해주시면 됩니다.

     (패스워드 변경 update user set password=password('패스워드‘) where user ="root"; 라고 해

      주시면 됩니다. 이것은 mysql db에 접속해서 내리는 쿼리문입니다.)

 

 6. 하드 파티션 포맷

  → 하드를 추가 장작이나 fdisk로 나눈후에는 파일시스템을 생성해 주어야 합니다.

     이 과정은 windows 시스템의 format과 같은 과정입니다.

     우선 파일을 포맷할 시스템이 /dev/hdb라고 가정했을때 다음과 같은 명령을 내려주면 됩니다.

      mkfs -j /dev/hdb (이것은 ext3파일 시스템으로 하드디스크를 포맷하는 명령입니다.)


 7. IP로는 웹에 접속 가능한데 domain으로는 웹에 접속이 안됩니다.

  → 이것은 DNS가 제대로 서비스를 해주지 못하는 경우에 발생을 합니다.

      도메인으로 입력을 하면 DNS에서는 이것을 IP로 변경하여 주는역활을 하는 것인데 이 동작이 제대로 수행이 되지 않아서 발생하는 문제입니다. 이때에는 현재 운영하는 도메인의 네임서버가 어디로 잡혀있는지 확인 후에 DNS설정이 되어있는곳에 문의를 하시면 됩니다. 도메인의 네임서버가 호스트웨이의 네임서버일 경우에는 호스트웨이에 문의하시면 됩니다.


 8. 가상 호스팅 설정

  → 가상 호스팅이란 하나의 IP를 가진 서버에서 여러 개의 multi도메인을 운영할 수 있는 방법이다.

     설정은 다음과 같다.

     NameVirtualHost 211.239.151.21 (서버의 IP - IP기반 가상 호스팅 이름기반 가상호스팅을

    한다는 설정이므로 최초 한번만 설정해준다)

    <VirtualHost 211.239.151.21>

        ServerAdmin zmnkh@manpage.co.kr

        DocumentRoot /home/manpage/public_html

        ServerName manpage.co.kr

        ServerAlias www.manpage.co.kr

        ErrorLog logs/dummy-host.example.com-error_log

        CustomLog logs/dummy-host.example.com-access_log common

    </VirtualHost>



   위와 같은 설정을 필요한 도메인 수만큼 반복하여, 작성해 주면 된다.

  <VirtualHost> ~ </VirtualHost> 의 내용을 반복!!

   (물론 도메인과 홈페이지의 DocumentRoot는 바꿔줘야 한다.)


 9. user를 생성할 때마다 자동으로 계정 디렉토리 안에 public_html을 디렉토리를 생성하고자 합니다.

  → /etc/skel 이란 디렉토리로 이동하셔서 그안에 public_html 이라는 디렉토리를 생성해 놓으시면

    user를 생성할때, 그 안의 설정값을 읽어와서 계정생성에 참고하게 되므로 자동으로 public_html이

    생성되게 됩니다.


 10. 계정생성시 마다 자동으로 디렉토리 권한을 701로 주고 싶습니다.

  → 계정을 생성하게 되면 자동으로 700의 권한을 가지도록 생성되어 있습니다.

      그것을 깜박하고 가상 호스팅을 설정하여 웹에서 그 디렉토리를 보게되면, permission deny가 표시

      되게 됩니다. 이 때문에 다시 한번 서버로 접속하여, 해당 디렉토리의 권한을 수정하게 되는데 계정을 생성할 때마다 자동으로 701의 권한을 주고 싶으면 (다른 사용자들이 디렉토리를 열람할 수 없도록 웹에서 볼 수 있는 최소권한인 701만을 주는 것이 바람직 하다)

      /etc/login.defs을 열어서 제일 하단에  UMASK [tab] 076을 써주게 되면 계정생성시 마다 자동으로 701을 권한을 부여하게 된다. (tab은 사이를 tab으로 띄우라는 의미이다.)


 11. 서버의 시간이 틀립니다.

  → 서버의 시간은 여러 가지 이유로 변동이 될 수 있습니다. 다음과 같은 명령으로 해결이 가능합니다.  rdate -s time.bora.net && clock -w (하드웨어의 BIOS 시간까지 변경하라는 명령입니다.)


 12. vi로 파일을 열었는데 이미 열려진 파일이라고 에러화면이 나옵니다.

  → 가끔 httpd.conf등 자주 열어보는 파일을 vi로 편집하고자 열어볼 때, “이미 열린 파일이다. 읽기모드로 읽겠느냐, 아니면 빠져나가겠느냐, 그냥 진행하겠느냐” 등으로 메시지가 나올때가 있습니다.

      이는 누가 이미 httpd.conf 파일을 열었거나 과거에 httpd.conf를 열어보고 잘못된 종료를 하여 생성된 swap 파일이 지워지지 않아서 생기는 문제입니다.

      이럴때에는 ls -al 명령으로 해당 디렉토리를 보게되면 (httpd.conf파일의 경우) .httpd.conf.swp 라는 파일이 존재하는 것을 확인할수 있을 것이다. 파일을 편집기로 열어보면 자동적으로 .swp 파일이 생성이 되는데 종료를 잘못할 경우에 이 파일이 사라지지 않고 남아있게 된다. 이 파일을 지워주게 되면 질문과 같은 에러는 나오지 않는다.

  

 13. 웹에서 http://도메인/~계정으로 접근하고 싶습니다.

  → vi /usr/local/apache/conf/httpd.conf 명령으로 httpd.conf를 오픈하여

     다음과 같은 항목이 있는지 확인해본다. 주석으로 잠겨있으면 안됨!!

     <IfModule mod_userdir.c>

           UserDir public_html

     </IfModule>


   그리고 몇라인 아래에 다음과 같은 디렉토리 옵션의 주석을 모두 제거해준다.


  ===================

  <Directory /home/*/public_html>

      AllowOverride FileInfo AuthConfig Limit

      Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

      <Limit GET POST OPTIONS PROPFIND>

          Order allow,deny

          Allow from all

      </Limit>

      <LimitExcept GET POST OPTIONS PROPFIND>

          Order deny,allow

          Deny from all

      </LimitExcept>

  </Directory>

  ===================

  이때 Indexes 란 옵션은 반드시 제거한다.


  변경한후에 설정을 저장하고 나와서 /usr/local/apache/bin/apachectl restart를 해주게 되면

  적용이 된다.

  단, 이때 선행조건으로는 웹에서 보려고 하는 계정의 권한은 최소한 701(chmod 701 계정명)이 되어야 하며, 계정안에는 public_html이란 디렉토리가 존재해야 한다. 그리고 public_html안에는 index.php, index.html등의 처음 불러올수 있는 파일이 있었야 웹에서 오류가 나지 않고 정상적으로 확인이 가능하다.


 14. [보안 경고] Indexes 옵션을 제거 하십시오

  → /usr/local/apache/conf/httpd.conf의 설 정중 디렉토리 옵션으로 Indexes라는 옵션이 있습니다.

      이는 해당 디렉토리의 내용을 windows 의 디렉토리처럼 웹에서 보여질 수 있도록 하는 옵션입니다. 최근 이 옵션으로 서버내의 설정파일이나 내용을 확인하거나 외부로 유출하는등의 해킹시도가 부쩍 늘어나고 있습니다. 이에 이 Indexes옵션은 제거 하여 주시기 바랍니다.


 15. [보안 경고] apache 패키지 업그레이드

  → 최근 일어나는 해킹 사례들을 보면 취약한 아파치 패키지를 노려서 해킹을 하는 사례가 늘고 있습니다. 실제로도 몇건의 해킹이 그런 취약점을 통해서 발생을 하였습니다.

      RPM으로 설치된 apache를 패키지를 사용하고 있는 관리자 분들은 최신의 apache버전으로 업그레

      이드 해주시기 바랍니다.

      만일 업그레이드가 되지 않을시 에는 다음과 같은 방법으로 어느정도의 보완을 할 수는 있습니다.

      /etc/fstab 을 vi로 열어서

      LABEL=/tmp              /tmp                    ext3    defaults        1 2

      이라고 되어있는 부분을

      LABEL=/tmp              /tmp                    ext3    defaults,nosuid,noexec        1 2

     라고 추가 해주신 후에 저장하고 나와서 mount -oremount /tmp 라고 해주시면 다시 갱신이 됩니

     다. (혹은 reboot)


 

    이렇게 해줌으로써 tmp파일에는 실행파일이나, setuid가 붙은 파일은 생성할수 없게 되어 /tmp의

    777 취약점을 이용한 공격은 방어할수 있게 됩니다.

    하지만 이것이 모든것을 막아줄수 있는 것은 아니며, 최신의 패키지로 업그레이드 하는 것이 가장

    좋은 방법입니다.


    만약 mysql.sock등과 같은 setuid가 필요한 파일이 /tmp에 존재해야 할 경우 에는 /etc/my.cnf 파

    일을 만든 후에

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

    [mysqld]

    socket=/var/run/mysql.sock

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

    라고 적어주신 후에 chmod 775 /var/run, chgrp mysql /var/run

    해주시면 /var/run 밑에 mysql.sock이 생기므로 /tmp에 setuid가 필요없게 됩니다. (mysql restart

    가 필요 합니다.)


    해킹에 대비하기 위해서는 항상 백업을 습관화 하셔야 하며, 취약한 패키지나 사용하시는 OS의 취

    약점이 발견되면 그 즉시 패치를 하셔야 합니다.


 16. 해킹에 대한 대비

  → 아무리 철벽 보안을 한다고 해도 마음먹고 들어오는 해커에게는 당해낼 재간이 없다. 오로지 빠른 대처와 복구, 루트패스워드의 변경, 시스템의 상태를 꾸준하게 검사하는 것많이 해커를 막을수 있는 길이다. 즉 관리자가 부지런해야 해커에 대한 공격을 막을수 있는것이다.


    시스템은 운영중이다 갑자기 프로세서의 반응이 느려지고, 서버가 느려진다는 느낌을 받았을 때 시스템의 프로세서나 메모리가 과도하게 움직일때, 보지못한 불법 프로세서들이 작동하고 있을때에는 해킹을 의심해 봐야 한다.

 

    간단하게 체크해 보는 방법은 다음과 같다.


    - find /dev -type f (/dev 디렉토리 및에는 MAKEDEV 외에는 일반 파일이 존재 하지 않으므로

      이 명령을 내렸을 때, MAKEDEV 말고 다른 파일들이 나온다면 해킹을 의심해 봐야 한다.)


   - /tmp (/tmp 디렉토리를 확인해 본다. /tmp 디렉토리는 777 권한으로 누구든지 읽고 쓸수가 있으므로 이곳에 불법적인 실행파일이나 압축파일 혹은 못보던 디렉토리가 생성되지는 않았는지

               확인한다.)

   - find / -perm -4000 -print > perm.txt 라는 파일을 평소에 만들어 두고, 만일 해킹이 의심이  되면. find / -perm -4000 -print | more 명령을 내려서 기존에 만들어 두었던 perm.txt 라는 파일과 대조해보아 setuid 파일이 생성되지는 않았는지 체크한다.


    - vi /etc/passwd 파일을 체크해 보아 불법적으로 생성된 유저는 없는지 확인한다. 그리고 uid

      와  pid를 검사하여 일반 유저가 슈퍼유저의 권한을 가지고 있지는 않은지 체크한다.


   - 기타 소유권이 없는 파일이나 “...” 등으로 명시된 디렉토리, 혹은 이름이 붙어 있지 않는(공백) 디    렉토리등이 있는지 확인해본다.