2012년 6월 14일 목요일

Linux 서버 경량화(최적화) 설정

Linux 서버 경량화 설정

ver 0.5


경량화가 왜 필요한가

서버 OS 로 잘알려진 Unix 나 Windows 혹은 Linux 중, 어떤것을 선택한다 하더라도 주어진 기본 세팅값을 그대로 사용한다면 여러가지 문제점들이 존재합니다.
예를들어 사용하지 않는 어플리케이션이 서버 데몬으로 떠있으면 불필요한 자원낭비가 될것입니다. 예) nfsd, sendmail, portmap 등.
그리고 Linux 의 경우 소스가 공개되어 있기 때문에 해커가 공격할수 있는 여지가 존재합니다. 잠재적인 취약점을 가지고 있는 프로그램이나 데몬은 사용하지 않는것이 좋습니다.
경량화의 취지를 짧게 요약하자면 다음과 같습니다.
  • 시스템 보안성 향상
  • 서버 자원확보

준비사항

  • 하드웨어
    하드웨어는 크게 상관이 없습니다. Linux 설치가 가능한 PC 급 이상이면 무리없이 돌아갑니다.
  • 소프트웨어
    Redhat 기반 Linux(5.8 or 6.3)를 기반으로 설명합니다. RHES, CeontOS 에서 이상없이 작동되는것을 확인하였습니다.

run level 변경

최근의 Linux OS 패키지는 level 5(GUI 모드)가 기본으로 세팅되어 출시됩니다. 그러나 Oracle Installer 처럼 X11 이 꼭 필요한 서비스가 아니라면 굳이 무거운 X11 을 사용할 이유가 없습니다.
다음과 같이 runlevel 5 에서 runlevel 3(Full multi user mode)로 변경합니다.
[root@ ~]# vi /etc/inittab
#id 값이 5로 되어있다면 3으로 변경합니다
id:3:initdefault:
변경한 다음 init 명령을 이용하여 runlevel 3으로 변경하거나, reboot 을 실행하여 재부팅 합니다.
[root@ ~]# init 3

불필요한 서비스 중단

ntsysv 를 이용하여 불필요한 서비스는 내립니다. 필자는 crond, network, sshd, syslog 4개의 서비스를 제외하고 모두 uncheck 하였습니다. (주: WAS 나 Solr 같은 Java 를 사용하는 일반적인 서버는 위 4개의 서비스로 충분하지만, 서비스 성격이 다른 서버의 경우 시스템 관리자와 협의후 이용여부를 결정하시기 바랍니다)
[root@ ~]# ntsysv
[*] crond
[*] network
[*] sshd
[*] syslog
level3 디렉토리에 제대로 적용되었는지 확인
[root@ ~]# ls -l /etc/rc.d/rc3.d/
lrwxrwxrwx root root S10network -> ../init.d/network
lrwxrwxrwx root root S12syslog -> ../init.d/syslog
lrwxrwxrwx root root S55sshd -> ../init.d/sshd
lrwxrwxrwx root root S90crond -> ../init.d/crond
lrwxrwxrwx root root S99local -> ../rc.local
체크한 서비스의 파일들이 symbolic link 생성된것을 확인할수 있습니다. S** 로 시작하는 파일들은 S00, S01 이런식으로 순차적으로 네이밍 되는데 이것의 의미는 주어진 번호 순으로 해당 서비스를 실행한다는 의미입니다.

일반유저 생성

어플리케이션 관리 유저를 생성하고 패스워드를 지정합니다.
[root@ ~]# adduser sysadm01
[root@ ~]# passwd sysadm01
cron 사용권한 등록
[root@ ~]# echo sysadm01 >> /etc/cron.allow

재부팅

모든 작업이 완료되었다면 시스템을 재부팅 합니다

자동화

관리 해야할 서버가 소수라면 위에서 서술한것 처럼 각각의 step 을 밟아 셋업할 수 있지만 작업해야할 클러스터 수가 많다면 서버 세팅에 걸리는 시간이 만만치 않을 것입니다. 위에서 열거한 모든 step 을 실행하는 shell script 를 작성하여 각각의 클러스터에서 한번에 끝내도록 합니다.
[root@ ~]# cat /root/vHostSetup_root.sh

주의: 아래의 script 를 실행하면 시스템 reboot 을 실행합니다.작업중인 프로세스가 있다면 저장을 한 이후에 실행하거나 혹은 원격지에 서버가 있는 경우 시스템에 다른 문제가 생겨 booting 이 안될경우 시스템관리자에게 연락을 취하시기 바랍니다.
#!/bin/sh

# Usage : vHostSetup_root.sh [enter]
# Normal Machine
# Author: Jinho Lee

# Include Aliases and Functions
if [ -f ~/.bashrc ]; then
  source ~/.bashrc
fi

if [ -f ~/.bash_profile ]; then
  source ~/.bash_profile
fi

#어플리케이션 관리 유저
APP_USER=sysadm01

#유저 패스워드
PASSWD=yourPassword

optimizeService()
{

  #필요없는 OS 서비스를 모두 내려서 자원 확보 및 보안처리
  INIT_DIR=/etc/rc.d/init.d
  RUN_DIR=/etc/rc.d/rc3.d

  if [ ! -d $RUN_DIR ]; then
    echo "$RUN_DIR does not exists. exiting."
    exit 1
  fi

  cd $RUN_DIR
  rm -f ./S*

  ln -s $INIT_DIR/network ./S10network
  ln -s $INIT_DIR/syslog ./S12syslog
  ln -s $INIT_DIR/sshd ./S15sshd
  ln -s $INIT_DIR/crond ./S30crond
  ln -s /etc/rc.d/rc.local ./S99local
}

addAppUser()
{
  #작업폴더 설정
  DATA_DIR=/data001
  
  #User 생성 및 패스워드 설정
  user_exist=$(grep $APP_USER /etc/passwd)
  if [ $? -ne '0' ]; then
    adduser $APP_USER
  fi
  echo $PASSWD | passwd $APP_USER --stdin
  
  #폴더생성 및 권한 세팅
  if [ ! -d $DATA_DIR ];then
    mkdir $DATA_DIR
    chown $APP_USER $DATA_DIR
  fi
  
  #관리유저 cronjob 설정
  if [ ! -f /etc/cron.allow ]; then
    echo 'root' > /etc/cron.allow
  fi
  cron_user=$(grep $APP_USER /etc/cron.allow)
  if [ $? -ne '0' ];then
    echo $APP_USER >> /etc/cron.allow
  fi
}

changeRunlevel()
{
  run_line=$(grep 'id:3' /etc/inittab)
  if [ $? -ne '0' ]; then
    cp /etc/inittab /tmp
    cat /tmp/inittab | sed 's/id:5/id:3/' > /etc/inittab
    rm -f /tmp/initab
    echo "/etc/inittab has been changed."
  fi
}

#OS 서비스 최적화
optimizeService

#일반 관리 유저 및 디렉토리 생성
addAppUser

#runlevel 변경
changeRunlevel

#reboot
reboot

댓글 없음:

댓글 쓰기