톰캣 설치는 앉아서 밥먹기 처럼 쉽습니다. 

유닉스의 솔라리스 뿐만아니라 리눅스도 아래와 같은 방법으로 설치하시면 됩니다

자바로 만들어진 것이라서 자바의 강점인 운영체제에 상관없이 잘 돌아간다라는 것
즉, 그냥 압축풀면 끝나요

주의사항은 JDK가 깔려 있어야 한다는 겁니다. 솔라리스는 기본적으로 JDK5가 깔려있습니다.
최신버전을 좋아하는 저는 JDK6으로 업그레이드 했습니다


java -version 쳐서 나오는지 확인하고, 안나오면 설치해야죠 http://java.sun.com/에서 받으세요

http://tomcat.apache.org/
여기서 최신버전 6.0.14버전을 받도록 합시다.
Binary Distributions 인 tar.gz로 받도록 합시다.

gunzip으로 압축풀고, tar로 압축풉시다.

[root][/user/mudchobo/install] gunzip apache-tomcat-6.0.14.tar.gz
apache-tomcat-6.0.14.tar
[root][/user/mudchobo/install] tar xvf apache-tomcat-6.0.14.tar


디렉토리를 생성하여 옮기겠습니다.

[root][/user/mudchobo/install]mv -r apache-tomcat-6.0.14 /usr/local/tomcat/


/usr/local/tomcat/ 폴더로 옮겨놓읍시다. 이제 PATH를 잡아줍시다.(csh기준)

setenv PATH={$PATH}:/usr/local/tomcat/bin

예전에는 CATALINA_HOME도 잡아준거 같은데 안해줘도 되나봐요.
이제 실행해봅시다.
startup.sh를 실행합시다.

[root][/usr/local/tomcat] startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:       /jdk1.6.0_03
[root][/usr/local/tomcat]


웹에서 확인해봅시다.
http://ip주소:8080/ 이후 확인해보세요 

야옹이가 나오는지

저작자 표시 비영리
Posted by 티엘로


1. Shell Script 생성

# cat > /bin/wall
===================================================================
#!/bin/sh

trap "echo Sorry; exit 0" 1 2 3 4 5 6 7 10 15

echo "***********************************************************"
echo "* *"
echo "* You are NOT allowed Telnet Service!!! *"
echo "* *"
echo "***********************************************************"

exit 0
====================================================================

# chmod 755 /bin/wall

2. Shell Script 등록

# cat >> /etc/shells
======================
/bin/ksh
/bin/bash
/bin/csh
/bin/wall
======================

3. /etc/passwd 파일 수정
root:x:0:1:Super-User:/:/bin/ksh
~
temp:x:102:1::/export/temp:/bin/wall <- 수정


4. Telnet 접속 확인

# telnet localhost

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.


SunOS 5.8

login: temp
Password:
Last login: Thu Apr 29 18:51:27 from localhost
***********************************************************
* *
* You are NOT allowed Telnet Service!!! *
* *
***********************************************************
Connection closed by foreign host.


5. FTP 접속 확인

# ftp localhost
Connected to localhost.
220 test04 FTP server (SunOS 5.8) ready.
Name (localhost:root): temp
331 Password required for temp.
Password:
230 User temp logged in.
ftp>


저작자 표시 비영리
Posted by 티엘로

설치할 APM 버전

  • Apache 2.0.55
  • PHP 5.0.5
  • MySQL 4.1.13a

들어가기 전에

1. 설치 전에

  • APM과 관련해 설치 전에 해야할 것은 없다.

2. APM 설치

  1. http://www.mysql.com: mysql-4.1.14.tar.gz
    root@wl ~ # gtar xvfz mysql-4.1.14.tar.gz
    root@wl ~ # cd mysql-4.1.14
    root@wl ~/mysql-4.1.14 # CC=gcc CFLAGS="-O2 -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT -fomit-frame-pointer -DHAVE_CURSES_H" \
     CXX=gcc CXXFLAGS="-O2 -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \
     ./configure \
     --prefix=/usr/local/mysql \
     --enable-thread-safe-client \
     --with-charset=euckr # MySQL 4.1.x부터 euc_kr이 아닌 euckr로 변경되었다.
    root@wl ~/mysql-4.1.14 # make
    root@wl ~/mysql-4.1.14 # make install
    
  2. http://www.apache.org: httpd-2.0.55.tar.gz
    root@wl ~ # gtar xvfz httpd-2.0.55.tar.gz
    root@wl ~ # cd httpd-2.0.55
    root@wl ~/httpd-2.0.55 # ./configure \
     --prefix=/usr/local/apache2 \
     --enable-so \
     --enable-dav \
     --enable-dav-fs \
     --disable-ipv6 \ # IPv6를 사용하지 않는다면 이 옵션을 주는것이 좋다.1)
     --with-mpm=worker # PHP가 비정상적인 동작을 보인다면 이부분을 삭제한다.2) worker외에 --with-mpm=perchild 도 쓸만하다.
    root@wl ~/httpd-2.0.55 # make
    root@wl ~/httpd-2.0.55 # make install
    
    1) 에러로그에 [warn] (128)Network is unreachable: connect to listener 이라는 메시지를 없앨 수 있다.
    2) PHP를 개발한 The PHP Group이나 APACHE 개발한 The Apache Software Foundation에서는 mpm으로써 worker나 perchild를 권장하지 않는다. 값을 지정하지 않는다면 기본값인 prefork을 사용한다.
  3. http://www.xmlsoft.org: libxml2-2.6.20.tar.gz
    root@wl ~ # gtar xvfz libxml2-2.6.20.tar.gz
    root@wl ~ # cd libxml2-2.6.20
    root@wl ~/libxml2-2.6.20 # ./configure --prefix=/usr/local/xml
    root@wl ~/libxml2-2.6.20 # make
    root@wl ~/libxml2-2.6.20 # make install
    
  4. http://www.php.net: php-5.0.5.tar.gz
    root@wl ~ # gtar xvfz php-5.0.5.tar.gz
    root@wl ~ # cd php-5.0.5
    root@wl ~/php-5.0.5 # ./configure \
     --prefix=/usr/local/php \
     --with-apxs2=/usr/local/apache2/bin/apxs \
     --with-mysql=/usr/local/mysql \
     --with-mysqli=/usr/local/mysql/bin/mysql_config \ # MySQL 4.1.2 이상 필요
     --with-iconv \
     --with-libxml-dir=/usr/local/xml \
     --enable-modules=so \
     --enable-mbstring \
     --enable-mbregex \
     --with-gd \
     --enable-gd-native-ttf \
     --with-jpeg-dir=/usr/sfw \
     --with-png-dir=/usr/sfw \
     --with-zlib-dir=/usr/local
    root@wl ~/php-5.0.5 # make
    root@wl ~/php-5.0.5 # make install
    root@wl ~/php-5.0.5 # cp php.ini-dist /usr/local/php/lib/php.ini
    
    # 여기까지 하면 설치는 끝난다. 아래는 Zend Optimizer를 설치하는 과정이다.
    root@wl ~ # gtar xvfz ZendOptimizer-2.5.10a-sunos5.9-i386.tar.gz
    root@wl ~ # cd ZendOptimizer-2.5.10a-sunos5.9-i386
    root@wl ~/ZendOptimizer-2.5.10a-sunos5.9-i386 # ./install 1)
    
    1)
    - php.ini파일은 /usr/local/php/lib 디렉토리에 있다.
    - Apache Control Utility는 /usr/local/apache2/bin/apachectl 에 있다.
    - 설치가 완료되면 /usr/local/php/lib/php.ini가 /usr/local/Zend/etc/php.ini파일로 심볼릭 링크된다.
    - 원래의 php.ini은 /usr/local/php/lib/php.ini-zend_optimizer.bak 에 있다.
    - php.ini만 이전것으로 복구하면 자연스럽게 Zend Optimizer를 언인스톨 할 수 있다.
    - Zend Optimizer는 http://www.zend.com에서 무료 회원 가입후 무료로 받을 수 있다.
    - Zend Optimizer는 필수사항이 아니다. Zend Encoder로 인코딩된 php 소스를 실행할 수 있으며, php를 좀 더 빨리 실행시켜준다고 알려져 있으며, Solaris Sparc이나 리눅스에서는 큰 효과가 있지만, Solaris x86에서는 그리 큰 효과가 없는듯 하다. (성능향상이 되는지도 잘 모르겠다 ^^ 스팍에서 설치할땐 쉽게 느낄 수 있을정도의 성능향상이 있었다)

3. APM 설정(기본적인것만)

  1. PATH 설정
    root@wl ~ # vi /etc/profile
    # for Apache located at /usr/local/apache2
    if [ -d /usr/local/apache2 ]
    then
      LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apache2/lib; export LD_LIBRARY_PATH
      PATH=$PATH:/usr/local/apache2/bin; export PATH;
    fi
    
    # for MySQL located at /usr/local/mysql
    if [ -d /usr/local/mysql/lib/mysql ]
    then
      LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib/mysql; export LD_LIBRARY_PATH
      PATH=$PATH:/usr/local/mysql/bin; export PATH;
    fi
    
  2. MySQL 설정
    root@wl ~ # useradd -d /export/home/mysql -g staff -m -u 102 -s /bin/false mysql 1)
    root@wl ~ # /usr/local/mysql/bin/mysql_install_db 2)
    root@wl ~ # chown -R mysql:staff /usr/local/mysql/var 3)
    root@wl ~ # cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf 4)
    root@wl ~ # vi /etc/my.cnf 4)
    skip-networking
    #log-bin
    root@wl ~ # /usr/local/mysql/share/mysql/mysql.server start 5)
    root@wl ~ # /usr/local/mysql/bin/mysqladmin -u root password 'new-password' 6)
    root@wl ~ # /usr/local/mysql/bin/mysqladmin -u root -h wl password 'new-password' 6)
    
    1) MySQL을 실행할 유닉스 계정을 생성한다.
    2) 기본 MySQL DB를 생성한다.
    3) 기본 MySQL DB는 /usr/local/mysql/var 에 생성되는데 이 디렉토리및 파일들의 소유자를 변경한다.
    4) MySQL 설정 파일을 복사한 후 적당히 수정한다. /usr/local/mysql/share/mysql 에 my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf 의 예제 설정 파일이 있다. 이를 /etc/my.cnf 으로 이름을 바꿔 복사하면 된다. 리플리케이션을 사용하지 않는다면 [log-bin]을 찾아 주석처리하고 외부에서 접속이 없다면 [skip-networking]의 주석을 푼다.
    5) MySQL 서버를 시작한다. 종료는 [/usr/local/mysql/share/mysql/mysql.server stop] 커맨드를 사용한다.
    6) MySQL의 root 패스워드를 변경한다. 기본값은 없기 때문에 반드시 수정해야 한다. [wl]부분은 MySQL이 설치된 호스트의 이름이다.
  3. Apache 설정
    root@wl ~ # vi /usr/local/apache2/conf/httpd.conf
    Group nobody 1)
    # AddDefaultCharset ISO-8859-1 2)
    AddType application/x-httpd-php	.php 3)
    AddType application/x-httpd-php-source	.phps 3)
    ServerName xxx.solanara.com:80 4)
    root@wl ~ # /usr/local/apache2/bin/apachectl start
    
    1) [Group #-1]을 찾아 [Group nobody]로 수정한다.
    2) [AddDefaultCharset ISO-8859-1] 부분이 있다면 주석처리 한다. (없을수도 있다)
    3) AddType부분의 두라인을 추가한다.
    4) ServerName을 정해준다. 정하지 않아도 되지만 [httpd: Could not determine the server's fully qualified domain name, using xxx.xxx.xxx.xxx for ServerName]와 같은 메시지가 나올 수 있다. 만약 도메인이 없다면 IP를 입력해준다. 예) [ServerName 192.168.0.1]
  4. PHP 설정
    root@wl ~ # vi /usr/local/apache2/htdocs/index.php
    <?
      phpinfo();
    ?>
    root@wl ~ #
    
    이후 http://localhost/index.php에서 php정보가 제대로 나오는지 확인한다. 아래와 비슷하게 나와야 한다. 확인되었으면 index.php파일을 지운다. (보안때문)
    phpinfo

    root@wl ~ # rm /usr/local/apache2/htdocs/index.php
    

    여기까지 되면 설치는 완료되었다.  
저작자 표시 비영리
Posted by 티엘로


# dd if=/dev/zero of=/swap1 bs=1024 count=532480
(1024
바이트의 크기로 532480 블럭을 만드는거죠 520M ,
만들고 싶은 크기x1024 해서 count 넣어 주시면 됩니다.)


# mkswqp /swap1 532480 (
스왑 파일 생성)

# chmod 0600 /swap1
# sync; sync (
확실하게 하기위해)
# swapon /swap1 (
스왑 파일 활성화 )

free
명령으로 확인해 보세요.

해제할때는 swapoff /swap1

부팅시 자동으로 스왑 파일을 활성화 시킬려면 

/etc/rc.d/rc.local 파일
끝에 swapon /swap1 이라고 추가하면 됩니다.

저작자 표시 비영리
Posted by 티엘로



스크립트 작성 후 실행권한을 주려면..

Chmod 755 DiskUsageCheck.sh

  

쉘 스크립트의 첫번째 라인에는 대부분

#!/bin/sh

라는 문장이 있는데, 이는 어떤 쉘을 이용하여 이 프로그램을 실행시킬 것인지를 지정하는 것이다. ,스크립트가 실행되면 /bin/sh 프로그램 하에서 실행됨을 의미한다.

 

변수

그냥 변수명을 적으면 된다. 변수의 타입이나 형을 명시하지 않는다.

변수에 값을 할당하지 않아도 특별한 문제는 발생하지 않으며, NULL로 초기화하고 나중에 값을 할당하려고 한다면 다음과 같이 한다.

name=

 

변수에 값을 할당할 때는 = 기호를 사용하는데 = 사이에 공백을 넣으면 안된다.

name=JUNGJH            # 맞다.

name = JUNGJH          # 틀리다.

만일 입력하려는 이름에 공백이 있다면 다음처럼 한다.

name="JUNG J H"

 

만일 인수로 입력되는 값이 있을 때 이를 변수로 받는 방법은 $숫자 이다. , $1은 첫번째 인수이고$2는 두번째 인수이다.

 

변수의 내용을 출력하려면 echo를 사용한다. 이때 변수임을 알리기 위해서 $를 넣는다.

echo $name

 

변수에 와일드 문자를 넣어서 사용할 수도 있다.

filename=*.sh

echo $filename   # 확장자가 sh 되어 있는 파일들의 목록이 나온다.

 

변수를 이용하여 스트링의 일부를 변경할 수도 있다. 예를 들어 option이라는 변수에 l를 입력한 후ls –“$option 을 사용하면 ls l 과 동일한 문장이 된다.

<. ShellTest2.sh>

 

스크립트 파일 내부에서 개발자가 unset 키워드로 변수를 제거할 수 있다.

name="Jung JH"

unset name

newname=$name          # newname=    같다.

 

쉘 스크립트에서도 상수를 만들 수 있다. 이때 사용되는 키워드는 readonly이다.

readonly만 쓰면 읽기전용으로 된 상수들을 모두 화면에 표시한다.

Name="Jung JH"

Readonly name          #  후로는 값을 바꿀  없다.

 

 

쉘 스크립트에서는 쉘 전체가 사용하는 환경변수도 일반 변수와 똑 같은 방법으로 사용할 수 있다.

 

변수에 값을 할당할 때 입력줄에서 입력받은 내용을 할당하는 방법이 있다. , 스크립트가 실행되는 중간에 변수에 할당할 내용을 사용자로부터 입력받은 후 그 내용을 할당하는 것이다.

이때 사용하는 키워드가 read인데 이 키워드와 변수를 함께 적으면 그 라인이 실행될 때 사용자로부터 입력할 것을 요청하게 된다.

<Grep.sh>

#!/bin/sh

echo "grep 사용될 옵션 입력, -l 또는 -s 입력해주세요."

read option1

echo "검색하고자 하는 문장을 입력해주세요"

read option2

grep $option1 $option2 *

 

쉘에서 사용되는 특정 키워드는 다음과 같다.

$#   - 명령입력 라인에서 입력된 인수의 개수를 가지고 있다.

$*   - 명령입력 라인에서 입력된 전체의 내용을 포함한다. , $1 ~ $n을 모두 합친것과 같다.

$$   - 쉘 프로그램이 실행되면서 사용된 프로세스의 ID 값을 가진다.

$!    - 쉘 프로그램이 실행시킨 백그라운드 프로세스의 ID 값을 가진다.

<. shellTest.sh>

위의 키워드를 사용한 다양한 응용을 한다.

 

set 명령어를 이용하면 현재 쉘에서 사용되고 있는 변수들의 리스트를 확인할 수 있다.

<. shellTest4.sh>

쉘의 환경변수를 몇가지 확인한다.

 

쉘에서 변수를 사용할 때 변수에 값을 할당된 경우에는 변수가 가진 값을 사용하고, 그렇지 않으면 디폴트의 다른값을 활용하는 방법이 있다

더 나아가 지정한 내용을 값이 할당되지 않은 변수속에 할당하는 방법도 있다.

${X:-Y}   # X 값이 있으면 그대로, 그렇지 않으면 Y 사용, X 변동없음

${X:=Y}   # Y 사용되고   X Y 할당

${X:?에러메시지 # X 값이 없으면 에러메시지와 함께 종료

<. shellTest4.sh>

위의 예를 활용한다.

 

제어문(조건문)

쉘에서 명령어들을 순차적으로 실행할 때 || 연산자와 && 연산자를 이용하여 연산자 바로 뒤에 위치한 명령어가 조건에 따라 실행되도록 만들 수 있다.

'|| 연산자는 앞의 명령어가 실패했을 때만 뒤에 위치한 프로그램이 실행되도록 한다.

&& 연산자는 반대로 앞의 명령어가 성공적으로 수행되었을 때만 뒤의 프로그램이 실행된다.

 

다음은 명령어 실행이 실패했을 때 이 내용을 로그로 남기는 작업이다.

Run Command1 || echo 첫번째 명령 실행 실패 >> log.txt

Run Command2 || echo 두번째 명령 실행 실패 >> log.txt

또한 다음은 실패가 예상되는 명령에 대한 보완 실행이다.

ShellTest5.sh || chmod 755 ShellTest5.sh && ShellTest5.sh

 

If-else 구문의 형식은 다음과 같다.

if [ conditons ]

then

   실행하고자 하는 문장

fi

 

#########

if [ conditons ]

then

   조건만족시 실행하고자 하는 문장

else

   조건 불만족시 실행하고자 하는 문장

fi

 

##########

if [ conditons ]

then

   조건만족시 실행하고자 하는 문장

elif [ conditons ]

   두번째 조건 만족시 실행 문장

else

   조건 불만족시 실행하고자 하는 문장

fi

 

<. IfTest1.sh>

 

if 조건문에서 사용되는 연산자들에는 다음과 같은 것들이 있다.

 

l         문자열체크

[ stringName ] - 문자열이 (NULL)인지 체크, Null 아니면 

[ -n stringName ] - 문자열의 사이즈가 0 이상인지 체크, 0 이상이면 

[ -z stringName ] - 문자열의 사이즈가 0 인지 체크, 0이면 

[ stringNameA = stringNameB ] - A문자열과 B문자열이 같은지 체크, 같으면 

[ stringNameA != stringNameB ] - A문자열과 B문자열이 다른지 체크, 다르면 

 

l         숫자 대소 관계 체크

[ intA -ge 100 ] - 숫자 A 100보다 크거나 같은지 체크, 100 이상이면 

[ intA -gt 100 ] - 숫자 A 100보다 큰지 체크, 100 넘으면 

[ intA -le 100 ] - 숫자 A 100보다 작거나 같은지 체크, 100 이하이면 

[ intA -lt 100 ] - 숫자 A 100보자 작은지 체크, 100 미만이면 

 

l         파일 체크

[ -r filename ] - 해당 파일이 읽기 가능한지 체크

[ -w filename ] - 해당 파일이 쓰기 가능한지 체크

[ -x filename ] - 해당 파일이 실행 가능한지 체크

[ -s filename ] - 해당 파일의 사이즈가 제로 이상인지 체크

[ -d filename ] - 해당 파일이 디렉토리 파일인지 체크

[ -f filename ] - 해당 파일이 보통 파일인지 체크

[ -h filename ] - 해당 파일이 링크 파일인지 체크

 

l         조건문의 결합

[ 조건문A -a 조건문B ] - 조건문 A B 모두 참인지 체크, -a AND

[ 조건문A -o 조건문B ] - 조건문 A B 참이 하나라도 있는지 체크, -o OR

 

<. IfTest2.sh>

 

case문도 제공을 하는데 형식은 다음과 같다.

case $변수명 in

문장1)

       첫번째 명령어;;

문장2)

       두번째 명령어;;

문장3)

       세번째 명령어;;

*)

       Default 명령어;;

esac

 

<. caseTest.sh>

 

 

제어문(반복문)

while문의 형식은 다음과 같다.

while [ 조건 ]

do

명령어 구문

done

 

<. whileTest.sh>

#!/bin/sh

while [ $# -gt 0 ]

   echo "< $1 명령 실행 > "

   $1

   Shift

done

 

위의 예제에서 shift 명령어를 사용하는데. Shift는 인수로 들어온 내용을 하나씩 옮겨가는 기능을 한다. , shift가 한번 실행되면 $1 $2이 되고 $2 $3이 된다.(???)

 

until 구문과 비교해보라..

#!/bin/sh

until [ $# -le 0 ]

   echo "< $1 명령 실행 > "

   $1

   Shift

done

 

for 구문의 형식은 다음과 같다.

for 변수명 in value1 value2 ...

do

   반복 실행 문장

done

 

while/until 에서 사용한 예제를 for로 변경하면 다음과 같다.

#!/bin/sh

for variable in $*                     # $* : 인수로 들어온 모든 문자열

do

       echo < $variable 명령 실행>

       $variable

done

 

for 키워드 뒤에 변수명(variable)이 오고 in 키워드 뒤에 값들이 나열된다. 이것은 in 뒤에 있는 값이 하나씩 variable에 할당이 되면서 값의 할당이 끝날때까지 do~done를 반복한다.

<. breakContinue.sh>

 

<. runCmd>

여러 개의 쉘 명령어를 한꺼번에 실행하도록 만들어 주는 예제

쉘 명령어가 옵션이 있는지 여부를 체크하고, 옵션이 있으면 옵션과함께 명령어를 실행하고 옵션이 없으면 명령어만 실행하는데, 이를 위해 while문과 다중 if, case문을 사용한다.

 

 

함수 작성

함수를 사용하려면 스크립트의 시작부에 정의가 되어 있어야 한다.

함수의 형식은 다음과 같다.

함수명()

{

       함수 내용

}

 

함수 호출은 인자가 없는 함수는 함수명만 호출하면 되고, 인자가 있는 함수는 함수명 뒤에 인자를 나열해주면 된다.( 괄호는 쓰지 않는다.)

함수 내부에서 넘겨받은 인자를 쓰는 방법은 쉘 프로그램이 인자를 쓰는 방법과 같다.($1, $2, )

 

저작자 표시 비영리
Posted by 티엘로

루트킷 예방

루트킷 예방은 어떤 다른 형태의 공격에 대한 예방과 같이 기본적인 시스템 보안에서 출발한다. 기본적인 시스템 보안계획은 소프트웨어 벤더에서 제공하는 패치로 애플리케이션을 업데이트하는 것 뿐만 아니라, 방화벽과 VPN등을 포함한다. 기본적인 보안 도구들을 실행함으로써 관리자는 상대적으로 안전한 네트워크를 보증할 수 있다.


보안기초

 
모든 네트워크에 대한 방화벽

방화벽을 사용하여 인터넷으로부터 연결되는 모든 네트워크가 보호된다고 확신하는 것은 방화벽에 대한 오해의 좋은 예이다. 관리자는 방화벽만이 침입자를 단념시키는 유일한 예방도구가 아니라는 점을 명심해야 한다.

 

모든 시스템 상에서 무엇이 실행되고 있는지 정확하게 알고 있어라.

어떤 시스템이 설치된 후에는 무엇이 실행되고 있는지 목록을 작성하라. 불필요한 서비스는 모두 종료시켜라. 비인가 애플리케이션을 실행하지 않도록 하기 위해서 시스템 프로세스에 대한 감사(audit)를 주기적으로 수행하라.

 

사용자에게는 해당 업무를 수행에 필요한 만큼의 접근을 승인하라.

사용자에게 절대로 필요 이상의 네트워크 서비스 접근을 제공하지 말아라. 사용자가 업무를 수행하기에 필요한 서비스에 대해서만 허가를 승인하라.

 

VPN과 Secure Shell과 같은 보안 통신을 가능하게 하라

VPN을 설치함으로써 관리자는 WAN상에서 전송되는 모든 데이터가 암호화된다는 것을 확신할 수 있을 것이다. Secure Shell(SSH)은 텔넷(telnet) 프로토콜을 대체한다. SSH는 사용자명과 암호를 포함한, 세션간 전송되는 모든 데이터를 암호화한다.

 

모든 벤더가 업데이트하는 것에 대하여 최신의 상태를 유지하라

운영체제 및 애플리케이션에 대한 보안 및 버그 패치는 주기적으로 이루어진다. 보안 이슈를 해결한 최신의 벤더 배포 버전으로 시스템을 최신 상태로 유지하라. 많은 공격자들은 매일 사용되는 애플리케이션에서 공개된 취약성을 악용하여 관리자 레벨 접근 권한을 획득한다.

 

호스트 및 네트워크 기반의 침입탐지 시스템을 설치하라

여러분의 네트워크에서 어떤 일이 일어나는지 아는 것은 매우 중요하다. 침입자가 접근권한을 획득하려고 할 때, 여러분의 IDS(Intrusion Detection System-침입탐지시스템) 애플리케이션으로 하여금 여러분에게 알려주도록 설정하라.

 

모든 로그 파일을 모니터링 하라

대부분의 시스템 활동이 로그(log)로 남기 때문에 로그 파일을 모니터링 한다면, 관리자가 매우 유리한 위치를 점유하게 된다. Logwatch나 LogSentry같은 로그 검사 프로그램을 사용하여 이런 일을 자동화하는 것은 매우 좋은 생각이다. 물론 로그 파일을 하는 것으로 관리자가 루트킷의 공격을 바로 알 수는 없다. 로그인 시도에 대하여 성공하거나 실패한 것과 같은 비정상적인 시스템 활동을 알 수 있는 것이다.

 

기본적인 보안 사전경고를 실시하는 것은 시스템에 대한 침입을 막고 어떤 종류의 공격도 예방하는 첫번째 단계이다. 관리자는 파일 보안을 확립함으로써 루트킷의 공격을 막아낼 수 있다.

 

파일속성(Attributes) 보안

파일 보안을 구현하기 위해서는 관리자가 따라야 할 몇 가지 단계가 있다. 공통 파일은 덮어쓰거나 변경될 수 없다고 보증하는 것이 한 가지 방법이다. 이것은 중요한 시스템 파일들에 대해서 immutable Flag를 셋팅함으로써 이루어진다.

 

Immutable Flag의 사용

immutable이라는 용어는 "변경할 수 없는"이란 뜻이다. immutable flag를 어떤 파일에 셋팅함으로써 그 파일은 수정하거나, 이름을 바꾸거나, 지울 수 없고, 심지어 링크도 걸 수 없다.

 

파일에 immutable flag를 셋팅하기 위해서는 대부분의 리눅스 배포판에서 찾을 수 있는 "chattr"이라는 명령어를 사용하면 된다.

 

·chattr +i <file>: immutable flag를 셋팅한다.

·chattr -i <file>: immutable flag를 해제한다.

·lsattr <file>: 파일에 적용된 속성들을 화면에 출력한다.

 

일부 공통 파일에 immutable flag를 셋팅하는 것은 그 파일이 변경될수 없다고 표시하는 것이기 때문에 대부분 루트킷의 작동을 불가능하게 만든다. 이런 방법으로도 LKM(loadable kernel modules) 루트킷을 막을 수는 없다. 이것은 커널이 "불변"으로 설정될 수 없는 것과 같다. 보고서 초반에 제시한 파일 목록은 어떤 파일에 immutable flag를 셋팅할 지 결정할 때, 좋은 출발점이 될 것이다.

 

immutable flag는 루트(root)에 의해서만 셋팅되거나 해제될 수 있다. 이 flag는 쉽게 셋팅할 수 있는 것처럼 쉽게 해제할 수도 있음을 기억하라. 공격자가 시스템에 접근했다는 것은 그 flag가 셋팅된 것을 발견하고 해제시켰을 수도 있음을 의미한다. 공격자는 immutable flag를 해제한 이후에 루트킷을 설치할 수 있다. 그러므로 루트킷에 대한 유일한 방어수단으로서 immutable flag만을 의지하지는 말아라.

 

다음의 보안 기초 가이드라인을 준수하라. 보안도구를 설치한 이후에 관리자는 그 시스템들에 대하여 실제로 탐지하고 모니터링 하는 것을 시작해야만 한다. 

루트킷 탐지 및 모니터링

관리자는 어떻게 숨어있는 프로그램을 모니터링 할 수 있는가?

기본적으로 관리자가 시스템의 활동을 모니터링할 수 있도록 도와주기 위해 개발된 애플리케이션이 있다. 그런 애플리케이션을 사용하면 관리자가 루트킷을 모니터링 할 수도 있다.

 

Tripwire와 AIDE

Tripwire와 AIDE는 모두 파일의 무결성을 모니터링하기 위해 사용되는 유틸리티이다. 두 프로그램 모두 현재의 파일 및 디렉토리의 변화를 비교하기 위하여 파일 및 디렉토리 속성을 DB에 저장하고, DB에 대한 보안 암호를 생성한다. 파일 무결성 검사를 위해서 MD5를 이용한다. MD5는 임의의 길이의 문자열 데이터를 더 짧은 고정길이의 값으로 변형시키는 해쉬(Hash)함수이다. 어떤 두 문자열 데이터도 같은 MD5값을 가질 수 없다고 믿어진다.

 

리눅스 레드햇(Linux Redhat) 7.1 시스템에서 netstat와 ls에 대한 md5sum결과 값은 다음과 같다.

 

        dc1961b6ce3ff6d6fe2c89c8603f4985        ls
        30286974e55bb9f9e82f93cc44c39492       netstat

 

만약 모니터링되고있는 파일이 어떤 방식으로든 수정된다면, Tripwire와 AIDE는 관리자에게 변경사실을 알려줄 것이다.

 

두 애플리케이션 모두 보안 분야에서 광범위하게 사용되고 있다. 나는 이에 대해 더 자세히 살펴보고, 여러분의 기업 전체에서 사용하기를 권고한다. Tripwire는 사업적 또는 GNU licensing으로 모두 사용가능하다. AIDE는 GNU licensing으로 사용가능하다.

 

http://www.tripwire.com       commercial license
http://www.tripwire.org        gnu license
http://www.cs.tut.fi/~rammer/aide.html

 

레드햇 패키지 관리자(Redhat Package Manager)

Tripwire와 AIDE등과 상당히 유사하게, 레드햇 패키지 관리자(rpm)은 설치된 애플리케이션의 첵섬(checksum)을 검증하는데 사용될 수 있다. rpm은 첵섬을 검증할 뿐만 아니라, 파일의 접근권한 및 크기(size)와 같은 다른 종류의 불일치 사항도 검증할 수 있다. rpm은 옵션(option)으로 "-V"가 붙어서 설치된 임의의 rpm 패키지의 서명(signature)을 검사하는데 사용된다. "-Va"옵션을 사용하면 모든 설치된 패키지를 검사할 수 있다.

 

테스트 시스템에서 "rpm -V util-linux"을 실행시켜 보면 다음과 같은 결과를 얻을 것이다.

.......T c /etc/fdprm
.......T c /etc/pam.d/chfn
.......T c /etc/pam.d/chsh
S.5....T c /etc/pam.d/login

 

아래에서 볼 수 있는 "man"에서 발췌한 것을 이용하면, 여러분은 위의 rpm명령어의 실행결과를 이해할 수 있을 것이다. 결과에 따르면, 모든 파일에서 mTime(T)가 변화하였다는 것을 알 수 있다. mTime은 파일의 수정 날짜와 시간이다. 또한 "login"파일에서는 파일크기(file size:S)와 MD5 첵섬(checksum:5) 역시 변경되었음을 알 수 있다. 이런 정보를 이용하여 관리자는 왜 파일이 변경되었는지 알아볼 수 있다.

 

RPM에 대한  "man"의 출력결과:

 

S   파일 크기(Size)가 변경됨

M  모드(Mode)가 변경됨(접근권한permission 및 파일 타입을 포함)

5   MD5 첵섬이 변경됨

D   주/부(major/minor) 장치(Device) 수가 일치하지 않음

L   읽기 연결(readLink)(2)경로가 일치하지 않음

U   사용자(User) 소유권이 변경됨

G   그룹(Group) 소유권이 변경됨

T   파일수정일시(mTime)이 변경됨

 

Chkrootkit이라 불리는 다른 애플리케이션은 관리자가 루트킷 서명(signature)를 탐지하는 것을 돕는다.

 

Chkrootkit

Chkrootkit은 루트킷에 의한 변형작업에 대하여 시스템 바이너리(binaries)를 검사하기 위한 쉘 스크립트이다. 이 프로그램은 잘 알려진 LKM(loadable kernel modules)루트킷을 탐지할 수도 있다. Chkrootkit은 Nelson Murilo에 의해 만들어져 유지보수 되고 있으며, "www.chkrootkit.org"에서 찾을 수 있다.

 

다음 명령어 파일들을 이용하면, chkrootkit은 시스템 내에 루트킷이 자리잡은 공통파일과 디렉토리 들을 찾을 수 있다.

· awk
· cut
· echo
· egrep
· find
· head
· id
· ls
· netstat
· ps
· strings
· sed
· uname

 

Chkrootkit은 "/proc" 디렉토리에 대한 ps실행결과를 검사하여 숨겨진 프로세스에 대한 검사를 수행할 수도 있다. 많은 루트킷이 숨겨진 프로세스로서 스니퍼(sniffer)와 백도어(backdoor)를 실행시킨다. 전체자원이 가동중인 시스템 상에서, 한 프로세스가 비교작업을 완료하기 전에 시스템이 그 프로세스를 종료시킬 수도 있기 때문에, 이 프로세스가 생성한 긍정적인(positive) 결과에는 오류가 있을 수 있다.

 

Chkrootkit은 또한, 네트워크 인터페이스가 'promiscuous mode'에 있지 않은지 검증한다. Promiscuous 모드는 네트워크 상에서 도착하는 모든 네트워크 패킷에 대해 네트워크 장비가 가로채서 읽을 수 있도록 허용한다. 이모드에서는 분석을 위해 모든 패킷을 스니퍼(sniffer) 프로그램에 제공한다.

 

Chkrootkit을 사용하면 대체(alternate)경로로부터 명령어 파일들을 사용할 수도 있다. 이 옵션을 사용하면, 관리자는 위의 목록에 있는 파일들을 쓰기 방지된 파일시스템 또는 CD, 플로피 디스켓에 저장할 수 있다. 만약 복사 방지가 가능하다면, immutable flag를 지정함으로써 덮어쓰기를 확실히 방지할 수 있다. 이것은 chkrootkit이 감염되지 않은 파일을 사용하고 있다는 것이 확실하다는 뜻이다. 이미 감염된 파일을 사용한다면 이 애플리케이션을 사용하는 목적을 망치고 있는 것이다.

 

앞서 언급한 바와 같이, chkrootkit은 알려진 LKM 루트킷을 모니터링하고 탐지한다. 덧붙여, lsmod, kstat와 같은 명령어를 활용하면 관리자가 이런 종류의 루트킷을 모니터링하는 것에 도움이 될 것이다.

 

LSMOD

Lsmod는 커널에 로드된 모듈 목록을 작성하기 위해 사용하는 유틸리티이다. 관리자는 이 명령어의 실행결과에 친숙해져야 한다. 다음은 RedHat 7.2 시스템에서 실행시킨 lsmod명령어의 실행결과이다. 다음 결과는 모듈명과 모듈크기, 사용횟수 그리고 참조하는 모듈 목록 등을 보여준다.

 

3c59x         28424    1
cdrom        31936    0    (autoclean) [sr_mod]
sr_mod      16056    10   (autoclean)
ext3           64768    2
usb-uhci    24324    0    (unused)
usbcore     71072    1    [usb-uhci]
ext3           64768    2
jbd            47892    2    [ext3]
aic7xxx      128256   3
sd_mod     12832     6
scsi_mod   104800   4    [sr_mod aha1542 aic7xxx
sd_mod]

 

커널로 로드되는 모든 모듈을 추적하는 것은 LKM 루트킷을 모니터링하는 매우 좋은 프로세스이다. lsmod가 루트킷 모듈에 의해서 변형되어 루트킷 모듈을 숨기는 데 악용될 수도 있다. 커널로 로드되는 모듈이 어떤 것인지 목록을 만들기 위해 사용되는 또 다른 명령어가 있다. 이것은 'cat'이라고 불린다.

 

Cat는 파일을 연결시키고 화면 또는 기타 출력장치로 출력시키는 명령어이다. '/proc/modules'에 대하여 cat을 실행시키면 lsmod의 실행결과와 동일한 정보를 화면에 보여줄 것이다.

 

블로그 주인의 푸념

루트킷, exploit, 하이재킹, 스푸핑, 스니핑, 커널링, BOF, DDoS 웹 상에서 마치 전쟁이라도 벌어지듯 많은 일들이 일어난다.. 특히 웹서버나, 어떤 회사, 특히 상용 서비스라면 장난이 아니다.
서버나 웹을 공격, exploit code, 스니핑, 심지어는 cgi script, troy 변조 방법 까지 엄청난 자료들이 구글링과 커뮤니티에서 구할 수 있다.

필자인 나는 8월부터 11월까지 총 3번의 홈서버(smb,ftp,APM) 등 간단하게 사용할 목적으로 REDHAT9.0 을 설치해서 사용했지만...

3번이나 털렸다 각각 한번씩 털릴때마다 재설치 했고 어차피 파일 삼바 전용이라 신경도 안썻다 물론 역추적은 해봤지만..., 전부 웹 스크립타, 아파치를 타고 들어왔으며..
1번째 ,,, 는 .. 루마니아 ?!
2번째, 3번째는 엄청난 대륙 차이나..

그런데 이번 11월에 4번째로 털렸다..
루트킷이다...
사용자 계정은 접속 거부가 뜬다 미친...ㅠㅠ 그래서 루트킷을 파해치고 보안에 신경을 쓸것이다..
그래서 '리눅스 보안 - 루트킷' 관련 글들을 수집하고 기재했다 ..

물론 내가 전부 작성 한건 아니다, 원작자와, 스크랩을 가능하게 해주신 분들에게 감사드린다..
루트킷 내가 파해쳐서 반격할거다..
기다려 내서버 아파치만 깔면 터는 인간들아
 
저작자 표시 비영리
Posted by 티엘로


초보자를 위한 리눅스 루트킷(RootKits). 침입방지에서 제거까지
 

소개(Introduction)

어느날 집에서 리눅스 유저 그룹으로부터 온 메일 리스트를 읽고 있는 중에, 도움을 요청하는 것을 발견했다. 그건 귀찮은 문제에 직면한 초보 리눅스 유저로부터 배달되어 온 것이었다. 리눅스 시스템에서 몇몇 루틴을 체크하던 중, 그는 유저 아이디 '0(즉 루트(root)-관리자)'로 등록된 한 명의 유저를 발견했다. 처음 든 생각은 그것이 루트킷(rootkit)일 수 있다는 것이었다. 그는 어떻게 그것이 정말 루트킷인지 검증할 수 있는지 알고 싶었고 시스템으로 부터 어떻게 제거하는지도 알고 싶었다. 그는 더 나아가 이런 종류의 공격이 다시 일어나지 않도록 보장하는 예방책을 알려줄 것을 요청했다. 이런 상황 때문에 나는 루트킷에 대한 이해와 루트킷이 끼치는 영향을 이해하기 위한 목적으로 이 보고서를 만들게 되었다. 또한 이 보고서에서는 루트킷을 모니터링하는 방법과 그것을 제거하는 절차에 대해서도 논의하고자 한다.

 

루트킷이란 무엇인가?

"http://www.whatis.com"에 따르면  "루트킷은 해커가 침입을 위장하기 위해 사용하여 한대의 컴퓨터 또는 일련의 컴퓨터 네트워크에 대한 관리자 접근권한을 획득하는 도구(프로그램)의 집합이다(역자주-앞에 게시한 루트킷(Rootkit) 참조). 루트킷은 일반적으로 리눅스, BSD, SunOS등 유닉스 운영체제 계열을 대상으로 만들어진다. 이 보고서는 리눅스 운영체제를 위해 만들어진 루트킷에 주안점을 둘 것이다. 기본적으로는 같은 기능을 수행하는 루트킷에는 많은 다른 버전들이 있다. 잘 알려진 리눅스 루트킷에는 LRK, tOrn, Adore등이 있고, 윈도우 루트킷에는 NTROOT, NTKap, Nullsys등이 있다. 이 루트킷의 파일 복사본과 관련된 세부 정보는 Packet Storm 사이트에서찾을 수 있다.

http://packetstormsecurity.nl/UNIX/penetration/rootkits/

루트킷은 공격자의 존재를 숨기기 위해 만들어질 뿐만 아니라, 미래의 관리자 레벨(루트)접근을 획득하기 위해 사용되기도 하며, DDoS(distributed denial of service)공격을 시작하거나, 또는 재정적인 정보 및 기밀정보를 습득하는데 사용되기도 한다. 루트킷은 공격자를 숨기기 위한 목적으로 만들었기 때문에, 루트킷이 어떤 기능을 갖고 있는지 이해할 필요가 있다. 루트킷이 설치될 때, ls,ps,netstat 같이 일상적으로 사용되는 많은 명령어들을 덮어쓴다. 이런 명령어들을 덮어씀으로써, 루트킷의 잠입을 관리자로부터 숨길 수 있다.

다음의 시나리오를 살펴보라 -

침임자는 패치되지 않은 애플리케이션에 대해 최근에 공표된 취약성을 통하여 이제 막 시스템에 접근하였다. 그러면, 침입자는 루트킷 설치프로그램을 기동한다. 이 루트킷은 'ls' 명령어를 막 덮어썼다. 이렇게 함으로써 어느 때든지 트로이목마화된(trojaned) 'ls' 명령어가 실행됨으로써 루트킷에 의해 설치된 모든 파일은 화면에 나타나지 않게 된다. 이 루트킷은 'ps'의 트로이목마화된 버전을 인스톨하기도 한하여 결국에는, 스니퍼(sniffer), 백도어(backdoor), 로그 파싱(parsing)프로세스 등도 화면에 보이지 않게 된다. 'ls' 와 'ps'명령어 만이 루트킷에 의해서 덮어쓰여질 수 있는 명령어는 아니다. 다음은 루트킷에 의해 덮어쓰여지는 일반적인 명령어들의 목록이다.

 

netstat: 현재 시스템에 연결되어 있는 네트워크 커넥션들, 라우팅 테이블(routing tables), 인터페이스 통계(interface statistics)에 관한 정보를 표시해 주기 위해 사용되는 유용한 툴. Netstat은 침입자에 의해서 시스템에 대한 내부로의 및 외부로의 연결을 숨기기 위해서 루트킷에 의해 수정된다.

 

du: 파일의 저장공간 사용율을 화면에 표시하기 위해 사용되는 명령어이다. 'ls' 명령어와 매우 유사한 이 'du'는 계층적 디렉토리 구조를 보여준다. 또한 각각의 파일 또는 이렉토리가 얼마나 많은 디스크 공간을 사용하는지 보여준다. du는 루트킷에의해 설치된 파일과 디렉토리를 숨기기 위해 주로 트로이목마화 된다.

 

find: 디렉토리 계층그조 하에서 파일들을 찾기위해 사용된다. find 명령어를 변형시킴으로써 침입자는 루트킷에 의해 설치된 이미 알려진 파일을 관리자가 찾기 어렵게 만든다. 'ls','du' 와 같이 find는 루트킷 관련 파일의 존재를 숨기기 위해 트로이목마화 된다.

 

ifconfig: 네트워크 인터페이스 관련사항을 설정하고 화면에 표시하기 위해 사용. 스니퍼(sniffer)가 설치되서 실행되면, 네트워크 인터페이스는  promiscuous 모드에 위치하게 된다. 인터페이스를 'Promiscuous mode'로 설정하는 것은 네트워크 인터페이스로 하여금 네트워크 상에 있는 패킷을 가로채서 읽을 수 있도록 하는 것이다. ifconfig는 인터페이스가 'promiscusous mode'상태에 있다는 것을 감춤으로써 스니퍼(sniffer)또는 패스워드 수집기(password grabber)의 존재를 숨기는 기능을 하도록 변형된다.

 

inetd (xinetd): 인터넷 서비스를 제공하는 프로그램을 시작시키기 위해 설계된 '슈퍼서버'

(x)inetd는 그때 그때 적절한 서버를 생성시켜 서비스 연결 요청을 받아들인다. 많은 루트킷은 어떤 한 특정한 포트에 접근되었을 때, 루트킷 서비스를 실행시키도록 환경설정 파일에 자신들의 애플리케이션을 첨부한다.

 

killall: 프로세스를 중단시키는 명령어. Killall은 대부분 루트킷에서 트로이목마화 됨으로써 관리자가 루트킷이 설치한 특정한 프로세스를 중단할 수 없게 된다.

 

login: 시스템에 접속인증시 사용되는 데몬. 로그인 데몬(daemon)은 모든 사용자 이름 및 패스워드를 기록하기 위해 수정된다. 이 기록된 리스트는 추후 사용을 위해 디렉토리에 저장될 수 있고, 또는 다른 시스템에 전송될 수도 있으며, 채팅서버나 뉴스그룹 같은 대체 시스템에 표시될 수도 있다.

 

lsof: 열려있는 파일들을 목록화하기 위해 사용되는 명령어. 'lsof'는 루트킷에 의해 열린 파일이나 프로세스를 숨기기 위해 덮여쓰기 된다.

 

모든 루트킷이 명령어를 덮어쓰기 하는 것은 아니다. Adore Knark같은 루트킷은 임시로 로딩가능한 커널 모듈(loadable kernel modules:LKM)로서 만들어진다. LKM루트킷은 시스템 호출(system call)을 이용하여 실질적으로 명령어를 수정할 필요없이 명령어의 행위를 변경한다.

일반인들은 시스템 호출을 "사용자 레벨 애플리케이션이 운영체제에 애플리케이션을 위한 어떤 기능을 수행하도록 요구하는 방법"라고 정의한다. 시스템 호출 테이블에는 각 시스템 호출 목록이 들어있다.

루트킷은 자신의 존재를 숨기도록 만들어졌기 때문에, 어떤 명령어가 어떤 루트킷에 영향을 받았더라도 그 이전과 동일하게 기능해야만 한다.

 

** 오늘의 용어설명 **

Sniffer & Promiscuous Mode(전자상거래 혁명-최인영, 동일출판사)

스니퍼는 네트워크의 한 호스트에서 실행되어 그 주위를 지나다니는 패킷들을 엿보는 프로그램으로서 계정과 패스워드를 알아내기 위해서 침입자들에 의해 자주 사용되는데 아무리 네트워크 보안에 신경을 쓴 호스트라도 주변의 호스트가 공격당해서 스니핑을 위해 사용된다면 무력해질 수 밖에 없다. 즉, 나의 컴퓨터와 연결된 호스트 중 하나에 해커가 침입하여 스니퍼를 설치하게 되면 나의 호스트로 접근하는 루트 패스워드를 가로채어 알아낼 수 있게 되며 같은 방법으로 인접해 있는 호스트들은 모두 스니핑을 당하게 된다. 스니퍼는 이더넷의 설계상 약점에 의해 발생하는 기술로 원리를 알아보면 다음과 같다.

가장 일반적인 LAN의 구성 방법은 이더넷을 사용하는 것으로 주변에서 가장 쉽게 접하는 경우이다. 이더넷을 통한 통신방법은 매우 간단하다. A라는 호스트가 B라는 호스트로 패킷을 보내고 싶다면 호스트 A는 B와의 배타적인 연결을 통하는 것이 아니라 그 패킷을 이더넷에 뿌린다. 그리고 그 패킷은 일반적으로 수신 주소의 호스트만이 받도록 기대된다. 그러나 그것은 기대 사항일 뿐 언제라도 깨어질 위험 부담을 안고 있는 프로토콜이다. 네트워크 디바이스는 자신에게 오지 않고 다른
호스트를 향해 지나가는 패킷까지 받는 상태에 들어갈 수 있는데, 그 때를 'Promiscuous Mode'라고 부른다.
스니퍼는 바로 그 상태에서 동작한다. 이렇게 네트워크의 설계상에 커다른 약점이 있기 때문에 스니퍼에 의한 공격은 치명적이며 일부 OS를 제외하고는 찾아내기가 곤란한 경우가 많고 이를 막기 위해 많은 부담이 따른다. 게다가 스니퍼의 핵심을 이루는 코드는 대부분의 OS에서 독립된 프로토콜로서 지원을 하는데 SunOS의 NIT, IRIX의 SNOOP이 좋은 예이다. 잘만 이용하면 침입자들을 상대하는 관리자들에게 큰 무기가 될 수 있다. 즉, 네트워크를 감시하여 해커를 잡는 데 사용할 수 도 있다. 예를 들면 netlog라는 좋은 툴이 이미 있다.

(ftp://ftp.cert-kr.or.kr/pub/tools/etc/netlog/netlog -1.2.tar.gz)은 telnet과 ftp모듈이 제외되어 있는 것이 이툴의 성격을 잘 말해 주고 잇다. 패스워드 스니핑에 사용되는 것을 막기 위함일 것이다.
스니퍼는 일반적으로 다음과 같은 일련의 동작을 하는 코드로 구성된다.
1. 네트워크 디바이스를 열어서 "Promiscuous Mode"로 만든다.
2. 지나가는 모든 패킷을 읽는다.
3. 패킷을 필터링해서 발신 및 수신 주소, 서비스(telnet, rlogin, ftp, smtp등), 그리고 계정과 패스워드가 포함된 데이터를 구분해서 출력한다.

 

inetd(원영식,FreeBSD user group)

inetd는 super daemon이라고 합니다.
즉 여러 서버 프로그램들을 관리하는 서버 프로그램이라고 할까요...  inetd는 메모리에 항상 떠 있으면서 클라이언트에서 요청이 있을 때마다  그에 적절한 서버 프로그램을 찾아서 실행시켜 주는 것입니다. 필요한 설정은 /etc/services와 /etc/inetd.conf 두 파일에 들어 있습니다. services는 서비스와 포트 번호를 설정하는 것이고, inetd.conf는 서비스와 해당 서버 프로그램을 설정하는 것입니다.
ftp를 inetd와 standalone 두 가지로 모드로 한다는 것은 말 그대로 ftp 서버를 inetd 관리 하에 둘 것인가, 아니면 inet와 관계 없이 독립적으로 실행할 것인가를 결정하는 것입니다. inet 모드로 운영하면 클라이언트로부터 요청이 있을 때마다(ftp 접속 요청이 있을 때마다) inet가 ftp 서버 프로그램을 찾아서 실행시켜 주고, ftp 접속이 끊어지면 다시 실행을 중단시킵니다. standalone 모드라면 부팅 후 항상 ftp 서버가 메모리에 상주하며 ftp 접속 요청이 생기면 직접 ftp 서비스를 시작합니다.

inet 모드의 장점은 쓸데없이 메모리를 잡아먹지 않아도 된다는 점이구요, standalone은 빠르다는 점입니다. 일반적으로 접속요구가 빈번한 웹서버는 standalone으로, 나머지 서비스는 inetd모드로 설정해 놓더군요.

 

DAEMON(정보통신용어사전)

컴퓨터 시스템의 운영에 관련된 작업을 후선(background) 상태로 동작하면서 실행하는 프로그램.
처리해야 할 작업 조건이 발생하면 자동으로 기동하여 필요한 작업을 실행한다. 예를 들면, 인터넷 웹 서비스를 제공하는 주 컴퓨터 시스템에서 웹 서버는 후선 상태로 동작하고 있다가 통신망상의 웹 브라우저로부터 자료 요청이 있으면 작업을 실행한다. 

 

LKM(en.wikipedia.org/wiki/LKM)

Linux Loadable Kernel Modules, or LKM, are object files that contain code to extend the running kernel, or so-called base kernel. They are typically used to add support for new hardware, filesystems or for adding system calls. When the functionality provided by a LKM is no longer required, it can be unloaded, freeing memory.

리눅스 로더블 커널 모듈(Linux Loadable Kernel Modules), LKM은 소위 베이스 커널(base kernel)이라고 불리는 구동 커널을 확장하기 위한 코드를 포함한 객체 파일이다. 새로운 하드웨어나 파일시스템 또는 추가된 시스템 콜(system call)을 추가적으로 지원하기 위해 사용된다. LKM에 의해 제공되는 기능의 더이상 필요하지 않을 때, 언로드(unload)되고 메모리를 해제한다.

 

저작자 표시 비영리
Posted by 티엘로

원문 -> http://linuxgazette.net/issue83/sandeep.html

-----------------------------------------------------------------------------

   이전 part1에서 우리는 ptrace의 기본적인 특성에 대해서 알아 보았습니다. 우리는 이제
  다시한번 작은 예제를 볼 것입니다. 제가 미리 말 한것 처럼 ptrace의 메인 어플리케이션
  은 실행될 프로세스의 메모리나 레지스터에 접근하는 것입니다.(그것이 디버깅의 목적
  이든 나쁜목적이든 말입니다.) 그래서 먼저 우리는 몇가지 기본적인 실행파일의 바이너리
  구조에 대해서 알 필요가 있습니다.- 그 다음 우리가 알 것은 어떻게 그리고 어디에 접근
  해야 하는것입니다.. 그래서 저는 먼저 ELF의 기본적인 튜터리얼을 제공할 것입니다.
  ELF는 리눅스에서 사용되는 바이너리 포맷입니다. 이 문서의 끝 부분에서 우리는 다른
  프로세스의 메모리와 레지스터에 접근하여 그들에게 추가적인 코드를 주입함으로 써
  출력을 다르게 만들어 볼 것입니다.

    NOTE. 혼란 스러워하지 마세요!! 확실히 이 문서는  ptrace에 관한 것이지 ELF에 관한
    것이 아닙니다. 그러나 ELF의 기본적인 지식이 프로세스의 이미지에 접근한데 필요
    합니다. 그래서 이것을 먼저 설명하는 것입니다.

1. What is ELF?

        ELF는 Executale and Linking Format 입니다. 이것은 리눅스에서 사용되는 실행
        가능한 바이너리를 정의합니다 - 그리고 공유 오브젝트와 코어 덤프 파일, 재배치
        들도 정의합니다. ELF는 링커와 로더에 의해 모두 사용됩니다. 그들은 두 가지 측면
        으로부터 ELF를 보게 됩니다. 그래서 둘 다 일반적인 인터페이스를 가집니다.

        ELF의 구조는 많은 섹션과 세그먼트를 가집니다. 재배치 파일은 섹션 헤더 테이블을
        가지고 실행가능한 파일은 프로그램 헤더 테이블을 가지고, 공유 오브젝트 파일은 둘
        다 가지고 있습니다. 다음에 오는 섹션에서는 이 헤더들이 무엇인지 설명을 하겠습니다.


2. ELF Headers
 
    모든 ELF 파일은 ELF 헤더를 가지고 있습니다. 이것은 항상 0 오프셋(파일의 가장 처음
    부분)에 있습니다. 이것은 바이너리 파일의 중요한 사항을 가지고 있습니다. - 무슨 자료
    구조들이 파일과 관련되었는지 알기 위해서는 꼭 인터럽트 되어야 합니다.(참조 되어야
    합니다)

    헤더의 포맷은 아래와 같습니다.(이 파일은 /usr/src/include/linux/elf.h에 있습니다)

   --------------------------------------------------------
   #define EI_NIDENT       16

   typedef struct elf32_hdr{
         unsigned char e_ident[EI_NIDENT];
          Elf32_Half    e_type;
          Elf32_Half    e_machine;
          Elf32_Word    e_version;
          Elf32_Addr    e_entry;  /* Entry point */
          Elf32_Off     e_phoff;
          Elf32_Off     e_shoff;
          Elf32_Word    e_flags;
          Elf32_Half    e_ehsize;
          Elf32_Half    e_phentsize;
          Elf32_Half    e_phnum;
          Elf32_Half    e_shentsize;
          Elf32_Half    e_shnum;
          Elf32_Half    e_shstrndx;
   } Elf32_Ehdr;
   --------------------------------------------------------

    각각의 필드에 대해서 간단히 설명하면 다음과 같습니다

    1. e_ident : 바이너리 파일을 어떻게 다루어야 할지에 대한 정보가 담겨 있습니다
                 플랫폼에 의존적입니다
   
    2. e_type : 바이너리 파일을 어떻게 사용해야 할지에 대한 정보가 담겨 있고 타입은
                재배치 가능한지, 실행가능한지, 공유가능한지 그리고 코어파일인지 입니다
   
    3. e_machine : 예상했던데로 이 필드는 아키텍쳐를 나타냅니다 - Intel 386, Alpha, Sparc

    4. e_version : 오브젝트 파일의 버전을 나타냅니다

    5. e_phoff : 프로그램 헤더의 시작 오프셋을 가지고 있습니다

    6. e_shoff : 섹션 헤더의 시작 오프셋을 가지고 있습니다

    7. e_flags : 프로세서 의존적인 플래그이다. i386에서는 사용되지 않습니다

    8. e_ehsize : ELF헤더의 size를 가지고 있습니다

    9. e_phentsize & e_shentsize : 프로그램 헤더와 섹션헤더의 size를 나타냅니다

    10. e_phnum & e_shnum : 프로그램 헤더아 섹션헤더의 갯수를 나타내며. 프로그램 헤더
                     테이블은 프로그램 헤더의 배열입니다. 비슷하게 섹션헤더도 마찬가지
                                     입니다
   
    11. e_shstrndx : 섹션 헤더 테이블안에서 섹션이 가지고 있는 섹션의 이름입니다. 이것은
                    테이블안의 섹션을 가리키는 인덱스 입니다
                                    (아래에서 좀더 볼 것이다)
                                   

3. Sections And Segments

    위에서 말 한것 처럼 링커는 섹션 헤더 테이블에서 묘사된것 처럼 논리적인 헤더의 집합
    인것 처럼 파일을 다룹니다 어플리케이션 들은 아마도 고유의 방법으로 인터럽트를 할 것
    입니다.

    섹션헤더들의 배열인 섹션헤더 테이블이 있습니다. 이 테이블의 가장 첫번째 인 0 엔트리는
    항상 NULL 이고 바이너리의 어느 부분도 나타내지 않습니다. 각각 섹션 헤더는 다음과 같은
    포맷을 가집니다.


   --------------------------------------------------------
    typedef struct elf32_shdr {
         Elf32_Word sh_name;           /* Section name, index in string tbl (yes Elf32) */
         Elf32_Word sh_type;           /* Type of section (yes Elf32) */
         Elf32_Word sh_flags;          /* Miscellaneous section attributes */
         Elf32_Addr sh_addr;           /* Section virtual addr at execution */
         Elf32_Off sh_offset;          /* Section file offset */
         Elf32_Word sh_size;           /* Size of section in bytes */
         Elf32_Word sh_link;           /* Index of another section (yes Elf32) */
         Elf32_Word sh_info;           /* Additional section information (yes Elf32) */
         Elf32_Word sh_addralign;      /* Section alignment */
         Elf32_Word sh_entsize;        /* Entry size if section holds table */
    } Elf32_Shdr;
   --------------------------------------------------------

  이제 각 필드의 자세한 설명을 봅시다.

    1. sh_name : 이것은 해당 인덱스의 e_shstrndx 문자열 테이블의 내용을 가집니다. 이 인덱스는
              Null로 끝나는 스트링의 시작 부분이며 이것은 섹션의 이름으로 사용됩니다. 많은
                        섹션 이름들이 있으며 아래는 그 중 일부 입니다.

                        .text : 이 섹션은 프로그램의 실행가능한 명령어를 가집니다.
                        .data : 이 섹션은 프로그램 이미지에 사용되는 초기화 된 자료를 가집니다.
                        .init : 이 섹션은 프로세스 초기화에 관련된 코드를 가집니다.

    2. sh_type : 프로그램 데이타, 심볼테이블, 스트링 테이블 등 섹션의 타입을 나타냅니다.

    3. sh_flags : 섹션의 내용을 어떻게 다룰 것인지에 대한 정보를 가집니다.

    4. sh_addralign : 섹션 내용을이 어떤 정렬방법이 요구되는지 나타냅니다.. 일반적으로 0/1
                 (둘 다 정렬을 하지 않는다는 의미) 또는 4를 사용합니다

  나머지 필드는 스스로 찾아 봅시다

    3.2. ELF 세그먼트 와 프로그램 헤더들

    ELF 세그먼트들은 로딩되는 중에 사용됩니다 ie. 프로세스 이미지가 코어안에서 만들어 질때
    각각 세그먼트는 프로그램 헤더에 의해서 묘사 됩니다. 프로그램 헤더 테이블이라는 것이 존재
    하는데(보통 ELF 헤더 근처에 있습니다) 테이블은 프로그램 헤더들의 배열입니다. 프로그램 헤더
    는 다음과 같은 포맷을 가집니다.

    --------------------------------------------------------
    typedef struct
    {
             Elf32_Word    p_type;                 /* Segment type */
             Elf32_Off     p_offset;               /* Segment file offset */
             Elf32_Addr    p_vaddr;                /* Segment virtual address */
             Elf32_Addr    p_paddr;                /* Segment physical address */
             Elf32_Word    p_filesz;               /* Segment size in file */
             Elf32_Word    p_memsz;                /* Segment size in memory */
             Elf32_Word    p_flags;                /* Segment flags */
             Elf32_Word    p_align;                /* Segment alignment */
    } Elf32_Phdr;
    --------------------------------------------------------

    1. p_type : 내용을 어떻게 다룰 것인지에 대한 정보를 제공합니다. 이것은 다음과 같은 프로그램의
                타입을 제공합니다.

                            - unused
                            - loadable
                            - Dynamic linking information
                            - reserved

                            etc ..

    2. p_vaddr : 세그먼트가 로드 될 것으로 예상되는 가상 메모리 주소 입니다.

    3. p_paddr : 세그먼트가 로드 될 것으로 예상되는 물리 메모리 주소입니다.
                 (역자 주. i386 리눅스는 가상메모리만을 사용하기 때문에 실제 p_paddr은 p_vaddr과
                               동일한 값을 가집니다.)
   
  4. p_flags : 보호 플래그를 가집니다. - read/write/execute 권한

    5. p_align : 메모리안의 세그먼트 정렬에 관한 내용을 가집니다. 만약 세그먼트가 loadable 타입
                 이라면 정렬은 page 크기로 예측될 수 있습니다.
   
    나머지 필드는 직접 알아내 봅시다 :D

4. Loading the ELF File

  우리는 ELF 오브젝트 파일에 대한 어느정도 지식을 가지게 되었습니다. 이제 우리는 실행을 위해
    파일이 어떻게 그리고 어디에로드 되는지 알아야 합니다. 보통 우리는 단순히 프로그램 이름을
    쉘 프롬프트에 입력합니다. 사실 많은 흥미있는 것들이 엔터를 친 후에 일어나게 됩니다.

    먼저 쉘은 커널 루틴을 호출하는 표준 libc 함수를 호출 합니다. 이제 공(역자 주 - 프로그램의
    흐름을 말하겠죠??)은 커널의 코트로 넘어왔습니다. 커널은 파일을 열고 실행파일의 타입과 포맷
    을 알아냅니다. 그리고는 ELF와 요구되는 라이브러리들을 로드하고 프로그램의 스택을 초기화
    하며 마침내 프로그램 코드에게 컨트롤을 넘깁니다.

    프로그램은 0x8048000에 로드되고(이것은 /proc/PID/maps로 확인할 수 있습니다) 프로그램의
    스택은 0xbfffffff에서 시작합니다.

5. Code Injection

   우리는 메모리에 프로그램이 로드되는 것을 자세히 보았습니다. 그래서 프로세스가 주어지고
   이것의 메모리 공간을 알고 있을때 우리는 이것을 추적할 수 있으며(만약 권한을 우리가 가지고
   있을경우) 프로세스의 개인적인 자료구조에 접근할 수 있습니다. 이것은 말이 쉽지 실제로
   하기에는 쉽지 않습니다. 한번 시도해 보지 않겠습니까??
   가장 먼저 다른 프로그램의 레지스터에 접근하고 이것을 수정하는 프로그램을 작성해 봅시다.
   여기서 우리는 다음과 같은 request 값을 사용할 것입니다.

     - PTRACE_ATTACH : 특정 pid의 프로세스를 붙입니다.
     - PTRACE_DETACH : 특정 pid의 프로세스를 때어냅니다.

       NOTE. 이것을(역자 주- PTRACE_DETACH를 말하는듯?) 호출하는 것을 잊지 마십시오.
                 그렇지 않으면 프로세스는 정지 모드로 있을것이며 이것은 복구하기 힘듭니다.

     - PTRACE_GETREGS : 프로세스의 레지스터를 data에 의해 가리켜지는 구조체에 복사합니다
                                  (여기서 addr 인자는 무시됩니다.). 이 구조체는 user_regs_struct 이며
                                  다음과 같이  정의되어 있습니다. 이것은 asm/user.h 에 있습니다.

    --------------------------------------------------------
    struct user_regs_struct {
                long ebx, ecx, edx, esi, edi, ebp, eax;
                unsigned short ds, __ds, es, __es;
                unsigned short fs, __fs, gs, __gs;
                long orig_eax, eip;
                unsigned short cs, __cs;
                long eflags, esp;
                unsigned short ss, __ss;
       };
    --------------------------------------------------------

    - PTRACE_SETREGS : 이것은 GETREGS의 반대 입니다.
    - PTRACE_POKETEXT : 이것은 추적되는 프로세스의 addr 주소안에 있는 데이타에 의해 가리켜
                              지는 곳에서 32bit를 복사합니다.
   
    이제 우리는 우리의 작은 코드 조각을 추적될 프로세스의 이미지에 삽입하고 강제로 프로세스의
    명령어 포인터(역자 주 - EIP를 말하는 것이겠죠?)를 변경시켜서 우리의 코드를 실행하게 만들
    것입니다. 이제 프로세스를 실행시키고 삽입된 코드를 실행시킬 것입니다.

    우리는 두가지 소스 파일을 가지고 있습니다. 한 가지는 추적되는 프로세스에 삽입될 어셈블리코드
    입니다. 우리가 추적할 조그마한 프로그램을 제공합니다.
    (역자 주 - 프로그램 소스들은 모두 현재 이 포스트에 첨부파일로 올리겠습니다 :D)

    소스 파일은 다음과 같습니다

      - Tracer.c
        - Code.S
        - Sample.c

  이제 파일을 컴파일 합니다.

  ---------------------------------
    #cc Sample.c -o loop
    #cc Tracer.c Code.S -o catch
    ---------------------------------

    이제 다른 콘솔로 가서 샘플 프로그램을 다음과 같이 실행합니다.

  ---------------------------------
    #./loop
    ---------------------------------

    다시 처음 콘솔로 돌아와서 loop 프로그램을 잡아서 이것의 출력을 변경할 프로그램을 다음과 같이
    실행합니다.

    ----------------------------------------------------
    #./catch `ps ax | grep "loop" | cut -f 3 -d ' '`
    ----------------------------------------------------
    (역자 주 - 그냥 직접 PID를 알아내서 입력해도 되겠죠 :D)

    이제 loop가 실행되고 있는 콘솔로가서 이것의 출력이 어떻게 변하였는지 확인해 봅니다.
    ptrace와의 놀이가 이제 시작되었습니다.

6. Looking Forward

  첫번째 파트에서 우리는 프로세스를 추적하고 이것의 명령어 갯수를 카운트 하였습니다. 이
  파트에서 우리는 ELF파일에 대해서 공부하고 작은 코드 조각을 프로세스에 주입 해 보았습니다.
  다음 장에서 저는 어떤 프로세스의 메모리 공간에 접근해 볼 것입니다.
 
그럼 그때까지 안녕히 계세요

    from Sandeep S.

※ 역자 주 - 이 문서의 아이디어는 매우 좋습니다. 마치 윈도우에서 원격에서 쓰레드를 만들어서 코드를 주입하는 것과 비교할 수 있겠습니다. 그러나 문서에서는 자세한 내용을 다루지 못하고 있습니다 .. 

단순히 아이디어만을 제공한 수준 같군요 ..프로그램이 실제 main()으로 넘어오는 과정도 자세히 설명하면 매우 복잡하고 알면 좋은 지식이니 따로 찾아서 공부해볼 필요가 있을것 같고 ..실제 코드를 주입하는 Tracer의 경우 현재의 리눅스에서 사용하기 위해서는 변형이 필요할 것으로 보입니다.
                    
 
저작자 표시 비영리
Posted by 티엘로

레드햇9.0 웹서버를 운영하다 급작스런 패키지 의존성 문제로 몇번 말아먹어본적이 있어 대중성 보다는  패키징 관리가 쉬운 Debian 계열의  우분투 리눅스에서 APM(Apache+Php+MySQL)을 설치해 보았습니다.

이 글은 컴파일해서 쓰는게 아니라 패키지 자체설치로 초보자도 간단하게 설치해볼수 있습니다

APM이란 리눅스에서 웹서버를 구성할때 많이 쓰는 프로그램의 일반적인 통합명칭입니다.

부르기 쉽게 한데로 모아서 APM이라고 부릅니다. 요즘은 LAMP(Linux + Apache + MySQL + Php/Perl,Python)환경 이라고도 부르기도 합니다.

아파치(Apache)는 웹서버 자체로서 일반적인 프로토콜인 Http프로토콜을 사용합니다. 또한 Https,ftp등도 지원을 하게 됩니다.

MySQL은 데이터베이스 엔진으로서 각종 게시판이나 데이터베이스를 사용해야할때 많이 쓰이는 프로그램입니다. MySQL뿐만 아니라 PostgresSQL도 사용이 가능합니다.

PHP는 스크립트언어로서 웹페이지를 구성할수 있는 언어중 하나입니다. 많은 웹 프로그램들이 php로 작성 되고 있습니다.

 

일반적으로 설치순서는 Apache -> MySQL -> PHP 등으로 이루어 지게 됩니다.

 

1) 설치

1.Apache

먼저 Apache를 설치하여 보겠습니다. 버전은 apache2버전을 기준으로 하겠습니다.

터미널을 열고 다음 명령을 입력합니다.

sudo apt-get install apache2

다음으로 mysql을 인증을 위한 모듈을 설치하겠습니다.

sudo apt-get install libapache2-mod-auth-mysql


다음으로 MySQL

sudo apt-get install mysql-server mysql-client

설치가 완료되면 MySQL서버가 자동으로 시작이 됩니다.

마지막으로 PHP 버전은 PHP5 기준으로 하겠습니다.

마찬가지로 터미널에서 다음을 입력합니다.

sudo apt-get install php5-common php5 libapache2-mod-php5

MySQL과 연동하기 위한 모듈을 설치합니다.

sudo apt-get install php5-mysql

 

이상으로 설치가 완료 되었습니다.

 

아파치 웹서버를 제 시작하겠습니다.

sudo /etc/init.d/apache2 restart

 

MySQL서버도 정상적으로 작동하는지 확인해 보고 작동을 안한다면 restart 를 해줍니다.

sudo netstat -tap | grep mysql

명령을 줬을때

tcp 0 0 localhost.localdomain:mysql *:* LISTEN -

와 비슷한 것을 보면 정상이고 그렇지 않다면

sudo /etc/init.d/mysql restart

로 재시작을 해줍니다.

 

모든게 정상이라면

에디터를 열고 웹서버의 디렉토리(일반적으로 "/var/www" 에서 phpinfo.php라는 파일을 만들고 다음의 소스코드를 넣어 줍니다.

1.      <?php

2.      print_r(phpinfo());

3.      ?>

그리고 웹브라우저를 열고 실행을 시켜봅니다.

일반적으로 http://호스트주소/phpinfo.php 로 주소를 열면 됩니다.

다음과 같은 화면이 나오면 웹서버를 위한 환경이 구성이 되었습니다.

스크롤을 내려 Apache MySQL 등을 찾아 제대로 연결이 되었는지 확인해 봅니다.

각종 사항은 설정마다 다르게 나올것입니다.


2) 설정

1. 아파치

아파치의 기본설정 파일은 /etc/apache2/apache2.conf

포트번호, 문서의루트, 모듈, 각종 로그파일, 가상 호스트 등을 설정할수 있습니다.

자세한 사항은 아파치 문서를 참조하시기 바랍니다.


2.  MySQL

mysql 의 관리자 암호는 처음에는 지정이 되지 않은 상태입니다.

관리자 암호를 설정하기 위해서는

sudo mysqladmin -u root password newrootsqlpassword

sudo mysqladmin -p -u root -h localohost password newrootpassword

을 입력합니다.

첫번째 줄만 실행해도 설정은 될것입니다.

MySQL 설정파일은 /etc/mysql/my.cnf 파일이고 로그 파일, 포트 번호등을 설정할수 있습니다.

참고 : http://mysql.com
         http://apache.org
         http://php.net


-설치 후-

Debian 계열의 배포판, 그중 우분투 리눅스는 패키징 관리가 용의하며, 각종 드라이브, 로컬 라이징, 간단한 명령어를 통한 업데이트 까지 데스크탑 리눅스를 모토로한 우분투는 GUI 환경까지 편의성 만큼은 Redhat 보다 좋은거 같습니다.

웹 서버로는 처음 구축해 보았지만, 현재 노트북의 OS 사용 하는것도 Ubuntu 이며 virtual box 사용으로 윈도우까지 wine 으로 IE6.0 까지 사용하며 불편을 못느끼고 있습니다.

Redhat 이나 Fedora 계열로 웹서버를 운영하시던 분들도 포스팅을 보시고 간단하게 가볍게 우분투를 한번 사용해 보시기 바랍니다.

단점들은 파악되는대로 포스팅을 통해 다시 공개하도록 하겠습니다.


저작자 표시 비영리
Posted by 티엘로




첫 단계로 wine과 cabextract 팩키지를 설치해야 한다.
$sudo apt-get install wine cabextract
단순하게 터미널에서 실행하자. 그러면 의존성에 걸린 libartsc0 팩키지도 같이
설치한다.


이제 설치가 종료되면 ies4linux 설치 팩키지를 다운받아야 한다.
wget 을 사용해서 다운받는다.
$wget http://www.tatanka.com.br/ies4linux/downloads/ies4linix-latest.tar.gz
이렇게 하면 파일을 자신의 home 디렉토리에 다운로드 하게된다.


다운로드 확인을 위해서 ls 를 해보면 전에 없던
ies4linux-latest.tar.gz파일이 있는것을 알 수 있다.

압축을 푼다.
$tar xvzf ies4*


압축이 풀리면 확인을 위해 ls를 사용해보자.
그러면 위와같이 ies4linux-2.0.5 라는 디렉토리가 생성되었다.
그 디렉토리로 이동해보자. 



ls를 사용해서 내용을 확인하면 위와같은 구조로 되어 있는걸 알수있다.

그중 ies4linux라는 파일을 실행시켜보자.
$./ies4linux




얼마의 시간이 지나면 위와같이 몇가지 질문을 하게된다.
첫번째는 explorer 5.5 SP2도 설치하겠냐고 물어보는데 특별히 나는 필요가 없으므로
n을 눌러서 넘어가고
두번째 5.01 설치하겠냐고 하는것도 그다지 필요없으므로 n을 선택했다.
세번째는 언어를 선택하게 되는데 우리는 ko를 타이핑 해주면 된다.


위 질문 3가지를 마치면 이제 다시 확인 질문을 하게된다.
그동안 입력한게 확실하냐고 묻는것이다. advanced option을 설정하려면
n을 타이핑 하라는데 나는 귀찮아서 하지 않고 여기서 y를 타이핑 했다. 



위 과정을 마치면 이제 설치가 진행된다. 설치파일은 직접 인터넷에서 다운받게 된다.

약간의 시간이 걸린다.


설치가 종료되면 이제 바탕화면에 explorer 아이콘이 생성된다.
아이콘 모양이 와인잔에 빠져있는 익스플로러 아이콘을 볼수있다.


이번에는 wine을  튜닝해보자.
터미널에서 먼저 winecfg 를 실행시킨다. 그러면 자신의 home 디렉토리에
.wine 이라는 숨김 디렉토리가 생성된다.
그리고 wine configuration 대화상자가 뜰것이다.
이건 그냥 꺼버리고 터미널에서 .wine 디렉토리 안으로 이동해보자
그러면 위와같은 화면의 구조가 나오는데. 그중 drive_c 디렉토리를 삭제한다.


그다음 링크를 시켜준다.
$ln -s ~/.ies4linux/ie6/drive_c drive_c
아직 테스트는 안해봤지만 wine 기본 디렉토리는 아직 익스플로러 관련 파일이 하나도
없기때문에 익스플로러 관련 어플리케이션을 설치하게 될 경우 참조에러가 날거 같았다.
그래서 위와같이 아예 아까 설치한 ie6 안의 dirve_c를 링크 시켜주는 것이다.
머 ... 나중에 이것때문에 에러가 발생하면 또 삽질좀 해주면 될것이다.
아무튼 지금은 이걸 해주어야 할거 같다 ..



자 이제 마지막으로 바탕화면의 익스플로러 아이콘을 실행하면 위와같이 리눅스에서 explorer를
볼 수 있다.. 급하게 Active X를 써야할때 쓰면 유용할 듯 하다..
단점으로 속도가 조금 느리다..


출처 : http://blog.naver.com/int_com 








저작자 표시 비영리
Posted by 티엘로