RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR

출처 : 대전국제IT교육센터 정성재 강사

 

1. NIS에 대하여
(1) 개요: 1980년대 중반 Sun Microsystems사에서는 두 가지 protocol을 내놓았는데 하나는 NFS
          (Network File System)이고 또 다른 하나가 NIS(Network Information System)이다. NIS는
          말 그대로 네트워크정보를 가지고 이것을 제공해주는 서비스를 말한다. 여러 대의 서버를
          운영하고 있고 각각의 로그인이 필요한 경우 사용자는 각 서버에 대해 모두 사용자계정과
          패스워드를 가지고 있어야 한다. NIS는 하나의 사용자계정과 패스워드, 그룹 등을 공유하
          여 다른 시스템에 제공하는 서비스를 말한다.
(2) 역사: NIS의 최초 버전은 YP(Yellow Pages)라 불리우는데, 이것은 British Telecom의 등록
          상표이며, NIS version 1이라고 부른다. 그 이후 Sun Microsystems 에서 NIS 2와 NIS 3을
          개발하였다. NIS 3 은 NIS+ 라고 불리우며 기존의 NIS에 보안을 강화한 것으로 RPC 에서
          데이터의 암호화와 인증을 지원한다. 그러나 NIS+는 서버 운영하기에 매우 복잡하여 현재
          대부분 NIS 2 를 사용한다.

2. NIS 서버구성하기
(1) 개요: NIS를 사용하기 위해서는 서버와 클라이언트에서 공통적으로 해 주어야할 작업들이 있다.
          NIS는 기본적으로 DNS를 사용하지 않으므로 /etc/host.conf 파일 수정등의 작업이 필요하
          다.
(2) NIS 구성을 위한 공통작업
   1) /etc/host.conf 파일 수정
    ㄱ. 설명: DNS를 이용하지 않게 하기 위해 DNS보다 NIS를 먼저 참조하도록 설정한다.
    ㄴ. 예
       [root@nis root]# cat /etc/host.conf
       order hosts,nis,bind
       multi on
   2) /etc/hosts 파일 등록
    ㄱ. 설명: 각각의 서버와 클라이언트 호스트들을 등록하여 좀 더 원할하게 사용할 수 있다.
             물론 DNS서버를 사용하는 경우 이 파일의 설정이 필요없다.
    ㄴ. 예
       [root@linux245 root]# cat /etc/hosts
       # Do not remove the following line, or various programs
       # that require network functionality will fail.
       127.0.0.1               linux245 localhost.localdomain localhost
       203.247.50.245          nis.test.co.kr
       203.247.50.246          nis_client.test.co.kr
(3) NIS 서버 구성하기
   1) 패키지의 설치
    ㄱ. 설명: NIS 서버용 프로그램은 ypserv이다. RHEL ES 3.0 기준으로 설치된 패키지는
             ypserv-2.8.1.i386.rpm 이다.
    ㄴ. 주요데몬
      a. ypserv : NIS 서버 데몬이다.
      b. yppasswdd : NIS 클라이언트에서 패스워드를 변경하도록 해주는 데몬이다.
      c. ypxfrd : NIS서버와 클라이언트간의 맵핑 속도를 높여주는 데몬이다.
   2) NIS 도메인 네임결정하기
    ㄱ. 설명: NIS에서 사용할 도메인이름을 결정해야 한다. nisdomainname 이라는 명령어를 이용하
             여 지정해도 되지만 부팅시에도 적용하려면 /etc/sysconfig/network 파일에 등록하도록
             한다.
    ㄴ. 예
      a. 명령어사용
        [root@linux245 root]# nisdomainname test.co.kr
          => NIS 도메인이름을 test.co.kr 이라고 지정하였다. 확인하려면 인자없이 nisdomainname
            입력하면 된다.
      b. /etc/sysconfig/network 파일에 한라인 추가
        NISDOMAIN=test.co.kr
   3) 테스트 계정 생성
    ㄱ. 설명: 테스트할 계정을 생성한다.
    ㄴ. 예
       useradd testuser
       passwd testuser
   4) 서버 시작하기
    ㄱ. 설명: 서버로 사용하기 위해서는 /etc/rc.d/init.d 디렉토리에 있는 ypserv와 yppasswdd를
             작동시켜야 한다.
    ㄴ. 예
       /etc/rc.d/init.d/ypserv start
       /etc/rc.d/init.d/yppasswdd start
    ㄷ. 참고: 부팅시에도 적용하려면 ntsysv 라는 명령실행후 ypserv와 yppasswdd 를 선택하도록
             한다.
   5) 서버의 작동확인
    ㄱ. 설명: 정상적으로 데몬이 작동중인지 확인한다.
    ㄴ. 예
       [root@linux245 root]# ps -aux |grep yp
       root      7683  0.0  0.2  1472  604 ?        S    00:59   0:00 ypserv
       root      7708  0.0  0.1  1636  488 ?        S    01:00   0:00 rpc.yppasswdd
       root      7738  0.0  0.2  4628  640 pts/1    S    01:03   0:00 grep yp
   6) 정보갱신
    ㄱ. 설명: 서버에서 사용자 추가등 설정한 내용이 변경되면 해당 정보를 갱신시켜야 한다.
    ㄴ. 방법: 2가지 방법중 하나를 한다.
      a. cd /var/yp ; make
      b. make -C /var/yp
    ㄷ. 참고
      a. make 작업을 수행하면 /var/yp 디렉토리에 지정한 nis서버이름으로 디렉토리(예를 들면 nis
        .test.co.kr)가 생성되고 그 디렉토리안에 관련정보를 가지고 있는 맵파일들이 생성된다.
      b. 서버에서 사용자가 새롭게 추가되면 추가된 정보를 지속적으로 갱신시켜줘야 한다. 이 경우
        클론을 사용해서 주기적으로 업데이트하도록 한다.
        예) [root@linux245 root]# cat /etc/crontab
            0 * * * * root make -C /var/yp > /dev/null 2>&1
              => 한시간 간격으로 업데이트하도록 설정한 예이다.
(4) NIS 클라이언트 구성하기
   1) 패키지의 설치: NIS 클라이언트로 사용하기 위해서는 ypbind와 yp-tools 라는 패키지가 설치
                    되어 있어야 한다. RHEL ES 3.0 버전에는 ypbind-1.12-1.i386.rpm과
                    yp-tools-2.8-1.i386.rpm 패키지가 설치되어 있다.
   2) NIS 도메인 이름 설정하기
    ㄱ. 설명: 서버 구성시 지정한 NIS 도메인이름을 지정한다. nisdomainname이라는 명령어를 사용
             해도 되고, 부팅시마다 적용시키기 위해 /etc/sysconfig/network 파일에 등록시킨다.
    ㄴ. 예
      a. 명령어사용
        [root@linux245 root]# nisdomainname test.co.kr
          => NIS 도메인이름을 test.co.kr 이라고 지정하였다. 확인하려면 인자없이 nisdomainname
            입력하면 된다.
      b. /etc/sysconfig/network 파일에 한라인 추가
        NISDOMAIN=test.co.kr
   3) NIS 서버와 nisdomain 설정
    ㄱ. 설명: /etc/yp.conf 파일에 지정한다.
    ㄴ. 예
       server nis.test.co.kr
       ypserver nis.test.co.kr
       domain test.co.kr
   4) ypbind 시작
    ㄱ. 설명: NIS 클라이언트는 ypbind라는 데몬을 작동시켜야 한다. 또한 ntsysv라는 명령어를
             실행시켜 부팅시에도 작동하도록 선택한다.
    ㄴ. 예
       /etc/rc.d/init.d/ypbind start
(5) NIS 클라이언트에서 사용하기
   1) 인증변경
    ㄱ. 설명: NIS 서버를 통한 인증을 받도록 설정을 변경해야 한다.
    ㄴ. 방법 : authconfig(또는 setup명령후에 Authentication configuration 선택)후에 NIS 사용을
              선택하고 '도메인'과 '서버'를 지정한다.
    ㄷ. 설정예
       도메인: test.co.kr
         서버: nis.test.co.kr
   2) 로그인해보기
    ㄱ. NIS 클라이언트에서 telnet localhost 명령을 내린다.
    ㄴ. 서버에 생성된 계정인 testuser로 로그인한다.
   3) 확인: 인증이 성공하면 다음과 같이 로그인된다.
     예)
     Red Hat Enterprise Linux ES release 3 (Taroon)
     Kernel 2.4.21-4.EL on an i686
     login: nisman
     Password:
     No directory /home/testuser!
     Logging in with home = "/".
     -bash-2.05b$
       => 일반적으로 리눅스에서 로그인하게 되면 '/home/계정'디렉토리로 접근하게 되는데,
         NIS는 인증만을 해주므로 사용자 홈디렉토리가 존재하지 않아 위와 같은 메시지가 나타나고
         로그인하게 된다. 이러한 경우 NFS와 autofs를 사용하여 외부에서 홈디렉토리도 가져오거나
         아니면 NIS클라이언트에 해당 사용자의 홈디렉토리와 환경설정파일을 부여할 수도 있다.
   4) 참고: NIS 클라이언트에서 홈디렉토리생성하여 복구하기
    ㄱ. 설명: NIS 서버는 NIS 클라이언트에게 계정과 패스워드 관련정보만을 제공한다. 따라서 일
             반 로컬사용자처럼 사용하려면 사용하고자할 디렉토리를 생성하고 권한을 부여해야
             한다.
    ㄴ. 방법: 서버에 지정된 사용자가 testuser인 경우
      a. 디렉토리 생성
        mkdir /home/testuser
      b. 환경파일 복사해오기
        cp /etc/skel/.* /home/testuser
      c. 소유권 변경
        chown -R testuser.testuser /home/testuser

3. NIS 관련명령어
(1) nisdomainname
   1) 설명: NIS 도메인이름을 보여주거나 지정하는 명령이다.
   2) 사용법
     nisdomainname [NIS 도메인이름]
   3) 사용예
    ㄱ. [root@linux245 root]# nisdomainname
        test.co.kr
         => 현재 설정된 NIS 도메인이름을 보여준다.
    ㄴ. [root@linux245 root]# nisdomainname test.co.kr
         => NIS 도메인을 test.co.kr로 지정한다.
(2) ypwhich
   1) 설명: NIS 클라이언트에서 사용하는 명령어로 NIS 서버의 이름과 관련 맵파일을 보여준다.
   2) 사용법
     ypwhich [option]
   3) option
     -m : NIS 서버관련 맵파일을 보여준다.
   4) 사용예
    ㄱ. [root@linux246 root]# ypwhich
        nis.test.co.kr
         => NIS서버의 보여준다.
    ㄴ. [root@linux246 root]# ypwhich -m
         => NIS 서버관련 맵파일을 보여준다.
(3) ypcat
   1) 설명: NIS 클라이언트에서 사용하는 명령어로 NIS 서버의 데이타베이스라고 할 수 있는 맵파일
           의 내용을 확인하는 명령이다.
   2) 사용법
     ypcat 맵파일
      => NIS 서버의 맵파일 정보를 보여준다. 맵파일의 확인은 'ypwhich -m' 명령을 이용한다.
   3) 사용법
    ㄱ. [root@linux246 root]# ypcat hosts.byname
         => 호스트관련정보를 보여준다.
    ㄴ. [root@linux246 root]# ypcat passwd.byname
         => NIS 서버의 사용자관련 정보를 보여준다.
(4) yppasswd
    1) 설명: NIS 클라이언트에서 NIS 서버에 등록된 사용자의 패스워드를 변경하는 명령이다. 물론
           변경하려면 NIS 서버의 root 패스워드도 알아야 한다.
    2) 사용법
      yppasswd 사용자계정
    3) 사용예
      ypasswd testuser
(5) ypchsh
   1) 설명: NIS 클라이언트에서 NIS 서버에 등록된 사용자의 쉘을 변경하는 명령이다.
   2) 사용법
     ypchsh 사용자계정
   3) 사용예
     ypchsh testuser
(6) ypchfn
   1) 설명: NIS 클라이언트에서 NIS 서버에 등록된 사용자의 정보를 변경하는 명령이다.
   2) 사용법
     ypchfn 사용자계정
   3) 사용예
     ypchfn testuser

* 참고: NIS 통한 인증이 가능한 서비스
  NIS로 telnet, samba, ssh(openssh 3.6버전이상) 등이 가능하다. RHEL 3에 설치되어 있는
openssh는 패치를 해야만 NIS를 통한 인증이 가능하다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. 아파치 2.0 에 대하여
(1) 개요: 아파치 2.0 버전은 기존의 1.3버전에서 업그레이드된 버전으로 레드햇 리눅스 8.0 부터
          기본으로 설치되고 있다. 1.3버전에 비해 많은 부분이 달라졌으므로 기존의 버전과 비교
          해서 그 차이점을 알아야 한다. 아파치 2.0은 가장 큰 변화는 멀티스레딩(MultiThreading)
          의 지원이다. 1.3버전은 각 요청을 프로세스에 의존하는 방식이었으나 스레드 기능의 추가
          로 아파치 2.0은 확장성과 유연함을 더 하였다. 아파치에서는 MPM(Multi-Processing Modul
          es)이라고 한다.
(2) MPM(Multi-Processing Modules)
   1) 설명: 아파치 2.0이 소개되면서 바뀐 가장 큰 변화로 기존의 1.3 버전이 안고 있는 한계인
           확장성 부분에 초점을 두고, 이에 대한 솔루션으로 하이브리드(Hybrid)웹서버를 표방하였
           다. 기존의 프로세스 방식과 스레드를 혼용한 것으로 하나의 프로세스가 제공해 주지
           못하던 신뢰성을 스레드개념을 도입하여 문제를 해결하도록 하였다. 이러한 방법은 신뢰
           성과 확장성을 제공한다. MPM은 주로  세가지 모듈형태로 많이 사용하는데, 이 중 하나의
           모듈을 선택하여 사용하면 된다. 특별히 선택하지 않으면 1.3 버전과 같은 형태인
           prefork 모듈을 사용한다.
   2) MPM 모듈의 종류
    ㄱ. prefork: 1.3 프로세스 모듈과 같은 방법으로 각 요청에 프로세스가 매핑되어 서비스 요청이
                많게 되면 프로세스의 수가 증가하게 된다. 프로세스를 제어하는 부모 프로세스는
                클라이언트의 요청이 들어올 경우 대기하고 있다가 자식 프로세스의 생성여부 등을
                관리하는 방식이다. 'MinSpaerServers', 'MaxSpareServers', 'Maxservers'의 프로
                세스 관련 지시어를 바탕으로 프로세스의 상태를 관리하며, 스레드를 지원하는 않는
                오래된 플랫폼의 경우나 스레드없이 작동하기를 원할 때 사용한다.
    ㄴ. worker: 'prefork MPM'에 기반을 두고 있는 모듈로 지정된 만큼의 스레드에 얼마나 많은 자
               식 프로세스를 생성할 것인지 지정하는 것이다. 페이지 요청이 들어오면 스레드는
               요청을 받게 되고 그에 따라 자연히 응답한다. 그러나, 이미 요청을 처리하는데 있어
               서 한계를 넘는 경우 새로운 자식 프로세스를 생성하게 된다.
    ㄷ. perchild: 서버시작시에 고정적인 프로세스 개수를 정의하며 각 프로세스는 특정 스레드
                 개수로 동작한다. 이 프로세스가 증가하게 되면 정의되어 있는 기능에 의해 자연히
                 스레드 개수는 증가된다. 프로세스는 요청이 많은지 그렇지 않은지를 판별하여 최
                 소/최대 여유분의 스레드 개수를 유지하게 된다. 또한, 각 자식 프로세스에 대하여
                 각기 다른 사용자와 그룹을 지정할 수 있다. 이 기능은 mod_perl, PHP 등을 포함한
                 CGI 스크립드들이 자식프로세스의 소유주 아이디로 작동이 가능하기 때문에 웹서버
                 입장에서는 보안적인 기능을 제공해준다고 볼 수 있다. 이 프로세스 모듈이 요즘
                 스레드를 지원하는 대부분 플랫폼환경에서 사용되어 질 수 있으며, 최대한 많은 요
                 청을 처리하기 위하여 CPU 사용량을 줄일 수 있는 방안도 될 수 있다.
    ㄹ. 기타 MPM모듈: 기타 MPM모듈로 WinNT, BeOS, NetWare, OS/2, 등이 있다.
(3) 기타 특징
   전자상거래와 같이 안전한 전송을 위해 쓰여지고 있는 SSL(Secure Socket Layer)을 핵심모듈의
  수정없이 지원한다. 또한 한 모듈의 출력을 다른 모듈에서 수정하여 클라이언트에게 보내는 필터링
  기능이 추가되었으며, IPV6도 지원한다.

2. 아파치 2.0 버전이 1.3버전에 비해 달라진 점
(1) 아파치 2.0은 아파치 데몬이 단독모드(Standalone)으로만 동작하도록 지원하기 때문에 서버의
   운영타입과 관련된 지시자인 ServerType 지시자가 없어졌다.
(2) StartServers, MinSpareServers, MaxSpareServers, MaxClients, MaxRequests-PerChild 등의
    지시자는 서버의 프로세스 개수를 지정하는 지시자였는데 이 모든 지시자들의 MPM모듈의 메뉴로
    흡수되었다.
(3) 1.3버전에서 포트넘버를 지정하던 Port라는 지시자를 없애고 Listen이라는 지시자를 사용한다.
    또한 포트넘버를 Listen 지시자 이외에 ServerName 지시자뒤에 호스트명에서 지정해야 한다.
(4) 개인 사용자의 웹 디렉토리의 경로는 나타내는 UserDir 지시자의 기본값이 disable로 설정되어
    있다. 만약 활성화시키려면 disable을 public_html 등으로 변경해야 한다.
(5) 1.3 버전에서는 DSO 모듈 설정을 위해 httpd.conf파일안에 AddModule, ClearModuleList 등의
   지시자를 사용하였지만 2.0에서는 Include지시자를 이용하여 conf.d디렉토리에 있는 conf파일을
   불러 읽어 들이게 할 수 있다. 물론 Include지시자를 사용하지 않으면 기존의 설정대로 할 수
   있다.
(6) srm.conf와 access.conf 파일을 독립적으로 사용하려면 Accessconfig와 ResourceConfig 지시자
   를 사용하였지만 2.0에서는 Include지시자를 사용한다.
(7) ErrorDocument 지시자로 메시지를 출력할 때 겹따옴표를 사용하지 않았지만, 2.0에서는 반드시
   겹따옴표를 사용해야 한다.
(8) 그 외에 AgentLog, ReferLog, RefererIgnore, FancyIndexing 등이 사용되지 않는다.

3. apache의 환경설정
(1) apache의 환경설정파일
   아파치 2.0 버전에서도 httpd.conf 파일에서 모든 환경설정을 다하도록 되어 있다.
(2) httpd.conf
   1) 구성: 1.3 버전과 마찬가지로 크게 3가지 부분으로 구성된다.
    ㄱ. Global Environment: 아파치를 전반적으로 제어하는 부분(전체환경설정)
    ㄴ. Main Server Configuration: 가상호스트에서 처리되는 않는 요청을 모두 처리해주는 주서버
                                  또는 기본 서버의 작동을 제어하는 부분(메인서버 환경설정)
    ㄷ. Virtual Host: 다른 IP와 호스트 이름을 처리하는 가상호스트 설정부분
   2) 주요설정 : httpd.conf파일은 세가지 섹션 설정으로 구성되어 있다.
    ### Section 1: Global Environment
     -ServerRoot "/usr/local/apache": 웹서버가 설치되는 디렉토리를 나타낸다. 이 곳에 환경설정
                                     파일, log파일, 에러파일, 실행바이너리 등이 위치한다.

     -ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
       => Internal server process정보를 기록할 때 사용한다. 모든 아키텍쳐에서 요구되는 것은 아
         니며, 필요한 경우 아파치 실행 프로세스의 값이 겹치지 않도록 해주면 된다.

     -PidFile /usr/local/apache/logs/httpd.pid : 서버가 시작할 때 자신의 프로세스 ID를 기록할
                                                파일을 나타낸다.

     -Timeout 300 : 받기/보내기 타임 아웃 시간을 설정한다. 설정시간 단위는 초이다.

     -KeepAlive On : 지속적인 접속을 허가할 것인지 말 것인지를 설정하는 부분이다. 즉, 하나의
                    프로세스가 실행됐을 때 처음부터 끝까지 이 프로세스를 요청한 사용자에게 작
                    업을 할 수 있도록 하는 기능이다. 이것을 사용하는 이유는 성능저하 때문인데,
                    예를 들면 자식프로세서가 한 가지 일만 처리하고 죽는 것이 아니라 다음의 일
                    도 처리함으로써 성능 향상을 꾀한다.

     -MaxKeepAliveRequests 100 : KeepAlive가 설정되어 있을 때, 지속적인 접속 기간 동안 처리할
                                수 있는 요청 갯수를 설정하는 부분이다. 클라이언트의 요청을 몇
                                번이나 처리하고 다시 처음 상태로 돌아가는지를 설정한다. 최대
                                요청갯수 0을 넣으면 무한대이다. 높은 성능을 내기 위해서는 높은
                                값을 써 넣는다.

     -KeepAliveTimeout 15 : keepAlive가 설정된 상태에서 클라이언트의 요청이 타임 아웃되는 시간
                           을 나타내며 초단위이다.

     -# prefork MPM
      <IfModule prefork.c>
      StartServers       8             // 몇개의 자식 프로세스를 처음에 미리 띄울것인지 지정
      MinSpareServers    5             // 최소로 유지해야할 여분의 자식프로세스수
      MaxSpareServers   20             // 최대 제한되어야 할 여분의 자식프로세스수
      MaxClients       150             // 클라이언트들이 동시에 접속할 수 있는 최대의 수 지정
      MaxRequestsPerChild  1000        // 자식 프로세스가 죽기전에 처리할 수 있는 요청의 개수
      </IfModule>
       => 아파치 1.3 버전에서 사용되는 모듈형태로 하나의 부모 프로세스가 작동하고 클라이언트의
         요청이 들어오면 자식프로세스를 생성하는 방식이다.

     -# worker MPM
      <IfModule worker.c>
      StartServers         2
      MaxClients         150
      MinSpareThreads     25   // 최소 여분의 스레드값
      MaxSpareThreads     75   // 최대 여분의 스레드값
      ThreadsPerChild     25   // 각 자식 프로세스당 생성하는 스레드값
      MaxRequestsPerChild  0   // 값이 0이면 자식프로세스는 죽지않고 계속 처리한다.
      </IfModule>
       => 프로세스 기반으로 작동하는 prefork MPM 방식과 각 자식 프로세스가 스레드로 클라이언트
         요청에 응답하는 혼합된 멀티 스레드 방식이다. 지정된 만큼의 프로세스와 각 프로세스마다
         스레드를 준비하여 많은 클라이언트의 요청을 받아들인다. prefork MPM에 비해 시스템 자원
         을 덜 소모한다.

     -# perchild MPM
      <IfModule perchild.c>
      NumServers           5  // 시작할 프로세스의 개수를 지정
      StartThreads         5  // 자식 프로세스에 의해서 실행되는 스레드의 수
      MinSpareThreads      5  // 최소 여분의 스레드수
      MaxSpareThreads     10  // 최대 여분의 스레드수
      MaxThreadsPerChild  20  // 자식프로세스가 생성할 수 있는 최대 스레드의 수
      MaxRequestsPerChild  0
      </IfModule>
       => 고정된 프로세스 개수를 정의하고 각 프로세스는 특정 스레드개수로 동작한다.

     -Listen 80 : 아파치 웹서버의 포트를 설정한다. 아파치 1.3버전의 Port 지시자를 대체한다.

     -Include conf.d/*.conf
       => 웹서버와 연동하는 프로그램과 관련된 환경파일을 불러오도록 지정한다.

     -LoadModule access_module modules/mod_access.so
       => 동적 객체 지원(Dynamic Shared Object, DSO)방식으로 관련 모듈을 적재한다. PHP 등을
         사용하려면 이 부분에 설정되어 있어야 한다.

     -#ExtendedStatus On
       => server-status 핸들러가 호출될 때 아파치 서버 상태를 좀 더 상세히 체크할 때 쓴다.

    ### Section 2: 'Main' server configuration
     -User apache
      Group apache
       => apache라는 사용자와 그룹을 가진 사용자들의 요청에 의해 웹서버가 실행되게 된다. httpd
        가 다른 사용자 또는 그룹 권한으로 실행하게 하려면 우선은 httpd가 root사용자 권한으로
        실행되고 나서 설정한 다음에 사용자권한으로 전환한다.

     -ServerAdmin root@posein.com : 서버에 문제가 발생했을 경우 보낼 관리자의 이메일주소를 적
                                   는다.

     -ServerName www.posein.com:80 : 서버의 도메인이름을 적는다. 만약 도메인이 없을 경우에는
                                    IP를 적는다. 실제 이름이 아닌 가상의 이름도 가능하고,
                                    추가로 2.0버전부터는 도메인명 뒤에 포트번호를 명기하도록
                                    하고 있다.

     - UseCanonicalName On : 아파치가 자신의 URL 생성시 어떤 특정한 법칙에 따라 생성을 하도록
                            지정하는 지시자이다. On이면 서버이름과 포트를 이용한 명칭을 생성
                            하고, Off이면 클라이언트에게 제공하는 호스트이름과 포트를 생성하게
                            된다.

     -DocumentRoot "/usr/local/apache/htdocs": URL상의 서버 root문서가 위치하는 디렉토리를 적
                                              는다.

     - <Directory /usr/local/apache/htdocs>
           Options Indexes FollowSymLinks
           AllowOverride None
           Order allow,deny
           Allow from all
       </Directory>
        => 특정 디렉토리를 제어할 때 사용하는 지시자를 <Directory /> ... </Directory>의 형태로
          작성하며, 각각의 디렉토리에 관한 권한등의 여러 설정등을 한다.
          * Options
            NONE : 어떤 옵션도 이용할 수 없으므로 모든 접근을 거부
            ALL : MultiViews 옵션을 제외한 모든 옵션을 부여
            Indexes : URL에 지정된 디렉토리에(index.html 같은) 지정된 파일이 없을 경우 디렉토
                     리의 파일목록을 보여주는 옵션
            Includes : 서버측의 추가적인 정보를 제공(SSI:Server Side Includes)
            FollowSymLinks : 디렉토리의 심볼릭 링크 사용 가능
            ExecCGI : CGI 스크립트를 실행할 수 있도록 함
            IncludesNOEXEC : SSI는 허용하지만 #exec 명령과 CGI 스크립트 #include 불허
            MultiViews : All 옵션이 설정되었을 때만 지정된 목록의 multiviews를 허용하는 것으로
                        유사한 파일이름을 찾아주는 기능을 실행한다. 예를 들면 index라고만 입력하
                        더라도 index.*를 찾아서 보여준다.
          * AllowOverride: 사용자 인증에 관련된 지시자로 클라이언트가 웹서버의 특정 디렉토리에
                          접근할 때 해당 디렉토리에 있는 유저 인증 파일인 .htaccess 파일을
                          읽게 되는데, 여기를 None으로 설정하면 아파치 서버는 이 파일을 무시
                          하게 된다.
           None : AllowOverride를 사용하지않는다. 즉 유저 인증파일을 사용하지 않는다.
           All : httpd.conf파일의 AccessFileName 지시자로 설정한 파일을 사용하며 또한 지시자를
                사용할 수 있다.
           AuthConfig : AccessFileName 지시자에 명시한 파일에 대해서 사용자 인증 지시자 사용을
                       허락한다. AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName,
                       AuthType, AuthUserFile, require등을 사용할 수 있다.
           FileInfo : AccessFileName 지시자로 설정한 파일에 대해서 문서 유형을 제어하는 지시자
                     사용을 허락한다. AddEncoding, AddLanguage, AddType, DefaultType, ErrorDo
                     cument, LanguagePriority등을 사용할 수 있다.
           Indexes : AccessFileName 지시자로 설정한 파일에 대해서 디렉토리 Indexing을 제어하는
                    지시자 사용을 허락한다. AddDescription, AddIcon, AddIconByEncoding, AddIco
                    nByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgno
                    re, IndexOptions, ReadmeName등을 사용할 수 있다.
           Limit : AccessFileName 지시자로 설정한 파일에 대해서 호스트 접근을 제어하는 지시자
                  사용을 허락한다. Allow, Deny, order 등을 사용할 수 있다.
           Options : AccessFileName 지시자에 명시한 파일에 대해서 Options 그리고 XBiHack 등과
                    같은 지시자 사용을 허락한다. Options, XBitHack등을 사용할 수 있다.
          * Order
            => Order명령은 해당 디렉토리에 대한 IP, DNS 필터링의 순서를 설정한다. Allow는 호스
              트 접근을 허락하며, Deny는 접근을 불허한다. Allow from all은 모든 호스트로부터의
              접근을 허락한다는 뜻이며, Deny from all은 모든 호스트로부터의 요청을 거부한다는
              뜻이다.
                예) Order deny, allow
                    Deny from all
                    Allow from 호스트명

     - #<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>
         => 개인 홈페이지 디렉토리에 대한 접근 권한을 설정한다. <Limit> ~ </Limit>로 각각의 접근
           을 제어할 수 있다.

     -UserDir public_html
       => 사용자의 개인 홈페이지의 문서가 위치하는 디렉토리명을 적는다. 기본값이 public_html
         이지만, 너무 길다고 생각되면 www나 web등으로 바꿔도 된다.

     -DirectoryIndex index.html index.php
       => 디렉토리의 인덱스파일(처음열리는 파일)로 사용할 파일이름을 적는다. 기본 index.html에
         index.htm, index.php, index.php3 index.shtml등을 추가하도록 한다.

     - AccessFileName .htaccess
        => 각각의 디렉토리의 접근을 제어하는 정보를 가진 파일 이름을 지정하며 웹 클라이언트들
          이 .htaccess파일을 볼 수 없도록 설정한다. 여기에서 사용하는 .htaccess는 권한정보를
          가지고 있으므로 보안유지 차원에서 접근을 허용해서는 안된다. 즉, 파일을 제어하려는
          디렉토리에 넣어 사용한다.

     - <Files ~ "^\.ht">
           Order allow,deny
           Deny from all
       </Files>
         => 웹 클라이언트들에게 .htaccess파일을 볼 수 있는지 여부를 결정한다.

     -TypesConfig /usr/local/apache/conf/mime.types
        => mine.types파일 또는 이에 해당하는 파일을 찾을 위치를 결정한다. MIME은 Multipurpose
          Internet Mail Extension의 약자로 클라이언트 브라우저에게 어떠한 유형의 자료를 전송
          할 것인지를 조절해 주는 기능이다.

     - DefaultType text/plain : 파일 확장자를 정의해 두는 것으로 MIME타입을 알 수 없는 문서에
                              대하여 사용할 기본 MIME타입을 설정한다. 기본값은 text/plain이며,
                              이 값으로 설정하면 Mime Type을 결정하지 못할때는 기본 텍스트문
                              서 결정한다. 주로 서버에 문서 파일이 많을 경우에 사용한다. 웹 브
                              라우저상에서 실행 프로그램이나 이미지 등 바이너리인 경우 웹브라
                              우저가 바이너리라고 해석하게 하기 위해서 "application/octet-str
                              eam" 과 같은 형식을 적어주어야 한다. 이것은 웹브라우저가 실행파
                              일 등을 텍스트문서로 착각하고 브라우저상에 표시하지 않게 하기
                              위함이다.

     - <IfModule mod_mime_magic.c>
           MIMEMagicFile /usr/local/apache/conf/magic
       </IfModule>
         => mod_mime_magic 모듈을 사용할 경우 해당 파일의 내용으로 파일 타입 힌트를 얻는 역할
           을 한다. MIMEMagicFile명령은 암시를 정의하는 모듈이 어디에 위치하고 있는지를 알려
           주는 것으로 이것을 사용하기 위해서는 해당 모듈을 탑재해야 한다.

     -HostnameLookups Off : 클라이언트에서의 접속 이름 또는 IP주소만을 기록할 지를 여부를 체크
                           한다. 예를 들면 posein.com은 On값이 되며, 192.168.0.1은 Off값이다.

     - ErrorLog /usr/local/apache/logs/error_log
       => 웹서버가 에러가 발생했을 경우 에러에 관한 기록파일을 설정한다. 참고로 <VirtualHost>
         지시자에서 ErrorLog 설정을 하지 않았다면 여기에서 언급한 설정을 따른다. 로그 파일의
         경우는 계속해서 사용량이 증가하므로 수시로 용량을 줄여야 한다.

     - LogLevel warn
        => 로그메시지의 크기를 제어하는 부분이다. 옵션에는 debug, info, notice, warn, error,
          crit, alert!, emerg 등이 있다.

     - LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
       LogFormat "%h %l %u %t \"%r\" %>s %b" common
       LogFormat "%{Referer}i -> %U" referer
       LogFormat "%{User-agent}i" agent
        => CustomLog 지시자에서 사용할 별명을 정의하는 곳으로 각각의 의미는 다음과 같다.
          %h : 호스트명
          %l : 리모트 로그이름
          %u : 사용자 인증에 사용된 유저명
          %t : 시간
          %r : 요청한 내용의 첫번째 줄
          %s : 서버상태
          $b : 전송량(헤더 포함) -바이트수
          %{헤더} : 요구된 헤더 내용
          %U : 요구한 URL

     - CustomLog /usr/local/apache/logs/access_log common
        => 클라이언트들이 웹서버에 접근한 정보를 기록해 주는 access_log 파일의 위치를 설정한
          다. <VirtualHost> 지시자에서 이 설정 부분이 없을 경우 여기서 설정한 위치로 모
          두 저장된다. 가상 호스트별로 따로 접근 로그파일을 만들고 싶으면 이 설정을 각각의
          <VirtualHost> 지시자 안에 넣으면 된다.

     - #CustomLog /usr/local/apache/logs/referer_log referer
       #CustomLog /usr/local/apache/logs/agent_log agent
         => 브라우저(agent)와 접속자(referer) 기록 파일을 갖고자 한다면 위 주석을 제거한다.

     - #CustomLog /usr/local/apache/logs/access_log combined
         => access, agent, referer 정보를 하나의 파일에 모두 저장하기를 원한다면 combined 옵션
           을 이용한다.


     - ServerTokens Full
       => 아파치에서 헤더에 의해 전송되는 정보를 어디까지 보여줄 것인가를 설정하는 지시자이다.
         * 값에 따른 정보 제공
          Prod[ductOnly] : 웹서버 종류만 표기된다. 예) Server:Apache
          Major : 아파치의 주버전 정보까지만 보여줌 예) Apache/2
          Minor : 아파치 하위버전 정보까지 보여줌 예) Apache/2.0
          Min[imal]: Prod 키워드 제공정보 + 웹서버 버전 예) Server:Apache/2.0.46
          OS: Min 키워드 제공 정보 + 운영체제 예) Server:Apache/2.0.46 (Unix)
          Full: OS 키워드 제공정보 + 설치된 모듈(응용프로그램) 정보
               예) Server: Apache/2.0.46 (Unix) PHP/4.3.2

     - ServerSignature On
        => 아파치 서버가 생성하는 페이지(에러문서, FTP 디렉토리 list, mod_status, mod_info,
          output, CGI 생성 문서 제외)에 서버 버전과 가상호스트 이름을 포함하는 행을 넣는 것을
          설정한다. 옵션에는 On | Off | Email 등이 있고 On으로 설정하면 서비스중인 가상호스트
          의 이름과 서버 버전을 포함한 라인을 보여주고, Email의 경우 ServerAdmin으로의 mailto:
          링크도 포함된다.

     - Alias /icons/ "/usr/local/apache/icons/"
        => 웹 문서 루트 디렉토리(DocumentRoot dir)외의 다른 디렉토리에서도 문서를 저장할 수
          있게 해 주는 별칭을 설정하는 부분으로 별칭의 설정은 Alias /별칭/ "path"하면 된다.
          디렉토리 설정은 앞에서 사용한 옵션을 사용하면 되고, 별칭은 하나 이상 여러 개를 만들
          어 사용 가능하기 때문에 필요한 만큼 만들어 사용하면 된다.

     - ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
        => Alias와 같은 기능을 하는 지시자로 CGI 스크립트파일이 있는 경로를 지정한다.

     - # Redirect permanent /foo http://www.example.com/bar
        => 하나의 도메인으로 메일 서버와 웹서버를 사용하는 경우에 유용하다. 즉 domain.com 을
          메일서버로 쓰고, www.domain.com을 웹서버를 쓰는 경우 www.domain.com만 입력하면 웹페
          이지가 열리고 domain.com을 입력하면 웹페이지가 안 열리는 경우 아래와 같이 입력하면
          된다.
            예) Redirect permanet /    http://www.domain.com

     - IndexOptions FancyIndexing VersionSort
        => 디렉토리 목록을 표시해 줄 때 표준으로 보여줄 것인지, 아니면 파일에 대한 약간의 정보
          를 추가해서 표시해 줄 것인지를 결정한다. 만약 표시한 파일이 존재하지 않을 경우 디렉
          토리와 파일들의 목록을 보여줄 때 디렉토리와 속성에 따른 아이콘, 파일 크기, 파일 시간
          을 사용할 지 여부를 설정한다. 추가로 VersionSort라는 것이 있는데 이것은 파일버전순으
          로 인덱스해주는 옵션이다.

     - AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

       AddIconByType (TXT,/icons/text.gif) text/*
       AddIconByType (IMG,/icons/image2.gif) image/*
       AddIconByType (SND,/icons/sound2.gif) audio/*
       AddIconByType (VID,/icons/movie.gif) video/*

       AddIcon /icons/binary.gif .bin .exe
       AddIcon /icons/binhex.gif .hqx
       AddIcon /icons/tar.gif .tar
       AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
       AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
       AddIcon /icons/a.gif .ps .ai .eps
       AddIcon /icons/layout.gif .html .shtml .htm .pdf
       AddIcon /icons/text.gif .txt
       AddIcon /icons/c.gif .c
       AddIcon /icons/p.gif .pl .py
       AddIcon /icons/f.gif .for
       AddIcon /icons/dvi.gif .dvi
       AddIcon /icons/uuencoded.gif .uu
       AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
       AddIcon /icons/tex.gif .tex
       AddIcon /icons/bomb.gif core

       AddIcon /icons/back.gif ..
       AddIcon /icons/hand.right.gif README
       AddIcon /icons/folder.gif ^^DIRECTORY^^
       AddIcon /icons/blank.gif ^^BLANKICON^^
         => IndexOptions에서 FancyIndexing으로 설정되어 있을 경우에 사용되며 각각의 파일 및
           확장자에 따른 아이콘의 모양을 정해준다.

     - DefaultIcon /icons/unknown.gif
         => 앞에서 설정되어 있지 않은 파일에 대하여 사용하는 아이콘이다.

     - #AddDescription "GZIP compressed document" .gz
       #AddDescription "tar archive" .tar
       #AddDescription "GZIP compressed tar archive" .tgz
         => 서버에서 만들어지는 인덱스에 있는 파일 뒤에 짧은 주석을 달 수 있도록 한다. 위의
           경우에는 확장자가 .gz이면 "GZIP compressed document"라는 설명을 보여주게 된다.

     - ReadmeName README
       HeaderName HEADER
        => 서버가 디렉토리 목록 뒤에 붙여넣을 README 파일의 이름을 설정하며, HeaderName은 디렉
          토리 인덱스 앞에 내용을 넣을 파일의 이름을 설정한다. 즉, 디렉토리 목록을 보여줄 때
         화면 아래부분에 간단한 설명이 들어갈 파일을 지정한다. 예를 들면, 서버는 처음 name.ht
         ml 파일을 찾고 존재하면 그 내용을 포함한다. 만약 파일이 존재하지 않는다면 name.txt를
         찾고 txt내용을 포함한다.

     - IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
        => 디렉토리를 인덱스할 때 파일을 보이지 않게 설정하는 부분이다.

     - AddEncoding x-compress Z
       AddEncoding x-gzip gz tgz
        => 일부 브라우저에서 전송을 받으면서 정보를 압축해제할수 있도록 허용할 때 사용하는 것
          으로 모든 브라우저에서 이 기능을 지원하지는 않는다.

     - AddLanguage da .dk
         => 문서의 언어를 표시한다. 즉, 내용 협상 과정을 통해 브라우저가 이해하는 언어의 문서를
           제공할 수 있다. 폴란드어의 경우 펄과 구분하기 위해 pl .po로 포기한다.

     - LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw
         => 내용 협상 과정에서 같은 순위를 가질 때 어느 언어에게 우선권을 부여할 것인지를 설정
           한다. 설정은 내림차순으로 나열한다.

     - AddDefaultCharset ISO-8859-1
        => 기본적으로 적용되는 웹문서의 언어를 지정한다. 만약 웹페이지에 한국어를 기본으로
          지정하려면 EUC-KR 이라고 설정한다.

     - AddCharset ISO-8859-1  .iso8859-1  .latin1
        => 추가로 지원하는 웹 문서의 언어를 설정한다.

     - AddType application/x-tar .tgz
       => 추가적으로 지원될 파일들을 적는다.
        예) php4를 사용할 경우
           AddType application/x-httpd-php .php .htm .html .inc .php4 .php3
           AddType application/x-httpd-php-source .phps
            => 즉 mime.types의 수정없이 mime을 설정가능하게 해준다.

     - #AddHandler cgi-script .cgi
        => 특정 파일 확장자나 처리기에 연결하거나 특정 파일 타입에 특정 동작 연결을 설정하는
          부분이다. 즉, 어떤 파일 확장자를 파일 종류와 무관하게 작동할 수 있게 "Hander"에 결
          합되도록 설정해 주는 것이다.

     - # Format: Action media/type /cgi-script/location
       # Format: Action handler-name /cgi-script/location
        => 매칭되는 파일이 불려질 때마다 해당 미디어 타입에 맞는 스크립트를 실행할 수 있으며,
          이 설정은 자주 사용되는 CGI 파일 프로세서에 대해 반복적으로 URL을 사용하지 않아도
          된다.

     - # Customizable error responses come in three flavors:
       # 1) plain text 2) local redirects 3) external redirects
       #
       # Some examples:
       #ErrorDocument 500 "The server made a boo boo."
       #ErrorDocument 404 /missing.html
       #ErrorDocument 404 "/cgi-bin/missing_handler.pl"
       #ErrorDocument 402 http://www.example.com/subscription_info.html

         => 존재하지 않는 페이지를 요청받을 경우 또는 해당 디렉토리의 퍼미션이 없을 경우 보여
           주는 에러 메시지설정이다. 관리자 임의로 다음 3가지 중 선택해서 출력해 줄 수 있다.
             1) plain text - 보통 텍스트 화면
             2) local redirects - 내부 URL로 방향 전환
             3) external redirects - 외부 URL로 방향 전환
           또한 각 에러에 대한 문서전달 방법을 예이다. 아파치 1.3버전에서는 큰따옴표(") 하나로
           오류 메시지를 전달하였으나 2.0버전에서부터는 양쪽으로 큰따옴표를 붙여 사용한다.

     - BrowserMatch "Mozilla/2" nokeepalive
       BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
        => HTTP 응답 방식을 수정한다. 첫번째 지시자는 Netscape 2.x와 유사한 브라우저에 대해
          KeepAlive기능을 사용하지 못하게 하는 설정이다. 두번째 지시자는 HTTP/1.1을 잘못 구현
          한 301,302(redirect)응답에 대해 KeepAlive를 제대로 지원하지 못하는 MS Explorer 4.0b2
          를 위한 설정 등이다.

     - BrowserMatch "RealPlayer 4\.0" force-response-1.0
       BrowserMatch "Java/1\.0" force-response-1.0
       BrowserMatch "JDK/1\.0" force-response-1.0
         => HTTP/1.1 응답도 제대로 처리하지 못해 HTTP/1.1 spec를 위반하는 브라우저에 대해
           HTTP/1.1응답을 하지 않게 하는 설정이다.

     - #<Location /server-status>
       #    SetHandler server-status
       #    Order deny,allow
       #    Deny from all
       #    Allow from .your-domain.com
       #</Location>
         => 서버 상태정보를 허용할 서버이름을 적어준다. 이 설정을 하면 웹브라우저를 이용하여
           http://localhost/server-status 라고 입력하면 웹서버의 상태를 파악할 수 있다.

     - #<Location /server-info>
       #    SetHandler server-info
       #    Order deny,allow
       #    Deny from all
       #    Allow from .your-domain.com
       #</Location>
         => 원격 서버의 환경 설정을 보고받을 수 있다. 주의할 점은 mod_info.c가 로드되어 있어야
           한다. http://localhost/server-info 라고 입력하면 서버의 환경 설정을 확인할 수 있다.

     - #    ProxyVia On
        => HTTP/1.1 "Via:"헤더를 처리할 지 여부를 설정하는 부분이다. 옵션에는 Off | On | Full
          | Block 등이 있으며 Full은 서버 버전을 포함하며, Block은 나가는 모든 자료에 "Via"를
          제거한다.

     - #    CacheRoot "/usr/local/apache/proxy"
       #    CacheSize 5
       #    CacheGcInterval 4
       #    CacheMaxExpire 24
       #    CacheLastModifiedFactor 0.1
       #    CacheDefaultExpire 1
       #    NoCache a-domain.com another-domain.edu joes.garage-sale.com
        => 캐쉬 기능을 enable하기 위해서는 #을 제거한다.


    ### Section 3: Virtual Hosts : 가상 도메인을 설정하는 부분으로 웹호스팅할 경우에 설정한다.
     -NameVirtualHost : 한 서버에서 여러도메인을 사용할 경우 설정해야 한다.
     예) 192.168.1.125라는 IP하나를 가지고 서버를 구축하여 abc.co.kr이라는 도메인을 웹호스팅
        할 경우의 설정
        NameVirtualHost 192.168.1.125
        ------------------------------------
       <VirtualHost 192.168.1.125>
          ServerAdmin admin@abc.co.kr
          DocumentRoot /home/abc/www
          ServerName www.abc.co.kr
          ServerAlias *.abc.co.kr                   // abc.co.kr앞에 붙는 모든 2차도메인을 모
                                                    //두 abc.co.kr이라는 홈페이지가 열리도록
                                                    //설정을 할 때 쓴다.
          ErrorLog logs/abc-error-log
          CustomLog logs/abc-access_log common
       </VirtualHost>

4. apache의 실행
(1) 데몬파일을 이용한 실행
  /usr/local/apache/bin/httpd stop 한 후에 /usr/local/apache/bin/httpd start한다.
   또는
  /usr/local/apache/bin/httpd restart
(2) 스크립트파일을 이용한 실행(권장)
  /usr/local/apache/bin/apachectl stop 한 후에 /usr/local/apache/bin/apachectl start한다.
   또는
  /usr/local/apache/bin/apachectl restart
(3) 부팅할 때마다 자동적으로 실행하도록 설정하기
  /etc/rc.d/rc.local파일에 /usr/local/apache/bin/apachectl start라고 추가한다.

5. httpd명령의 사용
(1) 사용법
   httpd [option] [command] [file_name]
(2) option
   -t : 환경파일인 httpd.conf의 파일설정을 점검한다.
   -f : 새로 설정한 conf파일이 있을 경우 그 설정파일로 아파치 데몬을 띄운다.
   -S : 현재 시스템에 설정되어 있는 가상 호스트를 보여준다.
   -l : 현재 컴파일된 모듈에 대한 목록을 보여준다.
(3) 사용예
   1) /usr/local/apache/bin/httpd -t  => 문법적으로 httpd.conf의 파일 설정을 점검한다.
      Syntax OK                       => 아무 이상이 없음을 나타낸다.
   2) /usr/local/apache/bin/httpd -f httpd_test.conf => httpd_test.conf파일의 설정대로 데몬을
                                                       띄운다.
   3) [root@linux245 root]# httpd -l
      Compiled in modules:
        core.c
        prefork.c
        http_core.c
        mod_so.c

(참고) apachectl 스크립트를 이용한 httpd.conf파일의 설정 점검
/usr/local/apache/bin/apachectl configtest

6. apache의 확인
(1) 데몬의 확인 : 아파치데몬이 떠 있는지 확인한다.
   [root@house apache]# ps -aux |grep httpd 또는 ps -aux |grep apache
    root      1515  0.0  1.2  3464 1652 ?        S    23:22   0:00 /usr/local/apache
    nobody    1516  0.0  1.6  3748 2064 ?        S    23:22   0:00 /usr/local/apache
    nobody    1517  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1518  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1519  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1520  0.0  1.3  3548 1720 ?        S    23:22   0:00 /usr/local/apache
    nobody    1523  0.0  1.3  3552 1740 ?        S    23:22   0:00 /usr/local/apache
     => 어떠한 명령을 가지고 실행했느냐에 따라 달라진다. 만약 정상적으로 작동한다면 아파치데몬
       의 리스트를 보여준다. 웹서비스 프로세스들은 초기에 구동된 httpd 데몬 1개만 root권한이고
       나머지는 nobody권한으로 데몬이 실행된다. 일반사용자들이 웹브라우저를 통해서 연결되는
       데몬은 nobody권한의 httpd이다.

7. 가상호스트(VirtualHost) 구성하기
(1) 설명: 서버를 구성하면 하나의 IP주소에 하나의 도메인이 부여되어 웹서버를 구성하게 된다.
          가상호스트란 하나의 IP주소를 가진 서버에 또 다른 여러 도메인이 부여되어 각각의 웹페
          이지를 보여주게 하는 것을 말한다.
(2) httpd.conf의 가상호스트 구성
   1) 개요: httpd.conf의 가상호스트는 이 파일의 마지막 부분인 'Section 3: Virtual Hosts'라는
           부분에서 설정하면 된다.
   2) 기본구성
    ㄱ. 기본예
       #NameVirtualHost *

       #<VirtualHost *:80>
       #    ServerAdmin webmaster@dummy-host.example.com
       #    DocumentRoot /www/docs/dummy-host.example.com
       #    ServerName dummy-host.example.com
       #    ErrorLog logs/dummy-host.example.com-error_log
       #    CustomLog logs/dummy-host.example.com-access_log common
       #</VirtualHost>
    ㄴ. 주요항목설명
      a. NameVirtualHost *
          => 하나의 IP주소로 이름기반 가상호스트를 할 경우에 사용한다. 기본적으로 주석처리가
            되어 있는데, 주석을 제거하고 *부분에 IP주소를 적으면 된다.
      b. <VirtualHost *> ~ </VirtualHost>
          => 가상호스트를 지정하는 태그이다. 이 태그안에 가상호스트관련 설정을 하면 된다.
      c. ServerAdmin webmaster@dummy-host.example.com
          => 해당도메인을 관리하는 관리자 이메일주소를 적는부분이다.
      d. DocumentRoot /www/docs/dummy-host.example.com
          => 기본 웹문서가 위치하는 디렉토리를 적는다.
      e. ServerName dummy-host.example.com
          => 도메인을 적는다.
      f. ErrorLog logs/dummy-host.example.com-error_log
          => 에러로그를 기록할 파일을 적는다.
      g. CustomLog logs/dummy-host.example.com-access_log common
          => 접속기록등 일반적인 로그를 기록할 파일을 적는다.
      h. ServerAlias *.example.com
          => 지정한 기본 도메인이외에 또 다른 호스트네임도메인을 적을 때 사용할 수 있다.
            조회하는 서브 도메인에 대하여 resolving이 되어야 한다.
            보통 ServerName항목과 연동해서 사용한다.
              예) ServerName    linux.co.kr
                  ServerAlias   www.linux.co.kr
(3) 실습
   1) 개요: 리눅스에서는 임의의 도메인을 가지고 DNS보다 먼저 참조하는 /etc/hosts를 이용하여
           가상호스트를 실습할 수 있다.
   2) 조건
    ㄱ. 서버로 사용할 IP주소를 192.168.10.120이라고 가정한다.
    ㄴ. 주 도메인을 www.linux.com이라 하고, 웹문서는 기본 웹문서가 위치하는 /usr/local/apache/
       htdocs에 위치시킨다.
    ㄷ. 추가로 구성할 도메인을 www.flower.com이라 하고, 이 도메인의 웹문서는 flower라는 계정
       사용자의 기본 홈디렉토리인 /home/flower/public_html로 지정한다.
    ㄹ. 로그는 각각의 도메인을 포함하여 구성한다. 즉 www.linux.com은 linux.com-access_log로
       하고, www.flower.com은 flower.com-access_log로 구성한다.
   3) 아래와 같이 미리 작업을 하도록 한다.
     [root@www root]# vi /etc/hosts
     # Do not remove the following line, or various programs
     # that require network functionality will fail.
     127.0.0.1       linux224        localhost.localdomain   localhost
     192.168.10.120  www.linux.com
     192.168.10.120  www.flower.com
     192.168.10.120  flower.com
(4) 구성하기
    [root@www root]# vi /usr/local/apache/conf/httpd.conf
    NameVirtualHost 192.168.10.120:80

    <VirtualHost 192.168.10.120:80>
    ServerAdmin webmaster@linux.com
    DocumentRoot /usr/local/apache/htdocs
    ServerName www.linux.com
    ServerAlias *.linux.com            // resolve가 되어야 한다.
    ErrorLog logs/linux.com-error_log
    CustomLog logs/linux.com-access_log common
    </VirtualHost>
    <VirtualHost 192.168.10.120:80>
    ServerAdmin flower@flower.com
    DocumentRoot /home/flower/public_html
    ServerName www.flower.com
    ServerAlias flower.com            // resolve가 되어야 한다.
    ErrorLog logs/flower.com-error_log
    CustomLog logs/flower.com-access_log common
    </VirtualHost>
(5) 테스트
    [root@www root]# /usr/local/apache/bin/httpd -S
    VirtualHost configuration:
    192.168.10.120:80      is a NameVirtualHost
                           default server www.linux.com (/usr/local/apache/conf/httpd.conf:947)
                           port 80 namevhost www.linux.com (/usr/local/apache/conf/httpd.conf:947)
                           port 80 namevhost www.flower.com (/usr/local/apache/conf/httpd.conf:954)

출처 : 대전국제IT교육센터 정성재 강사

 

1. IP 주소와 도메인
  인터넷에 연결된 수많은 서버와 클라이언트 컴퓨터는 각자 고유한 IP주소를 가지고 있는데 이 IP는
오직 자기만의 주소이다. 주민등록번호가 다르듯이 IP주소도 똑같은 경우가 없다. IP는 숫자로 된
배열로 되어있는데(IP에 대해서는 네트워크 책 참조), 많은 수의 갯수를 외우기는 상당히 어렵다.
따라서, 알기 쉽게 등장한 것이 도메인 네임이다.

2. DNS서버에 대하여
우리는 흔히 특정한 사이트에 접속하기 위해 도메인이름을 입력한다. 그러나 실제적으로 인터넷은
IP주소기반이기 때문에 해당사이트의 IP주소를 알아야 한다. 이 때 우리가 이용하는 것이 네임서버
이다. 네임서버는 특정한 클라이언트로부터 특정한 도메인에 대한 요청이 왔을 경우 Root 네임서버와
다른 네임서버로 부터 정보를 얻어 요청한 도메인에 대한 IP주소를 알려주는 역할을 한다. 또한 각각
의 도메인네임서버들은 2차도메인도 부여하고, 다른 서버로부터 오는 도메인에 대한 요청도 응답한다.



3. DNS서버의 종류와 역할
(1) 설명: DNS서버는 크게 Primary서버, Secondary서버, Caching Only서버로 나뉜다. 자신의
          도메인을 가지기 위해서는 가장 기본이 되는 것이 Primary서버이고, Secondary서버 및
          Caching Only서버는 보조 및 백업 서버 혹은 속도를 빠르게 하기 위해서 필요한 서버이다.
          일반적으로 Secondary서버는 Primary 서버가 다운되었을 경우를 대비해 백업할 경우에
          사용하고,  Caching Only서버는 기간망간의 캐싱을 위해서 사용한다.
(2) 종류와 역할
   1) Primary Name Server: 도메인 네임서버 사용시에 꼭 구축해야 하고, 보통 Master DNS라고
                          부른다.
   2) Secondary Name Server: 주 도메인서버인 Master DNS의 백업을 담당하고 Slave DNS라고
                            부른다. 반드시 구축할 필요는 없다.
   3) Caching Only Server: 서버에 기록된 정보가 요청이 올 경우에 응답해주는 서버이다. 즉 한번
                          요청한 정보를 서버에 기록해 두었다가 다시 동일한 요청이 왔을 때 직접
                          조회하지 않고 바로 응답하도록 해주는 서버이다.

4. 네임서버 구축의 개요
(1) 개요: 네임 서버를 운영하기 위해서는 서버에서 도메인 네임 서비스를 수행하는 프로그램을 설
          치해야 한다. Red Hat은 BIND(Berkeley Internet Name Domain)이라는 DNS서버용
          소프트웨어(데몬)을 제공한다. 또한 이 네임서버의 데몬이름은 named이다.
(2) RedHat Linux와 rpm 패키지
   RedHat Linux는 3개의 rpm패키지로 제공한다. DNS 서버관련 패키지는 bind 및 bind-utils이고,
  기본 환경설정파일 관련 패키지는 caching-nameserver로 제공이 된다.
(3) bind관련 파일 및 디렉토리
   1) 주환경설정파일
     /etc/named.conf
      => named데몬이 작동할 때 처음으로 참조하는 파일로 환경설정과 밀접한 관련이 있다.
        이 파일에서는 도메인별 zone파일을 지정하는 역할을 주로 한다.
   2) 시스템 부팅시 자동 실행 스크립트 파일
     /etc/rc.d/init.d/named
      => named데몬을 실행시킴에 있어 최적화시킨 파일이다. 네임서버를 작동시키고 중단시킬 때
        사용한다. 보통 stop, start, restart, reload 등의 인자값을 사용하는데, DNS에서는
        restart하면 caching정보가 사라지므로, 보통 reload를 많이 사용한다.
   3) /var/named 디렉토리: 루트 도메인 서버에 대한 정보가 담긴 zone파일인 named.ca와
                          localhost에 대한 zone파일인 localhost.zone, reverse zone파일인
                          named.local 파일 등 도메인 설정을 위한 zone파일이 위치하는
                          디렉토리이다.
   4) localhost와 루트 네임서버 정보 데이터베이스파일
    ㄱ. /var/named/named.ca       : 루트(.) 네임서버에 대한 정보가 있는 데이터베이스 파일이다.
    ㄴ. /var/named/localhost.zone : 리눅스 시스템에 부여되는 호스트이름인 localhost에 대한
                                   zone파일로 일종의 sample파일이라고 보면 된다.
    ㄷ. /var/named/named.local    : localhost의 Reverse zone파일이다. Reverse zone파일 구성을
                                   위한 sample파일이라고 볼 수 있다.
(4) DNS 설정하기
   1) 설명: DNS설정에서 핵심은 named.conf파일과 존파일이다. 이 두 가지의 파일을 설정하면 된다.
           존파일의 이름은 관리자가 임의로 부여하여 사용할 수 있다. named.conf 파일이
           DNS설정의 뼈대이고, 실제 서버의 내용은 존파일에 기록한다.
   2) 역할
    ㄱ. /etc/named.conf: 서버에서 사용하는 도메인별로 존파일을 지정한다. 리버스존파일의 선언도
                        해준다.
    ㄴ. zone파일: named.conf파일에서 지정한 경로에 파일을 정해진 포맷으로 만든다. 이 존파일의
                 역할은 2차도메인 부여 등 사용하는 도메인에 대해 주 설정을 담당한다.

5. /etc/named.conf파일
(1) 파일의 구성과 특징
   1) 파일의 구성은 크게 주석문과 구문으로 구성되어 있다.
   2) 기본구문은 DNS서버 구동시 꼭 필요하므로 지우지 않도록 한다.
   3) 주석은 실제 내용의 설정과 관계없이 설명 등을 붙힐 때 사용한다. 주석은 C나 C++에서 사용하
     는 스타일과 같다.
      예) // => 한줄정도의 주석을 달 경우, 또는 '#'도 사용가능하다.
          /*  */  => 여러라인의 주석을 달 경우 사용한다.
   4) 각 설정은 세미콜론(;)으로 한다.
(2) 기본설정
    // generated by named-bootconf.pl
    options {
            directory "/var/named";
            /*
             * If there is a firewall between you and nameservers you want
             * to talk to, you might need to uncomment the query-source
             * directive below.  Previous versions of BIND always asked
             * questions using port 53, but BIND 8.1 uses an unprivileged
             * port by default.
             */
            // query-source address * port 53;
    };

    //
    // a caching only nameserver config
    //
    controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
    };
    zone "." IN {
            type hint;
            file "named.ca";
    };

    zone "localhost" IN {
            type master;
            file "localhost.zone";
            allow-update { none; };
    };

    zone "0.0.127.in-addr.arpa" IN {
            type master;
            file "named.local";
            allow-update { none; };
    };
    include "/etc/rndc.key";
(3) Options
   1) 설명: 네임서버가 동작함에 있어 필요한 여러가지 설정을 하는 영역이다. 네임서버에 쓰이는
           존파일의 위치를 적는 directory 항목은 꼭 적어야 한다.
   2) 항목
    ㄱ. directory "/var/named";
         => 네임서버에서 데이터베이스 역할을 하는 존(zone)파일의 위치를 설정한다. 보통 기본값
           으로 /var/named 디렉토리가 지정된다.
    ㄴ. dump-file "/var/tmp/named_dump.db";
         => named는 정보가 갱신될 때 dump파일로 저장하는데 그 덤프파일이 생성될 위치와 파일명
           을 지정한다.
    ㄷ. statistics-file "/var/tmp/named.stats";
         => 네임서버의 통계를 낼 경우에 사용하는 옵션으로 메모리 통계 파일을 생성할 위치와
           파일명을 지정한다.
    ㄹ. forward (only|first);
         => 보통 forwarders 옵션과 함께 사용되며, only나 first 두 값 중 하나를 갖는다. only는
           자신에게 들어온 도메인 질의를 지정한 다른 서버로 넘기도록 하는 것으로 다른 서버가
           그에 대한 응답이 없을 경우 그 자신도 그 질의에 대해 응답하지 않을 경우에 설정한다.
           first는 타 서버에서 응답이 없을 때 자신이 응답하도록 할 때 설정한다.
    ㅂ. forwarders { 네임서버주소1; 네임서버주소2;....};
         => 도메인에 대한 질의를 다른 서버로 넘길 때 사용하는 옵션으로 복수 형태로
           지정가능하고 구분은 세미콜론(;)으로 한다.
    ㅅ. allow-query { 192.168.0/24; };
         => 네임서버에 질의할 수 있는 호스트를 지정한다. 위와 같이 지정하면 192.168.0.0 네트
           워크주소를 가진 호스트만이 질의할 수 있다.
    ㅇ. allow-transfer { 192.168.0/24; };
         => zone 파일의 내용을 복사할 대상에 제한을 걸 때 지정한다. 이 항목을 명기하지 않았을
          경우 기본적으로는 제한이 없다.
   3) 참고: ACL
    ㄱ. 설명: ACL이란 Access Control List의 약자로 여러 호스트를 하나의 명칭으로 지정하여
             사용하는 방법이다. allow-query나 allow-transfer 사용시 ACL을 이용하여 리스트를
             만든 후 사용가능하다.
    ㄴ. 사용예
        acl  "accesslist" { 192.168.0/24; 192.168.1.20; };
    ㄷ. 주의점: acl의 선언은 options {  }; 이전에 해야 한다.
   4) 사용예
     acl "member" { 210.96.52.100; 203.247.40/24; 211.58.96.100; };
     options {
             directory "/var/named";
             allow-transfer { 203.247.50/24; 203.247.51.30; };
             dump-file "/var/named/named_dump.db";
             statistics-file "/var/named/named.stat";
             forward only;
             forwarders { 203.247.32.31; };
             allow-query { 203.247.50/24; 203.247.51.33; member; };
     };
(4) zone 구문
   1) 설명: 실제적으로 도메인을 관리하는 데이터베이스파일인 zone파일을 지정한다. 이 zone구문
           은 크게 master, slave, hint(캐쉬서버)의 세가지 타입이 있다. 위의 예에서 보면
           zone "."이라는 항목이 있다. "."는 가장 상위도메인을 나타낸다. (참고로 말하면 원칙적
           으로 도메인을 칠때는 맨뒤에 "."을 붙여야 한다. 예를 들면 다음과 같이 "www.linux.co.
           kr."해야 한다. 그러나, 보통은 생략해서 사용해도 된다.) 도메인을 찾을 때는 가장 상위
           도메인서버에서 차례대로 트리구조형태로 찾는다. 또한 참조하는 파일인 named.ca는 일종
           의 캐시파일로서 인터닉(Internic)에서 배포하는 파일이므로 그 부분은 수정해서는 안된
           다. Reverse zone파일도 설정할 수 있다. Reverse zone 파일이란 IP를 도메인으로 변경하
           기 위해서 필요한 존파일이다. 몰론 설정안해도 무방하다. 또한 zone "0.0.127.in-addr.
           arpa"는 로컬호스트에서의 Reverse 파일에 관한 부분으로 이 부분 역시 설정그대로 둔다.
   2) 기본설정형식
     zone "도메인이름" {
       type (master | slave | hint);
       file "존파일이름";
       allow-update { none; };
     };
   3) 항목설명
    ㄱ. 도메인이름
      a. 설명: 일반적으로 해당 도메인이름을 적는다. 그 외에 "."은 캐시서버를 의미하고,
              리버스존파일의 선언은 "0.0.127.in-addr.arpa" 형태로 한다.
      b. 설정예
        1. zone "linux.co.kr"
        2. zone "50.247.203.in-addr.arpa"
    ㄴ. type
      a. 설명: type은 1차 네임서버와 2차 네임서버의 종류를 구분할 때 사용한다. 값에는master,
             slave, hint가 오는 데 이것은 DNS서버의 종류중에서 primary, slave, cache only
             서버를 뜻한다.
      b. 설정예
        1. type master;
            => Primary Name Server를 뜻한다.
        2. type slave;
           masters { primary_Name_Server_IP주소; };
    ㄷ. file
      a. 설명: 사용하고자할 존파일의 이름을 적는다. 보통 "도메인명.zone"으로 설정하고 리버스
              존파일인 경우에는 "도메인명.rev"로 설정한다.
      b. 설정예
        1. file "mybestone.zone";
        2. file "mybestone.rev";
    ㄹ. allow-update
      a. 설명: bind 9버전부터 등장한 항목으로 이 지시자는 아래의 Key설정영역과 함께 작동한다.
              역할은 Primary Name Server의 zone정보가 Slave Name Server에 업데이트될 때 사용
              한다. 이 지시자는 Primary Name Server와 Slave Name Server간에 인증을 위한 공유가
              설정되어 있어야 하고, 만약 공유키를 지정하지 않고, IP주소로 Slave Name Server를
              지정하고자 한다면 Slave Name Server의 IP주소를 적으면 된다. 물론 Slave Name Ser
              ver를 운영하지 않는다면 필요없는 항목이다.
      b. 설정예
        1. allow-update { key 공유키; };
        2. allow-update { 192.168.0.100; };
   4) 설정예:  도메인이 linux.co.kr이고, IP주소가 192.168.0.2인 경우
    ㄱ. zone파일지정(linux.zone)
       zone "linux.co.kr" {
              type master;
              file "linux.zone";
       };
    ㄴ. 리버스 zone파일지정
       zone "0.168.192.in-addr.arpa" {
             type master;
             file "linux.rev";
       };
(5) Key 설정 영역
   1) 설명: Bind 9 버전에 새롭게 추가된 보안 설정 영역으로 다른 서버에 존 설정관련 데이터들이
           전달될 때 서버 인증에 필요한 공유키를 설정하는 영역이다. 키 이름은 임의로 설정할 수
           있으나, 공유키 생성시에 지정한 키 이름과 같이 생성해야 한다. 역시 원격서버로 zone파
           일을 백업하지 않는다면 필요하지 않다.
   2) 기본구조
     key 키이름 {
           algorithm       알고리즘방식지정;
           secret          공유키값;
     };
      => bind 9에서는 HMAC-MD5알고리즘을 사용하고 공유키값은 dnssec-keygen이라는 것에 의해
        생성된다.
   3) 키생성
    ㄱ. 설명: Bind 9 에서는 RSA, DSA, HMAC-MD5 알고리즘중에서 HMAC-MD5만 지원한다. -a옵션으로
            알고리즘을 지정하고 -b 옵션으로 암호길이를 지정하면 된다. 최고 512bit로 지정할 수
            있다. -n HOST 뒤에 두 네임서버간의 공유키이름을 지정한다.
    ㄴ. 사용법
       dnssec-keygen -a hmac-md5 -b 128 -n HOST 키이름
    ㄷ. 사용예
       [root@www root]# dnssec-keygen -a hmac-md5 -b 128 -n HOST posein
       Kposein.+157+57372
       [root@www root]# ls K*
       Kposein.+157+57372.key  Kposein.+157+57372.private
        => 두 개의 키가 생성되는 데 두 키 가운데 하나를 선택하여 에디트하면 다음의 내용을 볼
          수 있다.
       [root@www root]# cat Kposein.+157+57372.key
       posein. IN KEY 512 3 157 6BPkem9J9/JOtfnWQ6Eahw==
        => 위의 내용을 편집해서 만들면 된다.
           key "posein" {
                 algorithm           "hmac-md";
                 secret              "6BPkem9J9/JOtfnWQ6Eahw==";
           };
(6) controls 설정 영역
   1) 설명: 이 영역은 rndc 유틸리티에 의해서 네임서버에 명령을 전달하여 네임서버를 구동시킬 때
           사용되는 제어 채널을 설정하는 부분이다.
   2) 기본구조
     controls {
        inet 127.0.0.1 allow { localhost; } keys { rndckey; };
     };
   3) 사용법
     inet 아이피주소 포트 allow { 허가주소; } keys { 키이름; };
   4) 사용예
    ㄱ. inet 127.0.0.1 allow { localhost; } keys { rndckey; };
      => 아이피주소 다음에 포트를 지정하지 않을 경우 기본값인 953으로 지정된다. allow 다음에
        설정한 localhost에서만 가능하고 키이름은 rndckey를 가진 경우에만 가능하다.
    ㄴ. inet * allow { any; } keys { key_list; };
      => *는 포트를 사용하지 않음을 나타내고, key_list라는 키를 가진 모든 호스트에서 가능하다.
(7) include "/etc/rndc.key" 설정 영역
    rndc라는 유틸리티의 접속을 위한 키설정부분이다. 이 내용은 /etc/rndc.key의 내용을 그대로
   가져와 control 영역의 키로 사용한다는 뜻이다.

6. 존(zone)파일
(1) 개요: 존파일은 /etc/named.conf의 정의하에 /var/named에 위치한다. /etc/named.conf에 정의된
          zone파일인 'named.ca', 'localhost.zone', 'named.local'는 BIND설치시 기본적으로
          제공해 주는 파일로, DNS 서버의 주 역할인 Resolving을 할 수 있도록 해주고(named.ca),
          개별 도메인 설정을 위한 샘플 파일같은 역할을 해준다.(localhost.zone, named.local)
          도메인을 설정하기 위해서는 zone 파일을 사용자가 지정해줘야 하는데, 임의로 생성하면
          된다. 예를 들면 linux.zone과 linux.rev 형태로 지정할 수 있는데, linux.zone파일은
          기본적인 도메인을 위해 필요한 것이고, linux.rev파일은 IP를 도메인으로 바꿔주는 역할
          (보통 Reverse라고 표현)을 하는 존파일이다. 물론 이 리버스 파일은 설정 안해도
          상관없다.
(2) 존파일의 역할: 사용하는 메인 도메인뿐만아니라, 2차 도메인을 관리하는 역할을 한다. 예를
                   들면 linux.co.kr이라는 도메인을 사용할 경우 2차도메인으로 game.linux.co.kr,
                   edu.linux.co.kr등을 사용할 수 있는데, 이러한 2차도메인의 지정을 담당하는
                   파일이다.
(3) 존파일의 구성
   1) 구성: 존파일은 도메인에 대한 실제적인 DNS정보를 담는 파일이다. 이 파일은 크게 SOA record
           와 실제내용으로 나뉜다.
   2) 기본구조
     $TTL    86400
     @ IN SOA nameserver contact-email-address (
     serial_number  ; Serial
     refresh_number ; Refresh
     retry_number   ; Retry
     expire_number  ; Expire
     minium_number  ; Minimum
     )
     [도메인] [ttl] [class] [type] [rdata]
   3) 항목설명
    ㄱ. $TTL: Time To Live의 약자로 bind 9 버전에서부터는 첫줄에 무조건 적도록 되어있다. TTL
             은 다른 서버에서 자신의 정보를 가져갔을 경우 그 쪽 서버의 캐시에 해당 정보가 얼
             마나 머물지를 결정한다. 값은 0~2147483647까지 가능하며, 단위는 초단위로 보통
             86400(1일)을 설정한다.
    ㄴ. SOA record : SOA(Start of Authority) 레코드는 zone의 시작을 가리키는 데 사용한다. 설정
                    시에 주석이 필요하면 세미콜론(;)을 입력하고 뒤에 문자열을 적는다.
      a. 맨 앞의 '@'는 현재 도메인을 나타낸다. 처음은 이것으로 시작한다.
      b. nameserver는 네임서버의 호스트명과 도메인명을 기록한다.그리고 마지막은 꼭 루트도메인
        을 뜻하는 '.'을 찍는다. 그러나 호스트명만을 입력할 때는 '.'을 생략할 수 있다.
         예) 도메인이 'linux.co.kr'인 경우 다음의 두 경우는 같다.
            ns                     IN           A          203.xxx.xxx.xxx
            ns.linux.co.kr.        IN           A          203.xxx.xxx.xxx
      c. contact-email-address는 관리자의 e-mail주소를 적는다. 일반적인 표기법은 'root@domain.
        com'이라고 표기하지만, 여기서는 'root.domain.com.'이라고 표기한다. 이 부분도 뒤에 꼭 
        '.'를 붙인다.
      d. serial_number : 일련번호로서 만약 도메인 데이터베이스가 갱신되어지면 숫자가 더 크도록
                        수정한다. 일반적으로 'YYYYMMDDNN'의 형식을 사용한다.'YYYYMMDD'는 해당
                        년월일을 적고, 'NN'은 수정한 횟수를 적어주면 된다.
      e. refresh_number : 2차 네임서버가 자신의 정보를 업데이트하기 위해서 1차네임서버에 얼마
                         나 자주 체크할 것인가를 설정하는 항목이다.
      f. retry_number : 만약 2차 네임서버가 1차 네임서버에 접속을 실패했을 경우 재시도할 시간
                       을 설정한다.
      g. expire_number : 2차 네임서버가 자신의 zone데이터를 사용할 수 있는 유효기간을 정한다.
      h. minimum_number : 데이터의 저장한도를 나타낸다. 시간들의 단위는 초단위이다.
        (참고) 2차 네임서버를 운영하지 않는다면 serial_number등의 항목은 무의미하다. 또한
              최근에 값설정시에 초단위값 대신에 W(weeks), D(Days), H(Hours), M(Minutes) 붙여
              사용해도 된다.
    ㄷ. [도메인] [ttl] [class] [type] [rdata]
      - 도메인: 도메인이름, 호스트명, 공백, @, * 등이 올 수 있다. @는 현재 도메인을 가리키고,
               *는 모든 도메인을 뜻한다. 호스트명만 기입하면 "호스트명.도메인이름"로 인식한다.
               공백은 바로 위 자원을 이어서 사용하고, 전체 도메인으로 지정시에는 반드시 도메인
               이름 맨 뒤에 꼭 맨 뒤에 '.'을 붙여야 한다.
      - ttl : 해당 레코드에 대한 TTL을 설정한다. 생략해도 무방하다.
      - class: 레코드에 대한 클래스를 지정하는 부분으로 일반적으로 Internet 클래스인 IN을 사용
             한다.
      - type: 레코드 타입을 지정한다.(A, MX 등)
      - rdata: 실제정보를 입력한다.
    ㄹ. type
      a. NS : Name Server를 지정한다.
        1. 사용법
          IN NS name_server_hostname
        2. 사용예
          IN NS ns.linux.co.kr.
      b. A : Address, 즉 특정호스트명에 대한 IP주소를 입력한다. 실제의 도메인 데이터베이스를
            구축하는 항목이다.
        1. 사용법
          hostname IN A IP_address
        2. 사용예
          www.linux.co.kr.      IN       A        211.36.134.226
      c. PTR : Domain Name Pointer, 이것은 위와 반대로 IP주소를 도메인으로 변환할 때 사용되는
              타입으로 reverse zone에서만 사용한다.
        1. 사용법
          IP_address           IN       PTR      hostname
        2. 사용예
          252     IN      PTR     mybestone.com.
        3. 참고: 이것은 꼭 안써주어도 상관은 없지만, 어떤 인터넷 서비스는 특정 호스트를 인증할
                때 IP역추적을 통해서 도메인이 등록이 되어 있는지를 인증하는 경우가 있다. 이때
                에는 이 항목을 사용하여야 한다.
      d. CNAME : Canonical Name 레코드이다. 일종의 Alias(별칭)을 의미한다.
        1. 사용법
          Alias  IN CNAME Canonical-hostname
        2. 사용예
          www                     IN A            192.168.3.224

          www1                    IN CNAME www
          www2                    IN CNAME www
      e. MX : Mail Exchanger의 약어로 일종의 Fowarding개념으로, 특정 도메인(호스트)에 대해서
             메일을 다른 메일서버로 보내게 된다.
       1. 사용법
         (도메인명 또는 호스트)      IN       MX       preference value     (메일서버)
          => 여기서 preference value는 '0'또는 양의 정수값이다. 여러개의 값이 존재할 경우에는
            낮을수록 우선권이 높다.
       2. 사용예 : linux.co.kr이라는 도메인으로 메일을 받을 경우
            IN    MX    10    linux.co.kr.
       3. 응용예 : 두개의 메일서버를 구축했을 경우
         IN     MX    10       mail
         IN     MX    20       mail2
         => 위의 예제는 이메일이 도착할 경우에는 먼저 mail서버로 먼저 보내고, 응답이 없을경우
           에는 mail2서버로 이메일을 보낸다. mail서버를 하나만 구축했을 경우에는 큰 의미가
           없다.
      f. HINFO: Host INFOrmation의 약자로 호스트정보를 제공할 때 쓴다.
       1. 사용법
         www    IN    HINFO     CPU정보    운영체제정보
       2. 사용예
         www    IN    HINFO     "i686"    "RedHat 9"
   4) 설정예: 여기서는 /etc/named.conf파일에서 존파일을 linux.zone으로 지정하고 Reverse 존파일
             을 linux.rev로 지정했다고 가정하자.
      예) 도메인이 linux.co.kr이고 IP가 192.168.0.2인 경우 다음과 같이 설정한다.
         1.linux.zone
          $TTL    86400
          @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                      2001022200 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
               IN      NS      ns.linux.co.kr.
        linux.co.kr.           IN    A    192.168.0.2
                               IN    MX    10    linux.co.kr.
        www.linux.co.kr.       IN    A    192.168.0.2
       (주의) 이 파일을 설정시에는 도메인 네임뒤에 루트를 뜻하는 '.'을 꼭 찍어야 한다. 또한
            이 파일에서 도메인 네임을 설정한 것만 접속이 된다.
       (참고) 여기에서 @는 origin을 뜻하는 특수 문자이다. 즉 메인도메인인 'linux.co.kr'를 의
             미한다. 또한 linux.co.kr이라는 도메인으로 메일을 받는다.
         2. linux.rev
           @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                      2001022301 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
                      IN      NS      ns.linux.co.kr.
          2               IN      PTR     ns.linux.co.kr.
          => 윗부분의 설정은 linux.zone의 설정과 같고, 아랫부분의 설정만 해주면 된다. 값은
            전체IP중에서 맨 숫자만 적어주면 된다. 왜냐하면 /etc/named.conf에서 linux.rev설정에
            서 일부를 지정했기 때문이다.

7. DNS관련 유틸리티
(1) rndc
   1) 설명: rndc는 네임서버 데몬을 관리하는 프로그램이다.
   2) 관련파일
    ㄱ. /etc/rndc.conf: rndc의 주 환경설정 파일이다.
    ㄴ. rndc-confgen: rndc의 주환경설정파일인 /etc/rndc.conf를 생성하는 명령이다.
   3) /etc/rndc.conf 기본설정예
     options {
        default-server  localhost;
        default-key     "rndckey";
     };

     server localhost {
             key     "rndckey";
     };

     include "/etc/rndc.key";
   4) /etc/rndc.conf의 항목
    ㄱ. options {};
       => default-server, default-key, default-port를 지정한다. 각각 서버, 키이름, 포트를 지정
         한다.
    ㄴ. server 서버주소 {};
       => 서버의 주소를 지정한 후 { }; 안에 사용할 식별키이름을 지정한다.
    ㄷ. key "키이름" {};
       => named.conf 파일과 같이 설정하거나 위의 항목처럼 include해도 된다.
         예) key "rndckey" {
                     algorithm       hmac-md5;
                     secret "2gNzw5u5z4ypwigLARTOgcA9cBQ94l4whKyjOBa5Rm4iu8P7XVt5LT8wht6x";
             };
   5) rndc-confgen
    ㄱ. 설명: /etc/rndc.conf 파일을 생성해주는 명령이다.
    ㄴ. 사용법
       rndc-confgen [option]
    ㄷ. option
       -a : /etc/rndc.key 키파일을 생성한다.
    ㄹ. 생성예
       [root@www root]# rndc-confgen -a
        => /etc/rndc.key 파일을 생성한다.
       [root@www root]# chmod 640 /etc/rndc.key
        => 퍼미션 변경
       [root@www root]# chown named.named /etc/rndc.key
        => 소유권 변경
       [root@www root]# rndc-confgen > /etc/rndc.conf
        => 리다이렉션기호를 사용하여 /etc/rndc.conf 파일로 저장할 수 있다.
   6) rndc 사용하기
    ㄱ. 조건: 네임서버 데몬이 작동하고 있어야 하며, /etc/named.conf 파일에 controls구문이 설정
             되어 있어야 한다.
    ㄴ. 사용예
       [root@www root]# rndc reload
        => named 데몬의 설정을 다시 로딩한다.
(2) redhat-config-bind: 레드햇 8.0부터 제공하는 GUI기반 BIND 설정도구이다.

(3) named-checkconf
   1) 설명: 네임서버의 주 환경 설정 파일인 /etc/named.conf의 문법적 오류를 찾아주는 명령이다.
   2) 사용법
     named-checkconf [filename]
      => 기본적으로 /etc/named.conf 파일의 오류를 검사하고, 다른 경로의 named.conf파일을
        검사하려면 파일의 경로를 적어주면 된다.
   3) 사용예
    ㄱ. [root@linux224 named]# named-checkconf
          => /etc/named.conf 파일의 문법적 오류를 찾는다.
    ㄴ. [root@linux224 root]# named-checkconf ~/named.conf
        /root/named.conf:12: unknown option 'acl
          => ~/named.conf의 문법적 오류를 찾는다.

(4) named-checkzone
   1) 설명: zone파일의 문법적 오류를 찾아주는 명령이다.
   2) 사용법
     named-checkzone 도메인명 zone파일경로
   3) 사용예
     [root@linux224 root]# named-checkzone linux.com /var/named/linux.zone
     /var/named/linux.zone:1: no TTL specified; using SOA MINTTL instead
     zone linux.com/IN: loaded serial 2005070802
     OK

8. DNS서버 구성예
(1) 단일서버
   1) 설명: 부여받은 IP주소가 192.168.1.125이고 신청한 도메인이 linux.co.kr이고, 하나의 시스템
           에 DNS, WEB, Mail서버 운영하는 경우
   2) 설정하기
    ㄱ. /etc/named.conf 파일의 설정: 이 파일에는 기본적으로 zone파일의 위치하는 디렉토리와
                                    2개의 존파일이 선언되어 있는 데, 기본설정은 건드리지 말고
                                    내용만 추가해야 한다.
      (예)
       [root@www root]# vi /etc/named.conf
       // generated by named-bootconf.pl

       options {
               directory "/var/named";
               /*
                * If there is a firewall between you and nameservers you want
                * to talk to, you might need to uncomment the query-source
                * directive below.  Previous versions of BIND always asked
                * questions using port 53, but BIND 8.1 uses an unprivileged
                * port by default.
                */
               // query-source address * port 53;
       };

       //
       // a caching only nameserver config
       //
       controls {
               inet 127.0.0.1 allow { localhost; } keys { rndckey; };
       };
       zone "." IN {
               type hint;
               file "named.ca";
       };

       zone "localhost" IN {
               type master;
               file "localhost.zone";
               allow-update { none; };
       };

       zone "0.0.127.in-addr.arpa" IN {
               type master;
               file "named.local";
               allow-update { none; };
       };
       zone "linux.co.kr" {         // 사용하고자 하는 도메인을 선언
               type master;         // 기본 primary로 사용시에는 master로 선언한다.
               file "linux.zone";   // 사용하고자하는 zone파일의 이름을 선언한다. 물론 이름은
       };                            임의로 선언. 여기서는 linux.zone이라고 함.

       zone "1.168.192.in-addr.arpa" {   // 부여받은 IP중 마지막 자리를 뺀 나머지를 역으로
               type master;                선언한다. nslookup등을 이용하여 IP주소로 도메인이름
               file "linux.rev";           을 조회할 때 사용. 타입은 master이고, zone파일의
       };                                  이름은 임의로 지정할 수 있으며, 여기서는 linux.rev
                                           라 함.

       include "/etc/rndc.key";
    ㄴ. zone파일의 생성: /etc/named.conf파일에서 zone파일들이 위치하는 디렉토리가 /var/named
                        라고 정의되어 있으므로 이 디렉토리에 생성한다. 아울러, 이 디렉토리에
                        localhost의 zone파일인 localhost.zone파일이 존재하므로 이 파일을
                        위에서 설정한 zone파일인 linux.zone으로 변경한뒤에 편집하고 리버스
                        존파일인 linux.rev는 linux.zone파일을 복사하여 설정하면 된다.
       (예)
      1. linux.zone파일의 설정
       [root@www named]# vi linux.zone
       $TTL    86400
       @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  ( // 네임서버와 관리자 메일
                                        2001071500 ; Serial           설정시 도메인명 뒤에
                                        28800      ; Refresh          반드시 '.'를 표기
                                        14400      ; Retry
                                        3600000    ; Expire         // 예전에는 초단위의 값을
                                        86400 )    ; Minimum          사용했으나 현재는 H(시),
                              IN   NS       ns.linux.co.kr.           D(일)등의 단위도 사용
       linux.co.kr.           IN   A        192.168.1.125
                              IN   MX 10    linux.co.kr.        // 메일서버의 우선순위를 지정
       www.linux.co.kr.       IN   A        192.168.1.125

         (참고) 2차 도메인 전부를 설정하는 경우
               *.linux.co.kr.         IN   A       192.168.1.125
           => (생략법)
               *                      IN   A       192.168.1.125

      2. linux.rev 파일의 설정
       [root@www named]# vi linux.rev
       $TTL    86400
       @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                        2001020201 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
                       IN NS      ns.linux.co.kr.
       125             IN PTR     ns.linux.co.kr.    // 125는 부여받은 IP의 맨 마지막을 표기한
       125             IN PTR     linux.co.kr.         것이며. PTR은 리버스존에서 정의해주는
       125             IN PTR     www.linux.co.kr.     것으로 IP주소로 도메인을 변환할 때 사용
                                                       한다.
   3) 테스트하기
    ㄱ. named 데몬을 작동시킨다.
       [root@www named]# /etc/rc.d/init.d/named start
         => named 시작시 [OK]메시지가 나타나도 /etc/named.conf파일의 설정이 잘못되면 데몬이
           작동되지 않으므로 데몬작동유무를 확인해야 한다.
    ㄴ. /etc/reslov.conf파일에 본인의 IP주소를 네임서버로 등록한다.
       예) [root@www named]# vi /etc/resolv.conf
           nameserver 192.168.1.125
    ㄷ. nslookup 명령등으로 테스트한다.
       예) [root@www named]# nslookup linux.co.kr
           Note:  nslookup is deprecated and may be removed from future releases.
           Consider using the `dig' or `host' programs instead.  Run nslookup with
           the `-sil[ent]' option to prevent this message from appearing.
           Server:         192.168.1.125
           Address:        192.168.1.125#53

           Name:   linux.co.kr
           Address: 192.168.1.125
(2) 단일서버2
   1) 설명: 위의 단일서버에 linux.com이라는 도메인 추가하기
   2) 설정하기
    ㄱ. /etc/named.conf 파일의 설정: 도메인이 추가된 경우에는 반드시 이 파일에 등록하고
                                    linux.com의 존파일을 선언해야 한다. 단순히 도메인만 추가
                                    하여 사용하는 경우에는 linux.com의 2차도메인인
                                    www.linux.com 등을 사용하기 위하여 새로운 존파일을
                                    생성해야 한다.
       (예)
      1. linux.zone파일의 설정
       [root@www named]# vi linux.com.zone
       $TTL    86400
       @       IN      SOA     ns.linux.com. root.linux.com.  ( // 네임서버와 관리자 메일
                                        2001071500 ; Serial       설정시 도메인명 뒤에
                                        28800      ; Refresh      반드시 '.'를 표기
                                        14400      ; Retry
                                        3600000    ; Expire         // 예전에는 초단위의 값을
                                        86400 )    ; Minimum          사용했으나 현재는 H(시),
                              IN   NS       ns.linux.com.             D(일)등의 단위도 사용
       linux.com.             IN   A        192.168.1.125
                              IN   MX 10    linux.com.        // 메일서버의 우선순위를 지정
       www.linux.com.         IN   A        192.168.1.125
      2. linux.rev 파일의 설정
       [root@www named]# vi linux.rev
       $TTL    86400
       @       IN      SOA     ns.linux.co.kr. root.linux.co.kr.  (
                                        2001020201 ; Serial
                                        28800      ; Refresh
                                        14400      ; Retry
                                        3600000    ; Expire
                                        86400 )    ; Minimum
                       IN NS      ns.linux.co.kr.
       125             IN PTR     ns.linux.co.kr.
       125             IN PTR     linux.co.kr.
       125             IN PTR     www.linux.co.kr.
       125             IN PTR     linux.com.            // 추가
       125             IN PTR     www.linux.com.        // 추가
    ㄷ. apache의 설정: 웹서비스를 하는 경우 아파치의 환경파일인 httpd.conf에서도 설정해줘야
                      한다.
        예) [root@www apache]# vi httpd.conf
            ---- 생략 -----
            NameVirtualHost 192.168.1.125              // 이 부분에 사용하는 IP를 적는다.
            ---- 생략 -----
            <VirtualHost 192.168.1.125>
                ServerAdmin admin@linux.com
                DocumentRoot /usr/local/apache/htdocs
                ServerName www.linux.com
                ServerAlias linux.com www.linux.com
                ErrorLog logs/linux.com-error-log
                CustomLog logs/linux.com-access_log common
            </VirtualHost>
              => 위의 ServerAlias 설정은 브라우저상에서 linux.com과 www.linux.com를 입력했을
                경우에 웹페이지가 열리도록 설정. 만약 2차도메인이 전부 이 동일한 웹페이지가
                열리도록 하려면 *.linux.com이라고 설정한다.
   3) 테스트하기
     [root@www named]# nslookup
     Note:  nslookup is deprecated and may be removed from future releases.
     Consider using the `dig' or `host' programs instead.  Run nslookup with
     the `-sil[ent]' option to prevent this message from appearing.
     > www.linux.co.kr                           // www.linux.co.kr 조회
     Server:         192.168.1.125
     Address:        192.168.1.125#53

     Name:   www.linux.co.kr
     Address: 192.168.1.125
     > www.linux.com                            // www.linux.com 조회
     Server:         192.168.1.125
     Address:        192.168.1.125#53

     Name:   www.linux.com
     Address: 192.168.1.125
     > 192.168.1.125                           // IP로 조회
     Server:         192.168.1.125
     Address:        192.168.1.125#53

     125.1.168.192.in-addr.arpa     name = linux.co.kr.
     125.1.168.192.in-addr.arpa     name = linux.com.
     125.1.168.192.in-addr.arpa     name = ns.linux.co.kr.
     125.1.168.192.in-addr.arpa     name = www.linux.co.kr.
     125.1.168.192.in-addr.arpa     name = www.linux.com.

(3) 다중 웹서버
   1) 설명: 웹서버 2대를 따로 운영할 경우 직접 www이라는 동일한 이름으로 지정가능하다.
   2) 사용예
     [root@linux224 named]# vi linux.zone
     @                        IN SOA ns.linux.com. posein.linux.com. (
                                             2005070501      ; serial (d. adams)
                                             3H              ; refresh
                                             15M             ; retry
                                             1W              ; expiry
                                             1D )            ; minimum

                              IN NS          ns.linux.com.
                              IN A           203.247.50.224
                              IN MX 10       203.247.50.224
     www                   0  IN A           203.247.50.227
     www                   0  IN A           203.247.50.228
       => TTL을 0으로 설정하면 caching을 하지 말도록 하는 설정이다.

(4) 2차도메인서버운영
   1) 개요: mybestone.com이라는 도메인으로 서버가 한 대 운영중이고 linux.mybestone.com이라는
           서브도메인(2차도메인)을 부여하여 이 서버가 독자적인 IP를 가지고 있고, 웹서버 및
           메일서버도 독자적으로 운영하려고 한다. 또한 이 서버의 서브도메인(3차도메인)도
           가능하게 설정하도록 한다.
   2) 조건
    ㄱ. mybestone.com (주 도메인)
         IP 주소         : 192.168.0.3
         zone 파일       : mybestone.zone
         Reverse zone파일: mybestone.rev
    ㄴ. linux.mybestone.com (서브 도메인)
         IP 주소         : 192.168.0.4
   3) 설정
    ㄱ. 주 네임서버(ns.mybestone.com)의 설정
      a. /var/named 디렉토리에 존재하는 mybestone.zone파일의 설정 추가
             linux            IN      NS      ns.linux
             ns.linux         IN      A       192.168.0.4
          => 첫번째줄의 설정을 풀어쓰면 다음과 같다.
              linux.mybestone.com.         IN       NS      ns.linux.mybestone.com.
            즉 linux.mybestone.com이라는 도메인의 네임서버를 ns.linux.mybestone.com이라는
            것으로 정한다는 뜻이다.
            두번째줄의 설정을 풀어쓰면 다음과 같다.
             ns.linux.mybestone.com.      IN       A      192.168.0.4
           즉, ns.linux.mybestone.com의 IP주소는 192.168.0.4라는 뜻이 된다.
       (참고) 단순히 2차 도메인 사용만 지정하려면
                linux             IN      A      192.168.0.4
              라고 한줄만 지정해도 된다.
       b. /var/named 디렉토리에 존재하는 mybestone.rev파일의 설정 추가
            linux            IN      NS      ns.linux.mybestone.com.
            4                IN      NS      ns.linux.mybestone.com.
    ㄴ. 서브 네임서버(ns.linux.mybestone.com)의 설정
      a. /etc/named.conf파일의 설정
          zone "linux.mybestone.com" {        // 위임받은 2차도메인 설정
                  type master;
                  file "linux.mybestone.zone";
          };

           zone "linux.0.168.192.in-addr.arpa" { // 위임받은 2차도메인의 역존 설정법
                   type master;
                   file "linux.mybestone.rev";
                 };
      b. linux.mybestone.zone파일의 설정
          @       IN      SOA     ns.linux.mybestone.com. root.linux.mybestone.com.  (
                                           2001071500 ; Serial
                                           28800      ; Refresh
                                           14400      ; Retry
                                           3600000    ; Expire
                                           86400 )    ; Minimum
                                         IN NS      ns.linux.mybestone.com.
          linux.mybestone.com.           IN A       192.168.0.4
                                         IN MX 10   linux.mybestone.com.
          www.linux.mybestone.com.       IN A       192.168.0.4
      c. linux.mybestone.rev 파일의 설정
          @       IN      SOA     ns.linux.mybestone.com. root.linux.mybestone.com.  (
                                           2001020201 ; Serial
                                           28800      ; Refresh
                                           14400      ; Retry
                                           3600000    ; Expire
                                           86400 )    ; Minimum
                       IN      NS      ns.linux.mybestone.com.
         4             IN      PTR     linux.mybestone.com.
         4             IN      PTR     ns.linux.mybestone.com.
         4             IN      PTR     www.linux.mybestone.com.
   ㄷ. httpd.conf파일에 설정한다.
        <VirtualHost 192.168.0.4>
            ServerAdmin root@linux.mybestone.com
            ServerName www.linux.mybesone.com
            DocumentRoot /usr/local/apache/html
            ErrorLog logs/linux.mybestone.com-error_log
            CustomLog logs/linux.mybestone.com-access_log common
        </VirtualHost>
(5) Slave DNS 구성하기
   1) 설명: Slave DNS는 Master DNS의 zone파일을 백업하는 역할을 하는 서버이다. Master DNS의
           IP주소를 192.168.1.125, 도메인 네임을 linux.co.kr이라고 가정하고, Slave DNS는
           192.168.1.126이라고 가정한다.
   2) 설정하기
    ㄱ. Master DNS(192.168.1.125)의 /etc/named.conf 파일에 허가할 Slave DNS의 설정
       [root@master root]# vi /etc/named.conf
       options {
               directory "/var/named";
               allow-transfer { 192.168.0/24; 192.168.1.126; };  // 허가할 Slave DNS IP주소
       };
       ----- 이하 생략 ------
    ㄴ. Slave DNS(192.168.126) 설정
      a. /etc/named.conf 파일의 설정: 다음의 항을 추가한다.
        [root@slave root]# vi /etc/named.conf
        ---- 생략 ----
        zone "linux.co.kr" IN {
                type slave;
                file "linux.zone";
                masters { 192.168.1.125; };
        };

        zone "1.168.192.in-addr.arpa" IN {
                type slave;
                masters { 192.168.1.125; };
                file "linux.rev";
        };
       b. zone파일을 복사할 /var/named의 허가권 조정: 복사를 해오는 named가 기본적으로
                                                     /var/named에 쓰기권한이 없다. 따라서,
                                                     허가권을 조정해야 한다.
         [root@www root]# ls -ld /var/named
         drwxr-x---    2 named    named        4096  8월 16 21:48 /var/named/
         [root@www root]# chmod g+w /var/named
         drwxrwx---    2 named    named        4096  8월 16 21:48 /var/named/
     ㄷ. slave DNS에서 named 데몬을 재가동하면 Master DNS의 존파일인 linux.zone, linux.rev
        파일을 복사해온다.


출처 : 대전국제 IT교육센터 정성재 강사

 

1. RHEL 4에서의 네트워크 설치 개요
RHEL 4에서도 리눅스 설치시 원격지에 FTP, NFS 서버 등으로 구축하고, 네트워크를 통하여 설치할
수 있다. RHEL 3 이전 버전과 달라진 점은 서버 구성은 같으나, 클라이언트의 CD-ROM 디렉토리의
경로가 다르고, 또한 설치 디스크의 이미지가 커져서 3.5" 플로피 디스크를 통한 설치가 불가능하다.
CD-ROM 드라이브의 경로는 기존의 /mnt/cdrom에서 /mnt/media로 변경되었고, 플로피 디스크
대신에 리눅스 설치 1번 CD를 사용하여 설치할 수 있다.

2. 리눅스 네트워크서버 설정 -NFS 서버이용
(1) 서버에 설치를 위한 소스 복사
   1) 설명: RHEL 4 버전인 경우에는 설치 CD에서 rpm패키지가 들어있는 RedHat디렉토리를 그대로
           복사해야 한다.
   2) 방법
    ㄱ. 소스가 위치할 디렉토리 생성
       [root@www root]# mkdir /redhat
         => 설치 디스크를 1번부터 4번장까지 복사해야 하므로 3-4GB의 여유 공간의 필요하다.
    ㄴ. 설치 CD 1번을 넣고 마운트한다.
       [root@www root]# mount /media/cdrom
         => RHEL 4부터 CD-ROM의 마운트 디렉토리가 /mnt/cdrom에서 /media/cdrom으로 변경되었다.
    ㄷ. rpm패키지를 /redhat에 복사한다.
       [root@www root]# cp -a /mnt/cdrom/RedHat /redhat
    ㄹ. 복사가 다 되었으면 마운트를 해제한다.
       [root@www root]# umount /media/cdrom
    ㅁ. 설치 디스크 2번 부터는 마운트하여 rpm패키지가 들어 있는 디렉토리인
       /media/cdrom/RedHat/RPMS/안의 내용만 복사하면 된다.
       [root@www root]# cp /media/cdrom/RedHat/RPMS/* /redhat/RedHat/RPMS
(2) NFS서버로 구축하기: 자세한 설명은 NFS서버 구축하기 참고
   1) /etc/exports 파일설정
    ㄱ. 기본설정법
       설치소스경로          클라이언트주소
    ㄴ. 설정예
       /redhat      *
      => /redhat 이라는 디렉토리에 모든 클라이언트의 접속을 허가하였다.
   2) NFS 서버를 작동한다.
    ㄱ. /etc/rc.d/init.d/portmap start    (보통 이 데몬은 기본적으로 작동한다.)
    ㄴ. /etc/rc.d/int.d/nfs start
(3) 네트워크 서버간의 차이
    네트워크 서버를 이용하여 리눅스를 설치 할 경우 FTP, HTTP, NFS 서버 등을 사용할 수 있으나,
   이 중 NFS서버를 많이 사용하는 이유는 아나콘다를 이용한 그래픽 설치가 가능하기 때문이다.

3. 클라이언트 설정 - NFS 서버 이용
(1) 개요: RHEL 3 버전까지는 부팅용 설치 디스크를 만들어서 사용했으나, RHEL 4에서는 설치용
          부팅디스크를 만들 수가 없다. 최근 플로피 디스크없이 CD-ROM만 기본 장착한 시스템들이
          많아 설치 CD 1번을 이용하여 네트워크 설치가 가능하다.
(2) 설치순서
   1) 설치 디스크 1번을 넣고 부팅한다.
   2) 초기화면이 뜨고 'boot:'라는 프롬프트가 나타나면 'linux askmethod'라고 입력하고
     [Enter]키를 누른다.
   3) 사용할 언어를 선택한다.(기본 English 선택)
   4) 키보드를 선택한다.(기본 us 선택)
   5) 인스톨 방법을 선택한다. NFS image, FTP, HTTP 방법이 있으며 이중에서 NFS image를 고른다.
   6) 네트워크 장치를 선택한다. eth0이나 eth1 등 맞는 것을 선택한다.
   7) TCP/IP 네트워크 설정을 한다. 해당 IP, Netmask, Gateway값등을 설정한다.
   8) NFS 서버를 설정한다.
    ㄱ. NFS server name : 서버네임이나 IP주소를 적는다.
        예) 192.168.4.100
    ㄴ. RedHat Enterprise Linux directory : 설치소스의 경로를 적는다.
        예) /redhat
   9) 설치를 시작한다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. pico편집기란?
pico는 워싱턴대학에서 만든 유닉스용 편집기로 간단하고 메뉴 선택 방식의 텍스트 편집기이다. vi
나 emacs와 달리 윈도우의 메모장처럼 쉽게 사용할 수 있다. vi 편집기처럼 입력모드와 명령모드가
존재하지 않고 바로 텍스트를 입력할 수 있다. 글자를 지울때도 Delete 키나, BackSpace 키를 이용
하면 된다.


2. pico 시작하기
(1) 사용법
   pico [option] [filenames]
(2) option
   -w : 긴 라인에서 라인이 깨지는 경우가 있는데 이 옵션을 사용하면 된다.
(3) 사용예
   1) [posein@www posein]$ pico
        => 빈 파일 형태로 문서를 불어온다.
   2) [posein@www posein]$ pico /etc/passwd
        => /etc/passwd라는 파일을 불러온다.

3. pico 실행후의 주요 메뉴
Ctrl + o : 파일을 저장한다.
Ctrl + x : 파일을 빠져나온다. 저장이 안되어 있으면 저장할 것인지 물어본다.
Ctrl + r : 현재 커서 위치에 다른 파일을 불려온다.
Ctrl + a : 현재 행의 맨 앞으로 이동한다.
Ctrl + e : 현재 행의 맨끝으로 이동한다.
Ctrl + v : 이전 페이지로 이동한다.
Ctrl + y : 다음페이지로 이동한다.
Ctrl + t : 영문자의 철자를 확인해 준다.
Ctrl + c : 현재 커서에서 이 키를 누르면, 하단에 현재 라인이 몇 번째 라인인지, 전체 몇 글자
           중에 몇 번째 글자인지, 전체 문서의 몇 퍼센트에 위치하는지도 알려준다. 
Ctrl + j : 현재 행이 흩어져 있는 경우에 이용된다. 예를 들어 행간이 많이 벌어져 있거나 들여쓰
           기가 되어 있는 경우에 자동으로 정리하여 질서 정연한 문장으로 만들어준다. 
Ctrl + w : 이 키를 누르고 문자열을 입력하면 원하는 문자열을 찾을 수 있다. 
Ctrl + k : 현재 라인을 삭제한다.
Ctrl + u : 마지막으로 삭제된 라인을 복구하는데 이용한다.
Ctrl + l : 화면 갱신한다.
Ctrl + g : 도움말을 보여준다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. AutoFS란?
Autofs는 자동 마운트 데몬(amd)의 작동을 제어하는 프로그램이다 자동마운트 데몬은 자동으로 파일
시스템을 마운트하며 파일 시스템이 사용되지 않고 일정 시간이 흐르면 자동으로 언마운트 한다. 네
트워크 파일 시스템, CD-ROM, 플로피 등을 마운트하는데 사용된다.


2. autofs 설치하기
리눅스 설치시에 전체선택을 하거나 사용자설치(Custom)모드에서 autofs rpm패키지를 선택하면 auto
fs가 설치되어 있을 것이다. 아니면 rpm 패키지를 찾아 설치하도록 한다. 설치방법은 생략한다.
(참고) autofs의 설치 확인
      rpm -qi autofs

3. autofs 설정하기
(1) 개요: /etc 디렉토리에 auto.master 라는 파일과 auto.misc라 불리우는 파일이 있는데 이 두개의
          파일이 환경설정 파일이다. 주 설정파일은 /etc/auto.master이다.
(2) /etc/auto.master
   1) 설명: automounter의 주된 설정파일이다. 이 파일은 3개의 필드로 구성되어 있다. 첫번째 필드
           는 마운트 포인트를 나타내고, 두번째 필드는 마운트포인트를 위한 맵파일이다. 세번째
           필드는 추가적인 옵션을 지정하는 부분이다.
   2) 파일의 예
     [root@www root]# cat /etc/auto.master
     # $Id: auto.master,v 1.2 1997/10/06 21:52:03 hpa Exp $
     # Sample auto.master file
     # Format of this file:
     # mountpoint map options
     # For details of the format look at autofs(8).
     /misc /etc/auto.misc  --timeout=60
      => /misc 라는 디렉토리를 /etc/auto.misc 파일의 설정을 가지고 사용하겠다는 뜻이다.
(3) /etc/auto.misc
   1) 설명: 실제 자동으로 마운트할 내용을 적는 파일이다. 이 파일명 이외에 다른 파일명으로
           /etc/auto.master라는 파일에 기록하면 여러 파일도 사용가능하다. 이 파일도 3개의 필드
           로 구성되어 있다. 첫번째 필드는 Key로 마운트 위치를 나타낸다. 두번째 필드는 옵션이
           고, 세번째 필드는 파일시스템의 특정한 위치를 나타낸다.
   2) 파일의 예
     [root@www root]# cat /etc/auto.misc
     # $Id: auto.misc,v 1.2 1997/10/06 21:52:04 hpa Exp $
     # This is an automounter map and it has the following format
     # key [ -mount-options-separated-by-comma ] location
     # Details may be found in the autofs(5) manpage

     cd              -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom

     # the following entries are samples to pique your imagination
     #linux          -ro,soft,intr           ftp.example.org:/pub/linux
     #boot           -fstype=ext2            :/dev/hda1
     #floppy         -fstype=auto            :/dev/fd0
     #floppy         -fstype=ext2            :/dev/fd0
     #e2floppy       -fstype=ext2            :/dev/fd0
     #jaz            -fstype=ext2            :/dev/sdc1
     #removable      -fstype=ext2            :/dev/hdd
      => 현재 설정은 cd 라는 키에 /dev/cdrom을 옵션설정대로 연결시키라는 설정이다.

3. autofs 사용하기
(1) 데몬가동하기
    /etc/rc.d/init.d/autofs start  하거나
    service autofs start
(2) 사용하기
   1) CD-ROM에 디스크를 삽입한다.
   2) ls /misc/cd 명령을 내리면 디스크의 내용을 확인할 수 있다.

(참고) NFS와 연계해서 사용하면 편리하다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. 파일 시스템이란?
파일 시스템(File System)이란 운영체제가 파일을 시스템의 디스크(흔히 블록디바이스라 불리우는
장치들) 또는 파티션에 기록될 수 있도록 구성하는 방식을 말한다. 운영체제는 시스템의 디스크 파티
션상에 파일들을 연속적이고 일정한 규칙을 가지고 저장하는데, 파일시스템은 이러한 규칙들의 방식
을 제시하는 역할을 한다.


2. 리눅스 파일 시스템의 구조
(1) 개요: 각각의 파일시스템들은 파일 시스템만의 독특한 시스템 특징을 가지고 있다. 그러나 대체
          적으로 대부분의 리눅스 파일 시스템은 비슷한 구조를 가지고 있으면 아래에 열거할 공통점
          을 가지고 있다.
(2) 리눅스 파일 시스템의 구성요소
   1) 슈퍼 블록(Super Block): 파일시스템의 전체적인 정보를 가지고 있다. 파일시스템의 크기, 매직
                             넘버, 마운트횟수, 블록그룹번호, 블록 크기, 첫번째 inode 등이 해당
                             된다.
   2) 아이노드(Inode) : 아이노드는 파일의 이름을 제외한 해당 파일의 모든 정보를 가지고 있으며
                       각 파일 이름에 부여되는 고유한 번호이다. Data Block의 위치정보, File형
                       태, 크기, 타임스탬프, File의 소유자, inode의 모드 등에 관한 정보를 가지
                       며, Inode로 이루어진 테이블에서 이 번호를 가지고 찾아 정보를 알려준다.
                       일반적으로 시스템에서는 파일이름으로 처리하는 것이 아니라 이 아이노드로
                       처리한다.
   3) 데이터 블록(Data Block) : 데이터 블록은 Inode에 포함된다. Inode가 몇 개의 데이터 블록을
                               포함하고 있다. 데이터 블록은 파일에서 데이터를 저장하기 위해
                               사용되는 공간이다.
   4) 디렉토리 블록(Directory Block) : 파일 이름과 Inode 번호를 저장하기 위해 사용된다.
   5) 간접 블록(Indirection Block) : inode에 Data Block의 위치 정보를 저장할 공간이 부족할 때,
                                    이 위치정보를 저장하기 위한 공간을 동적으로 할당하는데 이 공간
                                    이 간접 블록이다.
   6) 홀(Hole) : 홀은 Inode나 간접 블록안의 데이터 블록의 주소로 특별한 값을 저장한다. 홀은
                파일 시스템에 의해서 파일 안에 자리하게 된다. 하지만 이 홀을 위해 실질적으로
                디스크상에 공간은 할당되지 않는다. 단지 0바이트가 파일 안에서 특정 공간을 차지
                하고 있다고 가정하는 것이다.

3. 리눅스 파일 시스템의 종류와 특징
(1) 개요: 리눅스는 다양한 파일 시스템들을 지원하는데 중요 파일시스템들은 ext, ext2, minix,
          xia, umsdos, hpfs, iso9660, msdos, nfs, sysv 등이 있다.
(2) 파일 시스템의 종류와 특징
   1) ext
     리눅스 초기에 사용되던 파일 시스템으로 호환성이 없다. ext2의 구 버전으로 현재는 대부분
    사용하지 않고 있다.
   2) ext2
     현재 가장 많이 사용하는 파일 시스템으로 리눅스 파일 시스템의 대부분을 차지한다. 안정성이
    뛰어나고 속도가 빠르다. 호환성도 뛰어나고 업그레이드도 쉽게 설계되어 있다.
   3) minix
     과거 Minix에서 사용되었던 파일 시스템으로 가장 오래되고 기본이 되는 파일 시스템이다. 흔히
    가장 신뢰할 만할 파일 시스템이라고 하지만 몇가지 제한을 가지고 있다. 우선 몇몇 Time Stamp
    가 유실되고, 파일 이름은 30문자로 제한된다. 또한 파일 시스템마다 최대 64MB 성능 제한이
    있다. 대부분의 배포판의 부팅디스크는 보통 이 Minix 파일 시스템으로 구성되어 있다.
   4) xia
     Minix의 제한이었던 파일 이름과 파일 시스템에 대한 제한을 보안한 minix파일 시스템의 수정
    버전이지만 특별히 추가된 새로운 기능은 없다.
   5) msdos
     MS-DOS의 FAT파일시스템과 호환을 지원하는 파일 시스템이다. 또한 msdos는 OS/2와 윈도우 NT
    의 FAT파일시스템과도 호환된다.
   6) umsdos
     MS-DOS파일 시스템을 리눅스상에서 긴 파일명과 소유자, 접근권한, 링크와 장치 파일 등을 지원
    하도록 확장한 파일 시스템이다. umsdos는 일반적으로 DOS파일 시스템이 마치 리눅스 파일 시스
    템인 것처럼 보이도록 하는 기능을 제공하므로 따로 리눅스를 위한 파티션은 필요하지 않는다.
   7) iso9660
     ISO 기준을 따르는 CD-ROM의 표준 파일시스템이다. 이 파일시스템은 CD-ROM에 좀 더 긴 파일명
    을 사용할 수 있도록 확장한 록 브리지(Rock Bridge)가 기본으로 지원된다.
   8) hpfs
     OS/2의 파일 시스템이다. 하지만 현재는 읽기 전용인 파일 시스템으로 파일 시스템에 대한 읽기
    만 가능하다.
   9) nfs
     네트워크 파일 시스템(Network File System)이다. 네트워크상의 많은 컴퓨터들이 각각의 시스템
    에 가진 파일들을 서로 쉽게 공유하기 위해 제공되는 상호간의 파일 시스템 공유 파일시스템이다.
   10) sysv
     System V/386, Xenix 그리고 Coherent 파일 시스템이다.

4. ext2와 저널링파일시스템
(1) ext2 파일시스템
   1) 설명: Minix파일시스템은 리눅스가 처음으로 사용한 파일시스템이었다. 하지만 여러가지 제약
           조건이 있었고, 그 성능 또한 그리 뛰어나지 못했다. 이를 보안하기 위해 제시된 파일시
           스템이 확장 파일 시스템(EXT, Extended File System)이다. 특히 이 파일 시스템은 리눅
           스 전용으로 설계되어 1992년 4월 소개되었다. 하지만 이 파일시스템도 여러 문제점을
           가지고 있었고, 그래서 다시 ext파일시스템을 보완하기 위해서 1993년에 추가된 것이
           바로 2차 확장 파일 시스템(ext2, Extend File System 2)이다. ext2파일시스템은 자신이
           위치하고 있는 논리적인 파티션을 블록으로 다시 나누게 된다. 이 블록 그룹들은 파일시
           스템에서 무결성의 핵심을 이루는 정보를 중복해서 저장하여 실제 파일과 디렉토리를 정
           보와 데이터 블록으로 가진다. 블록 그룹들이 파일 시스템에 대해 무결성 정보를 가지고
           있는 이유는 파일시스템이 예기치 않는 시스템상의 재난으로부터 파일시스템을 복구하기
           위해서이다.
   2) 구성요소
     ㄱ. Inode: ext2 파일 시스템은 모든 파일을 ext2파일시스템에서 가장 기본이 되는 단위인 각각
               의 Inode에 의해서 표현한다. 또한 Inode는 각각을 구분할 수 있는 고유 번호를 가지
               게 되는데, 이러한 Inode의 역할은 파일의 데이터가 어느 블록의 어느 위치에 저장되
               어 있는지, 파일에 대한 접근 권한, 파일의 최종 수정시간, 파일의 종류 등의 정보를
               저장하는 것이다. 그리고 Inode는 Inode table에 저장된다.
         (참고) Inode 테에블에 저장되는 정보의 항목
               1. 모드(Mode) : Inode가 속한 파일에 대한 정보와 파일에 대한 접근 권한 정보가
                              저장된다. ext2에서 Inode는 단지 하나의 파일, 심볼릭 링크, 블록
                              장치, 문자장치 등만을 나타낸다.
               2. 소유자정보(Owner Information) : 소유자정보는 파일과 디렉토리에 대한 소유자와
                                                 그룹에 대한 식별자를 나타낸다. 소유자정보를
                                                 사용하여 파일이나 디렉토리에 대한 접근권한을
                                                 관리할 수 있다.
               3. 크기(Size): 크기(Size)는 파일의 크기 정보를 저장한다. 파일에 대한 크기정보는
                             바이트 단위로 저장된다.
               4. 타임스탬프(Time Stamp): 타임스탬프는 Inode가 생성된 시간과 최종적으로 수정을
                                         가한 시간에 대한 정보를 저장한다.
               5. 데이터 블록(Data Block): 데이터 블록은 Inode가 지정하고 있는 데이터 블록에
                                          대한 포인터를 저장한다. 데이터 블록에는 총 15개의 포
                                          인터가 존재하는데, 이 포인터들 중에서 선행의 12개 포
                                          인터는 해당 Inode가 지정하고 있는 데이터에 대한 실제
                                          블록의 포인터 정보를 가지고 있고, 나머지 3개의 포인
                                          터는 높은 수준의 간접 연결에 대한 정보를 가지고 있다.
                                          Inode는 또한 실제로 존재하지 않지만 시스템의 장치에
                                          접근할 수 있는 특별한 장치 파일의 표현에도 사용된다.
                                          리눅스시스템의 /dev디렉토리안에 위치하는 파일들이
                                          그것들이다.
     ㄴ. 슈퍼블록(Super Block): 슈퍼블록은 해당 파일시스템의 기본적인 크기나 형태에 대한 정보
                               를 저장한다. 파일시스템 관리자는 이 슈퍼블록의 정보를 이용하여
                               파일 시스템을 활용하고 유지할 수 있다.
        a. 매직 넘버(Magic Number): 마운트하는 소프트웨어에게 ext2파일 시스템의 슈퍼블록임을
                                   확인하게 하는 값이다. 현재 ext2파일 시스템에서 매직 넘버값
                                   은 OxEF53이다.
        b. 개정레벨(Revision Lever)
          개정레벨은 메이저 레벨(Major Level)과 마이너 레벨(Minor Level)로 구성되어 있으며,
         역할은 마운트프로그램이 어떤 특정한 버전에서만 지원되는 기능이 이 파일 시스템에서 지
         원되는 지에 대한 확인을 위해 사용된다. 또한 개정 레벨은 기능 호환성 항목을 포함하여
         마운트 프로그램이 해당 파일 시스템에서 안정적으로 사용할 수 있는 기능이 무엇인지를
         판단할 수 있는 기준을 제공한다.
        c. 마운트 횟수(Mount Count)와 최대 마운트 횟수(Maximum Mount Count)
         시스템은 마운트 횟수와 최대 마운트 횟수의 두 가지 정보를 이용하여 파일 시스템 전체를
         검사할 필요가 있는 지를 확인할 수 있다. 마운트 횟수는 마운트가 실행될 때마다 1씩 그
         값이 증가하며 만약 마운트 횟수가 최대 마운트 횟수에 도달하게 되면 시스템은 e2fsck를
         실행하라는 메시지를 내보낸다.
        d. 블록 그룹 번호(Block Group Number)
          블록 그룹 번호는 슈퍼 블록 복제본을 가지고 있는 블록 그룹의 번호를 나타낸다.
        e. 블록 크기(Block Size)
          블록 크기는 파일 시스템의 블록 크기를 표시한다. 블록 크기는 바이트 단위로 표시된다.
        f. 그룹당 블록 수(Blocks Per Group)
          그룹당 블록 수는 하나의 그룹에 속한 블록의 수를 나타낸다. 이 수는 블록의 크기와 마찬
         가지로 파일시스템을 만들 때 결정된다.
        g. 프리블록(Free Block) : 파일시스템 내부적으로 존재하는 프리블록의 수이다.
        h. 프리 아이노드(Free Inode): 파일시스템 내부적으로 존재하는 프리 아이노드의 수이다.
        i. 첫 아이노드(First Inode): 파일 시스템 내부적으로 존재하는 첫번째 아이노드의 번호를
                                    나타낸다. 리눅스 시스템에서 ext2파일 시스템의 첫번째 아이
                                    노드는 '/'디렉토리에 대한 엔트리를 나타낸다.
     ㄷ. 그룹 기술자(Group Descriptor): 각각의 블록 그룹을 기술하는 자료 구조이다. 그룹기술자
                                       는 슈퍼 블록과 같이 중복되게 블록 그룹에 복제되어 파일
                                       시스템의 파괴에서 안정적인 복구를 지원한다. 각 그룹의
                                       기술자에 저장되는 정보 항목은 다음과 같다.
        a. 블록 비트맵(Blocks Bitmap): 블록 비트맵은 블록 그룹에서 블록의 할당 상태를 나타내
                                      주는 비트맵으로 그 수는 블록의 수와 동일하다. 블록 비트
                                      맵은 블록을 할당하거나 해제할 경우 참고되는 정보이다.
        b. 아이노드 비트맵(Inode Bitmap)
          블록 그룹에서 블록의 아이노드 할당 상태를 나타내 주는 비트맵으로 그 수는 블록 비트맵
         과 같이 블록의 수와 동일하다. 아이노드 비트맵은 아이노드를 할당하거나 해제할 경우 참
         고 되는 정보이다.
        c. 아이노드 테이블(Inode Table)
          아이노드 테이블은 블록 그룹의 아이노드 테이블에서 시작 블록을 나타내며 그 수는 블록
         의 수와 동일하다.
        d. 기타: 프리 블록 개수(Free Block Count), 프리 아이노드 개수(Free Inode Count), 사용
                된 디렉토리 개수(Used Directory Count)가 있다. 그룹기술자(Group Descriptor)는
                연속적으로 나타나서 전체적으로 하나의 그룹 기술자 테이블을 형성하게 된다. 각
                블록 그룹(Block Group)에는 슈퍼 블록 바로 뒤에 그룹 기술자 테이블 전체가 위치
                하게 된다. 하지만 실제로 ext2파일 시스템에서 사용되는 것은 블록 그룹이 '0'인
                첫번째 복사본이다.나머지는 예상치 못한 시스템의 손상에 대비해 시스템 복구를
                준비하고 있을 뿐이다.
     ㄹ. ext2 디렉토리: ext2 파일시스템에서 디렉토리는 파일시스템상에서 파일에 대한 접근 경로를
                       생성하고 저장하는 특별한 의미의 파일로 취급된다. 각각의 디렉토리는 디렉
                       토리의 엔트리의 리스트로 나타낸다.
        a. 아이노드(Inode): 아이노드는 디렉토리 엔트르에 해당하는 Inode를 나타낸다. 아이노드값
                           은 블록 그룹의 Inode테이블에 저장되어 있는 Inode 배열에 대한 인덱스
                           값이다.
        b. 이름 길이(Name Length): 이름길이는 디렉토리 엔트리의 길이를 바이트로 나타낸 것을 의
                                  미한다.
        c. 이름(Name): 디렉토리 엔트리의 이름을 나타낸다.
(2) 저널링(Journaling) 파일시스템
   1) 설명: ext2 시스템은 파일의 내용과 그와 관련된 데이터(보통 메타데이터라고 부르고, 파일의
           위치, 크기, 소유자, 접근 권한등의 파일과 관련된 데이터들을 말한다.)들을 유지하고
           저장하는 체계이다. 그러나 ext2는 파일의 데이터와 메타데이터를 동시에 저장하지 않는
           비동기식 파일시스템이다. 즉, 메타데이터를 파일의 내용이 저장될 때 같이 저장하는 것
           이 아니라 일정 시간 메모리에 두었다가 시간 간격을 두고 저장한다. 이러한 시스템인
           경우 성능상의 장점도 있지만 시스템이 다운되거나 여러 문제가 발생할 경우 파일 시스템
           이 손상되는 단점을 가지게 된다. 또한 이를 위해 ext2는 fsck(File System Check)라는
           파일 시스템 복구 기능을 필요로 하고 복구하는데 시간이 많이 소요된다. 만약 파일 시스
           템의 크기가 크다면 파일시스템을 복구하는데 더욱 오랜 시간이 걸린다. 물론 이 시간
           동안 시스템은 사용할 수 없게 된다. 이러한 문제점을 해결하기 위한 방법중의 하나가 바
           로 데이터베이스에서 쓰이는 저널링 기술을 적용한 저널링 파일시스템이다. 이 기술은 일
           정부분을 기록을 위해 남겨두어, 백업 및 복구 능력이 있는 파일시스템을 말하며, 파일시
           스템 복구시간이 단축된다.
   2) 작동방법: 저널링 파일시스템은 사용자가 데이터를 입력 또는 수정하면 그 데이터를 바로 하드
               디스크에 기록하기 전에 관련 데이터를 로그에 기록한다. 만약 기록중에 정전이나 기
               타 다른 이유로 비정상적인 종료가 되면 다시 부팅할 때 로그에 기록된 데이터를 참
               고로 재작성하거나 복구한다.
   3) 사용부분: 저널링 파일시스템은 빈번한 업데이트를 하는 부분이 적합하다. /var디렉토리와 같
               이 메일 스풀링 및 데이터베이스의 저장공간, 로그 기록 등의 용도로 사용되는 곳이
               효과적이다.
(3) ext3 파일시스템
   1) 설명: ext3 파일 시스템은 ext2파일시스템에 저널링기술을 추가하여 만든 파일시스템이다. ext
           2 파일시스템이 가지고 있는 단점들을 극복하였다. 데이터 무결성은 물론 뛰어난 복구
           기능까지 가질 수 있게 되었다.
   2) ext3 파일시스템으로의 포팅 동기
     etx2 파일 시스템에서는 fsck(File System Check)라는 기능으로 파일시스템을 복구한다. 그러
    나, 이 fsck는 시간이 많이 걸린다는 단점이 있다. 특히 요즘 같은 대용량 하드디스크가 보편화
    되어 있는 상황에서는 더욱 그러하다. 또한 fsck는 시스템이 비정상적으로 셧다운되어 파일시스
    템에 손상이 되었을 경우 이외에도 슈퍼블록에 마운트 횟수를 저장하는 영역이 있어 마운트 횟
    수가 일정횟수 이상이 될 경우에는 자동으로 fsck를 실행해 오랜시간 동안 시스템을 사용할 수
    없게 되는 단점도 가지고 있다. 또한 ext2는 기능적인 측면보다는 파일 시스템의 효율과 퍼포먼
    스에 중점을 두고 디자인된 파일시스템이다. 그래서, ext2는 파일의 내용과 파일에 대한 허가권,
    소유권, 생성과 접근 시간과 같은 메타 데이터를 동기화하지 않는다.이럴 경우 만약 파일의 내용
    을 수정하는 도중에 시스템에 문제가 생길 경우 해당 파일의 메타데이터와 내용이 일치하지 않는
    문제점이 발생하게 된다. 따라서 이러한 문제점을 보안하기 위해서 저널링(Journaling)기술을
    이용한 ext3파일시스템이 대두된 것이다.
(3) 기타 저널링 파일시스템
   1) ReiserFS
     Reiser파일시스템은 독일의 한스 라이져(Hans Reiser)가 개발한 저널링 파일시스템으로 모든 파
    일 객체들을 단일 B트리에 저장하는 데 그 트리가 지원하는 사항으로 동적인 Inode 할당, 간결하
    고 색인화된 디렉토리, 크기 재조정이가능한 아이템, 60비트 오프셋 등이 있다. 트리에는 기본적
    인 4가지 형태의 아이템이 있는데, 이 4가지는 stat 데이터, 직접적인 아이템, 간접적인 아이템,
    디렉토리 아이템이 있다. 아이템은 키를 검색해 찾게 되는데 키에는 ID, 사용자가 찾으려 하는
    객체의 오프셋, 그리고 아이템타입에 대한 정보가 있다. Reiser파일시스템 디렉토리는 콘텐츠가
    변함에 따라서 늘어나기도 하고 줄어들기도 한다. 파일 이름의 해시데이터는 디렉토리에서 엔트
    리의 오프셋을 일정하게 유지하는데 이용된다. 이와 같이 해시데이터를 인덱싱하는 트리는 별다
    른 성능의 손실없이도 매우 큰 디렉토리를 이용할 수 있도록 해준다. 파일의 경우 간접적인 아이
    템은 데이터 블록을 가리키며, 직접적인 아이템은 압축된 파일데이터를 포함하고 있다. 이러한
    압축된 데이터는 트리에 직접 저장되며, 트리노드에서 다른 객체의 아이템과 공간을 경유하게
    된다. 따라서 대용량 파일의 경우 Reiser파일시스템은 ext2파일시스템이 사용하는 것과 유사한
    블록포인터를 저장하고 있지만, 작은 파일의 경우에는 데이터를 모으고 압축해서 공간 낭비를
    줄인다. 이러한 모든 아이템들은 트리를 재조정하면 크기를 변화시킬 수 있다. 사용자는 압축된
    파일에 데이터를 추가할 수도 있고, stat데이터에서 또 다른 필드가 필요한 경우 새로운 정보를 \
    포함할 수도 있다.
   2) JFS: IBM에서 독자적으로 개발한 저널링 파일시스템이다.
   3) XFS: SGI(실리콘 그래픽스)에서 개발한 저널링 파일시스템이다.

5. 파일시스템의 점검 및 고치기
(1) 설명: ext2파일시스템을 사용하면서 비정상적인 종료시에는 재부팅과정을 거치면서 파일시스템
          을 체크하도록 되어 있다. 체크하면서 아무런 문제가 없으면 OK 사인이 떨어지지만 문제가
          발생하는 경우에는 root패스워드를 입력하라는 화면이 나타나면서 부팅을 멈추게 된다.
          ext3파일시스템은 자동으로 복구가 되도록 되어있지만 ext2파일시스템은 상황에 따라 관리
          자가 파일시스템인 복구시에 사용하는 e2fsck명령으로 복구해야 한다.
(2) 파일시스템손상과 복구
   1) 파일시스템의 복구가 쉬운 경우: 이 경우에 /etc/fstab파일에 check가 설정되어 있으면 자동
                                    으로 복구시킨다.
    ㄱ. 참조되지 않은 inode
    ㄴ. 납득할 수 없이 큰 링크의 갯수
    ㄷ. 블록맵에 기록되지 않거나 사용되지 않는 데이터블록
    ㄹ. 파일에서 사용하고 잇지만 비어있다고 기록된 데이터블록
    ㅁ. 슈퍼블록에서 부정확한 요약정보
   2) 파일시스템의 복구가 어려운 경우 : e2fsck같은 명령어를 이용하여 수동복구해야 한다.
    ㄱ. 하나이상의 파일이 요구되는 블록
    ㄴ. 파일시스템의 범위밖에서 요구하는 블록
    ㄷ. 너무 작은 링크의 개수
    ㄹ. 셀수없는 블록
    ㅁ. 할당되지 않는 inode를 가리키는 디렉토리
    ㅂ. 다양한 포맷 에러

출처 : 대전국제IT교육센터 정성재 강사

 

1. Shell 프로그래밍의 개요
(1) 개요
   1) 사용자가 임의로 Shell파일을 만들어 필요시 마다 그 파일을 호출하여 실행한다.
   2) Shell은 보통언어가 가지고 있는 기본적인 특성을 가지므로 Shell을 이용하여 사용자 환경에
     맞도록 프로그래밍을 할 수 있다.
   3) Shell파일을 이용한 프로그램을 Shell프로그램 또는 Shell스크립트라고 한다.
   4) Shell프로그램의 수행방법
     ㄱ. chmod를 이용하여 수행하고자 하는 Shell파일에 실행권한을 부여한다.
     ㄴ. Shell파일에 인수를 주어 sh명령을 준다.
(2) 쉘스크립트 생성하는 법
   1) 첫라인에 사용할 쉘을 명시한다. bash쉘을 사용할 경우 보통 첫줄에 다음과 같이 표기한다.
     #!/bin/bash
   2) 스크립트를 실행 가능한 파일로 만든다.
(3) 실행예
   1) 예1
     ㄱ. [posein@www posein]$ cat sample1
         echo "sample1"
           => vi 편집기를 이용하여 입력한다.
         [posein@www posein]$ ls -l sample1
         -rw-rw-r--    1 posein   posein         15 Jun 25 02:49 sample1
           => 현재 실행권한이 없으므로 실행시킬 수가 없다.
         [posein@www posein]$ chmod 755 sample1
           => 실행권한을 부여하였다.
         [posein@www posein]$ ./sample1
         sample1
           => 현재디렉토리에 경로로 설정이 안되어 있으므로 './'를 붙여서 실행시켜야 한다.
     ㄴ. [posein@www posein]$ sh sample1
         sample1
          => 실행권한이 없더라도 앞에 'sh'를 붙여서 실행시킬 수 있다.
   2) 예2 : #!/bin/bash를 명기


2. Shell 프로그래밍 기초
(1) 리다이렉션과 파이프
   1) 다중명령어 사용
    ㄱ. 한 라인에 여러 개의 명령을 입력하면 여러 명령을 수행한다.
    ㄴ. 순차적으로 명령들을 수행할 때 명령들의 구분자는 ';'이다.
    ㄷ. 동시에 명령들을 수행할 때 명령들의 구분자는 '&'이다.
    ㄹ. 사용예
      a. [posein@www posein]$ date; ls -l; whoami
           => 순서대로 실행된다.
      b. [posein@www posein]$ date& ls -l& whoami
           => 동시에 실행된다.
   2) 입출력방향의 재지정
    ㄱ. 표준입출력
       -표준입력(stdin) : 내용입력, 0으로 표기
       -표준출력(stdout) : 내용출력, 1으로 표기
       -표준에러(stderr) : 에러메시지, 2로 표기
    ㄴ. 리다이렉션심볼
       < : 존재하는 파일로 부터 표준입력으로 읽음 (program < input)
       > : 표준 출력으로 파일에 씀 (program > output)
       >> : 존재하는 파일에 표준출력으로 추가함 ( program >> output)
    ㄷ. 입력재지정
      a. 설명: 키보드로부터 명령을 읽는 대신 파일에서 명령을 읽을 때 사용한다.
      b. 입력재지정 기호 : "<"
      c. 사용법
        command < file
      d. 사용예
        [posein@www posein]$ cat red
        ps
        ls
        [posein@www posein]$ sh < red
          PID TTY          TIME CMD
        25289 pts/1    00:00:00 bash
        25581 pts/1    00:00:00 sh
        25582 pts/1    00:00:00 ps
        Desktop  bbb
    ㄹ. 출력재지정
     a. 설명: 명령의 출력을 터미널에 연결하는 대신 파일로 저장할 때 사용한다.
     b. 출력재지정기호 : ">"
     c. 사용법
       command > file
     d. 사용예
       [posein@www posein]$ ls > red2
       [posein@www posein]$ cat red2
       Desktop/
       aaa*
       aaa.sh*
    ㅁ. 출력재지정 추가
     a. 설명: 출력을 파일의 끝에 추가하고자 할 때 사용한다.
     b. 출력재지정기호 : ">>"
     c. 사용법
       command >> file
     d. 사용예
       [posein@www posein]$ ls -l >> red2
    ㅁ. 표준에러 재지정
     a. 설명: 에러메시지를 터미널에 출력하지 않고 파일로 저장할 때 사용한다.
     b. bashd인 경우
       command 2 > errfile
        => 표준에러를 errfile에 저장한다.
       (command > file) 2 > errfile
        => 표준출력은 file에, 에러는 errfile에 저장한다.
     c. C shell인 경우
       command >& errfile
        => 표준에러를 errfile에 저장한다.
       (command > file) >& errfile
        => 표준출력은 file에, 에러는 errfile에 저장한다.
     d. 사용예
       1. [posein@www posein]$ ls -z
          ls: invalid option -- z
          Try `ls --help' for more information.
          [posein@www posein]$ ls -z 2>errfile
          [posein@www posein]$ cat errfile
          ls: invalid option -- z
          Try `ls --help' for more information.
       2. [posein@www posein]$ (ls -z > file) 2>errfile2
          [posein@www posein]$ cat file
          [posein@www posein]$ cat errfile2
          ls: invalid option -- z
          Try `ls --help' for more information.
       3. C Shell에서의 표준에러지정
          [posein@www ~]$ ls -z >& errfile
          [posein@www ~]$ cat errfile
          ls: 부적절한 옵션 -- z
          더 많은 정보를 얻으러면 `ls --help'명령을 하십시오.
       4. C Shell에서 표준출력과 표준에러지정
          [posein@www ~]$ ( ls -z > file2) > & errfile3
   3) 파이프
    ㄱ. 파이프를 사용하면 여러 프로세스를 함께 사용할 수 있다.
    ㄴ. 파이프로 연결된 프로세스는 동시에 수행될 수 있으며, 이 프로세스들 사이의 데이터 흐름은
       자동적으로 다시 계획된다.
    ㄷ. 사용법
       program1 | program2 | .....
    ㄹ. 사용예
       1. [posein@www posein]$ ps | sort | more
            PID TTY          TIME CMD
          25289 pts/1    00:00:00 bash
          25649 pts/1    00:00:00 ps
          25650 pts/1    00:00:00 bash
          25651 pts/1    00:00:00 bash
       2. [posein@www posein]$ ps | sort | more > ps.txt
            => 리다이렉션과 함께 사용하여 파일로 저장할 수도 있다.

3. Shell 프로그래밍 문법

(1) 주석
   1) 설명: 주석은 '#'을 이용하며 해당라인 끝까지 처리된다. 이 부분은 쉘실행시 무시되며, 보통
           프로그램에 대한 이해를 돕기위해 사용된다.
   2) 사용예
     #!/bin/sh
     # Auth: posein
     # Work : hello world 를 출력한다.

     echo "hello world"   # 문자열을 출력한다
(2) 변수
   1) 설명: 변수는 모든 프로그래밍언어의 가장 기본이 되는 요소로 어떠한 데이터를 저장하는 공간
           이다. 쉘에서 변수의 타입은 문자열(string)만을 가지면 C언어처럼 변수타입선언이 필요
           없다. 참고로 perl, python, php등도 변수타입선언이 불필요하다.
   2) 사용법
     var=value
      => 변수를 사용할 때는 변수명앞에 $을 붙인다. 또한 변수에 데이터를 저장할 때는 대입연산자인
        '='를 사용하며 대입연산자, 연산자/피연산자 사이에는 공백이 존재해서는 안된다. 또한 변수
        명은 -를 제외한 특수문자와 숫자로 시작해서는 안된다.
   3) 기타변수 대응법
     ㄱ. ${name} : name이라는 변수에 들어있는 값으로 치환한다.(변수명 다음에 다른 문자가 연이
                  어 나올때 유용)
     ㄴ. ${name:=value} : name이 null이면 value로 할당하여 저장하고, 아니면 그냥 기존의 값으로
                         치환한다.(기본값을 지정할 때 유용)
     ㄷ. ${name:+value} : 기존의 name이 null이 아니라면 value를 사용하지만 name에 저장하지는
                         않는다.
     ㄹ. ${name:-value} : 기존에 name값이 있다면 value를 기본값으로 하고  없다면 value반환.
                         name에 value값을 저장하지는 않는다.
     ㅁ. ${name:?value} : 기존에 name값이 있다면 기본값으로 하고 없으면 error를 내면서 value
                         값을 보여준다.
     ㅂ. ${#name} : name의 문자열 길이를 반환
     ㅅ. ${name:offset} : name값에서 offset만큼 삭제한 후에 값을 돌려준다.
     ㅇ. ${name:offset:length} : name값에서 offset만큼 삭제한 후에 length만큼 센 뒤 돌려준다.
   4) 환경변수
    ㄱ. $HOME: 사용자의 홈디렉토리
    ㄴ. $PATH: 명령어 찾기에 사용되는 콜론(:)으로 구분되는 디렉토리 목록
    ㄷ. $LOGNAME: 사용자의 로그인명($USER)
    ㄹ. $MAIL or $MAILPATH: 메일도착을 알고자 할때 사용되는데 둘 중 하나만 지정, $MAIL이 지정
                           되면 메일이 도착할 파일명이 지정되어야 하고 $MAILPATH가 지정되면
                           콜론(:)으로 분리된 메일 파일의 리스트이여야 한다. 메일프로그램이
                           메일을 어디에 놓아야 하는지를 지정하지는 않지만 새로운 메일이 도착
                           하면 Shell이 어디를 찾아야 하는지를 지정한다.
    ㅁ. $MAILCHECK: 메일 파일을 검사하는 초단위 설정
    ㅂ. $SHELL: 로그인 Shell명
    ㅅ. $PS1: Shell이 사용할 첫번째 프롬프트 스트링, 보통은 $
    ㅇ. $PS2: 두번째 프롬프트 스트링, 명령이 완전히 끝나지 않고 Shell이 또 다른 입력행을 요구
             할 경우 사용, 보통 >
    ㅈ. $TERM: 사용자의 터미널형을 포함, vi같은 어떤 명령은 정확한 결과를 나타내기 위해 사용
              중인 터미널의 종류를 나타냄.
    ㅊ. $IFS: 입력필드 구분자, Shell상에서 입력을 읽어들일 때 글자를 구분하기 위한 목적으로
             사용되는 문자 목록, 보통은 스페이스, 탭, 개행문자임.
   5) 아규먼트 변수: 특별한 내장변수로 '위치 매개변수(positional parameter)'라고도 한다. 이
                    변수는 매개변수를 불러올 때 스크립트의 명령행 인자를 담당한다. 위치 매개
                    변수는 그 이름이 1, 2, 3등으로 되어 있고 그 값을 각각 $1, $2, $3등으로
                    표시하고 0은 스크립트 파일명을 뜻한다.
    ㄱ. $0 : 실행된 쉘 스크립트이름
    ㄴ. $1 : 스크립트에 넘겨진 첫번째 아규먼트
    ㄷ. $2 : 스크립트에 넘겨진 두번째 아규먼트
    ㄹ. $# : 스크립트에 넘겨진 아규먼트의 개수
    ㅁ. $$ : 쉘스크립트의 프로세스ID
    ㅂ. $* : 스크립트에 전달된 인자 전체를 하나의 변수에 저장하며 IFS환경변수의 첫번째 문자로
            구분
    ㅅ. $@ : $*와 동일(다른점은 IFS환경변수를 사용하지 않음)
    ㅇ. $? : 실행한 뒤의 반환(return)값, 즉 참이면 0, 거짓이면 1이 반환됨
    ㅈ. $- : 현재 Shell이 호출될 때 사용한 옵션들
   6) 사용예
    ㄱ. test.sh
       #!/bin/sh
       # 변수에 값을 할당한다.
       a="hello world"
       # 이제 a라는 변수에 등록된 값을 화면에 출력한다.
       echo "a is : $a"
        => 실행파일로 만들어서 실행시키면 'a is : hello world'가 출력된다.
    ㄴ. test2.sh
       num=2
       echo "this is the $numnd"
         => 원하는 값이 "this is the 2nd" 이다. 그러나 위의 예제를 실행시키면 "this is the "
           라는 문자열이 출력된다. 왜냐면 쉘은 "numnd"를 하나의 변수명으로 생각하기 때문이다
           만약 원하는 값을 출력하려면 아래와 같이 바꿔야 한다.
    ㄷ. test3.sh
       num=2
       echo "this is the ${num}nd"
        => 'this is the 2nd' 라고 출력된다.
    ㄹ. [posein@www posein]$ cat var
        var=
        ${var:=ls}
        echo $var
         => var가 null이므로 값에 ls가 들어가면서 해당 명령이 실행된다.
    ㅁ. [posein@www posein]$ echo $DIR

        [posein@www posein]$ echo ${DIR:-temp}
        temp
        [posein@www posein]$ echo $DIR

    ㅂ. [posein@www posein]$ DIR=tmp
        [posein@www posein]$ echo ${DIR:+temp}
        temp
        [posein@www posein]$ echo $DIR
        tmp
    ㅅ. [posein@linux67 posein]$ string1=linux
        [posein@linux67 posein]$ string2=window
        [posein@linux67 posein]$ test $string1 = $string2
        [posein@linux67 posein]$ echo $?
        1
         => $?은 값이 참이면 0, 거짓이면 1을 출력한다.
    ㅇ. [posein@www posein]$ cat test4.sh
         #!/bin/bash
         echo "This script file $0"
         echo "Argument Count is $#"
         echo "Process ID is $$"
         echo "Argument List \$* : $*"
         echo "Argument List \$@ : $@"
         echo "Argument 1: $1"
         echo "Argument 2: $2"
         echo "Argument 3: $3"
         [posein@www posein]$ ./test4.sh a b c
         This script file ./test4.sh
         Argument Count is 3
         Process ID is 31779
         Argument List $* : a b c
         Argument List $@ : a b c
         Argument 1: a
         Argument 2: b
         Argument 3: c
    ㅈ. $@와 $*의 차이점
       [posein@www posein]$ cat ii1
       #!/bin/bash
       IFS=,
       echo "$@"
       [posein@www posein]$ cat ii2
       #!/bin/bash
       IFS=,
       echo "$*"
       [posein@www posein]$ ./ii1 a b c
       a b c
       [posein@www posein]$ ./ii2 a b c
       a,b,c
        => $*는 IFS를 사용하고 $@는 IFS를 사용하지 않는다.
    ㅊ. [posein@www posein]$ count=Ilovebash
        [posein@www posein]$ echo ${count:5}
        bash
        [posein@www posein]$ echo ${count:5:2}
        ba
   7) Shell변수의 출력
    ㄱ. set: 현재 정의되어 있는 모든 변수와 그 값을 출력
    ㄴ. env: export된 변수의 값만 출력
    ㄷ. exoprt:
      a. 설명: 특정변수의 범위를 환경 데이터 공간으로 전송하여 자식프로세스에서도 그 특정변수
              를 사용 가능하게 함.
      b. 특징
        - Shell프로그램이 호출될 때 export를 사용한 모든 변수에 대한 복사가 만들어져 호출된
          프로그램으로 전달되게 하여 변수의 범위를 확대시킨다.
        - 인자가 없는 export명령은 export된 변수의 리스트를 얻을 수 있다.
        - 서브 Shell에서 수정된 환경변수값은 부모 Shell에 영향을 주지 못한다.
        - 서브 Shell에서 변수를 export하면 export된 변수는 그 다음 서브 Shell에 영향을 준다.
    ㄹ. 예제
          [posein@www posein]$ cat main
          echo shell programming
          name=test
          city=seoul
          echo name is $name
          echo city is $city
          export name
          ./sub
          echo stop main
          [posein@www posein]$ cat sub
          echo start sub
          echo name is $name
          echo city is $city
          echo stop sub
          [posein@www posein]$ ./main
          shell programming
          name is test
          city is seoul
          start sub
          name is test
          city is
          stop sub
          stop main
   8) 정의된 변수의 제거
    ㄱ. unset 변수명
       => 변수의 값을 널(Null)로 만드는 것이 아니라, 존재하지 않게 한다.
    ㄴ. readonly 변수명
       => 읽기전용 변수로 되어 삭제할 수가 없다.(로그아웃할 때까지 적용된다.)
    ㄷ. 예
       1. [posein@www posein]$ str1=test1
          [posein@www posein]$ echo $str1
          test1
          [posein@www posein]$ unset str1
          [posein@www posein]$ echo $str1
       2. [posein@www posein]$ str2=test2
          [posein@www posein]$ readonly str2
          [posein@www posein]$ echo $str2
          test2
          [posein@www posein]$ str2=test3
          bash: str2: readonly variable
          [posein@www posein]$ echo $str2
          test2
   9) echo문과 escape문자
    ㄱ. 설명: echo문은 라인을 제어하는 명령해석기이며 -e옵션과 같이 \으로 시작하는 escape
             특수문자를 사용할 수 있다.
    ㄴ. 종류
       \b : Backspace
       \c : 새로운 라인의 생성을 억제(bash에서는 안됨)
       \f : Formfeed
       \n : 새로운 라인을 생성
       \r : Carrage Return
       \t : Tab문자
       \\ : Backslash
    ㄷ. 사용예
       [posein@www posein]$ echo "Hi\nHello"
       Hi\nHello
       [posein@www posein]$ echo -e "Hi\nHello"
       Hi
       Hello
   10) 특별구문: expr
    ㄱ. expr은 명령라인에 있는 표현식을 평가한다.
    ㄴ. 수학적인 표현식(+, -, *, /)을 계산하고 표준출력에 결과값을 출력한다.
    ㄷ. 결과값은 역인용부호(`)에 의해 다른 변수에 저장가능하다.
    ㄹ. expr명령은 수식의 연산자 앞 뒤에 반드시 공백이 필요하다.
    ㅁ. 정확한 정수 연산시 사용되고 소수점 계산은 불가능
    ㅂ. 예제
      a. [posein@www posein]$ expr 1 + 2
         3
      b. [posein@www posein]$ int=100
         [posein@www posein]$ expr 100 + $int + 10
         210
      c. [posein@www posein]$ int=0
         [posein@www posein]$ result='expr $int + 5'
         [posein@www posein]$ echo $result
         expr $int + 5
         [posein@www posein]$ result=`expr $int + 5`
         [posein@www posein]$ echo $result
         5
          => 단일 인용부호(' ')를 사용하면 둘러싸인 전체가 변수에 저장되며 역인용부호(` `)를
            사용하면 연산결과가 변수에 저장된다.
      d. [posein@www posein]$ expr 3 * 5
         expr: syntax error
         [posein@www posein]$ expr 3 \* 5
         15
           => *만 사용하면 특수문자로 인식하여 에러가 발생한다. 따라서 *앞에 \를 사용하여 특수
             문자의 의미를 제거하거나 인용부호인 " "나 ' '를 사용해야 한다.
      e. [posein@www posein]$ expr 10 / 3
         3
          => /는 나누어서 몫을 구한다.
      f. [posein@www posein]$ expr 10 % 3
         1
          => %는 나누어서 나머지를 구한다.
   11) 변수타입지정: decalre 와 typeset
    ㄱ. 설명: 이 두 명령은 내장명령으로 동의어이다. 역할은 변수의 특성을 제한한다. declare
             명령어는 bash 버전 2이후부터 가능하고 typeset명령은 ksh스크립트에서도 가능하다.
             declare명령을 아무 옵션없이 실행하면 모든 변수값을 출력한다.
    ㄴ. 사용법
       declare [option] [변수=변수값]
    ㄷ. option
       -r : 읽기전용으로 취급한다. readonly로 선언하는 것과 같다.
       -i : 정수로 취급한다.
       -a : 배열로 취급한다.
       -f : 정의된 함수의 목록을 출력한다.
       -F : 정의된 함수의 이름만을 출력한다.
       -x : export시켜서 외부환경에서도 이 변수를 사용할 수 있게 해준다.
    ㄹ. 사용예
     a. [posein@www posein]$ declare
          => 정의된 변수와 함수 등을 보여준다.
     b. [posein@www posein]$ declare -f
        declare -f popd ()
        {
          DIR_STACK=${DIR_STACK#* };
          cd ${DIR_STACK%% *};
          echo "$PWD"
        }
        declare -f pushd ()
        {
          dirname=$1;
          DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
          cd ${dirname:?"missing directory name."};
          echo "$DIR_STACK"
        }
          => 정의된 함수명과 함수를 출력한다. -f옵션뒤에 함수명을 명기하면 해당 함수에 대한
            정보만을 출력한다.
     c. [posein@www posein]$ declare -F
        declare -f popd
        declare -f pushd
     d. [posein@www posein]$ val1=3 val2=5
        [posein@www posein]$ result1=val1*val2
        [posein@www posein]$ echo $result1
        val1*val2
        [posein@www posein]$ declare -i val3=3 val4=5
        [posein@www posein]$ declare -i result2
        [posein@www posein]$ result2=val3*val4
        [posein@www posein]$ echo $result2
        15
(3) 인용부호
   1) 설명: 쉘에는 특별한 의미를 가지고 있는 특수문자들이 있는데, 이를 메타문자(meta character
           )라고도 한다. 이러한 특수문자를 문자그대로 사용하고자 할 때 즉, 문자나 단어의 특별
           한 의미를 없앨 때 인용부호를 사용할 수 있다.
   2) 종류
     ㄱ. single quotes(' '): 문자열로 표기(변수명 자체를 문자열로 표기)
     ㄴ. double qutoes(" "): 문자열로 표기(변수값을 하나의 인자로 인식, 즉 $, `, \는 문자열에서
                            제외됨)
     ㄷ. backslash(\) : 문자의 특수한 기능을 제거
     ㄹ. back quotes(` `) : 명령어로 인식
   3) 사용예
     ㄱ. [posein@www posein]$ echo 'My Home Directory is $HOME'
         My Home Directory is $HOME
          => $HOME을 그냥 문자열로 취급한다.
     ㄴ. [posein@www posein]$ echo "My Home Directory is $HOME"
         My Home Directory is /home/posein
          => $HOME의 값을 출력한다. (" "는 $, `, \의 특수한 기능을 인정)
     ㄷ. [posein@www posein]$ echo "My Home Directory is \$HOME"
         My Home Directory is $HOME
          => \의 특수한 기능을 제거하여 $를 문자열화 하여 $HOME가 출력된다.
     ㄹ. [posein@www posein]$ echo 'My Home Directory is \$HOME'
         My Home Directory is \$HOME
          => ' '는 모든 특수문자를 무조건 문자열처리하므로 그대로 출력된다.
     ㅁ. [posein@www posein]$ echo "Current Directory is `pwd`"
         Current Directory is /home/posein
          => ` `는 명령어가지고 있는 기능을 인정한다. 역시 " "입장에서 봤을 때 ` `의 특수한
            기능을 인정한다.
     ㅅ. [posein@www posein]$ name=posein
         [posein@www posein]$ echo $name
         posein
          => name의 값인 posein을 출력한다.
         [posein@www posein]$ echo \$name
         $name
          => \는 바로 다음 문자의 특수한 기능을 문자열로 전환시킨다.
         [posein@www posein]$ echo \\$name
         \posein
          => 역시 \는 바로 다음에 나오는 \의 특수한기능을 없앤다.
(4) 간단한 조건문
   1) 설명: test명령을 기본으로 보통 if문과 같이 사용된다. 보통 test라고 입력하지만 보통 쉘
           스크립트상에서는 test라는 명령어를 생략하고 [ ] 로 한다. 이러한 테스트 조건들은
           '['와 ']'사이에 쓰면되고, '['과 ']'사이에는 반드시 공백문자가 들어가야 한다.
   2) 사용법
     test 표현식
     [ 표현식 ]
   3) 표현식
     ㄱ. 문자열비교
        a. [ string ] : string이 빈 문자열이 아니라면 참
        b. [ string1 = string2 ] : 두 문자열이 같다면 참
        c. [ string1 != string2 ] : 두 문자열이 다르면 참
        d. [ -n string ] : 문자열이 null(빈문자열)이 아니라면 참
        e. [ -z string ] : 문자열이 null(빈문자열)이면 참
     ㄴ. 산술비교
        a. [ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참(Equal)
        b. [ expr1 -ne expr2 ] : 두 표현식 값이 같지 않다면 참(Not Equal)
        c. [ expr1 -gt expr2 ] : expr1 > expr2 이면 참(Greater Then)
        d. [ expr1 -ge expr2 ] : expr1 >= expr2 이면 참(Greater Equal)
        e. [ expr1 -lt expr2 ] : expr1 < expr2 이면 참(Less Then)
        f. [ expr1 -le expr2 ] : expr1 <= expr2이면 참(Less Equal)
        h. [ ! expr ] : expr이 참이면 거짓, 거짓이면 참
        i. [ expr1 -a expr2 ] : expr1 AND expr2의 결과, 즉 둘 다 참이면 참
        j. [ expr1 -o expr2 ] : expr1 OR expr2의 결과, 즉 둘 중 하나만 참이면 참
     ㄷ. 파일조건
        a. [ -b FILE ] : FILE이 블럭디바이스이면 참
        b. [ -c FILE ] : FILE이 문자디바이스이면 참
        c. [ -d FILE ] : FILE이 디렉토리이면 참
        d. [ -e FILE ] : FILE이 존재하면 참
        e. [ -f FILE ] : FILE이 존재하고 정규파일이면 참(호환성 문제로 -e보다 -f가 주로 사용)
        f. [ -g FILE ] : FILE에 SGID가 있으며 참
        g. [ -k FILE ] : FILE에 Sticky bit가 있으면 참
        h. [ -L FILE ] : FILE이 심볼릭링크이면 참
        i. [ -p FILE ] : Named pipe이면 참
        j. [ -r FILE ] : 현재 사용자가 읽을 수 있는 파일이면 참
        k. [ -s FILE ] : 파일이 비어있지 않으면 참
        l. [ -S FILE ] : 소켓디바이스이면 참
        m. [ -t FD ] : FD(File Descriptor)가 열려진 터미널이면 참
        n. [ -u FILE ] : FILE에 SUID가 있으면 참
        o. [ -w FILE ] : 현재사용자가 쓸 수 있는 파일(writable file)이면 참
        p. [ -x FILE ] : 현재사용자가 실행할 수 있는 파일(Excute file)이면 참
        q. [ -O FILE ] : FILE의 소유자가 현재 사용자이면 참
        r. [ -G FILE ] : FILE의 그룹이 현재 사용자의 그룹과 같으면 참
        s. [ FILE1 -nt FILE2 ] : FILE1이 FILE2보다 새로운 파일(최근의 파일)이면 참
        t. [ FILE1 -ot FILE2 ] : FILE1이 FILE2보다 오래된 파일이면 참
        u. [ FILE1 -ef FILE2 ] : FILE1이 FILE2의 하드링크, 즉 I-node값이 같으면 참
   4) 사용예
    ㄱ. [posein@www posein]$ cat test5.sh
        if [ -d data ]
        then
        cd data
        echo "data's File List"
        ls
        fi
         => 현재 디렉토리에 data라는 디렉토리가 존재할 경우 data's File LIst라는 문자열과
            함께 파일의 리스트를 보여준다.
    ㄴ. [posein@www posein]$ cat test6.sh
        [ "$LOGNAME" = "root" ]
        echo $?
        [posein@www posein]$ ./test6.sh
        1
         => 로그인한 사용자가 root가 아니므로 반환값이 1, 즉 거짓이다.
    ㄷ. [posein@www posein]$ cat test7.sh
        [ "$LOGNAME" = "posein" ]
        echo $?
        [posein@www posein]$ ./test7.sh
        0
         => 로그인한 사용자와 일치하므로 반환값이 0, 즉 참이다.
    ㄹ. [posein@linux67 posein]$ test 20 -gt 30
        [posein@linux67 posein]$ echo $?
        1
        [posein@linux67 posein]$ test 20 -lt 30
        [posein@linux67 posein]$ echo $?
        0
(5) 목록
   1) 설명: 여러 명령을 실행할 때 앞의 명령의 결과에 의해서 다음행도 결정되어야 할 경우가 있
           다. 이런 경우에 AND나 OR조건을 사용해서 한번에 처리할 수 있다. 이것은 쉘스크립트
           뿐만아니라 명령행에서도 사용가능하다. if문을 사용하는 것보다 간결하다.
   2) 종류
    ㄱ. &&
      a. 설명: AND를 의미한다. &&는 왼쪽 문장이 참이면 오른문장을 실행한다. 수행도중에 결과
              가 거짓이 되면 그 이후의 명령은 수행되지 않는다.
      b. 사용법
        문장1 && 문장2 && 문장3 && .....
      c. 사용예
        [ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
          => 왼쪽문장이 참이면 오른쪽 문장을 실행시킨다. 즉 /etc/shadow가 존재하면
            "This computer uses shadow passwords"라는 문자열을 출력한다.
    ㄴ. ||
      a. 설명: OR를 의미한다. 각 문장들이 거짓이 나오는 동안에 계속 실행된다. 즉 참이 나오면
              실행을 멈춘다.
      b. 사용법
        문장1 || 문장2 || 문장3 || ...
      c. 사용예
        [posein@icf04 posein]$ cat mail.sh
        #!/bin/sh
        mailfolder=/var/spool/mail/posein
        [ -r "$mailfolder" ] || { echo "Can not read $mailfolder"; exit 1;}
        echo "$mailfolder has mail from : "
        grep "^From " $mailfolder
         => posein이라는 사용자의 메일파일을 검사하여 파일을 읽을 수 없으면 에러메시지와
           함께 종료하고 그렇지 않으면 grep명령을 이용하여 누구한테 메일이 왔는지를 보여
           주는 스크립트이다.
        [posein@icf04 posein]$ ./mail.sh
        /var/spool/mail/posein has mail from :
        From posein  Wed Jun 26 21:50:15 2002
    ㄷ. &&과 ||의 혼용
      a. 설명: &&와 ||는 혼용이 가능하다.
      b. 사용법
        1. && 문장1 || 문장2
         => 조건이 참이면 문장1을 수행하고 조건이 거짓이면 문장2를 수행한다.
        2. && {
               문장1
               문장2
               문장3
              }
           ||
              {
               문장4
               문장5
               문장6
             }
          => 참이냐 거짓이냐에 따라 여러개의 문장을 수행하고 싶을 때는 { }을 사용한다.
      c. 사용예
       [posein@www posein]$ cat test8.sh
       #!/bin/bash
       [ -f /etc/shadow ] && echo "/etc/shadow is existed" || echo "/etc/shadow is not
        existed"
       [posein@www posein]$ ./test8.sh
       /etc/shadow is existed
        => /etc/shadow파일이 존재하면 "/etc/shadow is existed"라는 문자열이 출력되고 존재
         하지 않으면 "/etc/shadow is not existed"가 출력된다. 참고로 root권한자에서 pwunconv
         명령을 내린뒤에 다시 수행시켜보도록 한다.
(6) 조건문
   1) if
    ㄱ. 설명: 참인지 거짓인지를 판단할 때 사용된다. 참이라면 then부분을 실행하고 그렇지 않으
             면 else부분을 실행한다.
    ㄴ. 사용법
      - 형식1(단일 if문)
       
        if [ 조건 ]
        then
         실행문장
        fi

      - 형식2(if ~ else)

        if [ 조건 ]
        then
          실행문장1
        else
          실행문장2
        fi

      - 형식3(if ~ elif) : elif는 else if의 약자로 이 구문은 여러 개 사용해도 무방하다.

        if [ 조건1 ]
        then
           실행문장1
        elif [ 조건2 ]
           실행문장2
        else
           실행문장3
        fi
    ㄷ. 사용예
      a. [posein@icf04 posein]$ cat test.sh
         #!/bin/sh
         if [ "$SHELL" = "/bin/bash" ]
         then
              echo "your login shell is the bash (bourne again shell)"
         else
              echo "your login shell is not bash but $SHELL"
         fi
         [posein@icf04 posein]$ ./test.sh
         your login shell is the bash (bourne again shell)
      b. [posein@linux67 posein]$ cat tt
         if [ "$1" = "rose" ]
         then
          echo ROSE
         else echo FLOWER
         fi
         [posein@linux67 posein]$ ./tt rose
         ROSE
         [posein@linux67 posein]$ ./tt lily
         FLOWER
          => 첫번째 아규먼트값으로 rose가 오면 ROSE가 출력되고 그 외의 경우에는 FLOWER가
            출력된다.
     c. [posein@linux67 posein]$ cat tt2
        if [ "$1" = "rose" ]
        then
          echo ROSE
        elif [ "$1" = "lily" ]
        then
          echo LILY
        else
          echo FLOWER
        fi
        [posein@linux67 posein]$ ./tt2 rose
        ROSE
        [posein@linux67 posein]$ ./tt2 lily
        LILY
        [posein@linux67 posein]$ ./tt2 tulip
        FLOWER
         => 아규먼트에 rose가 오면 ROSE, lily가 오면 LILY, 그 외의 값이 오면 FLOWER가 출력
           된다.
     d. [posein@linux67 posein]$ cat i1
        #!/bin/bash
        echo "읽어들인 파일의 이름은?";read var
        if [ -f $var ]
         then
          echo file
        else
           if [ -d $var ]
             then
               echo directory
           else
               echo "not found"
           fi
        fi
        [posein@linux67 posein]$ ./i1
        읽어들인 파일의 이름은?
        /etc/shadow
        file
     e. [posein@www posein]$ cat i2
        #!/bin/bash
        if test -z "$1"
        then
            echo usage:i2 filename
            exit 1
        fi
        file_size=`wc -c < $1`
        echo the file size $file_size characters
        if test $file_size -le 5120
        then
            echo the file $1 is a small file
        else
            echo the file $1 is a large file
        fi
        [posein@www posein]$ ./i2 /etc/passwd
        the file size 3875 characters
        the file /etc/passwd is a small file
     f. [posein@www posein]$ cat el1
        #!/bin/bash
        echo "Are you man? (y/n)";read var
        if [ "$var" = "y" ]
        then
            echo "You are man"
        elif [ "$var" = "n" ]
        then
            echo "You are woman"
        else
            echo "enter y or n"
        fi
        [posein@www posein]$ ./el1
        Are you man? (y/n)
        y
        You are man
   2) case문
    ㄱ. 설명: 문자열과 일치하는 정규식부분을 찾아 해당하는 정규식 다음에 있는 명령어를 실행시
             킨다. 아래로 계속 내려가면서 문자열에 해당하는 부분을 찾고 보통 맨 마지막에
             나열한 정규식에 해당하지 않는 모든 경우에 해당하는 부분은 *)로 표기한다.
    ㄴ. 사용법
       case 문자열
       in
         정규식1) 명령어1;;
         정규식2) 명령어2;;
       ...
       esac
        => 오른쪽 괄호와 세미콜론은 반드시 사용해야 한다.
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt3
        case $1
        in
          0) echo zero;;
          1) echo one;;
          2) echo two;;
          3) echo three;;
          *) echo greater than four
        esac
        [posein@linux67 posein]$ ./tt3 2
        two
          => 아규먼트와 동일한 정규식을 찾아 해당 명령어를 수행한다.
     b. [posein@www posein]$ cat ca1
        #!/bin/bash
        echo "*********************************************"
        echo "*              보         기                *"
        echo "*********************************************"
        echo "1. who    2. date    3. pwd    4. ls -l     *"
        echo "*********************************************"
        echo "수행하고자 하는 명령어는?(번호를 입력하시오) "
        read number;
        case $number in
          1) who;;
          2) date;;
          3) pwd;;
          4) ls -l;;
          *) echo "없는 번호입니다."
        esac
        [posein@www posein]$ ./ca1
        *********************************************
        *              보         기                *
        *********************************************
        1. who    2. date    3. pwd    4. ls -l     *
        *********************************************
        수행하고자 하는 명령어는?(번호를 입력하시오)
        3
        /home/posein
     c. [posein@www posein]$ cat ca2
        #!/bin/bash
        echo "is it morning? (yes/no)"
        read ans;
        case "$ans" in
             yes | y | Yes | YES)           echo "good morning";;
             no  | n | No | NO)             echo "good afternoon";;
             *) echo "answer not recognize";;
        esac
        [posein@www posein]$ ./ca2
        is it morning? (yes/no)
        n
        good afternoon
   3) select문
    ㄱ. 설명: 이 구문은 다른 쉘에는 없고 콘쉘과 배시쉘에만 존재하는 구문으로 문법이 간결하다.
             구조는 for문과 유사하다.
    ㄴ. 사용법
       select 변수 in 값1, 값2,...
       do
          실행문장
       done
        => in 다음에 나오는 값들이 항목으로 된 메뉴로 생성된다. 이 값들이 생략되면 기본값은
          "$@"가 된다. 형식은 번호를 선택하게 되어 있으며, 사용자에게 번호를 표시해준다.
          "변수"에 선택된 내용을 저장하고 선택된 번호는 내장변수인 REPLY에 저장하고 "실행문장"
           이 실행된다.
    ㄷ.사용예
       [posein@www posein]$ cat sele1
       #!/bin/bash
       echo "What is your favourite OS ?"
       select var in "Linux" "Free BSD" "Windows" "Solaris" "Other"
          do
                break
          done
       echo "You have selected $var"
       [posein@www posein]$ ./sele1
       What is your favourite OS ?
       1) Linux
       2) Free BSD
       3) Windows
       4) Solaris
       5) Other
       #? 1
       You have selected Linux

(7) 반복문: 루프는 지정된 숫자나 몇가지 조건을 만날 때까지 일련의 명령들을 반복적으로 수행할
            수 있게 한다.
   1) for
    ㄱ. 설명: for문은 지정된 범위 안에서 루프를 수행한다. 범위는 어떤 집합도 가능하다. in뒤의
             값1, 값2, ...가 순서대로 지정된 변수에 배정되면서 do이하의 문장을 수행한다. 즉 매
             루프를 돌 때마다 변수의 값은 in이후의 값으로 대체된다.
    ㄴ. 사용법
      for 변수 in 값1, 값2
      do
         실행문장
      done
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt4
        for flower in Rose Tulip Lily
        do
          echo $flower
        done
        [posein@linux67 posein]$ ./tt4
        Rose
        Tulip
        Lily
         => flower라는 변수에 Rose, Tulip, Lily라는 값이 루프를 돌면서 들어가 출력된다.
     b. [posein@linux67 posein]$ cat tt6
        for file in $(ls chap[345].txt)
        do
          echo "-----$file-----" >> book.txt
        cat $file >>book.txt
        done
        [posein@linux67 posein]$ ./tt6
        [posein@linux67 posein]$ cat book.txt
        -----chap3.txt-----
        chap3 Page
        -----chap4.txt-----
        chap4 Page
        -----chap5.txt-----
        chap5 Page
         => chap3.txt, chap4.txt, chap5.txt파일을 book.txt라는 파일에 붙여넣는다.
     c. [posein@www posein]$ cat for1
        #!/bin/bash
        for var in *
        do
          file_size=`wc -c<$var`
          echo $var contains $file_size characters
          if test $file_size -le 5120
          then
               echo the file $var is a small file
          else
               echo the file $var is a large file
          fi
        done
         => for문에서 *는 현재디렉토리에 있는 모든 파일들을 값으로 받아들여 출력한다.
   2) while
    ㄱ. 설명: while뒤의 조건문 동안 do이하의 문장을 실행한다. for구문과 같이 실행 횟수를 지정
              하지 않아도 된다.
    ㄴ. 사용법
       while 조건문
       do
         실행문장
       done
    ㄷ. 사용예
     a. [posein@linux67 posein]$ cat tt7
        var=1
        while [ "$var" -le 5 ]
        do
           echo $var
           var=`expr $var + 1`
       done
       [posein@linux67 posein]$ ./tt7
       1
       2
       3
       4
       5
         => var이 5보다 작거나 같으면 var에 1씩 더한다. 결과는 1,2,3,4,5가 차례로 출력된다.
           참고로 expr은 연산할 때 사용한다.
     b. [posein@linux67 posein]$ cat tt8
        echo "Enter Password: "
        read password1
        echo "Retype Password: "
        read password2
        while [ "$password1" != "$password2" ]
        do
           echo "Password miss match Try again"
           echo "Retype Password: "
        read password
        done
        echo "OK Password Match complete"
          => 패스워드를 두 번 입력하여 두 값이 일치하지 않을 경우, 다시 입력을 요구한다. (물
            론 패스워드로 입력한 문자는 화면에 그대로 출력된다.)
   3) until
    ㄱ. 설명: until은 while문과 동일한 효과를 내지만 조건이 반대이다. 즉, while문은 조건이 참
             일 동안 루프를 수행하지만, until은 거짓일 동안 루프를 수행한다.
    ㄴ. 사용법
       until 조건문
       do
         실행문장
       done
    ㄷ. 사용예
       [posein@linux67 posein]$ cat tt9
       COUNTER=20
       until [ $COUNTER -lt 10 ]
       do
          echo COUNTER is $COUNTER
          COUNTER=`expr $COUNTER - 1`
       done
       [posein@linux67 posein]$ ./tt9
       COUNTER is 20
       COUNTER is 19
       COUNTER is 18
       COUNTER is 17
       COUNTER is 16
       COUNTER is 15
       COUNTER is 14
       COUNTER is 13
       COUNTER is 12
       COUNTER is 11
       COUNTER is 10
         => 20에서 부터 10까지 차례로 출력된다.
(8) 함수
   1) 설명
    ㄱ. 함수란 일종의 '스크립트안의 스크립트'라고 할 수 있다.
    ㄴ. 명령어 그룹을 메모리내에 정의하여 약어의 기능으로 사용할 수 있다. 메모리에 함수가 존재
       함으로서 수행속도를 향상시킨다.
    ㄷ. Shell 스크립트의 크기를 적절히 조절할 경우에 사용하고 코드를 구조화하는데 유리하다.
   2) 사용법
    ㄱ. 함수이름()
        {
           command
        }
    ㄴ. function 함수이름
        {
           command
        }
   3) 사용예
     [posein@www posein]$ cat fun
     #!/bin/bash
     user_print()
     {
       echo "shell programming"
     }
     echo "start user_print"
     user_print
     echo "end user_print"
     [posein@www posein]$ ./fun
     start user_print
     shell programming
     end user_print
   4) 참고할만 명령어
    ㄱ. type
     a. 설명: 주어진 인자가 쉘 스크립트, 함수, 앨리어스인지를 검사하여 출력한다. 기본적으로
             함수이면 정의된 내용까지 모두 출력한다.
     b. 사용법
       type [option] 인자
     c. option
       -all : 해당 인자이름으로 정의된 모든 사항을 출력한다.
       -path : 실행파일이나 쉘 스크립트에 국한되어 결과를 출력한다.
       -type : 여러결과는 인자이름과 일치하는 키워드 하나만을 출력한다.
     d. 사용예
       1. [posein@www shell]$ type pushd
          pushd is a function
          pushd ()
          {
              dirname=$1;
              DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
              cd ${dirname:?"missing directory name."};
              echo "$DIR_STACK"
          }
       2. [posein@www shell]$ type -all pushd
          pushd is a function
          pushd ()
          {
              dirname=$1;
              DIR_STACK="$dirname ${DIR_STACK:-$PWD''}";
              cd ${dirname:?"missing directory name."};
              echo "$DIR_STACK"
          }
          pushd is a shell builtin
       3. [posein@www shell]$ type -type pushd
          function
       4. [posein@www shell]$ type -all -type pushd
          function
          builtin
(9) 명령실행
   1) 산술확장
    ㄱ. 설명: 산술연산을 하는 expr명령은 실행이 매우 느리기 때문에 사용한다.
    ㄴ. 사용법
       $((...))
    ㄷ. 사용예
       [posein@www posein]$ cat ex1
       #!/bin/bash
       var=0
       while [ "$var" -ne 10 ]
       do
           echo $var
           var=$((var+1))
       done
       exit 0
      [posein@www posein]$ ./ex1
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
   2) 패턴과 패턴비교
    ㄱ. 설명: 일종의 문자열을 연산하는 것으로 특정한 패턴(pattern)을 놓고 변수의 문자열 값이
             일부분이라도 이 패턴과 일치하는지 검사할 때 쓰인다. 이 패턴에는 와일드카드문자
             (*, ?, [ ]를 포함한 문자세트)를 포함해도 된다.
    ㄴ. 종류
       ${variable#pattern} : 처음부터 pattern과 맞는 variable의 부분을 찾아 이 중 가장 작은
                            부분을 제거하고 나머지를 반환
       ${variable##wpattern} : 처음부터 pattern과 맞는 variable의 부분을 찾아 가장 큰 부분을
                              제거하고 나머지 부분을 반환
       ${variable%pattern} : 끝에서부터 pattern과 일치하는 variable의 최소부분을 제거하고
                            나머지를 반환
       ${variable%%pattern} : 끝에서부터 pattern과 일치하는 variable의 최대부분을 제거하고
                             나머지를 반환
    ㄷ. 사용예
      [posein@www posein]$ cat ex3
      #!/bin/bash
      unset var1
      echo ${var1:-string2}
      var1=string1
      echo ${var1:-string2}
      var1=/etc/sysconfig/network
      echo ${var1#*/}
      echo ${var1##*/}
      var2=/etc/sysconfig/network-script/ifcfg-lo
      echo ${var2%sysconfig*}
      echo ${var2%%sysconfig*}
      exit 0
      [posein@www posein]$ ./ex3
      string2
      string1
      etc/sysconfig/network
      network
      /etc/
      /etc/
(10) 기타관련명령어
   1) read
    ㄱ. 설명: 임의의 자료를 키보드로부터 입력받는 명령어로 read를 사용하며, 연속으로 여러 자료
             를 받을 수도 있다. 아규먼트는 차례대로 1,2,3,...순으로 매겨지고, 실행시킨 스크립
             트 파일 이름의 자체 아규먼트는 0이다.
    ㄴ. 사용법
       read 변수1 [변수2, ....]
    ㄷ. 사용예
       a. [posein@linux67 posein]$ read flower
          rose
           => read flower라고 입력하면 입력받을 수 있는 대기상태가 된다. 그 상태에서 값을 입력
             한다.
          [posein@linux67 posein]$ echo $flower
          rose
           => echo문으로 값을 확인한다.
       b. [posein@linux67 posein]$ read var1 var2
          aaa bbb
          [posein@linux67 posein]$ echo $var2 $var1
          bbb aaa
           => read문을 이용하여 연속적으로 입력받을 수 있다.
       c. [posein@www posein]$ cat read1
          #!/bin/bash
          echo "두 자연수를 입력받아 뺄셈을 하는 프로그램"
          echo "첫번째 자연수는?"
          read int1
          echo "두번째 자연수는?"
          read int2
          if [ $int1 -ge $int2 ]
          then
              expr $int1 - $int2
          else
              expr $int2 - $int1
          fi
          [posein@www posein]$ ./read1
          두 자연수를 입력받아 뺄셈을 하는 프로그램
          첫번째 자연수는?
          6
          두번째 자연수는?
          2
          4
       d. [posein@linux67 posein]$ cat read2
          #!/bin/bash
          echo "당신의 이름을 입력하세요?"
          read str
          echo $str
          [posein@linux67 posein]$ ./read2
          당신의 이름을 입력하세요?
          posein
          posein
   2) echo
    ㄱ. 설명: 해당문자열을 표준 출력에 표시하고 행바꿈을 한다. 만일 문자열이 없으면 행바꿈만
             한다.
    ㄴ. 사용법
       echo [option] [문자열]
    ㄷ. option
      -n : 출력결과에서 행바꿈을 하지 않는다.
      -e : escape문자를 사용할 수 있게 해준다.
    ㄹ. 사용예
     a. [posein@linux67 posein]$ echo HI!
        HI!
     b. [posein@www posein]$ echo -e "Yes\nNo"
        Yes
        No
     c. [posein@www shell]$ cat file6
        #!/bin/bash
        echo -n "ENTER A : "
        read A
        echo -n "ENTER B : "
        read B

        result1=`expr $A + $B`
        result2=`expr $A - $B`
        result3=`expr $A \* $B`
        result4=`expr $A / $B`
        result5=`expr $A % $B`

        echo "A + B = $result1"
        echo "A - B = $result2"
        echo "A * B = $result3"
        echo "A / B = $result4"
        echo "A % B = $result5"
        [posein@www shell]$ ./file6
        ENTER A : 6
        ENTER B : 2
        A + B = 8
        A - B = 4
        A * B = 12
        A / B = 3
        A % B = 0
   3) break
    ㄱ. 설명: for, while, until등의 순환문에서 빠져 나온다.
    ㄴ. 사용법
       break [n]
        => 순환문의 n번째루프에서 빠져나온다.
    ㄷ. 사용예
       [posein@www posein]$ cat br1
       #!/bin/bash
       rm -rf file*
       echo > file1
       echo > file2
       mkdir file3
       echo > file4
       for var in file*
       do
         if [ -d "$var" ]
         then
           break;
         fi
       done
       echo "directory name : $var"
       exit 0
       [posein@www posein]$ ./br1
       directory name : file3
   4) continue
    ㄱ. 설명: for, while, until등의 순환문을 계속해서 실행한다.
    ㄴ. 사용법
       continue [n]
         => n번째 루프를 나타내는 부분은 생략할 수 있다.
    ㄷ. 사용예
       [posein@www posein]$ cat co1
       #!/bin/bash
       rm -rf file*
       echo > file1
       echo > file2
       mkdir file3
       echo > file4
       for var in file*
       do
           if [ -d "$var" ]
           then
               continue
           fi
           echo "file name : $var"
       done
       exit 0
       [posein@www posein]$ ./co1
       file name : file1
       file name : file2
       file name : file4
   5) exit
    ㄱ. 설명: 상태 코드 n가 함께 스크립트를 종료한다. n은 0(성공)이나 0이 아닌 숫자(실패)가
             될 수 있다. 만일 n이 주어지지 않으면 가장 최근에 사용된 명령의 상태코드를 사용
             한다.
    ㄴ. 사용법
       exit [n]
   6) function
    ㄱ. 설명: 함수를 정의한다. 위치 매개변수($1, $2, -)가 명령어부분에서 사용가능하다.
    ㄴ. 사용법
       function 함수명
       {
         명령어
       }
    ㄷ. 사용예
       [posein@linux67 posein]$ cat myfunc
       # function myfunc
       {
         echo "parameter is $1"
       }
       [posein@linux67 posein]$ ./myfunc love
       parameter is love
   7) getopts
    ㄱ. 설명: 명령행 인자를 처리해 올바른지 점검한다. getopts명령은 주로 쉘스크립트 순환문에서
             사용되며 명령행 옵션이 표준 형식에 맞는지를 확인한다. 문자열에는 옵션을 나타내는
             문자들이 포함되며 스크립트가 실행될 때 getopts에 의해 처리한다. 적합한 옵션들은
             하나씩 처리되어 지정된 변수명에 저장된다.
    ㄴ. 사용법
      getopts 문자열 변수명
   8) return
    ㄱ. 설명: 함수정의에서 사용되며 함수가 종료될 때 상태코드 n을 반환한다. 만일 n이 생략되면
             직전에 실행된 명령 상태코드를 반환한다.
    ㄴ. 사용법
       return [n]
   9) set
    ㄱ. 설명: Shell에서 매개인자를 설정한다. 문자열을 공백으로 나누어진 필드로 출력할 때 유용
             하다.
    ㄴ. 사용법
       set 문자열
    ㄷ. 사용예
      a. [posein@www posein]$ set a b c
         [posein@www posein]$ echo $1 $2
         a b
      b. [posein@www posein]$ cat da1
         #!/bin/bash
         echo Date: $(date)
         set $(date)
         echo Date: $6년 $2 $3$1 $4
         exit 0
         [posein@www posein]$ ./da1
         Date: Thu Jul 4 23:36:22 KST 2002
         Date: 2002년 Jul 4Thu 23:36:22
   10) shift
    ㄱ. 설명
     a. 위치 매개변수를 n자리만큼 당긴다.
     b. 만일 n이 생략되면 기본적으로 1이 적용된다. 즉, $2는 $1으로 $3은 $2로 이동한다.
     c. 보통 매개 변수를 처음부터 끝까지 검색하는데 자주 사용한다.
    ㄴ. 사용법
       shift [n]
    ㄷ. 사용예
     a. [posein@www shiftdir]$ cat sh1
        #!/bin/bash

        while [ $# -gt 0 ]
        do
             echo "$# : $*"
             shift
        done
        [posein@www shiftdir]$ ./sh1 a b c
        3 : a b c
        2 : b c
        1 : c
     b. [posein@www shiftdir]$ cat sh2
        #!/bin/bash
        echo $#
        echo $1
        echo $2
        echo $3
        echo $4

        echo "____________________________"
        shift 2

        echo $#
        echo $1
        echo $2
        echo $3
        echo $4
        [posein@www shiftdir]$ ./sh2 a b c d
        4
        a
        b
        c
        d
        ____________________________
        2
        c
        d
     c. [posein@www posein]$ cat sh3
        #!/bin/bash
        echo Date: $(date)
        set $(date)
        while [ "$1" != "" ]
        do
          echo $1
        shift
        done
        exit 0
        [posein@www posein]$ ./sh3
        Date: Thu Jul 4 23:25:24 KST 2002
        Thu
        Jul
        4
        23:25:24
        KST
        2002
   11) source
    ㄱ. 설명: 파일을 읽고 실행한다. 파일이 반드시 실행가능할 필요는 없지만 PATH에 등록되어
             있어야 한다. 점(.)이 source와 같은 기능을 한다.
    ㄴ. 사용법
      source 파일 [인수]
      . 파일 [인수]
   12) eval!
    ㄱ. 설명: 인자의 값을 구하는데 사용
    ㄴ. 사용예
       [posein@www posein]$ cat ev1
       #!/bin/bash
       var1=10
       var2=var1
       eval! result='$'$var2
       echo $result
       [posein@www posein]$ ./ev1
       10
   13) expr
    ㄱ. 설명: 인자로 사용되는 표현식의 값을 구함
    ㄴ. 사용예
       var2=`expr $var +1`
   14) prinft
    ㄱ. 설명: 가장 최근의 shell에서만 사용가능한 명령어로 형식화된 출력을 할 때 사용한다.
    ㄴ. 사용법
       printf "format string" parameter1 parameter2
    ㄷ. format string의 변환식별자
       d : 십진수 출력
       c : 한문자 출력
       s : 문장 출력
       % : %문자 출력
    ㄹ. 사용예
     a. [posein@www posein]$ printf "%s\n" shell
        shell
     b. [posein@www posein]$ printf "%s %d\t%s\n" "shell programming" 100 gogo
        shell programming 100   gogo
   15) true
    ㄱ. 설명: 쉘 상에서 참의 의미를 가지는 0을 반환한다.
    ㄴ. 사용법
       true
    ㄷ. 특징
     a. 쉘 스크립트상에서 무한 루프를 만들 때 등의 경우 사용될 수 있다.
     b. Bourne 쉘 상에서 콜론문자(:)로 같은 효과를 얻을 수 있다. 보통 의미없는 널(Null).명령
    ㄹ. 사용예
     a. [posein@www posein]$ cat tr1
        #!/bin/bash
        while true
        do
          echo "over and over"
        done
     b. [posein@www posein]$ cat tr2
        #!/bin/bash
        rm -f file
        if [ -f file ]
        then
            :
        else
            echo "file did not exist"
        fi
        exit 0
        [posein@www posein]$ ./tr2
        file did not exist
(11) 쉘프로그래밍 기타사항
   1) 종료코드
     0          : 성공
     1 ~ 125    : 에러
     126        : 파일이 실행가능하지 않음
     128 ~ 255  : 시그널이 발생
      => Shell프로그래밍에서는 전역에러코드 변수없이 125개의 사용자 정의 에러코드를 사용할 수
        있다.
   2) 우선순위
    ㄱ. 앨리어스
    ㄴ. function, if, for같은 키워드
    ㄷ. 함수
    ㄹ. cd나 type과 같은 내장 명령
    ㅁ. 스크립트와 프로그램. PATH환경 변수에 들어있는 디렉토리를 쉘이 확인하여 실행한다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. gpg 사용하기
(1) 사용법
   gpg [options] command
(2) command
   --gen-key : 새로운 공개키와 비밀키를 생성한다.
   --list-keys : 설치된 공개키의 리스트를 보여준다.
   --export : 공개키를 다른 사람에게 전달하기 위해서 파일의 형태로 만들어 준다. 기본적으로
              바이너리형태로 만든다. 이 다음에 오는 키의 이름은 위에 생성된 키생성시 입력한
              문자열의 일부나 전체를 사용하도록 한다.
   --import! : 다른 사람의 공개키를 가지고 자신의 gpg에 설치한다.
   --edit-key : 키에 대하여 사인(sign)등의 편집을 한다.
   --encrypt, -e : 자료를 암호화한다.
(3) options
   --outfile 파일명 : '파일명'으로 공개키가 들어있는 파일을 생성한다. 보통 --export와 같이 사용
                    되며 이 옵션을 사용하지 않으면 화면으로 출력으로 출력한다.
   --armor , -a    : 공개키를 ASCII형으로 만든다.
   --encrypt : 암호화하는 옵션이다.
   --recipient : 암호화하는 옵션인 --encrypt과 같이 쓰이며 받는 사람의 공개키를 적는다.
   --decrypt : 해독화하는 옵션이다.
(4) 사용예
   1) [posein@www posein]$ gpg --output sungjae.gpg --armor --export sungjae
       => 공개키를 sungjae라고 생성하고 sungjae.gpg라는 파일로 저장한다.
   2) [prehee@www prehee]$ gpg --armor --import! sungjae.gpg
       => sungjae.gpg라는 공개키를 자신의 gpg에 설치한다. --armor옵션은 텍스트형태의 파일을
         import!할 경우를 뜻한다.
   3) [prehee@www prehee]$ gpg --edit-key sungjae


2. gpg의 설정
(1) 공개키와 비밀키를 생성한다.
   [posein@www posein]$ gpg --gen-key
   gpg (GnuPG) 1.0.6; Copyright (C) 2001 Free Software Foundation, Inc.
   This program comes with ABSOLUTELY NO WARRANTY.
   This is free software, and you are welcome to redistribute it
   under certain conditions. See the file COPYING for details.

   gpg: Warning: using insecure memory!
   Please select what kind of key you want:
      (1) DSA and ElGamal (default)
      (2) DSA (sign only)
      (4) ElGamal (sign and encrypt)
   Your selection?
    => (설명) gpg에서는 위와 같은 키방식을 제공하는데 DSA는 서명만 할 수 있는 방식이고 EIGamal
            은 암호화를 할 수 있는 방식이다. 일반적으로 디폴트값을 사용하면 되므로 엔터키를
            치고 다음으로 넘어간다.

   DSA keypair will have 1024 bits.
   About to generate a new ELG-E keypair.
                 minimum keysize is  768 bits
                 default keysize is 1024 bits
       highest suggested keysize is 2048 bits
   What keysize do you want? (1024)
    => (설명) 키의 길이를 정하는 것이다. 물론 크기가 클수록 안전하지만, 암호화하고 해독하는데
             많은 시간이 걸린다. 이 부분도 디폴트값으로 한다.
   Requested keysize is 1024 bits
    => (설명) 1024bit로 키의 크기가 설정되었다.
   Please specify how long the key should be valid.
            0 = key does not expire
         <n>  = key expires in n days
         <n>w = key expires in n weeks
         <n>m = key expires in n months
         <n>y = key expires in n years
   Key is valid for? (0)
    => (설명) 키의 유효기간을 지정하는 것이다. 중요한 것일 경우에는 유효기간을 짧게 잡아서 키를
            자주 변경하는 것이 좋다. 이 부분도 디폴트값으로 한다. 즉 유효기간이 없다.
   Key does not expire at all
    => (설명) 유효기간이 설정되지 않음을 나타낸다.
   Is this correct (y/n)? y
    => (설명) 정확히 맞는지 여부를 묻는 부분이다.
   You need a User-ID to identify your key; the software constructs the user id
   from Real Name, Comment and Email Address in this form:
       "Heinrich Heine (Der Dichter) <
heinrichh@duesseldorf.de>"

   Real name: Jung Sung-jae
    => (설명) 키의 이름을 정하는 부분이다. 보통 자신의 이름을 적는다.
   Email address:
posein@korea.com
    => (설명) 자신의 전자우편 주소를 쓴다.

   Comment: system manager
    => (설명) 설명한 것이 있으면 적도록 한다.
   You selected this USER-ID:
       "Jung Sungjae (system manager) <
posein@korea.com>"
   Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
    => (설명) 위와같이 생성이 되며 변경할 사항이 없으면 o를 누른다.
   You need a Passphrase to protect your secret key.
    => 비밀키 보호용 암호를 설정한다.
  
   We need to generate a lot of random bytes. It is a good idea to perform
   some other action (type on the keyboard, move the mouse, utilize the
   disks) during the prime generation; this gives the random number
   generator a better chance to gain enough entropy.
   .++++++++++++++++++++.+++++++++++++++++++++++++.+++++...+++++.++++++++++.++++++++++.+++++
   We need to generate a lot of random bytes. It is a good idea to perform
   some other action (type on the keyboard, move the mouse, utilize the
   disks) during the prime generation; this gives the random number
   generator a better chance to gain enough entropy.
   .+++++++++++++++++++++++++++++++++++.++++++++++++++++++++.++++++++++++++++++++++++++++++++
   public and secret key created and signed.
    => (설명) 공개키와 비밀키를 생성하였다.
(2) 생성된 키의 확인
   1) 설치된 디렉토리의 확인
     [posein@www posein]$ ls -a
     ./   .bash_history  .bash_profile  .emacs   .kde/      .mysql_history  .viminfo 
     ../   bash_logout   .bashrc        .gnupg/  .mplayer/  .screenrc       .wl      
       => .gnupg라는 디렉토리가 생성되었음을 알 수 있다.
   2) 설치된 디렉토리내의 파일
     [posein@www posein]$ cd .gnupg
     [posein@www .gnupg]$ ls
     options  pubring.gpg  pubring.gpg~  random_seed  secring.gpg
   3) 설치된 공개키의 리스트 확인
     posein@www posein]$ gpg --list-keys
     gpg: Warning: using insecure memory!
     /home/posein/.gnupg/pubring.gpg
     -------------------------------
     pub  1024D/7F1400E1 2002-04-11 Jung sungjae (system manager) <
posein@korea.com>

     sub  1024g/C4E2C936 2002-04-11

3. 공개키 파일의 생성과 설치

(1) 공개키 파일 만들기
   1) [posein@www posein]$ gpg --armor --export sungjae
      gpg: Warning: using insecure memory!
      -----BEGIN PGP PUBLIC KEY BLOCK-----
      Version: GnuPG v1.0.6 (GNU/Linux)
      Comment: For info see http://www.gnupg.org

      mQGiBDy1VWIRBACyHe0EnIe7payoWcNRSDwc/SLSL8pZ7kIrkPlnv6P3tARJN0xU
      s/C+kBLhB3JCN0N/7HO8QL82tcZFGQX0RStEzjp4DxIDFRZCcxq6AQdmoCW+FYxV
      p4mBpSheoNzw3sOumviHSiuo8qCUFY1/NSInvTJJzcgcBhHeoNbSEEKrFwCgzCrq
      1J8kvQG10j51mKu9iRFbq3UD/2icBWGRnQ+oWSUZAEvodjn560uobpxe2Py6jwlJ
      NCwv+dLFJV2MX1e4faRU5yfDF0O43IlgO8gjiA4whi8GuDzgVbVJsTWcrlZjusmw
      fj4wlelNXm/KahYfuTsWCusAQDBpUCDKjmUY9ocxf5aaSscQMXVexs5Q7TZNSsG5
      yFtZA/9Qcng02Auizqz5aOysmU2UuGEanbK+TR0dGe2FHw4hV7fCWVqsj5Q7h/sj
      +pCDWQp9oCZUA6WoFUWXAeHRXZ9Cl9bOMmiBAtcqxdo1Sy02d0RgC+esrubEPXrR
      cMkJSpIfHEZrHInZQjUw8qOB9o1N3itGFCpCWoHLhug7Ol3N3bQic3VuZ2phZSAo
      bGludXgpIDxwb3NlaW5Aa29yZWEuY29tPohXBBMRAgAXBQI8tVViBQsHCgMEAxUD
      AgMWAgECF4AACgkQbR8Td38UAOFL/wCfUxSvPnjrh6MPJA9q18qIsrR3wVQAniCM
      vftp1iqSWnFkRtC2yMK3FSaOuQENBDy1VWMQBACL+zeYup7TTWiaV4wooqRVXAdd
      8BvxoA6hfyTFXCvpqsbXAoy/3dbBY/bqhf9sJdE7ksVTjHd1o2aD7eDzkr2hzLC8
      x/NkBh+PcgiaqJR9APBSroW5ySr0PF6XfWHIgvgF00+Luu4GpqrXEdIh6SxImXm3
      2EF6xBukjCjxCDG3LwADBQP/QPOzqGmSrlNClp4aWrh7Q9xdQLLx9hW62hmsApT4
      /CG2wp7gDDshts+nwltw3+4LLp6j2MOP2bPoakbXcIBnW457gpZmsbyyFRwmmYqW
      WjFR3DDLmxeeX0Pqb8kNgUTCf31cgRDdUjQM0JdcE8kfM1pzFLjsk8umND6oqaB4
      waSIRgQYEQIABgUCPLVVYwAKCRBtHxN3fxQA4XABAJ0cSqKUNMWehupuoItg+qZd
      GYxFmACfRfHzc+aZ2jDdYZdBKZ8AczR1OwY=
      =c2ma
      -----END PGP PUBLIC KEY BLOCK-----
       => (설명) --output옵션을 붙여 주지 않았다면 결과가 표준출력인 화면으로 나타나다. 이
                텍스트 결과를 전자 메일로 전송해 준다거나 홈페이지에 올리게 되면 다른 사람들이
                이 공개키를 가지고 지정된 사람들만이 볼 수 있는 비밀 문서를 보낼 수 있게 된다.
   2) [posein@www posein]$ gpg --output sungjae.gpg --armor --export sungjae
       => sungjae.gpg라는 공개키를 생성한다.
(2) 다른 사람의 공개키 설치하기
   1) 다른 사람의 공개키를 설치
     [prehee@www prehee]$ gpg --armor --import! sungjae.gpg
     gpg: Warning: using insecure memory!
     gpg: key 21BCE5C8: public key import!ed
     gpg: /home/prehee/.gnupg/trustdb.gpg: trustdb created
     gpg: Total number processed: 1
     gpg:               import!ed: 1
      => (설명) sungjae.gpg는 sungjae라는 사람의 공개키가 들어있는 파일이고, 텍스트 파일형태이
              므로 --armor옵션을 사용하였다. 참고로 처음으로 gpg를 실행시키면 디렉토리와 관련
              파일을 먼저 생성하므로 다시 한번 명령을 내려야 한다.
   2) 설치된 공개키의 확인
     [prehee@www prehee]$ gpg --list-keys
     gpg: Warning: using insecure memory!
     /home/prehee/.gnupg/pubring.gpg
     -------------------------------
     pub  1024D/67667253 2002-04-11 prehee (system tester) <
prehee@mybestone.com>
     sub  1024g/F1FB95A8 2002-04-11

     pub  1024D/21BCE5C8 2002-04-11 Jung sungjae (system) <
posein@korea.com>
     sub  1024g/F5F740F4 2002-04-11
      => 다른 사람의 공개키를 잘 이용하려면 자신의 비밀키를 위와 같이 미리 생성해야 한다.

   3) 다른 사람 공개키가 서명달기
      [prehee@www prehee]$ gpg --edit-key sungjae
      gpg (GnuPG) 1.0.6; Copyright (C) 2001 Free Software Foundation, Inc.
      This program comes with ABSOLUTELY NO WARRANTY.
      This is free software, and you are welcome to redistribute it
      under certain conditions. See the file COPYING for details.

      gpg: Warning: using insecure memory!

      pub  1024D/21BCE5C8  created: 2002-04-11 expires: never      trust: -/q
      sub  1024g/F5F740F4  created: 2002-04-11 expires: never
      (1). Jung sungjae (system manager) <
posein@korea.com>
      Command>
        => (설명) 공개키의 편집을 위한 상태로 진입한다.

      Command> fpr
      pub  1024D/21BCE5C8 2002-04-11 sungjae (linux) <
posein@korea.com>

                   Fingerprint: A20D 6C76 1919 4FCF 5A57  2BE2 BBE2 67FC 21BC E5C8
       => (설명) 공개키의 지문(fingerprint)을 확인할 수 있다. Fingerprint라는 말 뒤에 나오는
                16진수의 숫자들이 이 공개키의 지문이다. 이 지문을 공개키 주인과 연락하면서
                (전화등으로 연락하면 서로 지문을 비교) 확인할 수 있다. 이렇게 확인을 거치면
                sign명령으로 sungjae의 공개키에 나의 서명을 할 수 있다.
      Command> sign

      pub  1024D/21BCE5C8  created: 2002-04-11 expires: never      trust: -/q
                   Fingerprint: A20D 6C76 1919 4FCF 5A57  2BE2 BBE2 67FC 21BC E5C8

           Jung sungjae (system manager) <
posein@korea.com>

      Are you really sure that you want to sign this key
      with your key: "prehee (system tester) <
prehee@mybestone.com>"

      Really sign? y

      You need a passphrase to unlock the secret key for
      user: "prehee (system tester) <
prehee@mybestone.com>"
      1024-bit DSA key, ID 67667253, created 2002-04-11

      Enter passphrase:
       => 패스워드를 입력하면 서명이 된다.
     
      Command> check
      uid  Jung sungjae (system manager) <
posein@korea.com>
      sig!       21BCE5C8 2002-04-11   [self-signature]
      sig!       67667253 2002-04-11   prehee (system tester) <prehee@mybestone
       => (설명) 결과를 보면 다른 사람의 공개키에 서명을 했어도 자신의 공개키에도 서명이 된다.
               자신의 공개키를 export할 때에는 자동적으로 gpg가 자신의 서명을 해준다.

4. 문서를 암호화하고 해독하기

(1) 개요 : 문서를 특정인에게 보내고 싶을 경우에 문서를 그 사람의 공개키를 이용해서 암호화한
          뒤 그 암호화된 문서를 그 사람이 받게 되면 그 사람은 자신의 공개키로 암호화 된 문서를
          자신의 비밀키로 해독할 수 있다.
(2) 사용예 : prehee라는 사용자가 posein(Jung sungjae)이라는 사용자에게 보내기 위해 암호화함
   1) 암호화
     a. [prehee@www prehee]$ cat a.txt
        I love linux
        I love windows.
         => (설명) 다음과 같은 문서가 있다.
     b. [prehee@www prehee]$ gpg --output en_a.txt --encrypt --recipient sungjae a.txt
        gpg: Warning: using insecure memory!
        => a.txt라는 문서를 암호화하여 en_a.txt라는 파일을 생성한다. --recipient 다음에는
          받는 사람의 공개키 이름을 적는다.
     c. [prehee@www prehee]$ ls
        Desktop/  a.txt  en_a.txt  sungjae.gpg
         => 암호화된 파일이 생성되었다. 일반적인 텍스트확인명령인 cat을 이용해서 살펴보면 깨진
           문자로 표시됨을 알 수 있다.
   2) 해독 : 이 메일등으로 전송됨 파일을 확인해보도록 하자. 암호화된 문서는 본인의 비밀키만을
            이용해서 풀 수 있다.
     a. [posein@www posein]$ ls
        Desktop/  en_a.txt  sungjae.gpg 
         => 암호화된 문서를 전송받았다. cat명령을 이용해서 확인해봐도 알 수가 없다.
     b. [posein@www posein]$ gpg --output a.txt --decrypt en_a.txt
        gpg: Warning: using insecure memory!

        You need a passphrase to unlock the secret key for
        user: "Jung sungjae (system manager) <
posein@korea.com>"
        1024-bit ELG-E key, ID F5F740F4, created 2002-04-11 (main key ID 21BCE5C8)

        gpg: /home/posein/.gnupg/trustdb.gpg: trustdb created
        gpg: encrypted with 1024-bit ELG-E key, ID F5F740F4, created 2002-04-11
        "Jung sungjae (system manager) <
posein@korea.com>"
          => 자신의 비밀키를 이용하여 암호를 입력하면 암호화된 문서 en_a.txt를 a.txt로 해독
            한다.
     c. [posein@www posein]$ ls
        Desktop/  a.txt  en_a.txt  sungjae.gpg 
         => a.txt라는 파일이 생성되었음을 알 수 있다.
     d. [posein@www posein]$ cat a.txt
        I love linux
        I love windows.
         => 정상적인 내용확인이 가능하다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. Snort에 대하여
Snort란 일종의 침입탐지시스템(IDS:Intrusion Detection System)으로 실시간 트래픽 분석, 프로토
콜 분석, 내용검색/매칭, 침입탐지 Rule에 의거하여 오버플로우, 포트스캔, CGI공격, OS확인 시도
등의 다양한 공격과 스캔을 탐지할 수 있다. 침입탐지 Rule은 보안 커뮤니티를 통해 지속적으로 업데
이트되고 또한 사용자가 직접 Rule을 작성하여 추가할 수 있도록 설계되어 최신공격에 대한 적응에
빨리 대처할 수 있다.


2. Snort 설치하기
(1) 설명: Snort는 공개용으로 http://www.snort.org에서 다운받을 수 있다.
(2) 방법
   1) /usr/local/src 에 snort-2.0.0.tar.gz 를 다운받는다.
   2) 압축을 푼다.
     [root@www src]# tar zxvf snort-2.0.0.tar.gz
   3) 압축을 풀면 snort-2.0.0 라는 디렉토리가 생성되는 데 이 디렉토리로 이동한다.
     [root@www src]# cd snort-2.0.0
   4) 환경설정을 한다.
     [root@www snort-2.0.0]# ./configure
   5) 컴파일한다.
     [root@www snort-2.0.0]# make
   6) 설치한다.
     [root@www snort-2.0.0]# make install

3. Snort 환경설정하기
(1) Rule 추가하기
   1) 설명: snort는 특정한 침입탐지 Rule과 비교하여 침입을 탐지하는 프로그램이므로 항상 최신의
           Rule을 설치하는 것이 좋다.
   2) 방법
    ㄱ. http://www.snort.org에 가서 snortrules-stable.tar.gz 을 다운 받는다.
    ㄴ. snort가 설치되어 있는 디렉토리에 압축을 푼다.
(2) snort.conf파일 설정하기
   1) 설명: 기본적인 몇가지만 설정하도록 한다.
   2) 설정
    ㄱ. var HOME_NET any
         => 현재 네트워크를 명시한다. 192.168.0.1/24 등의 서브넷 표기법으로 표기할 수 있다.
           정의하기가 어려우면 기본값인 any 라고 설정한다.
    ㄴ. var EXTERNAL_NET any
         => 외부 네트워크 대역을 지정한다. 기본값인 any 라고 설정한다.
(3) 탐지된 결과가 기록될 디렉토리 생성하기
   1) 설명: snort에 의해 탐지된 결과를 위한 디렉토리를 생성해야 하고 해당 디렉토리의 접근권한
           도 root만이 가능하도록 해야 한다.
   2) 방법
     ㄱ. 디렉토리 생성
        [root@www root]# mkdir /var/log/snort
     ㄴ. 권한 설정
        [root@www root]# chmod 700 /var/log/snort

4. Snort 사용하기
(1) 사용법
   snort [-options] <filter options >
(2) options
   -A : 얼럿 모드(Alert! Mode)를 지정한다. fast, full, none, unsock 중 하나로 지정한다. unsock
       은 UNIX 소켓을 사용할 때 지정한다.
   -b : tcpdump 파일 포맷으로 저장한다.
   -c 환경설정파일 : 지정된 파일을 Rule 파일로 사용한다.
   -C : 데이터부분의 문자만 출력한다.
   -D : snort를 데몬으로 동작시킨다. 백그라운드로 동작하면 터미널의 종료후에도 계속 동작하도록
       할 때 사용한다.
   -F bpf파일 : 필터링식을 'bpf파일'에서 읽어온다. 이 식은 tcpdump에서 원하는 패킷만을 덤프하
               기 위해 사용한다.
   -g 그룹명 : snort의 그룹 또는 GID를 변경한다.
   -h home-net : 홈 네트워크 변수인 HOME_NET의 값을 설정한다.
   -i interface : 지정된 네트워크 인터페이스를 모니터링 한다. 보통 eth0, eth1 등이 온다.
   -l 디렉토리명 : 지정한 디렉토리에 로그데이터를 저장한다.
   -n 패킷갯수 : 지정한 패킷갯수만 모니터링한다.
   -N : 패킷을 기록은 하지않고 alert!만 저장한다.
   -o : 룰셋 순서를 Alert!->Pass->Log 에서 Pass->Alert!->Log 로 바꾼다.
   -O :IP주소를 알 수 없도록 한다.
   -p : promiscuous 모드를 사용하지 않는다.
   -P 스냅길이 : 패킷의 스냅렌(snaplen)을 지정한다. 스냅렌이란 캡쳐할 수 있는 패킷의 최대크기
                를 말한다. 기본값은 1514으로 스냅렌보다 큰 패킷을 캡쳐할 경우 스냅렌만큼만
                기록된다.
   -q : 메지지를 보이지 않게 한다.
   -r tcpdump_file : tcpdump파일의 패킷들에 대해서 검색한다.
   -s : alert! 메시지를 syslog 로 보낸다. 즉 로그들이 /var/log/secure나 /var/log/messages에
       저장된다.
   -S 변수=변수값: Rule에 있는 변수와 값을 지정할 수 있다. 예를 들면 HOME_NET 같은 값은 재지정
                  한다.
   -t 디렉토리: 지정한 디렉토리를 chroot로 한다.
   -u 사용자 : snort의 UID또는 사용자명을 변경한다.
   -v : 메시지를 자세히 보여준다.
   -V : snort의 버전을 보여준다.
(3) 사용예
    snort -d -l /var/log/snort -c etc/snort.conf -A full -D

5. Snort 결과 분석

(1) 설명: snort를 실행하면 지정한 로그디렉토리(/var/log/snort)에 탐지결과가 남는다. 이 디렉토
          리에 경고메시지가 저장되는 alert! 파일, 각 IP주소별 디렉토리가 생성된다.
(2) 기본 로그 형태
   1) alert! 파일의 예
    ㄱ. Web 공격 시도에 의한 탐지 예
       [**] [1:1002:5] WEB-IIS cmd.exe access [**]
       [Classification: Web Application Attack] [Priority: 1]
       04/27-17:46:24.479073 203.247.xxx.xx:1941 -> 203.247.xx.xxx:80
       TCP TTL:114 TOS:0x0 ID:29029 IpLen:20 DgmLen:1500 DF
       ***A**** Seq: 0x49CC3667  Ack: 0x3B68E670  Win: 0x4470  TcpLen: 20
    ㄴ. 포트스캔(Prot Scan)에 의한 탐지 예
       [**] [1:628:1] SCAN nmap TCP [**]
       [Classification: Attempted Information Leak] [Priority: 2]
       04/27-18:47:44.042908 203.247.xx.xxx:57970 -> 203.247.xx.xxx:21
       TCP TTL:52 TOS:0x0 ID:43643 IpLen:20 DgmLen:60
       ***A**** Seq: 0x965ADFEC  Ack: 0x0  Win: 0x400  TcpLen: 40
       TCP Options (4) => WS: 10 NOP MSS: 265 TS: 1061109567 0
       [Xref => http://www.whitehats.com/info/IDS28]
   2) 각 주소별 디렉토리
    ㄱ. 설명: snort가 공격 메시지나 비정상적인 시도를 탐지하게 되면 로그디렉토리에 해당 공격을
             시도한 IP주소로 디렉토리를 만들고 관련 정보를 파일로 생성한다.
    ㄴ. 예
       [root@www 203.247.xx.xxx]# cat TCP:1941-80
       [**] WEB-IIS ISAPI .ida attempt [**]
       04/27-17:46:24.476608 203.247.xx.xxx:1941 -> 203.247.xxx.xxx:80
       TCP TTL:114 TOS:0x0 ID:29028 IpLen:20 DgmLen:1500 DF
       ***A**** Seq: 0x49CC30B3  Ack: 0x3B68E670  Win: 0x4470  TcpLen: 20
       47 45 54 20 2F 64 65 66 61 75 6C 74 2E 69 64 61  GET /default.ida
       3F 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  ?XXXXXXXXXXXXXXX
       58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  XXXXXXXXXXXXXXXX
                ------------ 이 하 생 략 ------------------
         => 만약 공격을 시도한 IP주소가 203.247.xx.xxx이면 /var/log/snort/203.247.xx.xxx형태로
           디렉토리가 생성되고 그 안에 로그파일이 생성된다.
(3) 참고 : 잘못된 탐지에 대하여
   snort가 탐지하는 로그를 보면 몇몇 Rule들이 잘못된 탐지를 하는 경우가 있다. 이 경우에는 관리
  자가 판단하여 snort.conf파일의 해당 Rule에 주석처리하거나 수정할 필요가 있다.

6. Snort관련 응용프로그램 - SnortSnarf
(1) 설명: SnortSnarf는 Snort관련 보조 응용프로그램으로 로그를 관리해주고, 결과를 웹페이지형태
          로 바꾸어 빠르고 편리하게 찾아볼 수 있도록 도와준다.
          관련사이트는 http://www.silicondefense.com 이다.
(2) 설치
   1) 최신버전인 SnortSnarf-021111.1.tar.gz 를 /usr/local/src 디렉토리에 다운받는다.
   2) 압축을 푼다.
     [root@www src]# tar zxvf SnortSnarf-021111.1.tar.gz
   3) 압축을 풀면 디렉토리가 생성되는데 그 디렉토리로 이동한다.
     [root@www src]# cd SnortSnarf-021111.1
   4) include 디렉토리에 안에 있는 내용을 /usr/lib/perl5/site_perl/5.8.0에 모두 복사한다.
     [root@www SnortSnarf-021111.1]# cp -r ./include/* /usr/lib/perl5/site_perl/5.8.0/
   5) cgi 디렉토리안에 있는 내용을 /usr/local/apache/cgi-bin 디렉토리로 이동한다.
     [root@www SnortSnarf-021111.1]# cp ./cgi/* /usr/local/apache/cgi-bin/
   6) 웹페이지가 저장될 디렉토리를 만든다.
     [root@www SnortSnarf-021111.1]# mkdir /usr/local/apache/htdocs/snort
(3) 실행
   1) 설명: 실행파일은 snortsnarf.pl이고 기존의 snort랑 연결해서 실행해야 하므로 관련 디렉토리
           와 관련파일의 위치를 잘 알고 있어야 한다. 아울러 실행파일이 너무 길게 되므로 스크립
           트로 만들어서 사용하면 재실행시에 쉽게 snortsnarf라고 입력하면 실행되도록 할 수
           있다.
   2) snortsnarf.pl 사용하기
    ㄱ. 사용법
       snortsnarf.pl options file1 file2
    ㄴ. options
       -rulesdir : snort rule파일들의 위치를 지정한다.
       -rulesfile : snort 환경설정파일 즉 snort.conf파일의 위치를 지정한다.
       -d : 웹페이지가 생성될 디렉토리를 지정한다.
    ㄷ. 사용예
       [root@www SnortSnarf-021111.1]# ./snortsnarf.pl -rulesdir /usr/local/snort \
       -rulesfile /etc/snort.conf -d /usr/local/apache/htdocs/snort /var/log/snort/alert!
   3) 스크립트로 만들기
     [root@www SnortSnarf-021111.1]# vi snortsnarf
     /usr/local/src/SnortSnarf-021111.1/snortsnarf.pl -rulesdir /usr/local/src/snort-2.0.0 \
     -rulesfile /usr/local/src/snort-2.0.0/etc/snort.conf -d /usr/local/apache/htdocs/snort \
     /var/log/snort/alert!
   4) 실행하기
     [root@www SnortSnarf-021111.1]# ./snortsnarf
(4) 확인
    웹브라우저에서 http://localhost/snort 라고 입력해서 확인한다.
(5) 참고 : snortsnarf의  error 발생
   1) 설명: 실행시에 다음과 같은 error가 발생할 수 있다.
     [root@www SnortSnarf-021111.1]# ./snortsnarf
     Can't locate Time/Timezone.pm in @INC (@INC contains: ./include /usr/lib/perl5/5.8.0/i386
     BEGIN failed--compilation aborted at /usr/lib/perl5/5.8.0/Time/ParseDate.pm line 8.
     Compilation failed in require at include/SnortSnarf/TimeFilters.pm line 18.
     BEGIN failed--compilation aborted at include/SnortSnarf/TimeFilters.pm line 18.
     Compilation failed in require at include/SnortSnarf/Filter.pm line 19.
     BEGIN failed--compilation aborted at include/SnortSnarf/Filter.pm line 19.
     Compilation failed in require at /usr/local/src/SnortSnarf-021111.1/snortsnarf.pl line 87.
     BEGIN failed--compilation aborted at /usr/local/src/SnortSnarf-021111.1/snortsnarf.pl line 87
   2) 원인: Perl 실행시 Time 관련 모듈에 없기 때문이다. 관련 모듈을 다운받아 설치한다.
   3) 해결책
    ㄱ. http://search.cpan.org/author/MUIR/Time-modules-2003.0211 로 이동한다.
    ㄴ. /usr/local/src에 Time-modules-2003.0211.tar.gz 파일을 다운받는다.
    ㄷ. 압축을 푼다.
       [root@www src]# tar zxvf Time-modules-2003.0211.tar.gz
    ㄹ. Perl관련 디렉토리에 복사한다.
       [root@www src]# cp -r ./Time-modules-2003.0211/lib/* /usr/lib/perl5/site_perl/5.8.0/
(6) 주기적으로 실행하기
   1) 설명: snortsnarf를 실행하면 웹페이지에 단 한번의 실행결과만 남게된다. 주기적으로 하려면
           cron데몬과 연계해서 실행하면 된다.
   2) 방법
    ㄱ. 설명: 30분마다 실행하도록 하려면 /etc/crontab 파일에 아래와 같이 추가한다.
    ㄴ. 예
       */30 * * * * root /usr/local/src/SnortSnarf-021111.1/snortsnarf

출처 : 대전국제IT교육센터 정성재 강사

 

1. Tcpdump란?
tcpdump는 Lawrence Berkley Nation Lab의 Network Rearch Gruop에서 만든 것으로 네트워크의 패킷
을 출력해주는 프로그램이다. 주어진 조건식을 만족하는 네트워크 인터페이스를 거치는 패킷들의
헤더들을 출력해 주는 프로그램이다. 주로 쓰임은 지정된 상대방 호스트로부터 들어오는 패킷을 체크
하는 데 있다.


2. tcpdump의 사용법
(1) 사용법
   tcpdump [options] [host]

(2) tcpdump의 결과보기 [root@www root]# tcpdump 01:37:09.744959 203.xxx.xxx.10.4847 > linux.co.kr.ftp: S 2082495566:2082495566(0) win 16384 (DF) => (결과설명) 01:37:09.744959 : Timestamp로 보통 '시간.특정한숫자값'형태로 부여된다. 203.xxx.xxx.10.4847 : Source_address.source_port로 소스의 IP주소와 Port번호를 나타낸 다. > : Traffic direction으로 방향을 나타낸다. linux.co.kr.ftp : destination_address.destination_port로 도착지 IP주소와 Port번호를 나타낸다. S : TCP flag로 특정한 표시문자를 일컫는다. 2082495566:2082495566(0) : sequence number이다. win 16384 : window size이다. : various options 이다. (DF) : Don't fragment

 

3. tcpdump 플래그(flags)

TCP 플래그  TCPDUMP 플래그 플래그의 의미
SYN S  SYN패킷, 접속요청을 할 때 보내는 패킷을 말한다.
TCP접속시에 가장먼저 보내는 패킷이다.
ACK ack  ACK패킷, 상대방으로부터 패킷을 받은 뒤에 알려주는
패킷을 말한다. 다른 플래그와 같이 출력되는 경우도
있다.
FIN F  접속종료를 위한 플래그로 이 패킷을 보내는 곳이
현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용한다.
RESET R  이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시
연결을끊고자 할 때 사용한다.
PUSH P  데이터를 즉시 목적지로 보내라는 의미이다. 텔넷과
같이 상호작용이 중요한 프로그램의 경우 빠른 응답
이 중요한다. 이때 사용하는 플래그이다.
UGENT URG  긴급한 데이터는 다른 데이터에 비해 우선순위가
높아야 한다. 예를 들어 ftp로 자료를 받고 있는 도중
[CTRL]+[C] 를 받으면 즉시 자료받기를 중단해야 하는
것처럼 이 때 사용하는 플래그이다.
Placeholder .  패킷이 SYN, FINISH, RESET, PUSH등의 플래그가 없는
경우이 플래그가 세팅된다. 이 플래그는 ACK플래그와

함께 사용되는 경우도 있다.


4. tcpdump의 옵션
-h: 버전 및 기본 사용법을 보여준다.
-a : Network & Broadcast 주소들을 이름들로 바꾼다.
-c Number : 제시된 수의 패킷을 받은 후 종료한다.
-d : compile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로 출력하고,
     종료한다.
-dd : packet-matching code를 C program의 일부로 출력한다.
-ddd : packet-matching code를 숫자로 출력한다.
-e : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
-f : 외부의 internet address를 가급적 심볼이 아닌 숫자로 출력한다.(Sun의 yp server와의 사용은
     가급적 피한다.)
-F file : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은 모두
          무시된다.
-i device : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면 시스템의
            인터페이스 리스트를 검색하여 가장 낮은 번호를 가진 인터페이스를 선택한다.(이 때
            loopback은 제외된다.) 예) tcpdump -i eth0
-l : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터 데이
     터를 받고자 할 때 유용하다. 보통 'tcpdump -l | tee dat' 나 'tcpdump -l < dat & tail -f
     dat' 명령으로 연계해서 사용하면 편리하다.
-n : 모든 주소들을 번역하지 않는다(port,host address 등등)
-N : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.
-O : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는 버그를 찾을
     때나 쓰인다.
-p : 인터페이스를 promiscuous mode로 두지 않는다.
-q : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
-r file : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가 사용되면 표준
          입력을 통해서 받아들인다.
-s length: 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때 사용한다.(Sun
           OS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만
           Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다.
           이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하
           나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게
           되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃
           게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아
           주어야 한다.
-T type : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이
          올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp
          (Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed
           White Board)
-S : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
-t : 출력되는 각각의 라인에 시간을 출력하지 않는다.
-tt : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
-v : 좀 더 많은 정보들을 출력한다.
-vv : '-v'보다 좀 더 많은 정보들을 출력한다.
-vvv : 16진수값 형태로 정보를 보여준다. 보통 -X옵션과 사용되어
-w : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.
-x : 각각의 패킷을 헥사코드로 출력한다.
-X : 헥사코드와 ascii형태 모두 출력해준다. 보통 -x 옵션과 같이 사용된다.
-조건식(expression!)
  옵션의 제일 마지막인 조건식은 어떤 패킷들을 출력할 지를 선택하는 데 쓰인다. 조건식이 주어지지
않는다면 모든 패킷들이 대상이 된다. 조건식들은 하나 또는 여러 개의 primitive들로 구성되어 있고
primitive들은 다시 하나 또는 여러 개의 qualifier들 다음에 오는 하나의 값으로 이루어진다.
  *qualifier
   type : 주어진 값의 종류가 무엇인지를 나타낸다. 가능한 type들은 'host', 'net', 'port'가 있다.
         type이 없는 값들은 type을 host라 가정한다.
   dir : id로 부터의 어떤 특정한 전송 방향을 나타낸다. 가능한 방향은 'src', 'dst', 'src or
        dst', 'src and dst'이다. 만약 방향이 정해지지 않았다면, src or dst라 가정한다. "For
        `null' link layers (i.e. point to point protocols such as slip) the inb ound and out
        bound qualifiers can be used to specify a desired direction."
   proto : 매칭을 특정 프로토콜에 한해서 수행한다. 가능한 프로토콜들은 ether, fddi, ip, arp,
          rarp, decnet, lat, sca, moprc, mopdl, tcp, udp이다. 만약 프로토콜이 명시되지 않았다
          면, 해당하는 값의 type에 관련된 모든 프로토콜들이 그 대상이 된다.
  *위의 패턴을 따르지 않는 primitive : gateway, broadcast, less, greater, 산술식이 있으며 참고
                                   로 더 정교한 조건식을 사용하려면 'and(&&)','or(||)','not(!)'
                                   을 사용할 수 있다.
  *사용가능한 primitive들
   dst host HOST
    => packet의 IP destination 항목이 HOST일때 참이 된다.
   src host HOST
    => packet의 IP source 항목이 HOST일때 참이 된다.
   host HOST
    => IP source, IP destination 항목 중 어느 하나라도 HOST이면 참이다.
   ether dst ehost
    => ethernet destination 주소가 ehost일 때 참이다.
   ether src ehost
    => ethernet source 주소가 ehost일 때 참이다.
   ether host ehost
    => ethernet source, destination 항목들 중 어느 하나라도 ehost이면 참이다.
   gateway host
    => 패킷이 host를 게이트웨이로 사용하면 참이다. 이 말의 의미는 ethernet sour ce나 destina
      tion 항목은 host이지만, IP source와 destination은 host가 아닐 때를 말한다.
   dst net NET
    => 패킷의 IP destination 주소가 NET의 network number를 가지고 있을 때 참이다.
   src net NET
    => 패킷의 IP source 주소가 NET의 network number를 가지고 있을 때 참이다.
   net NET
    => 패킷의 IP source 주소 혹은 destination 주소가 NET의 network number를 가 지고 있을 때
      참이다.
   net netmask mask
    => IP 어드레스가 지정된 netmask를 통해서 net과 매칭되면 참이다.
   net net/len
    => IP 어드레스가 netmask와 len 비트만큼 매치되면 참이다.
   dst port PORT
    => 패킷이 ip/tcp, ip/udp 프로토콜의 패킷이고 destination port의 값이 PORT일 때 참이다.
      port는 /etc/services에 명시된 이름일 수도 있고 그냥 숫자일 수도 있다. 만약 이름이 사용
      됐다면 port 번호와 프로토콜이 같이 체크될 것이다. 만약 숫자나 불 확실한 이름이 사용됐을
      경우에는 port 번호만이 체크될 것이다.
   src port PORT
    => 패킷의 source port의 값으로 PORT를 가지면 참이다.
   port PORT
    => 패킷의 source, destination port 중에 하나라도 PORT이면 참이다.
less length => 패킷이 length보다 짧거나 같으면 참이다.(len <= length) greater length => 패킷이 length보다 짧거나 같으면 참이다.(len >= length) ip proto protocol => 패킷이 지정된 종류의 프로토콜의 ip패킷이면 참이다. Protocol은 icmp, igrp, udp, nd, tcp 중의 하나 혹은 몇 개가 될 수 있다. 주의할 점은 tcp, udp, icmp들은 '\'로 escape되어야 한다. ehter broadcast => 패킷이 ethernet broadcast 패킷이라면 참이다. ehter는 생략 가능하다. ip broadcast => 패킷이 IP broadcast 패킷이라면 참이다. ether multicast => 패킷이 IP multicast 패킷이라면 참이다. ether proto protocol => 패킷이 ether type의 protocol이라면 참이다. protocol은 ip, arp, rarp 중에 하나 혹은 몇 개가 될 수 있다. ip proto protocol에서와 마찬가지로 ip, arp, rarp는 escape 되어야 한다. decnet src host => 만약 DECNET의 source address가 host이면 참이다. 이 어드레스는 '10.123'이 나 DECNET의 host name일 수 있다. DECNET host name은 DECNET에서 돌아가도록 설정된 Ultrix 시스템에서 만 사용 가능하다. decnet dst host => DECNET destination address가 host이면 참이다. decnet host HOST => DECNET source, destination address중의 하나라도 HOST이면 참이다. ip, arp, rarp, decnet => ether proto [ip|arp|rarp|decnet]의 약어 lat, moprc, mopdl => ether proto [lat|moprc|mopdl]의 약어 tcp, udp, icmp => ip proto [tcp|udp|icmp]의 약어 expr relop expr => EXPR proto [expr:size]의 형식을 띤다. proto, expr, size에 올 수 있는 것들은 다음과 같다. proto : ether, fddi, ip, arp, rarp, tcp, udp, icmp expr : indicate Byte offset of packet of proto size : optional. indicate the size of bytes in field of interest default is one, and can be two or four => RELOP !=, =, <=, >=, etc. 이 조건식을 사용하기 위해서는 먼저 해당하는 Protocol(proto)의 헤더에 관련된 것들을 자세 히 알아야만 한다. proto에는 대상이 될 프로토콜을 지정한다. expr에는 프로토콜 헤더의 처음 부터의 Byte Offset을 지정하는 식이 들어가게 된다. Size는 Option이며 지정이 안 되어 있을 경우에는 자동으로 1byte를 지칭한다. 따라서 이 조건식을 사용하게 되면 헤더에 포함된 정보 를 Bitmask를 사용하여 직 접 원하는 패킷인지를 가려낼 수 있기 때문에, 보다 정밀한 사용이 가능하게 된다.
5. tcpdump 기본사용예
(1) [root@www root]# tcpdump => 현재 서버의 모든 패킷을 보여준다. (2) [root@www root]# tcpdump port 21 tcpdump: listening on eth0 01:25:43.833276 203.xxx.xxx.100.4828 > xxx.com.ftp: S 1910472596:1910472596(0) win 16384 203.247.40.244.4828: S 4108025962:4108025962(0) ack 1910472597 ) => 21번 포트로 들어온 패킷만 보여준다. (3) [root@nanajjang /root]# tcpdump -c 2 host neuro.hannam.ac.kr Kernel filter, protocol ALL, datagram packet socket tcpdump: listening on all devices 11:09:44.576419 eth0 B arp who-has 203.247.40.247 tell neuro.hannam.ac.kr 11:09:44.576507 eth0 > arp reply 203.247.40.247 (0:c0:26:1:11:77) is-at 0:c0:26) => neuro.hannam.ac.kr의 패킷 2개만 보여준다. (4) tcpdump -v -e broadcast => broadcast 의 정보를 자세히 출력하고 출력되는 각각의 행에 대해서 link-level헤더를 출력 한다.
6. tcpdump로 패스워드 알아내기

(1) 설명: telnet을 이용하여 서버에 접속을 하면 패킷전송시에 암호화하지 않기 때문에 쉽게 내용 을 볼 수 있다. tcpdump를 이용하여 패스워드를 알아낼 수 있다.

(2) 사용예

 1) 실행명령 [root@www root]# tcpdump port telnet -l -vvv -x -X >dumpdata & tail -f dumpdata

 2) 패킷분석: 패킷의 양이 많으므로 잘 찾아야 한다. 먼저 연결된 포트를 확인한다. 20:38:22.395281 xxx.com.telnet > 210.xxx.xxx.100.35383: P [tcp sum ok] 175:182(7) ack 81 win 5792 (DF) [tos 0x10] (ttl 64, id 59193, len 59) 0x0000 4510 003b e739 4000 4006 ca41 cbf7 28fc E..;.9@.@..A..(. 0x0010 d27b c1c2 0017 8a37 2992 16d8 2041 b972 .{.....7)....A.r 0x0020 8018 16a0 5fec 0000 0101 080a 04d1 f156 ...._..........V 0x0030 0223 7825 6c6f 6769 6e3a 20 .#x%login:. => 서버(xxx.com)에서 클라이언트(210.xxx.xxx.100에게 'login'이라는 것을 보여줌을 알 수 있다. 또한 연결된 클라이언트의 포트번호가 35383임을 알 수 있다. 이 포트번호를 확인해 야 패킷을 찾아갈 수 있다. ---중략--- 20:38:23.979306 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 81:82(1) ack 182 win 5840 (DF) [tos 0x10] (ttl 56, id 49475, len 53) 0x0000 4510 0035 c143 4000 3806 f83d d27b c1c2 E..5.C@.8..=.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b972 2992 16df ..(..7...A.r)... 0x0020 8018 16d0 5130 0000 0101 080a 0223 78c3 ....Q0.......#x. 0x0030 04d1 f156 70 ...Vp => 클라이언트에서 서버로 전송하는 부분만을 확인하면 된다. P 다음에 존재하는 81:82와 ack 다음에 182라는 번호를 꼭 확인한다. 다음 패킷번호는 82:83이 되고 ack 183번이 되므로 ack 183이라는 부분을 찾아가면 된다. 여기서 클라이언트에서 서버로 전송한 글자는 맨 마지막에 표시된다. 즉 'p'이다. ---중략--- 20:38:24.162490 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 82:83(1) ack 183 win 5840 (DF) [tos 0x10] (ttl 56, id 49477, len 53) 0x0000 4510 0035 c145 4000 3806 f83b d27b c1c2 E..5.E@.8..;.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b973 2992 16e0 ..(..7...A.s)... 0x0020 8018 16d0 4ef0 0000 0101 080a 0223 78d6 ....N........#x. 0x0030 04d1 f481 6f ....o ---중략--- 20:38:24.322785 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 83:84(1) ack 184 win 5840 (DF) [tos 0x10] (ttl 56, id 49479, len 53) 0x0000 4510 0035 c147 4000 3806 f839 d27b c1c2 E..5.G@.8..9.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b974 2992 16e1 ..(..7...A.t)... 0x0020 8018 16d0 4a80 0000 0101 080a 0223 78e6 ....J........#x. 0x0030 04d1 f4df 73 ....s ---중략--- 20:38:24.445142 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 84:85(1) ack 185 win 5840 (DF) [tos 0x10] (ttl 56, id 49481, len 53) 0x0000 4510 0035 c149 4000 3806 f837 d27b c1c2 E..5.I@.8..7.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b975 2992 16e2 ..(..7...A.u)... 0x0020 8018 16d0 5820 0000 0101 080a 0223 78f2 ....X........#x. 0x0030 04d1 f531 65 ...1e ---중략--- 20:38:24.532360 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 85:86(1) ack 186 win 5840 (DF) [tos 0x10] (ttl 56, id 49483, len 53) 0x0000 4510 0035 c14b 4000 3806 f835 d27b c1c2 E..5.K@.8..5.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b976 2992 16e3 ..(..7...A.v)... 0x0020 8018 16d0 53d6 0000 0101 080a 0223 78fb ....S........#x. 0x0030 04d1 f570 69 ...pi ---중략--- 20:38:24.624350 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 86:87(1) ack 187 win 5840 (DF) [tos 0x10] (ttl 56, id 49485, len 53) 0x0000 4510 0035 c14d 4000 3806 f833 d27b c1c2 E..5.M@.8..3.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b977 2992 16e4 ..(..7...A.w)... 0x0020 8018 16d0 4e9f 0000 0101 080a 0223 7904 ....N........#y. 0x0030 04d1 f59c 6e ....n ---중략--- => posein이라는 글자를 알 수 있다. 즉 사용자 ID가 posein이다. 20:38:24.932380 xxx.com.telnet > 210.xxx.xxx.100.35383: P [tcp sum ok] 190:200(10) ack 89 win 5792 (DF) [tos 0x10] (ttl 64, id 59201, len 62) 0x0000 4510 003e e741 4000 4006 ca36 cbf7 28fc E..>.A@.@..6..(. 0x0010 d27b c1c2 0017 8a37 2992 16e7 2041 b97a .{.....7)....A.z 0x0020 8018 16a0 d40b 0000 0101 080a 04d1 f669 ...............i 0x0030 0223 7923 5061 7373 776f 7264 3a20 .#y#Password:. => 서버에서 클라이언트에서 Password라는 글을 보내어 출력시킨다. ---중략--- 20:38:25.300524 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 89:90(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49490, len 53) 0x0000 4510 0035 c152 4000 3806 f82e d27b c1c2 E..5.R@.8....{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97a 2992 16f1 ..(..7...A.z)... 0x0020 8018 16d0 557f 0000 0101 080a 0223 7947 ....U........#yG 0x0030 04d1 f669 66 ...ip ---중략--- 20:38:25.454778 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 90:91(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49491, len 53) 0x0000 4510 0035 c153 4000 3806 f82d d27b c1c2 E..5.S@.8..-.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97b 2992 16f1 ..(..7...A.{)... 0x0020 8018 16d0 489e 0000 0101 080a 0223 7957 ....H........#yW 0x0030 04d1 f739 72 ...9a ---중략--- 20:38:25.659340 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 91:92(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49492, len 53) 0x0000 4510 0035 c154 4000 3806 f82c d27b c1c2 E..5.T@.8..,.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97c 2992 16f1 ..(..7...A.|)... 0x0020 8018 16d0 554e 0000 0101 080a 0223 796b ....UN.......#yk 0x0030 04d1 f774 65 ...ts ---중략--- 20:38:25.777475 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 92:93(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49493, len 53) 0x0000 4510 0035 c155 4000 3806 f82b d27b c1c2 E..5.U@.8..+.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97d 2992 16f1 ..(..7...A.})... 0x0020 8018 16d0 54d8 0000 0101 080a 0223 7977 ....T........#yw 0x0030 04d1 f7dd 65 ....s ---중략--- 20:38:26.049208 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 93:94(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49494, len 53) 0x0000 4510 0035 c156 4000 3806 f82a d27b c1c2 E..5.V@.8..*.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97e 2992 16f1 ..(..7...A.~)... 0x0020 8018 16d0 887f 0000 0101 080a 0223 7992 .............#y. 0x0030 04d1 f81a 31 ....w ---중략--- 20:38:26.243634 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 94:95(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49495, len 53) 0x0000 4510 0035 c157 4000 3806 f829 d27b c1c2 E..5.W@.8..).{.. 0x0010 cbf7 28fc 8a37 0017 2041 b97f 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 86df 0000 0101 080a 0223 79a6 .............#y. 0x0030 04d1 f8a5 32 ....o ---중략--- 20:38:26.442302 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 95:96(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49496, len 53) 0x0000 4510 0035 c158 4000 3806 f828 d27b c1c2 E..5.X@.8..(.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b980 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 8768 0000 0101 080a 0223 79b9 .....h.......#y. 0x0030 04d1 f908 31 ....r ---중략--- 20:38:26.540930 210.xxx.xxx.100.35383 > xxx.com.telnet: P [tcp sum ok] 96:97(1) ack 200 win 5840 (DF) [tos 0x10] (ttl 56, id 49497, len 53) 0x0000 4510 0035 c159 4000 3806 f827 d27b c1c2 E..5.Y@.8..'.{.. 0x0010 cbf7 28fc 8a37 0017 2041 b981 2992 16f1 ..(..7...A..)... 0x0020 8018 16d0 80f7 0000 0101 080a 0223 79c3 .............#y. 0x0030 04d1 f96e 37 ...nd ---이하생략--- => 패스워드가 password라는 것을 알 수 있다.


출처 : 대전국제IT교육센터 정성재 강사

 

1. Tripwire의 개요
트립와이어는 파일의 변조 여부를 모니터링하는 툴이다. 보통 공격자가 시스템에 침입을 성공하면
다시 들어오기 위한 구멍(Backdoor)을 만들게 된다. 이 때 공격자는 여러 프로그램을 변조하게 된다.
대표적으로 ps, ls, netstat등 시스템의 정보를 확인할 수 있는 명령어가 주 타겟이다. 이렇게 침입
당한 시스템의 파일의 무결성을 검사해주는 프로그램이 tripwire이다. tripwire는 MD5, SHA, CRC-32
등의 다양한 해쉬 함수를 제공하고, 파일들에 대한 데이터베이스를 만들어 이를 통해 해커들에 의한
파일들의 변조여부를 검사하도록 되어 있다. 즉 tripwire는 먼저 시스템에 존재하는 파일에 대해 데
이터 베이스를 생성하고 저장한 후에 생성된 데이터베이스와 비교하여 추가,삭제되거나 변조된 파일
이 있는지 점검하고 관리자에게 리포팅해주는 도구이다.


2. Tripwire의 역사
트립와이어는 1992년 푸르드(Purdue)대학의 컴퓨터 보안 전문가인 유진 스패포드(Eugene Spafford)
박사와 대학원생인 지니 킴(Gene Kim)에 의해 개발되었다. 초기의 tripwire 1.x는 오픈소스였으나
2.x로 오면서 tripwire사에서 상용화하여 tripwire 1.3대의 ASR(Academic Source Release)에 대해서
는 공개로 배포하고 있다.
현재 Linux시스템에서는 Open Source 프로젝트를 추진하여 2.3버전의 tripwire를 다운받아 사용할
수 있고, 그 외의 운영체제인 Solaris, Windows NT 계열, HP-UX, IBM AIX 시스템등에서 2.X대 버전
을 사용하려면 상업용 버전을 이용해야 한다.

3. Tripwire 설치하기
(1) 설명: 트립와이어는 대부분의 배포판 리눅스에서 기본적으로 제공한다. 트립와이어가 없거나
          관련정보를 얻으려면 아래의 2개의 사이트에서 구할 수 있다.
(2) 관련사이트
   http://www.tripwire.com
   http://www.tripwire.org
(3) 설치하기
   1) http://www.tripwire.org에 접속해서 tripwire-2.3-47.i386.tar.gz을 다운받는다.
   2) 압축은 푼다.
     tar zxvf tripwire-2.3-47.i386.tar.gz
   3) 압축을 풀면 rpm패키지파일이 나오는데 이 파일을 설치한다.
     rpm -Uvh tripwire-2.3-47.i386.rpm

4. Tripwire 사용하기
(1) tripwire 설정파일 및 정책파일 생성하기
   1) 설명: twinstall.sh라는 파일을 실행시키면 트립와이어는 site keyfile과 local keyfile을
           생성하기 위한 Passphrases를 입력하도록 요구한다. site keyfile은 정책파일과 환경
           파일을 설정하는데 사용되고, local keyfile은 트립와이어 데이터베이스와 레포트 파일
           을 초기화하고 보호하는데 사용되는 일종의 암호이다.
   2) twinstall.sh 실행
     [root@www root]# cd /etc/tripwire
     [root@www tripwire]# ./twinstall.sh

     ----------------------------------------------
     The Tripwire site and local passphrases are used to
     sign a variety of files, such as the configuration,
     policy, and database files.

     Passphrases should be at least 8 characters in length
     and contain both letters and numbers.

     See the Tripwire manual for more information.

     ----------------------------------------------
     Creating key files...

     (When selecting a passphrase, keep in mind that good passphrases typically
     have upper and lower case letters, digits and punctuation marks, and are
     at least 8 characters in length.)

     Enter the site keyfile passphrase:           // 사이트키의 암호값을 설정한다.
     Verify the site keyfile passphrase:
     Generating key (this may take several minutes)...Key generation complete.
      // 두번의 암호 입력이 성공하면 /etc/tripwire디렉토리에 site.key라는 파일에 암호가 저장
      //된다.


     (When selecting a passphrase, keep in mind that good passphrases typically
     have upper and lower case letters, digits and punctuation marks, and are
     at least 8 characters in length.)
     Enter the site keyfile passphrase:
     Verify the site keyfile passphrase:
     Generating key (this may take several minutes)...Key generation complete.

     (When selecting a passphrase, keep in mind that good passphrases typically
     have upper and lower case letters, digits and punctuation marks, and are
     at least 8 characters in length.)


     Enter the local keyfile passphrase:        // 로컬키의 암호값을 설정한다.
     Verify the local keyfile passphrase:
     Generating key (this may take several minutes)...Key generation complete.
      // 이 로컬키의 값은 /etc/tripwire/호스트명-local.key파일로 저장된다.

     ----------------------------------------------
     Signing configuration file...
     Please enter your site passphrase:    // 환경설정파일 생성을 위해 사이트키값 입력
     Wrote configuration file: /etc/tripwire/tw.cfg
      // 환경설정파일은 tw.cfg파일로 저장된다. 그러나 이 파일은 편집이 불가능한 바이너리파일
      //이다. 따라서 내용을 확인하거나 설정내용을 변경하려면 twcfg.txt을 편집하면 된다.


     A clear-text version of the Tripwire configuration file
     /etc/tripwire/twcfg.txt
     has been preserved for your inspection.  It is recommended
     that you delete this file manually after you have examined it.

     ----------------------------------------------
     Signing policy file...
     Please enter your site passphrase:   // 정책파일 생성을 위해 사이트키값 입력
     Wrote policy file: /etc/tripwire/tw.pol
      // 정책파일은 감시할 디렉토리와 파일을 지정하고, 어느 정도 수준으로 감시할 것인지를
      //설정하는 파일이다. /etc/tripwire/tw.pol에 저장된다.


     A clear-text version of the Tripwire policy file
     /etc/tripwire/twpol.txt
     has been preserved for your inspection.  This implements
     a minimal policy, intended only to test essential
     Tripwire functionality.  You should edit the policy file
     to describe your system, and then use twadmin to generate
     a new signed copy of the Tripwire policy
(2) 데이터베이스 초기화
   1) 설명: 데이터베이스를 초기화한다. 로컬키 암호를 물어본다. 몇몇 시스템에서는 에러가 발생
           할 수도 있으며 시간이 조금 걸린다.
   2) 사용예
     [root@www sbin]# tripwire --init
     Please enter your local passphrase:
     Parsing policy file: /etc/tripwire/tw.pol
     Generating the database...
     *** Processing Unix File System ***
           -- 중략 --
     Wrote database file: /var/lib/tripwire/www.twd
     The database was successfully generated.
       => 초기화된 데이터베이스는 /var/lib/tripwire/호스트명.twd파일로 저장된다.
(3) 무결성 검사
   1) 설명: tripwire --check라고 명령을 내리면 된다.
   2) 사용예
     [root@www sbin]# tripwire --check
     Parsing policy file: /etc/tripwire/tw.pol
     *** Processing Unix File System ***
     Performing integrity check...
           -- 생략 --
(4) 데이터베이스 갱신
   1) 설명: 무결성 검사 후 발견되어진 변경 파일이 침입에 의한 것이 아니라 정상적인 변화라면
           기존에 만들어졌던 데이터베이스를 갱신해야 한다.
   2) 사용예
     [root@www sbin]# tripwire --update
       => 같은 명령으로 'tripwire -m u'가 있다.
(5) 정책파일 갱신
   1) 설명: 정책파일을 갱신하는 방법에는 'tripwire --update-policy'와 'twadmin --creat-profile'
           두가지 방법이 있다.
   2) 사용예
     [root@www sbin]# tripwire --update-policy /etc/tripwire/tw.pol

5. Tripwire 테스트하기
(1) 임의의 파일이용한다.
   1) 특정한 파일의 이름을 임시로 변경한다.
     [root@www root]# mv install.log install.log~
   2) 임의로 install.log파일을 생성한다.
     cat > install.log
   3) 트립와이어를 이용하여 체크한다.
    [root@www root]# tripwire --check
   4) 결과를 확인한다.
   5) 만약 결과를 확인 후에 변화된 결과가 정상적인 것이라면 데이터베이스를 갱신한다.
     [root@www root]# tripwire --update
        => 위 명령으로 안되면 'tripwire --init'명령으로 초기화시킨다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. Nmap의 개요
Nmap은 Network Mapper의 약자로 네트워크상에서 포트(Port)를 스캔(Scan)하는 도구이다. 작동중인
서비스 포트를 스캔하는 네트워크 보안 도구로 널리 사용된다. 이 도구는 또한 크래커들이 크랙 대상
을 검색할 때도 많이 사용한다. Nmap을 이용하여 자신의 서버에 불필요하게 작동하고 있는 서비스
포트를 확인할 수 있다.


2. Nmap 설치하기
(1) 설명: 요즘 나오는 리눅스에서는 대부분 기본 설치되어 있다. 만약 설치가 되어 않으면
          http://www.insecure.org/nmap에서 다운받아 설치할 수 있다. 현재 소스파일과 rpm패키지
          모두 제공되므로 둘 중 하나를 선택하여 설치하면 된다.
(2) 설치
   1) rpm패키지로 설치하기
    ㄱ. nmap-3.00-1.i386.rpm을 다운받는다.
    ㄴ. rpm -Uvh  nmap-3.00-1.i386.rpm 을 실행하여 설치한다.
   2) 소스로 설치하기
    ㄱ. 소스파일(nmap-3.00.tgz)을 다운 받는다.
    ㄴ. 압축을 푼다.
       tar zxvf  nmap-3.00.tgz
    ㄷ. 압축이 풀리면 nmap-3.00이라는 디렉토리가 생성되는 데 이 디렉토리로 이동한다.
    ㄹ. 환경설정을 한다.
       ./configure --prefix=/usr/local/nmap
    ㅁ. 컴파일한다.
       make
    ㅂ. 설치한다.
       make install
   3) 참고 : nmapfe
    ㄱ. 설명: nmap frontend는 X-Window System(GTK+)용으로 그래픽한 환경하에서 사용할 수 있는
             nmap이다.
    ㄴ. 설치
       rpm -Uvh nmap-frontend-3.00-1.i386.rpm

3. Nmap 사용하기
(1) 사용법
   nmap [options] 호스트 또는 네트워크_주소
(2) options
   -v : 자세한 정보를 보여준다.
   -p 포트범위: 점검하고자 하는 포트번호를 지정한다. 만약 23번 포트를 점검하려면 '-p 23'라고
               하면 된다. 연속된 포트는 '-'를 사용할 수 있고, 연속되지 않는 포트는 콤머(,)를
               사용할 수 있다.
   -sT : TCP connect() scan이라고 하며 가장 기초적인 형태의 스캔이다. connect()함수를 사용해서
        모든 포트에 대해 스캔하는 방식이다. 만약 포트가 listen상태라면 connect()는 성공할 것이
        고, 그렇지 않으면 도착하지 않는다.
   -sS : TCP SYN scan이라고 하며 이 옵션을 사용하면 full TCP 접속을 하지 않고 스캔한다. TCP에
        서는 하나의 SYN패킷을 보내어 SYN|ACK 패킷의 응답이 오면 그 포트는 listne상태임을 나타
        내고 RST응답이 오면 non-listner임을 나타낸다. 이 옵션은 하나의 패킷을 보내어 SYN|ACK
        응답을 받으면 그 즉시 RST 패킷을 보내서 접속을 끊어버린다. 이렇게 하면 접속이 이루어지
        지 않은 상태에서 접속을 끊었기 때문에 로그를 남기지 않는 경우가 대부분이다. 그래서 이
        옵션을 사용한 스캔을 half-open 스캐닝이라고 한다. custom SYN packet을 만들기 위해서는
        루트권한으로 해야 한다.
   -sP : Ping scan이라고 하며 호스트가 살아있는지 알고 싶을 때 사용한다. 이 옵션을 사용하면
        ICMP echo request packet을 보내는데 up이면 살아있는 것이고, down이면 죽어있는 것이다.
        일부사이트는 echo request packet에 응답하지 않는 경우가 있는데 up|dwon대신에  RST back
        을 받았다면 이 호스트 또한 살아있는 것이다.
   -sU : UDP scan이라고 하며 호스트의 open되어진 UDP 포트를 찾아준다. 이 옵션을 사용하면 각 포
        트에 0바이트의 udp패킷을 보낸다. 만일 ICMP port unreachable메시지를 받았다면 이 포트는
        closed 상태이며, 다른 경우이면 open이다. 루트권한으로만 실행가능하지만 큰 의미는 없다.
   -sA : ACK scan이라고 하며 방화벽의 상태를 보여준다. 단순히 들어오는 SYN 패킷을 차단하는 패
        킷필터인지를 점검하는데 도움이 된다. 포트에 ACK 패킷을 보내어 RST 응답을 받으면 그 포
        트는 'unfilter'이며, 아무런 응답이 없으면 'filtered'이다. 화면에는 'filtered'만 표시
        된다.
   -sW : Window scan 이라고 하며 TCP window 크기의 변칙 때문에 filtered/nonfiltered뿐만아니라
        open포트도 스캔할 수 있다는 점을 제외하며 ACK scan과 거의 같다.
   -sR : RPC scan이라고 하며 이 옵션을 사용하면 TCP/UDP포트에 대해 그들이 RPC포트인지를 검사
        하고 서비스를 제공하는 프로그램은 무엇이며 버전은 무엇인지 등을 확인하기 위해 SunRPC
        program NULL commands를 계속 보내게 된다. 따라서 호스트의 portmapper가 방화벽(또는
        TCP wrapper)안에 있다 하더라도 'rpcinfo -p'와 유사한 정보를 얻을 수 있다.
   -sF, -sX, -sN : 각각 Stealth FIN, Xmas Tree, Null scan이라고 한다. 이들은 SYN패킷을 막아놓
                  은 방화벽이나 패킷 필터 또는 Synlogger와 Courtney같은 스캔을 탐지하는 프로그
                  램들을 무사히 통과할 수 있다. open포트로 FIN패킷을 보내면 이 패킷을 무시하고
                  closed포트로 보내면 RST패킷이 온다. 이들 스캔은 주로 유닉스계열OS만 사용가능
                  하며 루트권한이 필요하다.
   -b : FTP bounce scan 이라고 하며 익명 FTP서버를 이용해 그 FTP서버를 경유해서 호스트를 스캔
       한다.
   -P0 : 방화벽에 의해 ICMP echo requests(or responses)를 막아놓은 네트워크의 스캔을 가능하게
        한다. ping을 막아놓은 호스트를 스캔하기 위해서는 -P0나 -PT80을 사용해야 한다.
   -PT : 일반적으로 특정한 호스트가 살아있는지를 검사할 때 ping을 사용하는데 이것은 ICMP echo
        request패킷을 보내고 응답을 기다린다. 이 옵션을 사용하면 TCP ACK를 보내어 응답이 오기
        를 기다린다. RST응답이 오면 호스트가 살아 있는 것으로 본다. ping패킷을 차단하는 네트워
        크나 호스트를 스캔할 때 이용한다. 보통 -PT 포트번호이고, 디폴트는 80이다.
   -O : 호스트의 운영체제를 점검해 준다. 루트권한으로 실행해야 한다.
   -I : ident프로토콜을 사용하여 open된 포트가 어떤 사용자에 의해 열려 있는지를 검사한다. 사용
       시에 기본적으로 -sT옵션과 같이 사용하여야 한다. 그러나, 현재는 이 옵션을 사용해도 잘
       검색되지 않는다.
(3) 사용예
   1) [root@www root]# nmap 203.247.xxx.xxx

      Starting nmap V. 3.00 ( www.insecure.org/nmap/ )
      Interesting ports on  (203.247.xxx.xxx):
      (The 1593 ports scanned but not shown below are in state: closed)
      Port       State       Service
      21/tcp     open        ftp
      22/tcp     open        ssh
      23/tcp     open        telnet
      53/tcp     open        domain
      80/tcp     open        http
      111/tcp    open        sunrpc
      3306/tcp   open        mysql
      6000/tcp   open        X11

      Nmap run completed -- 1 IP address (1 host up) scanned in 3 seconds
   2) [root@www root]# nmap -v 203.247.xxx.xxx
       => 좀 더 자세하게 정보를 보여준다.
   3) [root@www193 root]# nmap 203.xxx.50.0/24
       => 203.xxx.50.0 네트워크 전체를 스캔한다.
   4) [root@www root]# nmap 192.168.1.100-150
       => 연속되어 있는 여러개의 호스트를 검색할 때는 대쉬(-)를 사용하면 된다. 즉 192.168.1.1
         00부터 192.168.1.150까지 스캔한다.
   5) [root@www root]# nmap 192.168.0.5, 192.168.3.7
       => 연속되어 있는 않은 여러 개의 호스트를 검색할 때는 콤마(,)를 사용하면 된다.
   6) [root@www root]# nmap  -p 1-30,110,62000- 203.xxx.xxx.11
       => 203.xxx.xxx.11 호스트의 1-30번 포트, 110번포트, 62000번 이상의 포트를 스캔한다.
   7) [root@www root]# nmap -O 203.247.xxx.xxx
       => 해당 호스트의 포트스캔과 운영체제를 보여준다.
   8) [root@www root]# nmap -sP 203.247.xxx.xxx
       => 해당 호스트가 살아있는지를 검사한다.
   9) [root@www root]# nmap -sR -p 1-40000 192.168.10.100
       => 해당 호스트의 1~40000 포트에서 RPC포트를 찾아 보여준다.
   10)[root@www root]# nmap -sU -PT 192.168.10.0/24
       => 192.168.10.0 네트워크의 호스트들을 TCP ACK패킷을 보내어 응답을 기다리고 열려진 UDP
         포트를 보여준다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. ssh에 대하여
ssh는 Secure shell의 약자로 원격 머신에 로긴하여 그 안에 있는 명령들을 실행하는 프로그램이다.
기본적으로 사용법은 telnet과 유사하지만, telnet은 클라이언트와 서버간의 데이터전송시 일반텍스
트형태로 패킷을 전달하여 패킷의 내용을 유출당할 수 있지만, ssh는 패킷전송시 암호화시키므로 안
전하게 전송할 수 있다.
현재 ssh는 ssh2와 ssh1 두 가지 프로토콜이 있는데, ssh2는 ssh1을 개선한 것으로 호환은 되지만
기본적으로 호환성을 포함하고 있는 것이 아니다. ssh2서버 혼자서는 ssh1 연결을 관리할 수 없으므
로 ssh1 서버가 반드시 있어야 한다.
ssh1과 ssh2의 차이점을 기술적으로 보면 SSH2는 이중-암호화 RSA키 교환을 비롯하여 다양한 키-교
환 방법을 지원한다.


2. SSH설치하기
(1) 개요: 리눅스에서 사용하는 ssh는 두가지가 있다. 하나는 원 제작처인 www.ssh.com에서 제작한
          것과 www.openssh.org가 제작한 것이 있다. 대부분의 배포판에서 openssh에서 제작한 것을
          기본으로 지원하므로 openssh를 사용하도록 한다.
(2) 구성: SSH의 기본 구성은 SSH 서버와 SSH클라이언트로 구분된다. SSH로 접속을 하려면 SSH서버
          설치되어 있어야 하며, 클라이언트에서도 SSH가 지원되는 프로그램을 이용하여 접속해야
         한다.
(3) 설치: 현재 대부분의 배포판 리눅스에 Openssh가 기본으로 설치되어 있으므로 설치부분은 일단
          생략하도록 한다.

3. OpenSSH를 이용하여 ssh서버 설정하기
(1) 서버설정하기
   1) 설명: 서버관련 주 설정파일은 /etc/ssh/sshd_config 이다. 보통 기본 설정파일 그대로 사용해
           도 상관없지만 그룹이나 사용자들을 제한하려면 몇가지 지시자를 건드려야 한다.
   2) 환경설정(sshd_config)파일의 주요항목 분석
   #       $OpenBSD: sshd_config,v 1.34 2001/02/24 10:37:26 deraadt Exp $

   # This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

   # This is the sshd server system-wide configuration file.  See sshd(8)
   # for more information.

   Port 22                      // ssh가 사용하는 포트를 지정

   Protocol 2,1                 // openssh는 프로토콜 버전을 원하는 대로 선택할 수 있다. SSH는
                                //SSH1과 SSH2가 있는데 현재와 같이 설정하면 SSH1, SSH2 모두
                                //접속이 가능하다.

   #ListenAddress 0.0.0.0       // sshd 데몬이 귀를 기울일 주소이다. 0.0.0.0은 모든 곳을 말한
   #ListenAddress ::            //다.

   HostKey /etc/ssh/ssh_host_key        // SSH1의 호스트키 위치를 지정한다.

   HostKey /etc/ssh/ssh_host_rsa_key    // SSH2의 RSA암호화방식의 호스트키 위치를 지정한다.

   HostKey /etc/ssh/ssh_host_dsa_key    // SSH2의 DSA암호화방식의 호스트키 위치를 지정한다.

   ServerKeyBits 768                    // 서버 키의 비트수를 정의한다. 최소값은 512이고, 기본
                                        //값은 768이다.

   LoginGraceTime 600                   // 유저가 로그인에 실패했을 경우 서버가 연결을 끊는
                                        //시간이다. 값이 0이면 제한이 없다.

   KeyRegenerationInterval 3600         // 서버의 키는 한번 접속이 이루어진 뒤에 자동적으로
                                        //다시 만들어진다. 다시 만드는 목적은 나중에 호스트의
                                        //세션에 있는 키를 캡처해서 암호를 해독하거나 훔친키를
                                        //사용하지 못하도록 하기 위함이다. 값이 0이면 키는 다
                                        //시 만들어지지 않는다 .기본값은 3600초이다.

   PermitRootLogin yes                  // root 로그인 허용여부를 결정하는 것이다. yes, no, wi
                                        //thout-password를 사용할 수 있다. 현재 yes는 직접
                                        //root로 접속이 가능하다. 이것을 허용하지 않으려면 no
                                        //나 without-password로 바꾼다.
   #
   # Don't read ~/.rhosts and ~/.shosts files
   IgnoreRhosts yes                     // .rhosts 파일을 무시할 것이냐는 설정이다. 기본값은
                                        //.rhosts파일을 무시한다.

   # Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
   #IgnoreUserKnownHosts yes
   StrictModes yes                       // 로그인을 허용하기 전에 파일모드, 사용자 홈디렉토리
                                         //소유권, 원격 호스트의 파일들을 SSH데몬이 체크할 수
                                         //있도록 해주는 설정이다.

   X11Forwarding yes                    // 원격에서 X11 포워딩을 허용하는 것이다. 이 옵션을
                                        //yes로 설정하면 xhost보다 안전한 방법으로 원격에 있는
                                        //X프로그램을 사용할 수 있다.

   X11DisplayOffset 10                  // X11 포워딩될 때 디스플레이 번호를 지정해준다.

   PrintMotd yes                        // SSH로그인시에 /etc/motd파일의 내용을 프린트되도록
                                        //설정한다.

   KeepAlive yes                        // 클라이언트의 접속이 끊어졌는지 체크를 위해 서버가
                                        //일정시간 메시지를 전달한다.

   # Logging
   SyslogFacility AUTHPRIV              // syslog관련 facility코드이다.

   LogLevel INFO                        // 로그레벨을 지정한다. 기본값은 INFO이며, 그 외의 값
                                        //으로 QUIET(기록하지 않음), FATAL(치명적인 오류),
                                        //ERROR, VERBOSE, DEBUGS 등이 있다.

   #obsoletes QuietMode and FascistLogging

   RhostsAuthentication no              // rhost관련 인증허가여부를 지정한다.
   #
   # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
   RhostsRSAAuthentication no           // rhost나 /etc/hosts.equiv파일이 있으면 이것을 사용해
                                        //인증을 한다. 이것은 보안상 좋지 않은 방법이므로 기본
                                        //값은 no이다.
   #
   RSAAuthentication yes                // RSA인증을 사용한다.

   # To disable tunneled clear text passwords, change to no here!
   PasswordAuthentication yes           // 패스워드 인증을 허용한다. 이 옵션은 프로토콜 버전 1
                                        //과 2 모두 적용된다.

   PermitEmptyPasswords no              // 패스워드 인증할 때 서버가 비어있는 패스워드를 인정
                                        //하는 것이다. 기본값은 no이다.

   # Comment to enable s/key passwords or PAM interactive authentication
   # NB. Neither of these are compiled in by default. Please read the
   # notes in the sshd(8) manpage before enabling this on a PAM system.
   ChallengeResponseAuthentication no

   # To change Kerberos options
   #KerberosAuthentication no
   #KerberosOrLocalPasswd yes
   #AFSTokenPassing no
   #KerberosTicketCleanup no

   # Kerberos TGT Passing does only work with the AFS kaserver
   #KerberosTgtPassing yes

   #CheckMail yes
   #UseLogin no

   #MaxStartups 10:30:60
   #Banner /etc/issue.net
   #ReverseMappingCheck yes

   Subsystem       sftp    /usr/libexec/openssh/sftp-server
   // sftp는 프로토콜 버전 2에서 사용되는 것으로 ssh와 같이 ftp의 보안을 강화하기 위해 사용되
   //는 보안 ftp프로그램이다. sftp서버를 사용하기 위한 항목이다.

(2) 클라이언트 설정하기
   1) 설명: 클라이언트의 전체유저 설정파일은 /etc/ssh/ssh_config로 설정할 수 있다. Host지시자
           를 사용하여 접속할 서버마다 다른 옵션을 사용할 수 있다. SSH서버에 접속하는데 있어서
           꼭 필요한 설정은 아니다.
   2) 주요환경 설정파일(ssh_config) 분석
     #       $OpenBSD: ssh_config,v 1.9 2001/03/10 12:53:51 deraadt Exp $

     # This is ssh client systemwide configuration file.  See ssh(1) for more
     # information.  This file provides defaults for users, and the values can
     # be changed in per-user configuration files or on the command line.

     # Configuration data is parsed as follows:  // 클라이언트 설정파일은 3가지 방법으로 설정
     #  1. command line options                  // command line options
     #  2. user-specific file                    // 유저별 설정파일 지정($HOME/.ssh/config)
     #  3. system-wide file                      // 시스템 전체 설정 파일(/etc/ssh/ssh_config)
     # Any configuration value is only changed the first time it is set.
     # Thus, host-specific definitions should be at the beginning of the
     # configuration file, and defaults at the end.

     # Site-wide defaults for various options

     # Host *                     // 모든 호스트에 연결할 수 있다.

     #   ForwardAgent no          // 인증에이전트의 연결을 원격 호스트에 포워드할 수 있다.
     #   ForwardX11 no            // X11 커넥션이 자동으로 된다. 매번 서버에 연결할 때 command
                                  //line에서 -X옵션없이 기본적으로 X포워딩기능을 사용할 수
                                  //있다.
     #   RhostsAuthentication no
     #   RhostsRSAAuthentication yes
     #   RSAAuthentication yes
     #   PasswordAuthentication yes
     #   FallBackToRsh no
     #   UseRsh no
     #   BatchMode no
     #   CheckHostIP yes               // 이 부분이 yes가 되어 있으면 접속할 때마다 리모트 서
                                       //버의 IP주소를 know_hosts파일과 대조해본다. 이것은
                                       //DNS Spoofing에 의해 호스트키의 변경을 알 수 있다.
     #   StrictHostKeyChecking yes
     #   IdentityFile ~/.ssh/identity  // 사용자의 RSA인증 identity를 읽는다. 기본적으로 사용
                                       //자의 홈디렉토리에 $HOME/.ssh/identity에 저장되어 있
                                       //다.

     #   IdentityFile ~/.ssh/id_dsa    // 사용자의 DSA인증 identity를 읽는다. 기본적으로 사용
                                       //홈디렉토리의 $HOME/.ssh/id_dsa에 있다.
     #   IdentityFile ~/.ssh/id_rsa1
     #   IdentityFile ~/.ssh/id_rsa2
     #   Port 22
     #   Protocol 2,1
     #   Cipher blowfish               // 프로토콜 버전1에서 세션을 암호화하기 위한 암호알고리
                                       //즘을 지정한다. blowfish, 3des를 지정할 수 있다.
     #   EscapeChar ~
     Host *
             ForwardX11 yes
             Protocol 2,1
     // 모든 호스트에 접속할 때 ssh2와 ssh1을 사용하며 X11 포워딩을 허가한다.
   3) 사용예
    ㄱ. Host *.mybestone.com
        Protocol 1
         => mybestone.com 서버에 접속할 때는 ssh1 프로토콜을 사용한다.
    ㄴ. Host kldp.org
        Protocol 2
        Compression yes
        CompressionLevel 9
         => kldp.org에 접속할 때는 ssh2와 압축 옵션을 사용한다.

4. 클라이언트에서 SSH 사용하기
(1) 리눅스클라이언트에서 서버로 접속하기
   1) 설명: 리눅스에서 리눅스로 접속한다면 별도의 설정이나 프로그램의 설치없이 가능하다. 대부
           분의 배포판은 openssh가 설치되어 있다. 윈도우에서 리눅스서버로 접속한다면 ssh클라이
           언트를 설치해야 한다.
   2) 리눅스 클라이언트에서 리눅스 서버로 접속하기
    ㄱ. 접속하는 방법:
      a. ssh 계정명@도메인명
      b. ssh -l 계정 도메인명
    ㄴ. 사용예
      a. ssh
posein@mybestone.com
      b. ssh -l posein mybestone.com
    ㄷ. 접속
       [posein@www posein]$ ssh
posein@mybestone.com
       The authenticity of host 'mybestone.com (203.247.40.252)' can't be established.
       RSA key fingerprint is 89:41:93:58:5c:6d:bb:01:84:cb:3d:81:68:80:56:7b.
       Are you sure you want to continue connecting (yes/no)? yes
         => 처음 ssh로 해당 서버에 접속하면 나타나는 메시지로 접속할 서버의 호스트키가
           ~/.ssh/known_hosts(ssh2인 경우에는 known_hosts2)파일에 저장된다. yes로 대답한다.
       Warning: Permanently added 'mybestone.com,203.247.40.252' (RSA) to the list of known
       hosts.
      
posein@mybestone.com's password:
         => yes라고 대답하면 원래 서버의 패스워드를 물어오고, 패스워드를 입력하면 텔넷과 동일
           한 작업을 할 수 있다.
(2) 윈도우에서 리눅스 서버로 접속하기
    => 윈도우에서 ssh를 사용하려면 ssh클라이언트 프로그램의 설치가 필요하다. 대표적인 프로그
      램으로 SecureCRT가 있다. 상용으로 성능이 매우 우수하다. 관련사이트는 http://www.vandyke.
      com이다.

5. 클라이언트에서 SSH서버로 접속하기
(1) 리눅스클라이언트에서 접속하기
   [posein@neuro posein]$ ssh
posein@mybestone.com
   The authenticity of host 'mybestone.com (203.247.40.252)' can't be established.
   RSA key fingerprint is a8:69:69:83:67:8b:50:27:41:ad:b8:e9:0d:b2:a8:88.
   Are you sure you want to continue connecting (yes/no)? yes  // yes라고 입력
   Warning: Permanently added 'mybestone.com,203.247.40.252' (RSA) to the list of .
  
posein@mybestone.com's password:         // 해당 서버의 패스워드를 입력한다.
   [posein@mybestone posein]$
    => 접속되었다.
(2) 윈도우클라이언트에서 서버에 접속하기
   1) 설명: 윈도우에서는 ssh를 이용하려면 별도의 전용 프로그램이 필요하다. http://www.openssh.
           org/windows.html에 가면 윈도우용 클라이언트 프로그램의 목록을 확인할 수 있다. 그러
           나 이 페이지에 있는 프로그램들은 대부분 ssh1만 지원한다. 여기서는 상용프로그램인
           SecureCRT라는 프로그램으로 해본다.
   2) 사용예
    ㄱ. SecureCRT를 선택한다.
    ㄴ. 'Quick Connect'아이콘을 선택한다.
    ㄷ. 'Quick Connect'메뉴에서
       Protocol ssh1
       Hostname 접속하고자하는_도메인
       Port 22
       Username 사용자
       를 입력하고 [connect]를 누른다.
    ㄹ. 처음 접속하면 'New Host Key'라는 창이 뜨는데 [Accept & Save]를 클릭한다.
    ㅁ. 'Enter Password'라는 창이 나오면 사용자패스워드를 입력하고 [ok]를 누른다.


6. 인증키를 이용하여 SSH서버로 접속하기
(1) 개요: SSH서버로 접속할 때 일반적으로는 패스워드를 입력하여 접속하지만 인증키를 이용하여
          접속할 수도 있다. 이 방법을 사용하면 로그인할 때마다 암호를 직접 입력하지 않고 생성
          된 인증키로만 로그인할 수 있다.
(2) 사용예
   1) 인증키를 만들기: ssh-keygen명령을 이용한다.
     [posein@www posein]$ ssh-keygen -t rsa    // RSA 암호화방법으로 인증키를 생성한다.
                                               //Protocol 1 버전용 rsa1와 Protocol 2 버전용
                                               //rsa, dsa 를 -t옵션을 사용하여 선택할 수 있다.
     Generating public/private rsa key pair.
     Enter file in which to save the key (/home/posein/.ssh/id_rsa):
      => 키가 저장될 곳과 파일명을 물어보는데 디폴트로 그냥 엔터를 넘어가도 된다. 넘어가면
        다음과 같이 인증키 암호를 물어온다.
     Created directory '/home/posein/.ssh'.               // 관련 디렉토리를 생성한다.
     Enter passphrase (empty for no passphrase):
      => 원하는 암호를 두번 입력한다.
     Your identification has been saved in /home/posein/.ssh/id_rsa.
     Your public key has been saved in /home/posein/.ssh/id_rsa.pub.
     The key fingerprint is:
     7b:60:56:eb:82:d2:43:40:48:a6:d0:8e:f4:7a:8c:f1
posein@xxx.com
      => ~/.ssh 디렉토리에 키가 생성된다. 참고로 인증키 생성시 인증키 암호를 입력하지 않으면
       ssh 접속시 암호를 입력하지 않아도 접속할 수 있다. 그러나 보안상 위험하므로 피하도록
       한다.
   2) 퍼블릭 키 사용하기
     ㄱ. 설명: 인증키를 생성하면 ~/.ssh 디렉토리안에 한쌍의 키(예를 들면 id_rsa  id_rsa.pub)가
              생성되어 있다. 여기서 퍼블릭키인 id_rsa.pub을 접속할 리모트 서버에 ~/.ssh디렉토
              리에 authorized_keys라는 이름으로 복사한다.
     ㄴ. 사용예
        [posein@neuro posein]$ scp ~/.ssh/id_rsa.pub
posein@mybestone.com:.ssh/authorized_keys
       
posein@mybestone.com's password:             // 해당 서버의 패스워드를 입력한다.
        id_rsa.pub           100% |*************************************************|   235       00:00
   3) 접속하기
     [posein@neuro posein]$ ssh
posein@mybestone.com
      => 만약 인증키생성시에 패스워드를 입력하지 않으면 패스워드없이 즉시 로그인된다.

7. SSH관련 유틸리티
(1) scp(secure copy)
   1) 설명: 원격지의 서버에 있는 파일을 ssh인증과 암호화된 기법을 이용하여 복사하거나 복사해
           올 수 있도록 해준다. 전체적인 사용법은 복사명령인 cp와 유사하다.
   2) 사용법
     scp [option] 복사하고자하는_파일명 사용자아이디@원격지주소:파일명
      => 원격지주소의 파일을 복사하고자 할때는 반대로 지정하면 된다.
   3) option: 대체적으로 cp명령의 옵션과 유사하다.
     -r : 특정디렉토리의 하위디렉토리까지 모두 복사해준다.
   4) 사용예
    ㄱ. scp a.txt
posein@mybestone.com:test
         => 로컬에 있는 a.txt를 원격지서버에 test라는 이름으로 복사한다. 만약 test가 디렉토리
           이며 test라는 디렉토리안에 a.txt라는 이름으로 복사된다.
    ㄴ. scp
posein@mybestone.com:pds/sample.c .
         => 원격지서버의 posein이라는 사용자의 홈디렉토리에서 ~/pds/sample.c를 현재 디렉토리에
           복사한다.
   5) 응용예: 개인 홈디렉토리의 .ssh/config 파일에 접속하고자하는 SSH서버에 관한 정보를 입력
             하면 /etc/hosts파일의 역할처럼 간단히 입력만으로도 접속이 가능하다.
     [posein@neuro posein]$ cat ~/.ssh/config
     Host *bestone                 // 접속하고자하는 서버의 간단한 이름을 지정한다.
     HostName www.mybestone.com    // 실제 호스트네임을 기록한다.
     User posein                   // 서버 계정을 적는다.
     ForwardAgent yes              // 인증대리인이 포워드가 되도록 지정한다.
     [posein@neuro posein]$ scp passwd.txt bestone:.
      => 현재 디렉토리의 passwd.txt를 bestone(www.mybestone.com의 posein이라는 사용자의 홈디렉
        토리)의 지정된 장소에 복사한다.
(2) sftp
   1) 설명: 원격지 서버에 파일을 전송할 때 신뢰할 수 있는 암호화된 기법을 이용하여 전송하거나
           전송받는다. 전체적인 사용법은 ftp명령과 유사하다.
   2) 사용법
     sftp 사용자아이디@원격지주소
   3) 사용예
     sftp
posein@mybestone.com


출처 : 대전국제IT교육센터 정성재 강사

 

1. sysctl 이란?
sysctl 명령은 커널 변수의 값을 제어하여 시스템을 최적화할 수 있는 명령이다. sysctl은 시스템의
/proc/sys 디렉토리밑에 있는 커널 매개변수를 제어한다. 이 디렉토리 밑으로 존재하는 디렉토리를
구분하는 '/'는 sysctl 명령이용시에는 '.'으로 대체한다.


2. 일반적인 커널 매개변수의 변경법
(1) 설명: 일반적으로 커널 매개변수를 변경하려면 /proc 디렉토리밑에 있는 항목들을 vi편집기를
          이용하여 값을 변경하거나 echo명령을 이용하여 값을 변경한다.
(2) 예: ping에 응답하지 않도록 설정해보자.
   1) ping과 관련된 파일: /proc/sys/net/ipv4/icmp_echo_ignore_all 이라는 파일이다.
   2) 값 확인
     [root@www root]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
     0
      => 현재 이 파일의 값이 0이다. 파일이름을 해석해보면 icmp 패킷에 대한 응답을 전부 무시할
        것이냐는 뜻인데 값이 0(no)이다. 즉 ping에 대한 응답을 하겠다는 뜻이다. ping에 응답을
        하지 않으려면 이 값을 1로 바꾸어주면 된다.
   3) 값 변경
     [root@www root]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
     [root@www root]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
     1
      => 앞으로 ping에 응답하지 않는다.

3. sysctl 명령어
(1) 설명: /proc 디렉토리밑에 있는 항목들을 직접 편집하거나 echo 명령을 사용하는 것이외에
          sysctl명령을 이용하여 설정할 수 있다.
(2) 사용법
   sysctl option [파일명 or 파일명=값 등]
(3) option
   -a : 현재 커널 매개변수와 값을 보여준다.
   -p : sysctl 환경변수파일(기본값은 /etc/sysctl.conf)의 설정상태를 보여준다.
   -n : 특정키에 대한 값을 보여준다.
   -w variable=value : 변수에 값을 설정한다.
   -A : 테이블형태로 설정가능한 파라미터를 보여준다. -a와 같다.
(4) 사용예
   1) [root@www root]# sysctl  -a
      ------생략----------
      net.ipv4.route.min_delay = 2
      net.ipv4.icmp_ignore_bogus_error_responses = 0
      net.ipv4.icmp_echo_ignore_broadcasts = 0
      net.ipv4.icmp_echo_ignore_all = 1
      ------생략-----------
     => 현재 설정된 커널 매개변수와 값을 출력해준다.
   2) [root@www root]# sysctl -p /etc/sysctl.conf
      net.ipv4.ip_forward = 0
      net.ipv4.conf.default.rp_filter = 1
      kernel.sysrq = 0
      kernel.core_uses_pid = 1
       => 해당파일(/etc/sysctl.conf)에 대한 설정상태를 보여준다. 여기서는 기본값과 같으므로
         -p옵션다음에 /etc/sysctl.conf를 생략해도 결과는 같게 나온다.
   3) [root@www root]# sysctl -n net.ipv4.icmp_echo_ignore_all
      1
       => /proc/sys/net/ipv4/icmp_echo_ignore_all파일의 값을 보여준다.
   4) [root@www root]# sysctl -w net.ipv4.icmp_echo_ignore_all=0
      net.ipv4.icmp_echo_ignore_all = 0
       => /proc/sys/net/ipv4/icmp_echo_ignore_all 파일의 값을 0으로 한다.
(5) 참고: 커널매개변수 변경시 vi를 사용하든지, echo명령을 사용하던지, sysctl명령을 사용하던지
          재부팅하면 값이 초기화된다. 그러므로 계속적으로 값을 반영시키려면 /etc/sysctl.conf
          파일에 등록하면 된다. 물론 쉽게 /etc/rc.d/rc.local파일에 등록해도 된다.

4. 주요항목분석
(1) /proc/sys/net/ipv4/icmp_echo_ignore_all
   1) 설명: ping에 의한 응답을 하지 않게 할 수 있다.
   2) 사용법
     sysctl -w net.ipv4.icmp_echo_ignore_all=1
     echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
(2) /proc/sys/net/ipv4/tcp_syncookies
   1) 설명: SYN Flooding 공격을 막을 때 유용한 항목으로 SYN패킷의 도착빈도가 일정한 횟수보다
           많을 때 해당 요청을 허용하지 않을 때 사용한다.
   2) 사용법
     sysctl -w net.ipv4.tcp_syncookies=1
     echo 1 > /proc/sys/net/ipv4/tcp_syscookies
   3) 참고: SYN FLOODING 공격
     TCP 프로토콜에서 두 시스템이 연결이 되려면 클라이언트에서 서버로 연결을 하기위해서 "연결
    을 요청합니다."라는 의미의 SYN패킷을 보낸다. 서버는 이것에 대한 응답으로 SYN/ACK패킷을
    클라이언트에게 보내고, 클라이언트는 서버에게 ACK패킷을 보냄으로서 연결이 된다. 이것을 3
    WAY HANDSHAKING이라고 부른다. SYN Flooding 공격은 이 3 Way Handshaking의 약점을 이용한다.
    공격 시나리오는 다음과 같다.
      ㄱ. 존재하지 않는 IP주소를 소스 어드레스로 사용하여 SYN패킷을 Target에 전송한다.
      ㄴ. Target은 SYN/ACK패킷을 보내고 SYN_RCVD상태로 전환한다.
      ㄷ. ACK로 응답하는 시스템이 없으므로 Target은 일정시간동안 계속 패킷을 보내고, SYN_RCVD
        상태에서 대기한다.
      ㄹ. 공격자는 target의 TCP Connection pool이 꽉차게 되므로 새로운 커넥션을 형성하지 못하
         게 된다.
(3) /proc/sys/net/ipv4/tcp_max_syn_backlog=1024
   1) 설명: TCP프로토콜에서 한 소켓이 동시에 SYN요청을 처리하기에기는 한계가 있는데 이 한계가
           백로그(backlog)이다. 백로그는 연결 요청이 아직 완전히 처리되지 아니한 대기상태에
           있는 큐의 길이이다. 이 백로그 큐가 꽉차게 되면 이후 들어오는 SYN요청은 무시되며
           이러한 공격이 위에서 말한 SYN Flooding공격이다. 그러나, 백로그를 무조건 늘리는 것이
           꼭 좋은 것만은 아니다. 또한 1024이상으로 설정하려면 커널소스를 수정해야 한다.
   2) 사용법
     echo 1024 > /proc/sys/net/ipv4/tcp_max_syn_backlog
     sysctl -w net.ipv4.tcp_max_syn_backlog=1024
(4) /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
   1) 설명: 브로드캐스트 주소에 ping을 쏘는 것을 막는다. smurf공격을 막을 수 있다. 이 공격을
           막기 위해서 값을 1로 한다.
   2) 사용법
      sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
      echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
   3) 참고: Smurf 공격
     과거 유행했던 DoS 공격의 한 방법으로 공격자가 Source IP Address를 Target으로 위장하여
    네트워크로 ICMP echo request를 보내어 Target이 정상적으로 서비스를 할 수 없도록 만드는
    기법이다.
(5) /proc/sys/net/ipv4/conf/all/accept_source_route
   1) 설명: 라우팅과 라우팅 프로토콜은 몇가지 문제점을 생성해 내는데 목적지의 경로에 대한
           세부적인 내용을 담고 있는 IP 소스 라우팅은 목적지 호스트에서도 같은 경로를 따라
           반응을 해야 한다는 문제점이 있다. 크래커가 특정 네트워크에 소스 라우팅 패킷을 보낼
           수 있다면 돌아오는 반응을 가로채서 상대방의 호스트와 신뢰받은 호스트처럼 속일 수
           있게된다. 이 기능을 사용하지 못하게 값을 0으로 한다.
   2) 사용법
     echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
     sysctl -w  net.ipv4.conf.all.accept_source_route=0
(6) /proc/sys/net/ipv4/conf/all/rp_fiter
   1) 설명: IPv4는 인증 매카니즘을 가지고 있지 않기 때문에 Source IP Address를 조작할 수 있다.
           rp_filter는 패킷이 들어오는 인터페이스와 나가는 인터페이스가 같은 지를 검사한다.
           값을 1로 하면 된다.
   2) 사용법
     echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
     sysctl -w net.ipv4.conf.all.rp_filter=1
   3) 참고: Spoofed IP 패킷
    ㄱ. 외부에서 오는 패킷이 사설 IP인 경우
    ㄴ. 들어오는 인터페이스와 나가는 인터페이스가 다른 경우
    ㄷ. IANA(Internet Assigned Numbers Authority, 인터넷 할당 번호 관리 기관)에서 예약한 IP
       Address가 로컬 IP인 경우
    ㄹ. 로컬에서 나가는 패킷의 Source IP Address가 로컬 IP가 아닌 경우
(7) /proc/sys/net/ipv4/conf/all/log_martians
   1) 설명: 이 파일은 스푸핑 패킷과 redirect된 패킷의 기록을 남길 지 여부를 지정하는 파일이다.
           기본값은 '0'으로 기록을 남기지 않는다. 값을 '1'로 바꾸면 패킷을 기록한다.
   2) 사용예
     echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
     sysctl -w net.ipv4.conf.all.log_martians=1
(8) /proc/sys/net/ipv4/tcp_fin_timeout
   1) 설명: 이 파일은 TCP 세션 종료후에 얼마나 세션연결을 유지하고 있을지를 초단위로 값으로
           설정되어 있는 파일이다. 기본값은 60초이다. telnet이나 ftp등을 이용하여 서버에 접속
           하다가 예기치 못한 상태에서 연결이 종료되는 경우가 있다. 이런 경우에 TCP 세션의
           연결 상태 지속여부를 결정하는 값이다. 10-20초 정도로 설정해도 무방하다.
   2) 사용법
     echo 20 > /proc/sys/net/ipv4/tcp_fin_timeout
     sysctl -w  net.ipv4.tcp_fin_timeout=20
(9) /proc/sys/net/ipv4/tcp_keepalive_time
   1) 설명: TCP 연결상태를 계속 유지시키기 위한 시간 설정이다. 기본 초단위로 7200, 즉 2시간이
           기본값이다. 20-30분정도로 설정하는 것도 서버의 자원을 효율적으로 이용한다는 측면에
           서 매우 유익하다.
   2) 사용법
     echo 1800 > /proc/sys/net/ipv4/tcp_fin_timeout
     sysctl -w  net.ipv4.tcp_keepalive_time=1800
(10) /proc/sys/net/ipv4/ip_forward
   1) 설명: 인터넷 공유나 IP 마스커레이드등 하나의 서버에서 IP를 공유하여 포워딩을 가능하게
           할 것인지 여부를 지정하는 파일이다. 기본값은 '0'으로 포워딩이 불가능하다. 포워딩
           이 가능하게 하려면 값을 '1'로 지정한다.
   2) 사용법
     echo 1 > /proc/sys/net/ipv4/ip_forward
     sysctl -w  net.ipv4.ip_forward=1
(11) /proc/sys/net/ipv4/ip_local_port_range
   1) 설명: 서버내의 TCP와 UDP에서 사용할 수 있는 포트범위의 값을 지정하고 있는 파일이다.
   2) 사용법
     echo 32768   61000 > /proc/sys/net/ipv4/ip_local_port_range
     sysctl -w net.ipv4.ip_local_port_range='32767   60999'
(12) /proc/sys/net/ipv4/tcp_timestamps
   1) 설명: 이 값은 외부에서 서버의 날짜정보를 확인가능하게 할 것인지를 지정하고 있는 파일이
           다. 기본값은 '1'로 외부에서 날짜정보확인이 가능하다. 날짜정보를 확인 불가하게 하려
           면 값은 '0'으로 바꾼다.
   2) 사용법
     echo 0 > /proc/sys/net/ipv4/tcp_timestamps
     sysclt -w net.ipv4.tcp_timestamps=0
(13) /proc/sys/net/ipv4/conf/all/accept_redirects
   1) 설명: 이 파일은 redirect 관련 패킷을 허가할 것인지를 결정하는 파일로 기본값은 '1'로 허가
           하도록 되어 있다. 다시 설명하면 ICMP redirect 패킷은 서버의 routing 경로를 확인하는
           역할은 한다. 이러한 패킷을 차단할 수 있다.
   2) 사용예
     echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
     sysctl -w net.ipv4.conf.all.accept_redirects=0
(14) /proc/sys/net/ipv4/conf/all/send_redirects
   1) 설명: 이 파일은 서버에서 나가는 ICMP redirect패킷을 허가할 것인지를 결정하는 파일로 기본
           값은 '1'로 허가하도록 되어 있다. 이 값을 '0'으로 설정하면 ICMP redirect이 나가는 것
           을 막을 수 있다.
   2) 사용예
     echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
     sysctl -w net.ipv4.conf.all.send_redirects=0
(15) /proc/sys/fs/file-max
   1) 설명: 커널에서 최대로 사용가능한 파일 수를 지정하는 파일이다. 적당히 조절할  수 있다.
   2) 사용예
     echo 52422 > /proc/sys/fs/file-max
     sysctl -w fs.file-max=50000
(16) /proc/sys/fs/file-nr
   1) 설명: 현재 커널에서 사용중인 파일 수등을 기록하고 있는 파일이다.
   2) 확인
     [root@www fs]# cat /proc/sys/fs/file-nr
     1653    191     52422
      => 첫번째값은 커널에서 현재 오픈가능한 최대 파일 수를 나타내고, 두번째값은 커널에서 현재
        사용중인 파일 수이며, 세번째값은 커널에서 최대로 오픈할 수 있는 파일 수를 나타낸다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. 아파치 웹서버 보안의 개요
리눅스를 사용하는 가장 큰 이유는 웹서버를 운영하기 위해서이다. 이 웹서버를 가능하게 해주는
프로그램이 아파치이다. 가장 많이 쓰이는 아파치 1.3버전의 기초적인 보안에 대해 알아보도록 한다.


2. 보안과 관련있는 httpd.conf 파일의 항목 분석
(1) 태그와 옵션항목분석
   1) 설명: httpd.conf는 <Directory>, <Location>, <Files> 등의 태그를 이용하여 적용범위를
           지정하고 Options 사용하여 그 디렉토리에 권한을 설정한다.
   2) 태그
    ㄱ. <Directory> ~ </Directory> : 현재 서버의 특정디렉토리를 지정할 때 쓴다.
    ㄴ. <Location> ~ </Location> : 특정 서버를 지정할 때 쓴다.
    ㄷ. <Files> ~ </Files> : 현재 서버의 특정파일을 지정할 때 쓴다.
   3) 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: 사용자 아이디와 동일한 링크가 있을 때 심볼릭링크로의 이동을 가능
                             하게 한다.
   4) AllowOverride
    ㄱ. 설명: 이 항목은 클라이언트의 디렉토리 접근 제어에 관한 설정을 나타낸다. 예를 들면 특정
       디렉토리에 접근할 때 해당 디렉토리에 있는 유저 인증파일인 .htaccess를 읽게 되는데, 여기
       를 None으로 설정하면 아파치서버에서 이 파일을 무시하게 된다.
    ㄴ. 값
      None : AllowOverride를 사용하지않는다. 즉 유저 인증파일을 사용하지 않는다.
      All : httpd.conf파일의 AccessFileName 지시자로 설정한 파일을 사용하며 또한 지시자를 사용
           할 수 있다.
      AuthConfig : AccessFileName 지시자에 명시한 파일에 대해서 사용자 인증 지시자 사용을 허락
                  한다. AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType,
                  AuthUserFile, require등을 사용할 수 있다.
      FileInfo : AccessFileName 지시자로 설정한 파일에 대해서 문서 유형을 제어하는 지시자 사용
                을 허락한다. AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument,
                LanguagePriority등을 사용할 수 있다.
      Indexes : AccessFileName 지시자로 설정한 파일에 대해서 디렉토리 Indexing을 제어하는 지시
               자 사용을 허락한다. AddDescription, AddIcon, AddIconByEncoding, AddIconByType,
                DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOpti
                ons, ReadmeName등을 사용할 수 있다.
      Limit : AccessFileName 지시자로 설정한 파일에 대해서 호스트 접근을 제어하는 지시자 사용
             을 허락한다. Allow, Deny, order 등을 사용할 수 있다.
      Options : AccessFileName 지시자에 명시한 파일에 대해서 Options 그리고 XBiHack 등과 같은
               지시자 사용을 허락한다. Options, XBitHack등을 사용할 수 있다.
   5) 사용예
     <Directory "/usr/local/apache/htdocs">

        Options Indexes FollowSymLinks MultiViews
     </Directory>
      => (설명)
          1. Indexes는 index.html등이 없을 때 해당디렉토리의 파일목록이나 디렉토리목록을 웹페
            이지에 보여주는 설정이다. index.html등을 없애고 실행시키면 목록이 보임을 알 수 있
            다. 상당히 위험한 옵션이므로 제거하도록 한다.
          2. FollowSymLinks는 해당디렉토리에 심볼릭링크를 허용한다. /usr/local/apache/htdocs
            로 이동해서 ln -s /etc new(또는 ln -s / list.html같이 해보자)라고 명령내린후에 웹
            브라우저에서 http://localhost/new라고 하면 /etc디렉토리안의 파일들이 보인다. 그중
            에 passwd같은 파일은 다른 사용자들이 볼 수 있으므로 클릭을 하면 현재시스템에 사용
            중인 계정들이 노출된다.
          3. MultiViews는 그냥 비슷한 글자만 쳐도 웹페이지가 열리도록 하는 설정이다. 예를 들면
            웹브라우저에서 http://localhost/index라고 치면 대부분 웹페이지가 보일 것이다.
(2) ErrorDocument 지시자
   1) 설명: 웹서버 구동중에 문제나 에러가 발생하면 Apache는 다음의 4가지 중 1가지 행위를 하게
           된다.
             - 간단한 시스템에서 작성된 에러 메지시 출력
             - 사용자가 수정한 메시지 출력
             - 문제나 에러를 해결하기 위한 로컬 URL을 리다이렉션
             - 문제나 에러를 해결하기 위한 외부 URL을 리다이렉션
           이 중 첫번째가 기본적인 설정이며 나머지를 사용하기 위해서는 필요한 것이 ErrorDocume
           nt 이다.
   2) 사용법
     ErrorDocument error-code document
   3) error-code
    ㄱ. 설명: HTTP 규약(RFC2616)의 10번째 세션 "상태코드 정의"에 자세히 설명되어 있다.
             (http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html)
    ㄴ. 코드
       1xx : Informational
         100: Continue
         101: Switching Protocols
       2xx : Successful
         200: OK
         201: Created
         202: Accepted
         203: Non-Authoritative Information
         204: No Content
         205: Reset Content
         206: Partial Content
       3xx : Redirection
         300: Multiple Choices
         301: Moved Permanently
         302: Moved Temporarily
         303: See Other
         304: Not Modified
         305: Use Proxy
       4xx : Client Error
         400: Bad Request
         401: Unauthorized
         402: Payment Required
         403: Forbidden
         404: Not Found
         405: Method Not Allowed
         406: Not Acceptable
         407: Proxy Authentication Require
         408: Request Time-out
         409: Conflict
         410: Gone
         411: Length Required
         412: Precondition Failed
         413: Request Entity Too Large
         414: Request-URI Too Large
         415: Unsupported Media Type
       5xx : Server Error
         500: Internal Server Error
         501: Not Implemented
         502: Bad GateWay
         503: Service Unavailable
         504: Gateway Time-out
         505: HTTP Version not supported
   4) 사용예
    ㄱ. ErrorDocument 403 http://kr.yahoo.com
         => 접속이 허락되지 않은 페이지 요청을 http://kr.yahoo.com으로 보낸다. 참고로 이 경우
           에는 access_log에는 403(Forbidden) 상태코드 대신에 302(Moved Temporarily)가 기록된
           다.
    ㄴ. ErrorDocument 404 "요청하신 파일이 존재하지 않습니다.
         => 404(Not Found) 상태코드의 경우에 "요청하신 파일이 존재하지 않습니다."라는 문구를
           출력한다. 설정할 때 쌍따옴표를 앞부분에 하나만 사용한다는 것을 유념해야 한다.
   5) 참고
     ErrorDocument 설정은 웹브라우저에 따라 정확히 작동하지 않을 수도 있다. 특히 인터넷익스플
    로어는 자체 오류메시지로 처리된다.

3. 아파치 설정 보안
(1) 웹문서디렉토리(DocumentRoot)에서 불필요한 문서를 다 지우기
   1) 설명: 소스로 아파치를 설치하게 되면 기본 웹문서가 위치하는 디렉토리가 /usr/local/apache/
           htdocs이다. htdocs 디렉토리에는 아파치관련정보가 들어있는 문서와 공개될 필요가 없는
           문서가 위치하고 있다. 이 문서들을 제거한다.
   2) 방법
     ㄱ. cd /usr/local/apache/htdocs 한뒤에 rm -rf * 로 모두 제거한다.
     ㄴ. 또 다른 방법으로는 httpd.conf에서 DocumentRoot값을 새로운 경로로 지정한다.
(2) 불필요한 CGI 스크립트제거하기
   1) 설명: apache를 설치하면 cgi-bin 디렉토리에 기본으로 CGI스크립트가 설치된다. 이 CGI 스크
           립트가 공격에 이용될 수도 있기 때문에 모두 제거하도록 한다. 특히 초기버전인 경우에
           php.cgi등이 제공되었는데 해킹의 빌미를 제공하였다.
   2) 방법: cgi-bin 디렉토리에 있는 모든 파일을 제거한다.
(3) DocumentRoot에 설정하는 디렉토리 옵션 설정하기
    <Directory "/usr/local/apache/htdocs">
        Options IncludesNoExec
    </Directory>
     => 기본적인 설정을 모두 제거하고 보안과 관련있는 항목만 옵션으로 지정한다.
(4) <Limit> ~ </Limit> 태그 이용하기
   1) 설명: <Limit>태그는 각 디렉토리별로 HTTP Method의 사용여부를 통제하는 태그이다. 파일의
           업로드 및 파일의 수정,삭제를 위해서 사용되는 HTTP Method는 PUT과 POST, DELETE 가 있는데
           이 Method를 제한한다.
   2) 사용예
     <Directory "/home/*/public_html">

        <Limit POST PUT DELETE>
              Require valid-user
        </Limit>
     </Directory>
       => 개인 사용자 홈디렉토리에서 POST, PUT, DELETE Method를 패스워드 파일에 등록된 사용자
         만이 이용가능하도록 제한한 것이다.
(5) 헤더 정보 숨기기
   1) 설명: 클라이언트가 Apache 웹서버에 접속했을 때 웹서버에서느 응답 메시지의 헤더에 웹서버
           버전, 설치된 응용프로그램 등과 같은 정보를 전달한다.
   2) 사용예 - 헤더 정보 확인하기
     [root@www /root]# 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: Sat, 14 Dec 2002 14:24:11 GMT
     Server: Apache/1.3.26 (Unix) PHP/4.2.2
     Connection: close
     Transfer-Encoding: chunked
     Content-Type: text/html; charset=iso-8859-1

Connection closed by foreign host.
      => 이 정보는 공격자에 의해 Apache 웹서버 버전과 구동되고 있는 응용프로그램의 버전을 확인
        하고 알려진 취약점을 이용하여 공격하는데 유용하게 이용될 수 있다.
   3) 헤더 정보 숨기기
    ㄱ. 설명: Apache 웹서버에서는 "ServerTokens"지시자를 수정함으로써 헤더에 의해 전송되는 정
             보를 바꿀 수 있다.
    ㄴ. 사용법
       ServerTokens 키워드
    ㄷ. 키워드와 제공되는 정보
       Prod[ductOnly] : 웹서버 종류만 표기된다. 예) Server:Apache
       Min[imal]: Prod 키워드 제공정보 + 웹서버 버전 예) Server:Apache/1.3.26
       OS: Min 키워드 제공 정보 + 운영체제 예) Server:Apache/1.3.26 (Unix)
       Full: OS 키워드 제공정보 + 설치된 모듈(응용프로그램) 정보
            예) Server: Apache/1.3.26 (Unix) PHP/4.2.2
    ㄹ. 참고: ServerToken은 apache 1.3이상에서 가능하고 ProductOnly키워드는 1.3.12버전 이상에
             서만 사용가능하다. 일반적으로 ServerTokens은 httpd.conf에 명시되어 있지 않는 경우
             가 많다. 이런 경우에는 기본값인 "ServerTokens Full"이 적용되어 모든 정보가 응답
             헤더에 포함되어 클라이언트에게 전송된다. 최소한의 정보를 주기 위해서는
             "ServerTokens Prod"가 좋다.

4. 아파치와 사용자 인증
(1) 개요: 아파치에는 사용자나 호스트 인증과 접근통제를 위한 몇가지 기능이 있다. 특정한 IP주소
          나 서브넷에 따라서 접속을 허락하거나 거부할 수 있고, 사용자 이름과 패스워드에 의해서
          사용자를 인증할 수도 있다.
(2) 사용자 인증의 종류
   1) 기본 사용자 인증: HTTP프로토콜은 기본적으로 인증을 하지 않는 프로토콜이다. 사용자인증에
                       의해 보호되는 자원에 접근하기 위해서는 매번 사용자이름과 패스워드와 같
                       은 인증서를 서버에 보내야만 한다. 하지만 초기 인증을 거친 후 다른 페이
                       지에 접근하기 위해서 매번 사용자 이름과 패스워드를 서버에 전송하는 것
                       은 일반적으로 클라이언트 소프트웨어나 웹브라우저에서 자동으로 이루어진
                       다. 만약 사용자이름이 웹서버의 리스트에 있고, 패스워드가 일치하면 보호
                       된 자원에 접근할 수 있다. 기본적인 인증에서는 패스워드가 암호화되어서
                       저장되지만 클라이언트에서 서버로 전송되지만 클라이언트에서 서버로 전송
                       되는 도중에는 암호화되지 않아 제3자에 의해 도청될 수 있다. 보호된 자원
                       에 접속하는 매 순간마다 ID와 패스워드가 전송되므로 telnet,ftp등 인증을
                       하는 다른 서비스보다 쉽게 도청이 가능하다. 뿐만 아니라 서버에서 클라이
                       언트로 전송되는 어떠한 데이터에 대해서도 암호화가 제공되지 않으므로 내
                       용도 가로채기가 용이하다. 따라서 기밀성이 중요시되는 웹서버에서는 이러
                       한 인증은 권장할 수 없다.
   2) 다이제스트 사용자 인증: 다이제스트 인증은 기본적인 인증과 다르게 네트워크 등의 전송로상
                             에서 패스워드가 평문으로 전송되지 않는다는 점이다. 즉 패스워드를
                             MD5 암호화 해쉬를 시킨 후 전송한다. 다이제스트 인증은 패스워드를
                             암호화해서 전송하고는 있지만 데이터는 평문으로 전송되므로 문제점
                             을 가지고 있고, 또한 모든 웹브라우저가 다이제스트 인증을 지원하지
                             않는다.
   3) DB 인증 모듈: DB 인증 모듈은 사용자이름과 패스워드를 보다 신속하게 확인할 수 있다. 서버
                   에 다수의 사용자 이름과 패스워드가 저장되어 있을 경우 사용자가 데이터에 접
                   근하기 위한 인증과정에 많은 시간이 소모될 수 있다. 일반 파일 시스템이 아닌
                   DB를 이용할 경우 사용자 이름과 패스워드 확인시간을 많이 단축할 수 있다.
(3) 기본 사용자 인증 설정
   1) 기본 설정방법 : 기본 사용자 인증과 다이제스트 사용자 인증의 설정 방법은 매우 유사하다.
                     다음과 같이 두가지 절차를 거쳐 설정할 수 있다.
    ㄱ. 패스워드 파일 생성
    ㄴ. 패스워드 파일을 사용할 수 있도록 Apache 환경 설정
   2) 설정
    ㄱ. 패스워드 파일생성
       [root@www /usr/local/apache/bin]# ./htpasswd -c /usr/local/apache/password posein
       New password:
       Re-type new password:
       Adding password for user posein
        => 패스워드 파일을 처음 생성할 경우에는 -c 옵션을 사용하여 만든다.
       [root@www /usr/local/apache/bin]# ./htpasswd  /usr/local/apache/password prehee
       New password:
       Re-type new password:
       Adding password for user prehee
        => 사용자를 추가할 경우에는 -c 옵션을 빼고 사용하면 된다.만약 -c 옵션을 사용할 경우에
          는 기존의 등독된 사용자들은 지워지므로 주의해야 한다.
       [root@www /usr/local/apache/bin]# cat ../password
       posein:LT30X3txYYEuY
       prehee:/RfZRDXV1N/Eo
        => 패스워드 파일을 확인해보면 사용자ID와 패스워드 필드로 구성되어 있는데, 패스워드
          필드는 암호화되어 저장된다. 또한 두 사용자가 암호를 동일하게 입력해도 암호화된 값
          은 다르게 나타난다.
    ㄴ. 패스워드 파일을 사용가능하기 위한 환경설정(1)
      a. 설명: httpd.conf파일내에서 디렉토리별로 사용자 인증을 하기 위한 설정을 하면 된다.
      b. 방법
        <Directory /home/posein/public_html>
            AllowOverride AuthConfig
        </Directory>

    ㄴ. 패스워드 파일을 사용가능하기 위한 환경설정(2)
      a. 설명: 사용자 인증이 필요한 디렉토리에 아래의 지시자들이 포함된 .htaccess파일을 생성
              한다.
      b. 지시자
        AuthType : 인증형태(Basic 또는 Digest)
        AuthName : 인증영역(웹브라우저의 인증창에 표시됨)
        AuthUserFile : 사용자 패스워드 파일의 위치
        AuthGroupFile : 그룹 파일의 위치(옵션)
        Require : 접근을 허용할 사용자 또는 그룹정의
         예) Require user userid [userid]
             Require group group_name [group_name]
             Require valid-user
      c. 사용법: 앞의 패스워드 파일에 등록된 posein, prehee라는 사용자만을 정해진 디렉토리에
                접속할 수 있도록 설정해보자.
        [posein@www public_html]$ cat .htaccess
        AuthType Basic
        AuthName "Welcome posein's Home
        AuthUserFile /usr/local/apache/password
        Require user posein prehee               // 만약 패스워드파일에 등록된 모든 사용자를
                                                 //접근가능하도록 설정하려면
                                                 //Require valid-user 라고 하면 된다.
   3) 관련명령어
    ㄱ. htpasswd
      a. 설명: 아파치 사용자 인증을 위한 파일을 생성하거나 업데이트를 하는 명령이다.
      b. 사용법
        htpasswd [options] password_file username
      c. options
        -c : 새로운 패스워드 파일을 생성한다.
      d. 사용예
        htpasswd -c /usr/local/apache/password posein
         => password라는 파일을 생성하면서 posein이라는 사용자를 등록한다.
        htpasswd /usr/local/apache/password prehee
         => prehee라는 사용자를 등록한다.
(4) 접근통제
   1) 설명: 클라이언트가 사용하는 호스트의 IP주소나 도메인에 의해서 웹서버의 데이터에 대한
           접근을 통제할 수 있다. 기본적인 서버 설정은 DocumentRoot의 내용에 대해 누구나 접속
           을 허락하도록 설정되어 있다. Apache의 "Allow"와 "Deny"지시자는 사용자 시스템의 호스
           트 이름과 호스트 주소를 근간으로 접속을 허락 또는 차단할 수 있도록 지정할 수 있다.
           또한, "Allow"와 "Deny"지시자를 동시에 사용할 경우 그 순서를 정하는 "Order"지시자를
           사용하여 보다 정교한 정책설정을 할 수 있다.
   2) 사용예
    ㄱ. Order Deny,Allow : Deny지시자가 Allow지시자보다 먼저 검사된다. 접근을 기본적으로 허
                           용된다. 즉 Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의
                           접속을 허용한다.
    ㄴ. Order Allow,Deny : Allow지시자가 Deny지시자보다 먼저 검사된다. 접근을 기본적으로 차단
                           된다. 즉, Deny지시자나 Allow지시자에 일치하지 않는 클라이언트의 접
                           속은 차단한다.
    ㄷ. Order Mutual-failure: Allow 리스트에 있고, Deny리스트에 없는 호스트만 접근을 허용한다.
                             순서는 "Allow,Deny"때와 같다.
     (참고) 일반적인 Firewall이나 라우터의 접근통제 Rule은 순차적으로 비교하다가 최초로 일치하
           는 Rule을 적용하고 그 이후는 비교하지 않지만, Apache에서는 Allow와 Deny를 일단 모두
           비교하고 둘 중에 하나라도 일치할 경우 적용한다는 점에서 차이가 있다. 또한 "Order"
           지시자 사용시 키워드(Allow 또는 Deny)는 콤마(,)에 의해서만 분리되고 공백이 들어가서
           는 안된다.
    ㄹ. Order deny,allow
        deny from all
        allow from 172.16.10
         => "deny from"과 "allow from"지시자는 호스트, 도메인 이름, IP주소, 서브넷마스크를
           가진 주소(예를 들면 172.16.10.0/255.255.255.0), CIDR(Classes InterDomain Routing)
           마스크를 가진 IP주소(172.16.10.0/24)를 사용할 수 있다.
(5) 권한부여
   1) 설명: 권한부여는 특정한 자원에 접근할 사용자 퍼미션이 유효한지를 확인하는 것이다. 어떤
           퍼미션에 의해 허락되고 거부될지는 자원과 그 자원과 관련된 규칙들에 따라서 다양하다.
           각 파일과 디렉토리구조는 다른 접근통제나 사용자인증 방법을 가질 수 있다. 접근통제
           와 사용자 인증방법을 사용하여 각 자원에 대한 다양한 권한을 부여할 수 있다. 가령
           인터넷에서 접속시에는 사용자이름과 패스워드를 확인하고 인트라넷에서 접속시에는
           요구하지 않도록 설정할 수도 있다. 이는 "Satisfy"지시자를 통해서 구현할 수 있다.
   2) 사용법
     Satisfy any | all
      => all은 인트라넷 사용자에 대해 패스워드를 묻지않고 접속이 가능하게 하는 것이고, any는
        인트라넷사용자라도 패스워드를 묻는다.
   3) 사용예
     Order deny,allow
     deny from all
     allow from 172.16.10
     AuthType Basic
     AuthName "Welcome Posein's Home"
     AuthUserFile /usr/local/apache/password
     Require posein prehee
     Satisfy Any
      => AuthName 항목에서 1.3버전에서는 겹따옴표가 앞쪽에 하나이고, 2.0버전에서는 겹따옴표가
        앞뒤로 두개를 써야 한다.
(6) SSL/TLS 인증
   1) 설명: 앞에 열거된 사용자 인증기법들은 모든 웹 컨텐츠를 암호화하지 않는다는 단점이 있다.
           최근 인터넷 뱅킹등과 같이 전송로상에 전송되는 웹컨텐츠 역시 보호되어져야 하는 경우
           가 많다. SSL/TLS는 사용자인증과 웹서버 데이터와 컨텐츠를 암호화하는 수단이다. SSL
           을 지원하기 위해서 Apache는 Mod_SSL 모듈을 가지고 있고, 이 모듈은 SSL v2, v3 그리고
           새로운 TLS을 사용하는 강력한 암호화를 제공한다. 현재 이 모듈은 강력한 128bit암호화
           와 RSA, Diffie-Hellman암호화를 제공한다.
   2) 동작원리: 최초 핸드쉐이크 후에 SSL은 비밀키를 생성하고 이 대칭키 암호화가 데이터 암호화
               를 위해 사용된다. 공개키(비대칭키)는 단말의 신원 인증과 대칭키 교환에 사용된다.
               메시지 무결성은 MAC(Massage Authentication Code)에 의해 제공되고 신뢰된 접속을
               가능하게 한다.
   3) SSL 프로토콜이 제공하는 주요기능
    ㄱ. 사설접속과 데이터 암호화
    ㄴ. 서버에 통신하는 단말 인증
    ㄷ. 신뢰된 접속

4. 아파치의 운영관리
(1) 로그관리
   1) 설명: Apache 로그파일들은 기본적으로 /usr/local/apache/logs디렉토리에 저장된다. 기본 설
           치시에는 access_log와 error_log 2개의 로그파일이 생성된다.
   2) 로그의 형태: 아파치관련 로그는 httpd.conf의 LogFormat이라는 곳에서 정의되어 CustomLog라
                  는 항목을 통해 기록된다.
   3) 로그의 종류
    ㄱ. access_log: 웹서버 접근에 관련된 로그를 기록한다.
       - httpd.conf와의 관련항목
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
         => access_log는 8개의 필드로 구성되어 있다. 8개의 필드를 common으로 정의한다.
           %h : 클라이언트의 IP주소
           %l : 유일한 개인 ID(클라이언트의 ident값)
           %u : 사용자 이름(사용자 인증을 거친 경우 사용자이름)
           %t : 날짜
           %r : Method(GET, PUT, POST 등)
           %>s : URI(Uniform Resource Identifier) - 서버상태
           %b : 전송된 바이트 수
        CustomLog /usr/local/apache/logs/access_log common
          => access_log를 common형태로 저장한다.
       - 로그 예
        203.xxx.xx.xxx - - [31/Dec/2002:18:03:29 +0900] "GET /~posein/ HTTP/1.1" 401 479
        203.xxx.xx.xxx - posein [31/Dec/2002:18:03:32 +0900] "GET /~posein/ HTTP/1.1" 200 94
       - 로그검사시 점검사항
        1. 유효하지 않는 로그인 시도
        2. 제한된 필드에 대한 접속 시도
        3. 존재하지 않는 파일에 대한 접속 시도
        4. 허락되지 않는 PUT(업로드) 시도
        5. 단기간 동안의 동일한 IP주소로 부터의 대량 접속 시도(서비스거부)
        6. 웹서버 예기치 못한 종료와 시작
    ㄴ. error_log: 웹서버의 진단 정보 및 요청 처리과정에서 발생되는 각종 에러에 대한 기록한다.
       - httpd.conf와의 관련항목
        ErrorLog /usr/local/apache/logs/error_log
         => 에러로그를 기록할 위치를 지정한다.
        LogLevel warn
         => 어느정도 수준일 때 로그를 기록할 것인지를 지정한다. 일반적인 유닉스시스템의 syslog
           와 마찬가지로 debug, info, notice, warn, error, crit, alert!, emerg중 하나를 선택할
           수 있다. debug가 심각성이 가장 낮은 수준의 로깅이며, emerg는 심각성이 가장 높은 수
           준의 로깅을 의미한다. "LogLevel"을 debug로 지정할 경우 대단히 사소한 내용도 기록되
           므로 로그의 량이 대단히 늘어나므로 적정한 수준에서 기록되도록 한다.
(2) 보안패치
   1) 설명: 앞서 살펴본 웹서버 관리자에 의한 환경설정상의 문제점으로 인한 공격 가능성과 더불어
           웹서버 자체 또는 웹서버에서 사용하는 어플리케이션 프로그램의 버그로 인한 공격도
           심각하다. 특히, 요즘 극성을 부리고 있는 인터넷 웜의 경우 각 서버에 공통적인 취약점
           을 찾아서 공격하므로 웹서버에 대한 보안 패치는 수시로 이루어져야 한다.
   2) 방법
    ㄱ. 버전별로 취약점의 확인
       http://www.apacheweek.com/security/
    ㄴ. 웹서버의 보안 취약점을 확인할 수 있는 도구의 사용
       Nessus, Whisker등을 이용하여 점검하고 조치한다.
    ㄷ. Apache 웹서버 관련 취약점에 대한 패치를 아래의 사이트에서 받아서 설치한다.
       http://www.apache.org/dist/httpd/patches/
(3) 설정파일 및 데이터백업
   초기 서버 설정 파일들과 이후의 기본적인 설정파일들은 일반에 공개되거나 다른 변화가 일어나기
  전에 백업해서 보관되어야 한다. 또한 시스템 설정이 변경될 때마다 이력관리가 필요하고 다수의
  수정이 있을 경우에는 반드시 백업을 해야 한다. 설정파일뿐만아니라 웹데이터에 대한 백업도 정기
  적으로 이루어져야 한다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. PAM(Pluggable Authentication Module: 착탈형 인증 모듈)이란?
사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법을 일컫는다. PAM은
관리자가 응용프로그램들의 사용자인증방법을 선택할 수 있도록 해준다. 즉 필요한 공유라이브러리의
묶음을 제공하여 PAM을 사용하는 응용프로그램을 재컴파일없이 인증 방법을 변경할 수 있다.


2. PAM의 목적과 동작
리눅스에서 PAM프로젝트의 목적은 권한을 부여하는 소프트웨어의 개발과 안전하고 적정한 인증의
개발을 분리하려는 데에 있다. 이것은 응용프로그램이 사용자 인증을 처리하기 위해 사용될 함수의
라이브러리를 제공함으로써 가능하다. PAM라이브러리는 /etc/pam.d(또는 /etc/pam.conf)에서 각 시스
템에 맞게 설정하여, 각 시스템에서 사용가능한 인증 모듈을 통해 사용자의 인증 요구를 처리한다.
모듈 자체는 /lib/security(또는 /usr/lib/security)에 위치하고 동적으로 로드가능한 오브젝트 파일
의 형태를 갖는다.

3. PAM의 설치
현재 대부분의 리눅스 시스템에 기본으로 설치되어 있으므로 설치는 생략한다. 확인은 rpm -qi pam
하면 된다. 설치된 파일의 확인은 rpm -ql pam 명령을 내려서 확인하도록 한다.

4. PAM의 구성파일
(1) 개요: 기본적으로 PAM은 /etc/pam.d 디렉토리에 설치되어 있다. 이 디렉토리를 살펴본다. 인증
          과 관련된 많은 파일들이 존재하지만 그 중에 중요한 몇가지만 살펴보도록 한다.
(2) PAM파일의 구성문법
   1) 기본구조: 다음과 같이 구성되어 있다.
     type   control   module-path   module-arguments
   2) 기본구조의 예
     [root@www /etc/pam.d]#cat login
     #%PAM-1.0
     auth       required     /lib/security/pam_securetty.so
     auth       required     /lib/security/pam_stack.so service=system-auth
     auth       required     /lib/security/pam_nologin.so
     account    required     /lib/security/pam_stack.so service=system-auth
     password   required     /lib/security/pam_stack.so service=system-auth
     session    required     /lib/security/pam_stack.so service=system-auth
     session    optional     /lib/security/pam_console.so
   3) 구성의 종류
    ㄱ. type: 이 부분은 PAM에 어떤 타입의 인증이 사용될 것인지를 알려준다. 같은 타입의 모듈은
             쌓일 수 있고, 사용자에 인증되기 위한 다중 요구사항을 만족하도록 요청할 수 있다.
             다음과 같은 4개의 타입이 있다.
       - account: 계정은 사용자가 해당 서비스에 접근이 허용되었는지, 패스워드가 기간이 만료가
                 되었는지를 결정한다.
       - auth: 주로 패스워드를 통하지만 생체인증과 같은 보다 정교한 방법을 통해서 사용자가
              자신이 주장하는 사용자가 맞는지를 결정한다.
       - password: 패스워드는 사용자가 그들의 인증을 변경하도록 어떤 방법을 제공한다. 이것을
                  결정하는 것이 패스워드이다.
       - session: 사용자가 인증받기 전후에 해야 할 것을 나타낸다. 사용자의 홈디렉토리를 마운
                 트/언마운트, 로그인/로그아웃 서비스를 제한하는 등의 포함한다.
    ㄴ. control: 통제를 담당하는 부분으로  PAM에 무엇을 해야할 지를 알려준다. 4가지의 형식이
                있다.
       - requisite: 이 모듈을 이용하는 인증이 실패할 경우, 즉시 인증을 거부하도록 한다.
       - required: 인증이 거부되기 전에 비록 PAM이 이 서비스에 등록된 다른 모든 모듈들을 요구
                  함에도 불구하고 실패할 경우 인증을 거부하도록 한다.
       - sufficient: 비록 이전에 요청되어진 모듈이 실패하더라도 이 모듈에 의해서 인증이 성공할
                    경우, PAM은 인증을 승인한다.
       - optional : 이 모듈이 서비스에 대한 응용프로그램의 성공/실패에 중요하지 않다는 것을 의
                   미한다. 보통 PAM은 모듈들의 성공/실패 판단시에 이런 모듈은 무시한다. 그러나
                   이전/이후의 모듈들이 명확한 성공/실패가 없다면 이 모듈이 응용프로그램에게
                   주는 결과를 결정짓는다.
    ㄷ. module-path: 모듈경로는 PAM에게 어떤 모듈을 사용하고 그 경로를 알려준다. 대부분 PAM모
                    듈은 /lib/security에 있다.
    ㄹ. module-argument: 모듈-인수는 모듈에게 전달되는 인수를 나타낸다. 각각의 모듈은 각각의
                        인수를 가지고 있다.
(3) /etc/pam.d 디렉토리와 인증
   1) 설명: /etc/pam.d 디렉토리는 리눅스 커널 2.4버전에서 사용하는 /etc/xinetd.d 디렉토리와
           유사하다. 특정한 서비스에 대한 요청이 오면 /etc/pam.d 디렉토리안의 파일의 설정을
           보고 처리하며, 그 외의 서비스들은 /etc/pam.d/other에서 처리한다.
   2) 주요파일분석
    ㄱ. login: 슈퍼유저로 로그인할 수 있는 사용자 인증과 관련된 파일이다.
       -예) [root@mybestone /etc/pam.d]#cat /etc/pam.d/login
            #%PAM-1.0
            auth       required     /lib/security/pam_securetty.so
            // pam_securetty.so 모듈이 지정해놓은 보안 규칙을 만족해야만 로그인이 허용된다는
            //뜻이다. 이 모듈은 /etc/securetty 파일에서 지정되어있는 tty에서 요청한 슈퍼유저
            //만 로그인을 허용한다.
            auth       required     /lib/security/pam_stack.so service=system-auth
            auth       required     /lib/security/pam_nologin.so
            account    required     /lib/security/pam_stack.so service=system-auth
            password   required     /lib/security/pam_stack.so service=system-auth
            session    required     /lib/security/pam_stack.so service=system-auth
            session    optional     /lib/security/pam_console.so
    ㄴ. other: PAM에서 별도로 지정하지 않은 서비스에 대한 인증을 위한 참조하는 파일이다.
       - 예) [root@mybestone /etc/pam.d]#cat other
             #%PAM-1.0
             auth     required       /lib/security/pam_deny.so
             account  required       /lib/security/pam_deny.so
             password required       /lib/security/pam_deny.so
             session  required       /lib/security/pam_deny.so
               => 알지 못하는 서비스가 4개의 구성타입 중 어떤 곳에 접근을 시도하더라도 PAM은
                 인증을 거부한다.(pam_deny.so 모듈이 담당한다.)

5. 주요 모듈에 대한 설명
(1) 설명: 리눅스(레드햇 8.0기준)에서 사용가능한 모듈들은 /lib/security디렉토리에 있다. 주요
          모듈에 대해 알아본다.
(2) 지원 모듈 목록
   [root@www root]# cd /lib/security
   [root@www security]# ls
   pam_access.so    pam_group.so      pam_mail.so         pam_shells.so     pam_unix_auth.so
   pam_chroot.so    pam_issue.so      pam_mkhomedir.so    pam_smb_auth.so   pam_unix_passwd.so
   pam_console.so   pam_krb5.so       pam_motd.so         pam_stack.so      pam_unix_session.so
   pam_cracklib.so  pam_krb5afs.so    pam_nologin.so      pam_stress.so     pam_userdb.so
   pam_deny.so      pam_lastlog.so    pam_permit.so       pam_tally.so      pam_warn.so
   pam_env.so       pam_ldap.so       pam_pwdb.so         pam_time.so       pam_wheel.so
   pam_filter       pam_limits.so     pam_rhosts_auth.so  pam_timestamp.so  pam_winbind.so
   pam_filter.so    pam_listfile.so   pam_rootok.so       pam_unix.so       pam_xauth.so
   pam_ftp.so       pam_localuser.so  pam_securetty.so    pam_unix_acct.so
(3) 주요 모듈
   1) pam_securetty.so
    ㄱ. 설명: 이 모듈은 표준의 UNIX securetty검사해서 /etc/securetty파일에 기록된 내용과 비교
             하는데 root계정인 경우에만 확인한다. 그 외의 다른 사용자에 대해서는 항상 인증이
             성공한 것으로 처리한다. 다른 sufficient인증 방법보다 앞서 require인증방법으로
             등록하는 것이 표준사용방식이다.
    ㄴ. 사용된 곳 : /etc/pam.d/login 등
   2) pam_listfile.so
    ㄱ. 설명: 이 모듈은 임의의 파일에 대해 서비스를 허가하거나 거부하는 방법을 제공한다.
    ㄴ. 모듈인자(module-argument)
       onerr=succeed|fail
        => onerr=succeed이면 PAM_SUCCESS를 리턴하고, onerr=fail이면 PAM_AUTH_ERR 또는 PAM_SER
          VICE_ERR이 리턴된다. 보통 sense와 반대로 적는다.
       file=filename
        => 지정한 파일을 읽는다. 한줄에 한 아이템만 적는다.
       sense=allow|deny
        => allow는 특정한 아이템이 발견되면 PAM_SUCCESS가 리턴되고 권한요구는 성공한다. 값이
          deny이면 PAM_AUTH_ERR이 리턴되고 권한요구는 실패한다.
       item=user|tty|rhost|ruser|group|shell
        => 아이템을 지정한다. 각각 사용자명, 요청한 터미널, 원격사용자,그룹,쉘을 나타낸다.
       apply=user|@group
        => 특정사용자 또는 주어진 그룹으로 적용을 제한하는데 사용한다. 이것은 tty, rhost, shel
          l아이템과 함께 사용될 때만 의미가 있는 제한이다. 생성시에 이 모듈인자를 제외하고는
          모듈인자는 필수적이다.
    ㄷ. 사용예(/etc/pam.d/ftp)
       [root@www root]# cat /etc/pam.d/ftp
       #%PAM-1.0
       auth       required     /lib/security/pam_listfile.so item=user sense=deny file=/etc
      /ftpusers onerr=succeed
       auth       required     /lib/security/pam_stack.so service=system-auth
       auth       required     /lib/security/pam_shells.so
       account    required     /lib/security/pam_stack.so service=system-auth
       session    required     /lib/security/pam_stack.so service=system-auth
   3) pam_nologin.so
    ㄱ. 설명: /etc/nologin파일이 존재하면 root만 로그인할 수 있고 다른 사용자는 에러메시지와
             함께 거부된다. /etc/nologin파일이 없다면 모듈은 성공을 리턴한다. 이 모듈을 효과
             적으로 사용하려면 모든 login방법들(login, rlogin 등)이 이것을 사용하게 해야 한다.
             또한 이 설정은 sufficient 모듈 앞에 required로 설정해야 한다.
    ㄴ. 사용된곳: /etc/pam.d/login
   4) pam_deny.so
    ㄱ. 설명: 이 모듈은 접근을 거부하는 데 사용한다. 응용프로그램에게 항상 실패를 리턴한다.
    ㄴ. 사용예
      a. 모든 계정에 대한 로그인을 막으려면 /etc/pam.d/login이라는 파일에 아래와 같이 설정해주
        면 된다.
       account    required     /lib/security/pam_deny.so
      b. 응용프로그램이 사용자의 패스워드를 변경하는 것을 막고 login이 예전에 사용하던 패스워
        드가 만료되어 새 패스워드를 자동적으로 묻는 것을 막으려면 /etc/pam.d/login이라는 파일
        에 아래 내용을 추가한다.
       password   required     /lib/security/pam_deny.so
   5) pam_cracklib.so
    ㄱ. 설명: 이 모듈은 password를 설정한 정책과 비교,검사한다.
    ㄴ. 모듈인자
       debug
        => 모듈이 동작을 보여주기 위해 syslog에 정보를 남기는데 이 옵션을 사용하면 패스워드정
          보를 남기지 않는다.
       type=LINUX
        => 모듈의 기본 동작은 패스워드를 물어볼 때 "New UNIX password: "라고 묻는데, 이 옵션을
          사용하여 'UNIX'라는 말 대신 'LINUX'로 바꿀 수 있다.
       retry=N
        => 새 패스워드를 물어보는 횟수로서 기본값은 1이다. 이 옵션을 사용하면 N만큼 횟수를 늘
          릴 수 있다.
       difok=N
        => 새 패스워드에서 예전 패스워드에 있지 않는 문자들을 몇자나 사용해야 하는지 나타내는
          수로 기본값은 10이고 새 패스워드에서 1/2이상의 글자가 이전과 다르다면 새 패스워드로
          받아들여 진다.
       minlen=N
        => 새 패스워드의 최소 크기에 1을 더한 크기이다. 새 패스워드엔 사용된 문자열의 길이외에
          각 문자종류(숫자, 대문자, 소문자, 특수문자)를 사용한 것에 대해 각각 크레디트(credit)
          를 준다.
       dcredit=N
        => 숫자문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
       ucredit=N
        => 대문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
       lcredit=N
        => 소문자가 가질 수 있는 크레디트값을 지정한다. 기본값은 1이다.
       ocredit=N
        => 특수문자가 가질수 있는 크레디트값을 지정한다. 기본값은 1이다.
       use_authok
        => 이 인자는 사용자에게 새 패스워드를 묻지말고 앞서 실행된 패스워드모듈에서 받은 것을
          사용하도록 모듈에게 강제한다.
    ㄷ. minlen값과 크레디트(credit)
       이 모듈은 크레디트(credit)라는 것을 사용한다. 만약 minlen=12 이면 실제적으로 보면 최소
      패스워드의 길이 12가 되어야 한다. 그러나, credit이라는 값이 부여되면 minlen의 값에서
      credit만큼 최소의 길이를 줄여준다. 만약 minlen의 길이가 12일때 패스워드를 gksskaeo1!
      이라고 설정했다고 가정하자. 실제길이는 10자이다. 그러나 이것은 패스워드로 사용가능하다.
      왜나하면 소문자를 사용함으로 1크레디트, 숫자를 사용하여 1크레디트, 특수문자를 사용하여 1
      크레디트를 얻으므로 도합 3크레디트를 얻는다. 이런 경우 총문자의 길이는 12-3임으로 실제
      적으로 9자이상이면 가능하다.
   6) pam_wheel.so
    ㄱ. 설명: root권한을 얻을 수 있는 사용자를 wheel(gid=0)이라는 그룹으로 묶어서 사용하도록
             지원하는 모듈이다.
    ㄴ. 모듈인자
       debug
        => syslog에 더 많은 정보를 제공한다.
       group=그룹명
        => gid=0인 그룹을 검사하는 대신 인증을 위해서 '그룹명'그룹을 검사한다. 여기서 그룹명은
          그룹의 이름이지 숫자로 된 그룹의 id가 와서는 안된다.
       trust
        => 이 옵션을 사용하면 root권한을 요구한 사용자가 wheel그룹에 속한 경우 PAM_SUCCESS를
          돌려주도록 한다. 즉 wheel group에 속한 사용자들은 암호를 입력하지 않고도 root권한을
          획득할 수 있게 된다. 주의해서 사용해야 한다.
       deny
        => 모듈의 동작을 반대로 하도록 만든다. 만약 사용자가 wheel그룹에 속한 사용자가 uid=0
          을 얻기 시도하면 접근을 거부한다. 이 옵션은 단독적으로는 쓸모가 없고 'group='옵션과
          같이 사용하기 위해 만들어졌다.
       use_uid
        => login할 때의 이름을 이용하지 않고 uid를 이용한다.
    ㄷ. 사용된 곳: /etc/pam.d/su
   7) pam_rootok
    ㄱ. 설명: 이 모듈은 superuser가 암호입력없이 해당 서비스에 대한 접근을 허용할 때 사용한다.
    ㄴ. 사용된 곳
       [root@www root]# cat /etc/pam.d/su
       #%PAM-1.0
       auth       sufficient   /lib/security/pam_rootok.so
        => root사용자는 기본적으로 접근이 가능하다. 즉, root사용자가 su명령으로 일반사용자로
          전환해도 패스워드를 묻지 않는다.
       # Uncomment the following line to implicitly trust users in the "wheel" group.
       #auth       sufficient   /lib/security/pam_wheel.so trust use_uid
       # Uncomment the following line to require a user to be in the "wheel" group.
       #auth       required     /lib/security/pam_wheel.so use_uid
       auth       required     /lib/security/pam_stack.so service=system-auth
       account    required     /lib/security/pam_stack.so service=system-auth
       password   required     /lib/security/pam_stack.so service=system-auth
       session    required     /lib/security/pam_stack.so service=system-auth
       session    optional     /lib/security/pam_xauth.so

6. PAM의 사용예

(1) 특정계정에 대해 telnet 접속은 막고, ftp접속만 허가하도록 해보자.
   1) /etc/pam.d/login파일을 열어서 아래라인을 추가한다.
     auth       required     /lib/security/pam_listfile.so item=user sense=deny file=/etc/logi
     nusers onerr=succeed
   2) /etc/loginusers 파일을 만들고 telnet 접속을 막을 계정을 적는다.
     [root@www root]# cat /etc/loginusers
     prehee
       => prehee 이라는 계정은 텔넷은 사용할 수 없고 ftp만 사용가능하다.
(2) /etc/loginusers파일에 등록된 사용자만 로그인을 허용하도록 해보자
   1) /etc/pam.d/login파일을 열어 아래라인을 추가한다.
     auth       required     /lib/security/pam_listfile.so item=user sense=allow file=/etc/logi
     nusers onerr=fail
   2) /etc/loginusers 파일을 만들고 접속하고자 하는 계정을 한줄에 하나씩 적는다.
(3) 사용자 패스워드 길이 제한하기
   1) 설명: 리눅스에서 패스워드 기본설정과 관련된 파일이 /etc/login.defs이다. 이 파일에서 패스
           워드의 길이는 최소 5자로 설정하고 있다. 이 파일에서 설정해도 되지만 PAM을 이용하여
           패스워드의 길이를 설정할 수 있다. 기본 설정파일은 /etc/pam.d/passwd이다.
   2) 설정하기
    ㄱ. /etc/pam.d/passwd파일의 기본설정상태
       [root@www root]# cat /etc/pam.d/passwd
       #%PAM-1.0
       auth       required     /lib/security/pam_stack.so service=system-auth
       account    required     /lib/security/pam_stack.so service=system-auth
       password   required     /lib/security/pam_stack.so service=system-auth
        => 현재 패스워드관련 정책은 /etc/pam.d/system-auth의 설정을 따른다는 뜻이다.
    ㄴ. 패스워드와 관련된 /etc/pam.d/passwd파일의 기본설정상태 확인
       [root@www root]# cat /etc/pam.d/system-auth
       #%PAM-1.0
       # This file is auto-generated.
       # User changes will be destroyed the next time authconfig is run.
       auth        required      /lib/security/pam_env.so
       auth        sufficient    /lib/security/pam_unix.so likeauth nullok
       auth        required      /lib/security/pam_deny.so

       account     required      /lib/security/pam_unix.so

       password    required      /lib/security/pam_cracklib.so retry=3 type=
       password    sufficient    /lib/security/pam_unix.so nullok use_authtok md5 shadow
       password    required      /lib/security/pam_deny.so

       session     required      /lib/security/pam_limits.so
       session     required      /lib/security/pam_unix.so
    ㄷ. 패스워드 길이제한을 위한 /etc/pam.d/passwd 파일 수정: 내용중 3번째줄을 삭제하고 아래와
                                                             같이 3줄을 추가한다.
       [root@www pam.d]# cat /etc/pam.d/passwd
       #%PAM-1.0
       auth       required     /lib/security/pam_stack.so service=system-auth
       account    required     /lib/security/pam_stack.so service=system-auth
       #password   required    /lib/security/pam_stack.so service=system-auth
       password   required     /lib/security/pam_cracklib.so retry=3 minlen=12 type=LINUX
       password   sufficient     /lib/security/pam_unix.so nullok use_authok md5 shadow
       password   required     /lib/security/pam_deny.so
        => 현재 기존의 내용을 주석처리하였다. 새로이 설정한 내용은 패스워드를 /etc/pam.d/syste
          m-auth파일의 설정을 따르지 않고 새로운 모듈로 설정하였다.
    ㄹ. /etc/pam.d/system-auth의 내용수정: 패스워드 관련된 부분을 /etc/pam.d/passwd에서 직접
                                          관여하므로 이 파일에서 password관련 3개의 항목을
                                          제거한다.
       [root@www root]# cat /etc/pam.d/system-auth
       #%PAM-1.0
       # This file is auto-generated.
       # User changes will be destroyed the next time authconfig is run.
       auth        required      /lib/security/pam_env.so
       auth        sufficient    /lib/security/pam_unix.so likeauth nullok
       auth        required      /lib/security/pam_deny.so

       account     required      /lib/security/pam_unix.so

       session     required      /lib/security/pam_limits.so
       session     required      /lib/security/pam_unix.so
   3) 테스트
     [posein@www posein]$ passwd
     Changing password for user posein.
     Changing password for posein
     (current) UNIX password:
     New LINUX password:                // LINUX라는 문구열이 보인다.
     Retype new LINUX password:         // LINUX라는 문구열이 보인다.
     Enter new UNIX password:
     Retype new UNIX password:
     passwd: all authentication tokens updated successfully
       => retry=3 으로 설정해서 3번물어본다.
(4) su명령어를 특정사용자에게만 허가하기
   1) 설명: PAM서는 특정사용자만 특정한 그룹(보통 wheel)에 속하도록 하여 그 그룹에 속한 사용자만
           특정한 권한을 가도록 하기 위해 pam_wheel.so라는 모듈을 제공한다. 또한 리눅스에서는
           기본적으로 wheel이라는 그룹이 생성되어 있으므로 이 두가지를 이용하면 된다.
   2) 설정하기
    ㄱ. /etc/group파일에서 wheel그룹에 su명령어를 사용할 사용자를 추가한다.
      예) [root@www root]# cat /etc/group
          root:x:0:root
          bin:x:1:root,bin,daemon
          daemon:x:2:root,bin,daemon
          sys:x:3:root,bin,adm
          adm:x:4:root,adm,daemon
          tty:x:5:
           disk:x:6:root
          lp:x:7:daemon,lp
          mem:x:8:
          kmem:x:9:
          wheel:x:10:root,posein            // posein이라는 사용자를 추가하였다.
          ----- 이하생략 -----
    ㄴ. /etc/pam.d/su에 아래의 내용을 추가한다.
       auth       required     /lib/security/pam_wheel.so debug group=wheel
       예) [root@www root]# cat /etc/pam.d/su
           #%PAM-1.0
           auth       sufficient   /lib/security/pam_rootok.so
           auth       required     /lib/security/pam_wheel.so debug group=wheel      // 추가
           # Uncomment the following line to implicitly trust users in the "wheel" group.
           #auth       sufficient   /lib/security/pam_wheel.so trust use_uid
           # Uncomment the following line to require a user to be in the "wheel" group.
           #auth       required     /lib/security/pam_wheel.so use_uid
           auth       required     /lib/security/pam_stack.so service=system-auth
           account    required     /lib/security/pam_stack.so service=system-auth
           password   required     /lib/security/pam_stack.so service=system-auth
           session    required     /lib/security/pam_stack.so service=system-auth
           session    optional     /lib/security/pam_xauth.so

출처 : 대전국제IT교육센터 정성재 강사

 

1. John The Ripper란?
John the Ripper는 Solar Designer가 개발한 Unix계열 password crack tool이다. 무료 도구이며,
UNIX계열 크래킹도구이지만 DOS, Win9x, NT, 2000 등의 플랫폼도 지원한다. 속도를 높이기 위해
Intel MMX기술이나 AMD K6 프로세서의 특수 기능들을 이용한 최적화된 코드를 집어넣기도 하였다.
관련사이트는 http://www.openwall.com/john/ 이다.


2. John The Ripper 설치하기
(1) http://www.openwall.com/john/ 에서 John the Ripper를 다운받아 /usr/local/src 디렉토리에
    위치시킨다.
   [root@mybestone src]# ls
   john-1.6.tar.gz
(2) 압축을 푼다.
   [root@mybestone src]# tar xvfz john-1.6.tar.gz
(3) 압축이 풀려진 디렉토리를 이동한다.
   [root@mybestone src]# cd john-1.6
(4) src 디렉토리로 이동한다.
   [root@mybestone john-1.6]# cd src
(5) make를 하여 지원되는 시스템을 확인한다.
   [root@mybestone src]# make
   To build John the Ripper, type:
           make SYSTEM
   where SYSTEM can be one of the following:
   linux-x86-any-elf        Linux, x86, ELF binaries
   linux-x86-mmx-elf        Linux, x86 with MMX, ELF binaries
   linux-x86-k6-elf         Linux, AMD K6, ELF binaries
   linux-x86-any-a.out      Linux, x86, a.out binaries
   linux-alpha              Linux, Alpha
   linux-sparc              Linux, SPARC
   freebsd-x86-any-a.out    FreeBSD, x86, a.out binaries
   freebsd-x86-k6-a.out     FreeBSD, AMD K6, a.out binaries
   freebsd-x86-any-elf      FreeBSD, x86, ELF binaries
   freebsd-x86-mmx-elf      FreeBSD, x86 with MMX, ELF binaries
   freebsd-x86-k6-elf       FreeBSD, AMD K6, ELF binaries
   openbsd-x86-any          OpenBSD, x86
   openbsd-x86-k6           OpenBSD, AMD K6
   solaris-sparc-gcc        Solaris, SPARC, gcc
   solaris-sparc-v8-cc      Solaris, SPARC V8, cc
   solaris-sparc-v9-cc      Solaris, SPARC V9, cc
   solaris-x86-any          Solaris, x86, gcc
   solaris-x86-k6           Solaris, AMD K6, gcc
   digital-alpha-cc         Digital UNIX, Alpha, cc
   aix-ppc-cc               AIX, PowerPC, cc
   hpux-pa-risc-gcc         HP-UX, PA-RISC, gcc
   hpux-pa-risc-cc          HP-UX, PA-RISC, cc
   irix-mips32-cc           IRIX, MIPS 32-bit, cc
   irix-mips64-cc           IRIX, MIPS 64-bit, cc
   dos-djgpp-x86-any        DOS, DJGPP 2.x, x86
   dos-djgpp-x86-mmx        DOS, DJGPP 2.x, x86 with MMX
   dos-djgpp-x86-k6         DOS, DJGPP 2.x, AMD K6
   win32-cygwin-x86-any     Win32, Cygwin, x86
   win32-cygwin-x86-mmx     Win32, Cygwin, x86 with MMX
   win32-cygwin-x86-k6      Win32, Cygwin, AMD K6
   generic
    => 위의 목록에서 현재 사용중인 시스템에 맞는 정보를 선택하고 컴파일한다. 만약 자기 시스템
       이 리스트에 없으면 make generic 명령어를 실행하면 된다.
(6) 현재 시스템에 맞는 모델을 선택하고 컴파일한다.
   [root@mybestone src]# make linux-x86-mmx-elf
    => 인텔계열시스템의 예이고 목록에 없으면 make generic이라고 한다.

3. John The Ripper 설치후 디렉토리
(1) 설명: John The Ripper를 설치하면 3개의 디렉토리와 1개의 파일이 생성된다.
(2) 목록
   1) README: John The Ripper에 대한 간단한 설명, 설치법, 사용법등이 적혀있는 파일이다.
   2) doc: John The Ripper에 대한 전반적인 문서들이 들어있는 파일이다.
   3) run: 실행관련파일들이 들어있으며 패스워드크랙을 위한 목록파일인 password.lst파일이 있다.
   4) src: 컴파일을 위한 소스파일이다.

4. John The Ripper 실행하기
(1) 실행파일이 있는 run디렉토리로 이동한다. (/usr/local/john-1.6/run)
   [root@mybestone src]# cd ../run
(2) 패스워드파일인 /etc/shadow 파일에 다음과 같이 실행한다.
   [root@mybestone run]#./john /etc/shadow
   Loaded 26 passwords with 26 different salts (FreeBSD MD5 [32/32])
   1234             (test)
    => test사용자의 passwd는 1234임을 알 수 있다.
(3) 작동법
   패스워드크랙을 실행하면 password.lst라는 파일에 있는 목록을 비교하여 단어 하나하나를 암호화
  하여 /etc/shadow파일과 같은 것이 있는 지를 검사한다. 만약같은 파일이 있으면 화면에 출력해주
  고 변환된 것도 john.pot라는 파일에 저장한다.
   예) [root@mybestone run]# cat john.pot
       $1$oWB3dUsn$pntvPIyUdLNIszwib7cbz1:1234
       $1$72QAnZFv$wQI5EDufaHMNDIOpJw/y21:1234
       $1$LY6uT14M$1GPUH4nx60XZ6Yjtum99h1:1234
       $1$bItzCQK6$9qMkCzN4XfwrOdAy3ckoO0:1234
       $1$gJLIqp0E$NHKHX2do36cZ4/9L3UzWk1:1234
       $1$T59dStp2$7mfaOkb4XgH9vm9e5XmY1.:1234
       $1$i5bopIh3$anTlfv7SU9uEyNC9TV/Oc0:1234
       $1$vs4NjZVv$OQpQhZOg6Lc5aGQ35nnbp0:1234
       $1$o8RHfrJ4$VsiRijJ1ld0/UB3Zlb.m3.:1234
       $1$0CAxOZyw$oJv9AJYMi1sAzNWps8E8D1:1234

출처 : 대전국제IT교육센터 정성재 강사

 

1. NAT(Network Address Translation)란?
(1) 개요: 컴퓨터에서 인터넷을 사용하려면 IP주소를 부여받아야 한다. 보통 이러한 IP를 공인 IP라
          부른다. 그러나 IP주소는 폭발적인 인터넷 사용인구의 증가로 IP가 부족해지는 현상이 나
          타났다. 이러한 부족현상을 해결하는 방안중의 한 기술이 NAT이다.
(2) 정의: NAT란 말 그대로 네트워크의 주소를 변환하여 주는 역할을 하는 것이다. 즉 한개의 공인
          IP주소를 가지고 있는데 여러개의 컴퓨터를 사용하려는 경우처럼 한대의 컴퓨터에 공인
          IP를 부여하고 나머지는 사설 IP를 부여하여 인터넷사용시에는 공인IP를 공유하여 사용할
          수 있도록 해주는 기술이다.


2. NAT의 사용예
(1) 여러 대의 피시에서 한 개의 IP를 공유하여 인터넷을 사용하는 경우
      => 공인된 IP가 부여된 컴퓨터에는 랜카드를 두개를 장착하여 하나는 공인IP를 부여하고 다른
        하나는 사설IP가 부여된 사설네트워크 연결을 위해 사설IP를 부여하여 인터넷을 공유할 수
        있다.
(2) 한 개의 IP주소(도메인네임)에 여러 대의 서버를 연결하는 경우
      => 부하분산을 위해 한 개의 도메인네임(FQDN)에 대해 여러 대의 서버를 운영하는 경우에도
        NAT를 사용한다. 즉, www.linux.ac.kr 도메인 한개에 웹서버, 메일서버, FTP서버를 따로
        운영하는 경우 부하평준하(Load Balance) 기능도 구현이 가능하다. 예를 들면 웹서버는
        192.168.0.1, 메일서버는 192.168.0.2 등 이런 방법으로 구현이 가능하다.
(3) 투명프락시
      => 학원에서 인터넷을 강의하는 경우처럼 동일 네트워크에 연결된 여러 대의 PC에서 동시에
        같은 사이트를 연결한다. 이 경우 프록시 서버를 이용하면 그 해당사이트를 프록시서버에서
        참조해 보다 빠른 접속을 할 수 있다. 이런 프록시 서버를 이용하려면 각 컴퓨터에 설치된
        웹브라우저에서 프록시서버를 지정해 주어야 한다. 리눅스에 프록시서버를 설정하면 리눅스
        를 통과하는 패킷은 자동으로 리눅스에 설치된 프록시서버 프로그램(SQUID 같은)으로 연결
        된다.

3. iptables에서 NAT의 분류
(1) 개요: iptables에서는 크게 두 부류의 NAT로 분류한다. 위 (1)의 경우를 SNAT(Source NAT)라
          하고 (2)와 (3)의 경우를 DNAT(Destination NAT)라 분류한다.
(2) 종류
   1) SNAT: 패킷의 소스 어드레스를 변경한다는 의미이다. 즉 내부 어드레스인 192.168.1.2인 컴
           퓨터가 다른 웹사이트(예를 들면 www.debian.org)를 접속하면 203.247.XX.XXX 처럼 공인
           IP로 나타나기 때문이다. SNAT는 라우팅(경로) 결정 이후에 이루어진다.(Post-routing)
           패킷의 목적지주소는 이미 정해져 있으므로(www.debian.org) 라우팅 경로는 결정되어
           있고 패킷의 소스 주소가 리눅스를 떠나기 직전에 변경된다.(192.168.1.1 => 203.247.xx
          .xxx)
   2) DNAT: 위의 개념과 반대되는 것으로 NAT를 시행하는 리눅스에서 패킷의 목적지 주소를 변경한
           다. 패킷의 목적지 주소가 먼저 변경되고 그 변경된 주소에 의거하여 새로운 라우팅 경로
           를 찾는다. 즉 DNAT는 라우팅 이전 단계에서 작용한다.(pre-routing)

4. iptables를 이용한 설정
(1) SNAT(Source NAT): 기존의 IP Masquerade를 말한다.
   1) 사용법
     iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3
     iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3-203.247.50.7
     iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 203.247.50.3:1-1023
       => -o는 패킷을 보내는 인터페이스 장치를 지정한다. SNAT에서는 패킷을 내보내는 장치를
         지정할 수 있다. --to 는 나가는 패킷에 부여할 소스 주소이다. IP공유라면 --to는 인터넷
         쪽의 공인 IP를 지정하면 된다.(지정하지 않아도 상관없다.)
   2) 사용예
    ㄱ. 한국통신 ADSL을 리눅스에 연결해 인터넷을 공유(IP MASQUERADING)하는 경우
       iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    ㄴ. 고정 IP를 사용하는 리눅스에서 인터넷을 공유하는 경우
       iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 203.247.50.3
         => 참고로 192.168.0.0/24는 지정하지 않아도 된다.
    ㄷ. 유동 IP를 사용하여 인터넷을 공유하는 경우
       iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
   3) 설정의 확인
     iptables -t nat -L
  (참고) 위 설정이외에도 다음과 같은 명령을 내려서 포워딩이 가능하게 해야 한다.
       echo 1 > /proc/sys/net/ipv4/ip_forward
(2) DNAT(Destination NAT)
   1) 개요: DNAT는 부하분산이나 평준화에만 사용하는 것은 아니다. 간단한 방화벽으로도 유용하다.
           리눅스A(203.247.50.3)에 DNAT를 설정하여 웹서버와 메일서버를 각각 내부주소인 리눅스B
           (192.168.1.11)와 리눅스C(192.168.1.12)에서 서비스 하도록 지정하고 인터넷에서 다른
           연결은 리눅스A로 지정하면 리눅스A는 간단한 방화벽과 같은 구실을 한다.
   2) 사용예
    ㄱ. 웹서버(192.168.1.11) 분산
     iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 80 -j DNAT \
     --to 192.168.1.11:80
       => (설명)
         - -A PREROUTING: DNAT는 먼저 목적지 주소를 변경하고 (203.247.50.3을 192.168.1.11로)
          다음에 라우팅이 이루어진다.
         - -t nat: 부하분산도 nat기능이다.
         - -p tcp: 웹(www)은 tcp를 사용한다.
         - -d 203.247.50.3 --dport 80: 들어오는 패킷의 목적지 주소가 203.247.50.3이고 포트번호
          가 www(80번)인 경우만 이 규칙을 적용한다.
         - j DNAT: destination NAT
         - --to 192.168.1.11:80 => 패킷의 목적지 주소를 192.168.1.11 포트번호를 80번으로 설정
          하라는 뜻이다. 192.168.1.11 서버에서는 80번 포트에서 웹서버 프로그램을 가동해야 한
          다.
    ㄴ. 메일서버(192.168.1.12)
       iptables -A PREROUTING -t nat -p tcp -d 203.247.50.3 --dport 25 -j DNAT 192.168.1.12:
       25
    ㄷ. DNS서버를 192.168.1.10으로 변경하려면 다음과 같이 지정한다.
       iptables -A PREROUTING -t nat -p udp -d 203.247.50.3 --dport 53 -j DNAT --to 192.168.\
       1.10:53
        => DNS는 UDP를 사용한다.
   3) 설정의 확인
     iptables -t nat -L
      => 설정을 보통 포트이름등으로 보여준다.
     iptables -t nat -nL
      => 설정을 포트넘버등 숫자로 보여준다.
   4) 설정의 해제
     iptables -t nat -F

5. iptables를 이용한 투명프록시 구현
(1) 투명프록시란?
  투명프록시는 내부 네트워크의 웹브라우저에서 프록시서버를 지정하지 않아도 강제로 프록시서버를
사용하게 하는 설정이다. 프록시를 설정하는 경우의 이점은 캐시를 사용하므로 인터넷 접속 속도를
빠르게 할 수 있다.
(2) iptables에서 설정
   1) squid 프록시서버를 작동시킨다.
   2) 리눅스 서버의 인터넷쪽에 연결된 랜카드의 인터페이스명이 eth0(203.247.50.3), 내부랜인
     eth1의 주소가 192.168.2.1이라면 다음과 같이 명령을 내린다.
      iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
        => (설명)
          ㄱ. -t nat: 투명프록시도 패킷의 주소를 변경하는 설정이므로 nat이다.
          ㄴ. -A PREROUTING: 투명프록시는 패킷의 주소를 변경하는 작업이 경로를 찾는 것보다
                            우선한다.(즉 라우팅보다 우선한다.:Pre Routing)
          ㄷ. -i eth1: 변경할 패킷이 들어오는 장치를 지정한다. 내부랜이 eth1에 연결되어 있고
                      이 랜에 연결된 내부 네트워크 시스템들은 이 리눅스를 통해 인터넷을 사용\
                      하므로 들어오는 패킷의 장치명은 eth1이다.
          ㄹ. -p tcp: 들어오는 패킷 중 tcp프로토콜만 nat를 적용한다는 뜻이다. www(80)연결은
                     tcp를 사용한다.
          ㅁ. --dport 80: 들어오는 패킷의 목적지 포트가 80번(www)인 경우에만 nat를 적용한다는
                         뜻이다. 따라서 ftp, telnet등은 적용을 안 받는다.
          ㅂ. -j REDIRECT: 투명프록시는 리눅스 내부에서 패킷의 입력포트번호를 변경해 주는 방법
                          이다.
          ㅅ. --to-port 3128: 들어오는 패킷의 목적지 포트번호를 3128번으로 변경하는 뜻이다. 목
                             적지의 IP주소는 지정하지 않았으므로 모든 인터넷 웹 검색에 대해
                             투명프록시가 적용된다.
(3) 확인
   iptables -t nat -L
(4) 다른예
   (조건) 투명프록시가 설치된 리눅스 서버에 웹서버를 설치해도 상관없다. 그런데 192.168.2.x네트
        워크에서 자신의 웹서버 데이터를 접근할 때도 프록시 서버를 공유한다는 것은 아무런 의미가
        없다. 웹서버에서 읽을 때는 홈페이지 디렉토리에서 찾고 프록시에서 찾을 때는 프록시서버의
        캐시 디렉토리에서 찾는 차이밖에 없다. 자신의 홈페이지 데이터를 내부랜에서 수시로 변경하
        는 경우는 오히려 프록시서버 캐시 디렉토리에서 찾으면 문제가 된다. 캐시가 지워지지 않는
        한 변경된 홈페이지 데이터를 볼 수가 없다. 그래서 내부랜(192.168.2.x)의 윈도우에서 192.
        168.2.1리눅스 서버의 변경된 홈페이지 데이터를 즉시 확인해야 한다면 http://192.168.2.1
        명령시에는 투명프록시가 작용하지 않아야 한다. 그 방법은 아래와 같다.
         iptables -t nat -A PREROUTING -i eth1 -p tcp -d ! 192.168.2.1 --dport 80 -j REDIRECT
        --to-port 3128
          => 처음의 기본설정에 -d ! 192.168.2.1을 추가하였다.(참고로 !과 192.168.2.1사이에는
            공백이 필요) 즉 들어오는 패킷의 목적지주소(검색사이트)가 192.168.2.1이면 투명프록
            시를 적용하지 말라는 뜻이다.
(5) 설정해제
    iptables -t nat -F
(6) www외의 인터넷 연결에 대한 nat설정
   1) 설명: 주의할 것은 투명프록시는 오직 http 즉 www(80)검색만 해당되고 telnet이나 ftp는 적용
           되지 않으므로 내부랜에서 인터넷의 다른 호스트에 telnet 및 ftp를 사용하려면 추가로
           SNAT를 설정해 주어야 한다.
   2) 설정
     iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to 203.247.50.3
      => (설명)
        ㄱ. -A ROSTROUTING
        ㄴ. -s 192.168.2.0/24: 192.168.2.0 네트워크로부터의 패킷에만 SNAT를 적용한다.
        ㄷ. -o eth0 : 패킷이 나가는 장치를 말한다. (eth0이 인터넷에 연결되어 있다.)
        ㄹ. -j SNAT: Source NAT를 말한다. 소스 주소(192.168.2.x)를 변경한다는 뜻이다.
        ㅁ. --to 203.247.40.3: 소스 주소를 203.247.50.3으로 변경하라는 뜻이다.
   3) 확인
     iptables -t nat -L
(7) 참고
    투명프록시가 적용되려면 인터넷에 나가는 패킷이 투명 프록시가 설정되어 있는 리눅스를 통과해
   야 한다. 통과하지 않는 패킷에 대해서는 포트의 방향을 변경할 방법이 없다. 따라서 투명프록시
   를 사용하는 모든 내부 컴퓨터의 디폴트 게이트웨이는 리눅스에 부여된 내부 IP주소이어야 한다.

출처 : 대전국제IT교육센터 정성재 강사

 

1. iptables의 개요
리눅스커널 2.4버전에서 사용하는 방화벽이다. 리눅스커널 2.2버전에서는 ipchains를 사용하였는데
원리와 구조 등 전반적으로 비슷하다.


2. iptables 사용하기
(1) 개요: iptables는 구버전의 ipchains와 같이 사용할 수 없으므로 확인하여 ipchains가 모듈로
          올라와 있으면 모듈을 제거해야 한다.
(2) 모듈의 확인
   [root@mybestone /root]# lsmod
   Module                  Size  Used by
   autofs                 11296   1  (autoclean)
   8139too                16512   2  (autoclean)
   ipchains               39360   0  (unused)
   usb-uhci               20752   0  (unused)
   usbcore                49728   1  [usb-uhci]
     => 현재 ipchains의 모듈이 올라와 있다. 이 경우에는 iptables를 사용할 수 없다.
(3) 모듈의 제거 및 iptables의 실행
   [root@mybestone /root]# rmmod ipchains
     => 모듈을 제거한다.
   [root@mybestone /root]# lsmod
   Module                  Size  Used by
   autofs                 11296   1  (autoclean)
   8139too                16512   2  (autoclean)
   usb-uhci               20752   0  (unused)
   usbcore                49728   1  [usb-uhci]
    => 모듈이 제거되었음을 알 수 없다.
   [root@mybestone /root]# iptables -L
   Note: /etc/modules.conf is more recent than /lib/modules/2.4.2-3/modules.dep
   Chain INPUT (policy ACCEPT)
   target     prot opt source               destination

   Chain FORWARD (policy ACCEPT)
   target     prot opt source               destination

   Chain OUTPUT (policy ACCEPT)
   target     prot opt source               destination
    => iptables 명령이 실행된다.

3. iptables의 기본구조
(1) 개요: iptables는 크게 2개의 테이블로 나눌 수 있다. 하나는 필터링을 하는 filter라는 테이블
          이고, 또 다른 하나는 nat 라는 테이블이다. filter라는 테이블을 기본적으로 생략가능하
          고, nat는 네트워크의 주소를 변환할 때 사용하는 테이블을 -t 옵션을 이용하면 명기해야
          한다. 기본 필터링은 논리적인 3개의 사슬(chains)으로 구성되어 있고, 각각 INPUT,
          OUTPUT, FORWOARD 라는 이름을 가지고 있다. 또한 사용자가 정의하여 새로운 사슬도 생성
          할 수 있다.(기본 사슬의 이름은 대문자이다.)
(2) 구성
   1) INPUT 사슬  : 리눅스박스를 향해 들어오는 패킷들이 거치는 체인
   2) FORWARD 사슬: 리눅스박스를 거쳐 output체인을 향하는 체인
   3) OUTPUT 사슬 : 리눅스박스를 나가는 패킷들이 들어가는 체인
(3) 기본문법
   1) 기본문법
     iptables [-t table] action chain pattern [-j target]
   2) 항목설명
    ㄱ. table : 크게 nat와 filter로 나누며, 기본값일 filter이므로 filter인 경우에는 생략한다.
    ㄴ. action : 전체 사슬에 대한 정책을 지정한다. -A, -L, -D, -F 등 대문자 옵션이 이에 해당
                한다.
    ㄷ. chain: 일반적인 필터링에 속하는 INPUT, OUTPUT, FORWARD가 있으며, nat 테이블에는 POST
              ROUTING, PREROUTING, OUTPUT 이 있다.
    ㄹ. pattern: 세부규칙을 지정하는 것으로 소문자 옵션(-s, -p, -d 등)이 이에 해당한다.
    ㅁ. target: 정책을 지정하는 것으로 DROP, ACCEPT, LOG 등이 해당한다.

4. iptables의 정책
(1) 개요: iptables의 정책이라는 것은 패킷을 어떻게 처리할 것인지를 말한다. 패킷의 처리는 크게
          거부할 것이냐 허가할 것이냐 두가지이지만, 세부적으로는 ACCEPT, DENY, DROP으로 관리한
          다.
(2) 기본정책
   1) ACCEPT : 패킷을 허용하는 옵션이다.
   2) DENY   : 패킷을 허용하지 않는다는 메시지를 보내면서 거부한다. 사슬 전체정책설정(-P)에서
              는 사용할 수 없다.
   3) DROP   : 패킷을 완전히 무시한다.

5. iptables 사용하기(1) - 사슬에 대한 사용
(1) 개요: iptables는 조작하는 방법은 크게 두가지로 나눌 수 있다. 첫번째는 전체 사슬에 대한
          설정이고 두번째는 각 사슬에 대한 규칙을 조작하는 방법이다. 참고로 사슬에 대한 동작
          설정은 대문자옵션(-P, -L 등)을 사용하고 사슬에 대한 세부규칙은 소문자옵션( -s,-p 등)
          을 사용한다.
(2) 사용법
   1) 전체사슬에 대한 작동
     -N: 새로운 사슬을 만든다.
     -X: 비어있는 사슬을 제거한다. (3개의 기본 사슬은 제거할 수 없다.)
     -P: 사슬의 정책을 설정한다.
     -L: 현재 사슬의 규칙을 나열한다.
     -F: 사슬으로부터 규칙을 제거한다.
     -Z: 사슬내의 모든 규칙들의 패킷과 바이트의 카운트를 0으로 만든다.
   2) 사슬 내부의 규칙에 대한 작동
     -A: 사슬에 새로운 규칙을 추가한다.(--append) 해당 사슬에 맨 마지막 규칙으로 등록된다.
        -사슬과 규칙
         INPUT, FORWARD: -t가 filter인 경우 사용가능
         POSTROUTING, PREROUTING: -t가 nat인 경우 사용가능
         OUPTUT: 양쪽 다 사용가능
     -I: 사슬에 규칙을 맨 첫부분에 삽입한다.
     -R: 사슬의 규칙을 교환한다.
     -D: 사슬의 규칙을 제거한다.

6. iptables 사용하기(2)- 필터링지정

(1) 개요: 세부옵션을 사용하여 좀더 자세한 규칙을 정할 수 있다.
(2) 옵션과 관련된 규칙
   1) -s(발신지) -d(도착지)의 사용
    ㄱ. 개요: 발신지('-s','--source','--src')와 도착지('-d','--destination','--dst')를 지정한
             다. 보통 IP주소를 표현하는 방법은 4가지가 있다.
    ㄴ. 표현법
      a. 도메인으로 표기하기
        예) -s www.linux.ac.kr, -d localhost
      b. IP주소를 표기하기
        예) -s 192.168.0.2
      c. Netmast값을 이용한 표기(1)
        예) -s 192.168.1.0/24 : 192.168.1.0 ~ 192.168.1.255
            -s 192.168.0.0/16 : 192.168.0.0 ~ 192.168.255.255
      d. Netmast값을 이용한 표기(2)
        예) -s 192.168.1.0/255.255.255.0
            -s 192.168.0.0/255.255.0.0
    ㄷ. 사용예
       iptables -A INPUT -s 0/0 -j DROP
        => 모든 IP주소(0/0) 로부터 들어오는 패킷들을 모든 DROP한다.
   2) -j의 사용
    ㄱ. 개요: 특정한 정책(ACCEPT, DROP, DENY, REDIRECT 등)을 설정한다.
    ㄴ. 사용예
       iptables -A INPUT -s 192.168.1.20 -j DROP
        => 192.168.1.20으로 부터 들어오는 모든 패킷에 대해 거부한다.
   3) !('not'을 의미)의 사용
    ㄱ. 개요: 아닌 NOT의 의미로 사용된다.
    ㄴ. 사용예
       -s ! localhost
        => localhost로부터 오는 패킷이 아닌경우를 나타낸다.
   4) -p(프로토콜)의 사용
    ㄱ. 개요: 프로토콜을 지시할 때 사용한다. 보통 TCP, UDP, ICMP같은 이름들이 사용된다. 대소문
             자를 구별하지 않는다. '!'(not)과도 같이 사용된다.
    ㄴ. 사용예
       -p ! TCP
        => TCP 프로토콜이 아닌경우를 나타낸다.
   5) -i 사용
    ㄱ. 개요: '-i'('--in-interface')는 패킷이 들어오는 인터페이스를 지정하는데 사용된다. 즉
             -i는 INPUT과 FORWARD 사슬에 사용된다.
    ㄴ. 참고: -t가 nat이면 PREROUTING에서만 지정가능하고 인터페이스명 앞에 "!"를 추가하면 그
             장치는 제외한다는 의미가 된다. 뒤에 "+"를 추가하면 그 이름으로 시작하는 모든 장치
             를 의미한다. 디폴트가 +이다.
   6) -o의 사용
    ㄱ. 개요: '-o'('--out-interface')는 패킷이 나가는 네트워크장치를 지정한다. 보통 OUTPUT,
             FORWARD사슬에 사용된다.
    ㄴ. 참고: -t nat이면 POSTROUTING에서만 지정가능하다. "!"과 "+"은 -i와 동일하다.
   7) -t(--table)
    ㄱ. 개요: table을 선택한다. filter, nat, mangle 세가지 선택이 있다. 커널에 해당 테이블을
             지원하는 코드가 들어 있어야 한다. 모듈 자동적재를 선택하면 그와 관련된 커널 모듈
             이 적재된다. 디폴트는 filter이므로 nat를 사용하려면 필히 nat라고 지정해야 한다.
    ㄴ. 사용예
       -t nat

7. iptables의 확장
(1) 개요: ipchains에서 간단하게 적용되던 -p같은 프로토콜관련 옵션들의 기능들이 세부적인 사항
          들을 설정할 수 있도록 추가적인 옵션이 제공된다.
(2) tcp의 확장
   1) 설명: 기본 -p tcp(또는 --protocol tcp)가 지정되고 추가로 사용할 수 있는 옵션이 제공된다.
   2) 사용법
     -p tcp [옵션]
   3) 옵션
     --source-port: 발신지에서의 하나의 포트나 포트범위를 지정한다. 보통 /etc/services에 기록
                   된 것과 같은 포트 이름이 사용될 수 있고 숫자로 나타낼 수 있다. 범위를 표시
                   하기 위해 '-'를 사용할 수 있다.
     --sport: --source-port 옵션과 같다.
     --destination-port: 도착지 포트를 지정한다.
     --dport: --destination-port 옵션과 같다.
     --tcp-flags : tcp에서 발생하는 flag를 지정하는 옵션이다. 보통 두개의 단어를 사용하는
                  첫번째 것은 검사하고자 하는 지시자 리스트를 적고, 두번째 단어는 지시자에게
                  어떤 것이 설정될 것인지를 지정한다.
       예) iptables -A INPUT --protocol tcp --tcp-flag ALL SYN, ACK -j DENY
          => 모든 flag들이 검사되지만 (여기서 ALL은 SYN, ACK, FIN, RST, URG, PSH와 같다.) SYN
            과 ACK만 거부로 설정된다.
     --syn : --tcp-flags SYN, RST, ACK를 줄여서 사용하는 옵션이다. ! 가 앞에 선행될 수 있다.
     --tcp-option 숫자 : 숫자와 tcp옵션이 같은 경우의 패킷을 검사한다. tcp옵션을 검사하려 할때
                        완전한 TCP 헤더를 갖지않는 것은 자동으로 DROP된다.
   4) 참고
     TCP 프로토콜은 두 시스템간의 접속을 위해서 3-way handshaking이라는 것을 한다. 즉 A라는
    시스템이 B라는 시스템에 접속을 요청(SYN패킷)하면 B라는 시스템은 응답패킷(ACK)을 보내고
    다시 A라는 시스템이 응답패킷(ACK/SYN)을 보내면 접속을 이루어진다. 이러한 기법을 이용하면
    특정한 곳으로 부터 오는 접속 시도를 패킷만 불가능하게 만듬으로써 접속이나 요청등을 거부할
    수 있다.
      예) -p tcp -s 192.168.1.3 --syn
         => 192.168.1.3으로부터 오는 SYN패킷을 의미한다.
(3) udp의 확장: -p udp(또는 --protocol udp)로 지정하고 '--source-port','--sport','--destinati
                on-port','-dport'를 지원한다.
(4) icmp의 확장
   1) 설명: -p icmp(또는 --protocol icmp) 뒤에 --icmp-type만 추가옵션으로 지원한다.
   2) 사용법
     -p icmp --icmp-type [추가명령]
   3) 참고
     icmp-type관련 추가명령은 iptables -p icmp --help하면 볼 수 있다.
   

8. iptables 간단한 실습하기
(1) 정책세우기
   예) 127.0.0.1(loopback) 이라는 IP주소로부터 오는 ping패킷(ICMP패킷) 무시하기
     => (분석)
       프로토콜: ICMP
       발신주소: 127.0.0.1
       목표(target): DROP
(2) 현재 정책의 확인
   [root@mybestone /root]# iptables -L
   Chain INPUT (policy ACCEPT)
   target     prot opt source               destination

   Chain FORWARD (policy ACCEPT)
   target     prot opt source               destination

   Chain OUTPUT (policy ACCEPT)
   target     prot opt source               destination
    => 현재 어떠한 정책도 설정되어 있지 않다.
(3) 정책설정하기
   1) ping 테스트하기
     [root@mybestone /root]# ping localhost
     PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.
     Warning: time of day goes back, taking countermeasures.
     64 bytes from localhost.localdomain (127.0.0.1): icmp_seq=0 ttl=255 time=86 usec
      => 현재 ping이 된다.
   2) 정책설정하기
     [root@mybestone /root]# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP
     [root@mybestone /root]# ping -c 1 localhost
     PING localhost.localdomain (127.0.0.1) from 127.0.0.1 : 56(84) bytes of data.

     --- localhost.localdomain ping statistics ---
     1 packets transmitted, 0 packets received, 100% packet loss
      => ping이 되지 않는다.
   3) 현재 정책의 확인
     [root@mybestone /root]# iptables -L
     Chain INPUT (policy ACCEPT)
     target     prot opt source               destination
     DROP       icmp --  localhost.localdomain  anywhere

     Chain FORWARD (policy ACCEPT)
     target     prot opt source               destination

     Chain OUTPUT (policy ACCEPT)
     target     prot opt source               destination
(4) 정책지우기
   1) 번호로 지우기
    ㄱ. 개요: iptables -L 했을 때 리스트를 보면 각 정책(현재는 INPUT만 설정)의 리스트번호가
             위에서부터 차례로 1,2,3,.번호가 설정되었다고 생각하면 된다. 그러므로 현재는
             INPUT중에서 1번만 설정되었다.
    ㄴ. 사용예
       [root@mybestone /root]# iptables -D INPUT 1
         => INPUT사슬의 1번규칙을 삭제한다.
   2) 전체명령으로 지우기
    ㄱ. 개요: 원래 설정한 명령에서 -A 대신에 삭제옵션인 -D를 사용하면 된다.
    ㄴ. 사용예
       [root@mybestone /root]# iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
    ㄷ. 정책의 확인
       [root@mybestone /root]# iptables -L
       Chain INPUT (policy ACCEPT)
       target     prot opt source               destination

       Chain FORWARD (policy ACCEPT)
       target     prot opt source               destination

       Chain OUTPUT (policy ACCEPT)
       target     prot opt source               destination
   3) -F 옵션이용하기
    ㄱ. 설명: -F옵션은 전체 사슬에 대한 규칙을 제거하거나 특정사슬의 규칙을 전부 제거할 수
             있다.
    ㄴ. 사용예
      a. [root@mybestone /root]# iptables -F
           => 전체 사슬에 대한 규칙을 제거한다.
      b. [root@mybestone /root]# iptables -F INPUT
           => INPUT사슬에 부여된 규칙을 전부제거한다.

9. 응용예
(1) 들어오는 패킷 모두 거부하고 192.168.0.2로 부터 들어오는 모든 패킷들에 대해서만 허가하기
    iptables -P INPUT DROP
      => 전체 사슬중에 INPUT에 대한 전체정책(-P)를 DROP하면 된다.
    iptables -A INPUT -s 192.168.0.2 -j ACCEPT
      => 도착지에 대한 명기를 하지 않으면 현재서버를 말하며, 프로토콜을 명기하지 않으면 모든
        프로토콜이라고 여긴다.
(2) 들어오는 모든 패킷들 허가하고 192.168.1.18로 부터 들어오는 모든 패킷들에 대해서 거부하기
    iptables -P INPUT ACCEPT
    iptables -A INPUT -s 192.168.1.18 -j DROP
(3) 192.168.4.40으로 들어오는 패킷중에서 tcp프로토콜관련 패킷만 거부하기
    iptables -A INPUT -s 192.168.4.40 -p tcp -j DROP
      => tcp기반 서비스인 텔넷등을 이용할 수 없다. 그러나 ping같은 icmp프로토콜을 사용하는
        패킷은 허가된다.
(4) 포트번호 22번부터 30번까지를 목적지로 들어오는 패킷들을 막고 텔넷포트인 23번포트만 허용
    하기
     iptables -A INPUT -p tcp --dport 22:30 -j DROP
     iptables -A INPUT -p tcp --dport 23 -j ACCEPT
       => iptables에서 세부규칙은 먼저 등록된 것이 효력을 발생한다. 즉 현재의 정책설정은
         포트에 대한 거부를 먼저 설정하였기 때문에 다음행에 23번포트를 허가해도 효력이 없다.
         제대로 설정하려면 다음과 같이 순서를 바꿔야 한다.
     iptables -A INPUT -p tcp -dport 23 -j ACCEPT
     iptables -A INPUT -p tcp --dport 22:30 -j DROP

10. iptables의 규칙 저장하고 불러오기
(1) 개요: 원하는 대로 방화벽 사슬을 설정해 놓은 후, 그 설정을 저장하여 설정된 내용을 불러올
          수 있다. 이 때 저장하는 명령이 iptabless-save라는 스크립트이고, 불러오는 명령은
          iptables-restore이다.
(2) iptables-save
   1) 설명: 설정한 내용을 저장하는 스크립트이다.
   2) 사용법
     iptables-save > 파일명
   3) 사용예
    ㄱ. iptables-save >firewall.txt
       => 현재 설정을 firewall.txt라는 파일로 저장한다.
    ㄴ. iptables-save -v
       => 저장한 내용을 화면에 출력한다.
(3) iptables-restore
   1) 설명: iptables-save로 저장한 사슬을 복구하는 스크립트이다.
   2) 사용법
     iptables-restore < 파일명


11. iptables와 ipchains의 차이점
(1) 미리 생성되어 있는 3개의 체인이름이 소문자에서 대문자로 바뀌었다.
   input, output, forward => INPUT, OUTPUT, FORWARD
(2) -i 지시자는 들어오는 인터페이스만 의미하고 입력과 포워드 체인에서만 작동한다. 포워드나
   출력체인에 사용되었던 -i는 -o로 바꿔야 한다.
(3) 기존에 단독으로 사용되었던 -p tcp 등이 --source-port등의 추가옵션과 함께 사용된다.
(4) TCP -y 옵션은 --syn으로 바뀌었고, '-p tcp' 다음에 와야 한다.
(5) DENY target이 DROP으로 바뀌었다.
(6) 만들어진 체인을 '0'으로 하면 정책카운터도 지워진다.
(7) REJECT와 LOG는 확장된 target이다.
(8) 체인 이름이 16자 까지 가능하다.
(9) MASQ와 REDIRECT는 더 이상 target이 아니다. iptables는 패킷을 변화시키지 않는다. 이것은
    NAT라는 하부구조가 있다.

우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
Tips! (1)
OpenSource (1)
«   2018/07   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
  1. 2012/12 (2)
  2. 2012/04 (3)
  3. 2012/03 (6)
  4. 2012/02 (6)
  5. 2012/01 (2)