RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'Linux'에 해당되는 글 103

출처 : 대전국제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라는 하부구조가 있다.

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

 

1. ipchains란?
리눅스커널 2.2버전 이상에서 부터 사용하는 일종의 방화벽(firewall)이다. 커널에서 들어오고 나가
는 패킷을 선택적으로 구별하는 필터링을 한다. 이 필터링에 규칙을 정하고 자신만의 규칙에 맞게 조
절할 수 있는 것이 ipchains이다. 이것을 이용하여 리눅스서버에 강력한 IP보안 기능을 설정할 수 있
고, 리눅스 박스를 GATEWAY화하여 많은 클라이언트와 다른 서버를 보호할 수 있다.
(참고) ipchains의 버전확인
/sbin/ipchains --version


2. ipchains의 기본구조
(1) 개요: ipchains는 논리적인 3개의 사슬(Chains)으로 구성되어 있고 각각 Input, Forward,
          Output체인이라는 이름을 가지고 있다. 또한 새로운 사용자 정의사슬도 만들 수 있다.
(2) 구성
   1) input체인   : 리눅스박스를 향해 들어오는 패킷들이 거치는 체인
   2) forward체인 : 리눅스박스를 거쳐 output체인을 향하는 체인
   3) Output체인  : 리눅스박스를 나가는 패킷들이 들어가는 체인
(3) 연결단계
    Input Chain => Forward Chain => Output Chain

3. ipchains의 정책(Policy)
(1) 개요: ipchains의 정책이라는 것은 패킷을 어떻게 처리할 것인가를 의미한다. 패킷의 처리는
          크게 수용할 것이냐 거부할 것이냐 두가지 정책이지만, 실질적으로는 ACCEPT, REJECT,
          DENY 세가지 정책이 관리한다. 기타정책으로는 MASQ등이 있다.
(2) 기본정책
   1) ACCEPT : 패킷을 수용한다.
   2) REJECT : 거부메시지와 함께 거부한다.
   3) DENY   : 메시지를 보내지 않고 상대를 무시한다.
   4) 기타
    ㄱ. MASQ : IP 매스커레이딩(Masquerading)에 사용하는 정책이다. 이 정책은 반드시 FORWARD
              사슬에서만 존재한다.

4. 사슬(Chains)의 이용
(1) 개요: 사슬에 관련된 많은 옵션이 존재하며, 옵션을 이용하여 다양한 정책을 지정할 수 있다.
(2) 사용법
   ipchains 옵션 [지정하고자 하는 사슬] [정책]
     => 일반사용자일 경우에는 /sbin/ipchains 라고 입력해야 한다.
(3) 옵션
   -N : 새로운 사슬을 만든다.
   -X : 빈 사슬을 지운다. 참고로 사슬이 비어있지 않으면 지울 수 없고 INPUT, FORWARD, OUTPUT
         은 기본 사슬로서 지울 수 없다.
   -P : 내장 사슬에 대한 기본 정책(Policy)을 변경한다.
   -L : 사슬 속에 든 규칙을 나열한다.
   -F : 사슬 속의 모든 규칙을 방출한다.
   -Z : 사슬 속의 모든 규칙에 대한 패킷, 바이트 카운터 값을 0으로 설정한다.
   -A : 사슬에 새로운 규칙을 추가한다. 보통 -A [사슬명]이 온다.
       예) -A input
   -I : 사슬 속에 어딘가에 새로운 규칙을 추가한다.
   -R : 사슬 속 특정 위치의 규칙을 교체한다.
   -D : 사슬 속 특정 규칙을 삭제한다.
   -M -L : 현재 매스커레이드된 접속 규칙을 나열한다.
   -M -S : 매스커레이딩 타임아웃값을 설정한다.
   -C : 현재의 설정을 테스트한다.
   -s : source 패킷이 들어오는 곳을 위치를 명시한다.
   -d : destination 패킷이 가고자 하는 최종 목적지
   -p : protocol 명시
      예) -p tcp, -p udp, -p icmp등
   -! : inverse역규칙 명시
      예) -p ! tcp : !는 프로토콜, 발신, 수신 등의 표현과 함께 사용 가능하나, icmp프로토콜과
         는 함께 쓸 수 없다.
   -i : interface 명시
      예) -i eth0, -i ppp0
   -y : 접속동기화 요청(SYN)명시
      예) -s any.host.com -y => any.host.com으로부터 오는 접속요청(syn flag)를 명시
   -j : 정책을 설정한다.
      예) -s any.host.com -j DENY => any.host.com에서 들어오는 모든 패킷을 거절한다.
   -l : 패킷을 기록
      예) -s any.host.com -l -j DENY => any.host.com에서 들어오는 모든 패킷을 기록하고 거절
   -b : 양방향 규칙
   -t : 서비스 유형 처리하기
(4) 옵션과 관련된 규칙
   1) -s(발신지), -d(도착지)의 사용
    ㄱ. 개요: 이 두가지 옵션을 각각 발신지(-s)와 도착지(-d)를 IP로 표현하는 옵션으로 4가지
             방법으로 사용가능하다.
    ㄴ. 표현법
     a. 도메인으로 표기하기
       예) -s localhost, -d www.linux.ac.kr
     b. IP주소로 표기하기
       예) -s 192.168.0.3
     c. Netmask값을 이용하여 표기(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
     b. Netmask값을 이용하여 표기(2)
       예) -s 192.168.1.0/255.255.255.0
           -s 192.168.0.0/255.255.0.0
   2) -p의 사용
    ㄱ. 개요: 프로토콜을 명시하는 옵션으로 tcp, udp, icmp와 같은 이름을 사용해서 표현한다.
             또한 "!"를 사용하여 역표현이 가능하다.
    ㄴ. tcp, udp에서의 사용
      a. 설명: tcp, udp포트 또는 포트의 범위를 추가로 지정할 수 있다. 또한 콜론(:)을 사용하여
              포트의 범위를 지정할 수 있다. 예를 들면 7000:7010이면 7000부터 7010까지의 11개의
              포트번호를 의미한다. 여기서 시작값이 생략되면 0으로 간주하고 끝값이 생략되면
              65535로 간주한다.
      b. 사용예
        -p TCP -s 0.0.0.0/0 :1024
          => 1024포트 이하로부터 오는 모든 tcp접속을 말한다.
        -p TCP -d 192.168.0.1 !www
          => 192.168.0.1 시스템으로 들어오는 www포트 이외의 TCP접속을 말한다.
        -p TCP -d ! 192.168.0.1 www
          => 192.168.0.1 시스템을 제외한 모든 시스템의 www포트를 사용하는 TCP접속을 말한다.
    ㄷ. icmp에서 사용
      a. 설명: ICMP는 포트라는 것이 없지만 여러가지 옵션을 가지고 있다.
      b. 사용법:
        -s 유형 -d 코드
         => 유형과 코드는 ipchains -h icmp라고 치면 확인할 수 있고, 유형과 코드는 숫자로 된
           값을 입력하면 된다.

5. ipchains의 사용예
(1) 사슬의 설정값 확인
   1)[root@house /root]# ipchains -L                 // 전체 사슬의 내용을 확인
     Chain input (policy ACCEPT):
     Chain forward (policy DENY):
     target     prot opt     source                destination           ports
     MASQ       all  ------  192.168.0.0/24       anywhere              n/a
     Chain output (policy ACCEPT):
   2)[root@house /root]# ipchains -L forward        // 특정 사슬의 내용만 확인
     Chain forward (policy DENY):
     target     prot opt     source                destination           ports
     MASQ       all  ------  192.168.0.0/24       anywhere              n/a
(2) 사슬의 설정값 지우기
   1) ipchains -F : 전체 사슬의 내용을 지운다.
   2) ipchains -F forward : forward사슬의 내용을 지운다.
   3) ipchains -F input   : input사슬의 내용을 지운다.
(3) 응용예
   1) ipchains를 이용한 ping에 응답하지 않기
     ipchains -A input -p icmp --icmp-type echo-request -j DENY
    (참고1) ping과 관련된 파일 /proc/sys/net/ipv4/icmp_echo_ignore_all
   2) 특정사이트인 www.abc.com의 패킷을 막기
     ipchains -A input -s www.abc.com -d localhost -j DENY
      => 목적지(-d)가 localhost인 모든 패킷(프로토콜이 명시되지 않으면 모든 프로토콜이다.)을
        DENY로 한다.
   3) 192.168.0의 주소를 가진 C클래스의 모든 호스트(192.168.0.1 ~ 192.168.0.255)들의 접근을 거
     부하기
     ipchains -A input -p tcp -s 192.168.0.0/24 -d localhost telnet -j DENY
      => INPUT사슬에 출발지(-s)가 192.168.0.0/24인 모든 호스트로부터 프로토콜은 TCP(-p tcp)를
       사용하고 목적지가 localhost의 telnet서비스 포트인 패킷을 DENY한다.
    (참고2)Netmask값을 이용한 IP표현
      예) 192.168.1.0/24  : 192.168.1.0 ~ 192.168.1.255
          192.168.0.0/16  : 192.168.0.0 ~ 192.168.255.255
          0/0             : 모든 호스트
   4) 웹서비스를 제외한 모든 서비스를 제한하고, 모든 로그를 남기도록 설정하기
     ipchains -A input -p tcp -s 0/0 -d localhost !www -j DENY -l
      => input사슬에 프로토콜은 TCP(-p tcp)이고, 출발지는 모든 호스트(-s 0/0으로 표기하지만 생
        략가능),목적지는 localhost인데 웹서비스 이외에는 모두 DENY한다. 참고로 !www대신에 !80
        이라고 된다. 맨 뒤에 -l은 패킷을 기록하라는 옵션이다.
   5) 어떠한 서비스도 하지 않을 경우의 설정
     ipchains -A input -s DNS_server -d localhost -j ACCEPT
     ipchains -A input -p tcp -s !localhost -d localhost 0:1024 -j DENY -y -l
     ipchains -A input -p udp -s !localhost -d localhost 0:1024 -j DENY -l
      => 첫번째는 DNS와의 통신을 위해 자신의 네임서버와의 통신을 위해 열어놓은 것이고, 두번째
        는 로컬호스트가 아닌(!localhost) 호스트로부터 localhost의 0번부터 1024번포트(-d 0:102
        4)사이로 오는 모든 접속 동기화 요청(SYN)비트가 설정된 TCP(-y)패킷을 거부한다. 0번부터
        1024번까지는 시스템이 사용하는 예약된 포트이므로 대부분의 해킹이 이곳에서 일어난다.
        SYN패킷만 걸러내면 외부로부터의 TCP연결은 원천적으로 봉쇄된다. 그러므로 비교적 안전하
        다고 할 수 있다. 세번째는 같은 내용이지만 프로토콜만 바뀐것이다. 참고로 UDP프로토콜은
        SYN신호가 존재하지 않는다.
   6) 매스커레이딩 설정하기
      ipchains -A forward -s 192.168.0.1/24 -j MASQ

6. ipchains의 규칙 저장하고 불러오기

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

7. ipchains로 막아서는 안될 것들
(1) ICMP: ICMP패킷을 필터링 할 경우에는 주의해야 한다. ICMP프로토콜에는 여러가지 타입이 있는
          이 중 절대로 막아서는 안되는 패킷이 destination-unreachable타입이다. 이는 모든 TCP/
          IP자료 교환시에 필요한 패킷이다. ICMP와 관련된 사항을 보려면 ipchains -h icmp라 입
          력하면 된다.
(2) 도메인 네임 서비스와 관련된 패킷: 도메인 네임 서버는 도메인이름을 IP주소로 바꿔주는 서버
                                      이므로 kr.yahoo.com등의 주소를 사용할 수 없다. 네임 서
                                      버는 UDP프로토콜을 사용하며 53번 포트를 사용하고, TCP도
                                      사용한다. 따라서 네임서버와의 통신(TCP/UDP 53번 포트)는
                                      절대로 막아서는 안된다.
(3) 메일서비스와 관련된 패킷들: 메일 서버의 경우도 마찬가지다. 자신이 메일 서버를 운영한다면
                                다른 메일서버와의 통신로인 25번을 막으면 안된다.
(참고3) 서비스의 확인은 /etc/services 파일에서 확인한다.

8. 로그 파일 분석
(1) 개요: -l 플래그는 기록을 의미한다. 이 기록 파일은 일반적인 리눅스시스템에서는
          /var/log/messages에 남는다.
(2) 로그예
    Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025 L=34 s=0x00 I=18
      F=0x0000 T=254 (#5)
(3) 로그설명
   input       : 규칙(로그 파일을 남기게 만든)을 포함한 사슬을 나타낸다.
   DENY        : 규칙이 패킷에게 한 행동이다. 만약 이 필드가 '-'라면 룰은 그 패킷에게 아무런
                효과도 주지 않은 것이다.
   eth0        : 패킷이 들어온 인터페이스이다.
   PROTO=17    : 패킷이 17번 프로토콜이라는 뜻이다. 가장 일반적인 프로토콜 번호는 1=icmp, 6=
                tcp, 17=udp정도이다.
   192.168.2.1 : 패킷의 출발지 IP주소
   :53         : 패킷의 출발지 포트 번호
   192.168.1.1 : 패킷의 목적지 IP주소
   :1025       : 패킷의 목적지 포트 번호
   L=34        : 패킷의 총길이 (byte)
   S=0x00      : TOS(Type Of Service)필드
   I=18        : ip의 ID
   F=0x0000    : 16bit fragment offset plus flags.
   T=254       : 패킷의 TTL(Time To Live)값이다. TCP/IP헤더에는 TTL값이 있는데 이것의 내용이
                다. 이것은 모든 홉(hop)들의 값이다. 보통 15 또는 255에서 시작한다.
   (#5)        : 괄호안의 값은 커널 2.2.9이후 버전에서만 볼 수 있다.
(참고4) ipchains 명령후에 즉시 반영시려면 ipchains-save하면 된다.

9. 기본동작 익히기
(1) 정책세우기
   예) 127.0.0.1 이라는 IP주소로부터 오는 ping패킷(ICMP패킷)을 무시하려 한다고 하자.
      => (분석)
        프로토콜: ICMP
        발신주소: 127.0.0.1
        목표(target): DENY
(2) 현재 정책의 확인
   [root@mybestone /root]# ipchains -L
   Chain input (policy ACCEPT):
   Chain forward (policy ACCEPT):
   Chain output (policy ACCEPT):
    => 어떠한 정책도 설정이 안되어 있음을 알 수 있다.
(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=116 usec
      => 현재 ping이 됨을 알 수 있다.
   2) 정책설정하기
     [root@mybestone /root]# ipchains -A input -s 127.0.0.1 -p icmp -j DENY
     [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]# ipchains -L
     Chain input (policy ACCEPT):
     target     prot opt     source                destination           ports
     DENY       icmp ------  localhost.localdomain anywhere              any ->   any
     Chain forward (policy ACCEPT):
     Chain output (policy ACCEPT):
(4) 정책지우기
   1) 번호로 지우기
    ㄱ. 개요: ipchains -L 했을 때 리스트를 보면 각 정책(현재는 input만 설정)의 리스트번호가
             위에서부터 차례로 1,2,3.. 번호가 설정되었다고 생각하면 된다. 그러므로 현재는
             input중에서 1번만 설정되었다.
    ㄴ. 사용예
       [root@mybestone /root]# ipchains -D input 1
        => 1번 규칙을 지운다.
   2) 전체명령으로 지우기
    ㄱ. 개요: 원래 설정한 명령에서 -A대신에 삭제하는 옵션인 -D를 사용하면 된다.
    ㄴ. 사용예
       [root@mybestone /root]# ipchains -D input -s 127.0.0.1 -p icmp -j DENY
    ㄷ. 정책확인
       [root@mybestone /root]# ipchains -L
       Chain input (policy ACCEPT):
       Chain forward (policy ACCEPT):
       Chain output (policy ACCEPT):
        => 삭제되었음을 알 수 있다.

10. 전체사슬 관련 동작익히기

(1) 개요: ipchains는 연관된 규칙을 묶어서 사용자가 정의한 사슬로 만들 수 있다. 사슬이름은
          기본 사슬명인 input, output, forward와 기본정책인 ACCEPT, DENY, REJECT, MASQ등을
          제외하고 정하면 되고 8자까지만 가능하다.
(2) 새로운 사슬 만들기
   [root@mybestone /root]# ipchains -N firewall
    => firewall이라는 사슬을 생성한다.
(3) 생성된 사슬의 확인
   [root@mybestone /root]# ipchains -L
   Chain input (policy ACCEPT):
   Chain forward (policy ACCEPT):
   Chain output (policy ACCEPT):
   Chain firewall (0 references):
    => firewall이라는 사슬이 생성되었음을 알 수 있다.
(4) 사슬 지우기
   [root@mybestone /root]# ipchains -X firewall
    => firewall이라는 사슬을 지운다. 사슬을 지우려면 사슬에 정책이 없는 빈사슬이어야 하고
      내장사슬을 지울 수 없다.
(5) 사슬비우기
   1) 개요: -F를 사용하여 사슬에 설정된 규칙을 지울 수 있다.
   2) 사용법
      ipchains -F [사슬명]
   3) 사용예
    ㄱ. ipchains -F
       => 전체 사슬에 대한 내용을 지운다.
    ㄴ. ipchains -F input
       => input 사슬에 대한 규칙만을 지운다.
(6) 사슬 규칙보기
   1) 개요: -L을 사용하여 사슬 속의 규칙을 볼 수 있다.
   2) 사용법
     ipchains -L [사슬명]
   3) 사용예
    ㄱ. ipchains -L
       => 전체 사슬의 내용을 출력한다.
    ㄴ. ipchains -L input
       => input사슬의 내용만을 출력한다.

11. IP 마스커레이드(Masquerade)
(1) 개요: IP Masquerade란 하나의 공인 IP를 가지고 여러 대의 컴퓨터가 인터넷을 이용하도록 하는
          기능을 말한다. 즉, TCP/IP패킷에 비공인 IP가 발신지일 경우 이를 실시간에 공인 IP로
          치환시켜주는 기능이다. 공인IP부여뿐만아니라, 동시에 여러 대의 클라이언트를 보호하는
          방화벽이 된다.
(2) IP 마스커레이드설정하기
   1) LAN CARD 추가 장착하기
     기존의 실질적으로 IP를 부여한 랜카드가 eth0로 세팅되어 있다. 여기에 추가로 랜카드를 하나
    더 장착한다. 이 랜카드는 리눅스상에서 eth1로 장착된다.
   2) eth1에 IP부여하기.
    ㄱ. 설명: 공인 IP대역말고 내부IP대역으로 할당된 것들중에서 IP를 부여한다. IP의 부여는
             /etc/sysconfig/network-scripts/ifcfg-eth1 이라는 파일에 적는다.
    ㄴ. 사용예: 여기서는 내부IP대역중에서 192.168.0.0대역을 쓰는 것으로 하고, IP는 192.168.0.1
               을 부여한다.
       DEVICE=eth1
       BOOTPROTO=static
       BROADCAST=192.168.0.255
       IPADDR=192.168.0.1
       NETMASK=255.255.255.0
       NETWORK=192.168.0.0
       ONBOOT=yes
   3) /etc/sysconfig/network 설정하기
     이 파일은 eth0의 게이트웨이값과 hostname을 지정해주는 파일이다. 이 파일에
    FORWARD_IPV4=true라는 항목을 추가한다.
   4) /etc/rc.d/rc.local파일에 다음의 항목을 추가한다.(대소문자 구분할 것.)
     ㄱ. 설명: /etc/rc.d/rc.local파일은 dos나 windows로 말하면 autoexec.bat파일에 해당하는
              것으로 부팅시 마다 참조하는 파일이다. 즉, 부팅할 때마다 마스커레이드 기능을
              이용하도록 설정하는 것이다.
     ㄴ. 설정예
       /sbin/ipchains -P forward DENY        // 기본정책은 모두 거부이다.
       /sbin/ipchains -A forward -s 192.168.0.0/24 -j MASQ  // C클래스대역의 내부아이피를 모두
                                                             사용
       echo 1 > /proc/sys/net/ipv4/ip_forward      // 내부아이피를 사용하도록 값을 인위적으로
                                                     부여
       /sbin/modprobe ip_masq_ftp            // 내부사용자들이 외부로 ftp서비스를 사용가능하게
                                              해줌
   5) 재부팅한다.
   6) eth1으로 부터 랜선을 뽑아 hub로 연결한다.
   7) 클라이언트(PC) 세팅
     ㄱ. 192.168.0.2부터 IP를 부여하여 세팅한다.
     ㄴ. 클라이언트 PC의 게이트웨이는 192.168.0.1(리눅스서버의 eth1의 값)로 세팅하고, Netmask
        는 255.255.255.0으로 세팅한다.

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

 

1. 접근통제란?
(1) 설명: 네트워크 환경체제에서는 항상 권한이라는 것이 있다. 어떠한 시스템에 접근하려면 그
          시스템에 접근권한이 있어야 한다. 권한을 가지지 않은 자가 권한이 부여되지 않은 자료에
          불법적인 접근을 시도할 때 이를 차단하는 행위를 접근통제(Access Control)이라 한다. 리
          눅스시스템에서도 소유자, 그룹, 그 외의 사용자 등 3계층으로 분리하여, 파일 또는 디렉
          토리에 읽기, 쓰기, 실행에 대한 권한을 부여한다.
(2) 접근통제방법: 접근통제하는 방법에는 학문적으로 보면 어떤 계층에서의 통제냐 운영체제의
                  위치가 어디냐에 따라 굉장히 많이 나누지만 여기서는 간단히 분류해보자.
   1) 완전접근통제: 말 그대로 어떠한 사람도 접근을 못하게 막는 것이다. 그러나, 완전통제라면
                    네트워크로서의 기능이 없다고 말할 수 있다.
   2) 일부접근통제: 선별적으로 접근을 허가하는 통제법이다. 대표적인 방법이 TCP Wrapper이다.

(3) 참고: 일부접근통제방식과 Set-Uid
   1) 설명: 리눅스에서 비밀번호를 변경할 때 passwd라는 명령을 이용한다. 이 passwd의 권한은
           root에게 있다. (실제적으로 확인해보면 소유자와 소유그룹 모두 root다. 파일의 위치는
           /usr/ bin/passwd) 그런데, 어떻게 일반 사용자가 그 명령을 사용할 수 있을까? 그것은
           root가 패스워드 권한 일부를 양도했기 때문이다. 이를 setuid, setgid라고 부른다. 이
           러한 경우와 같이 패스워드를 바꾸는 행위 또는 그 역할에만 권한을 허용한 경우가 일부
           접근통제방법에 해당한다.
   2) passwd의 setuid 확인
     ㄱ. /etc/bin으로 이동한다.
     ㄴ. 'ls -l passwd'라고 입력
     ㄷ. 다음과 같이 결과가 출력된다.
       -r-s--x--x    1 root     root        12244 Feb  8  2000 passwd
         => 이와 같이 소유자부분에서 x가 있어야 할 자리에 s가 있다. 이런 경우가 setuid 또는
          setgid가 부여된 경우이다. 이 파일의 소유자와 그룹은 root이다.


2. TCP Wrapper란?
리눅스 커널 2.2 버전에서 TCP Wrapper는 슈퍼데몬인 inetd데몬에 의하여 수행되는 서비스들의 접근
을 제어한다. 즉, 시스템에 접속을 허락한 호스트만 접속할 수 있도록 한다거나, 또는 원하지 않는
호스트의 접근을 막도록 해주는 접근 제어 프로그램이다. TCP 연결을 기반으로 하는 TELNET, FTP,
FINGER,RLOGIN 등을 감시하고 필터링할 수 있다. 현재 사용하는 커널 2.4 버전에서는 inetd가 확장
된 xinetd라는 슈퍼데몬을 사용하면서 자체적으로 접근제어를 하지만 tcp wrapper의 구성요소중
/etc/hosts.allow와 /etc/hosts.deny을 이용한 접근제어는 아직도 사용하고 있다.

3. TCP Wrapper의 구성
(1) 개요: TCP Wrapper는 데몬 프로세서인 /usr/sbin/inetd와 환경파일인 /etc/inetd.conf로 구성
          되어 있다. 또한 리눅스에서는 스크립트파일인 /etc/rc.d/init.d/inet이 있고, /usr/sbin
          /tcpd에서 참조하는 /etc/hosts.allow 파일과 /etc/hosts.deny파일이 있다.
(2) 구성파일
   1) /usr/sbin/inetd
    이 데몬은 여러 가지 다른 서버 프로그램들(telnet, ftp 등)을 관리하기 때문에 슈퍼 데몬이라고
   불리운다. 만약 호스트에서 telnet서비스를 요청하면 inetd는 환경파일인 /etc/inetd.conf파일을
   참고하여 in.telnetd를 구동하고 telnet서비스를 처리한다.
  2) /etc/inetd.conf(커널 2.2 버전만 해당)
    ㄱ. 설명: TCP Wrapper가 구동될 때 참고하는 환경파일이다. 전반적인 설정에 관여한
             다.
    ㄴ. inetd.conf 필드의 구성 : 총 7개의 필드로 구성되어 있다.
      a. 구성예
       telnet  stream  tcp     nowait  root    /usr/sbin/in.telnetd  in.telnetd
      (서비스이름) (소켓타입)(프로토콜)(플래그)(사용자)(서버프로그램) (매개변수)
      b. 필드의 설명
        - 서비스이름 : /etc/services에 정의된 이름
        - 소켓타입 : stream은 tcp, dgram은 udp이다.
        - 프로토콜 : /etc/protocols에 있는 이름
        - 플래그 : 프로세스의 시작방법
        - 사용자 : 서비스가 수행될 때 그 서비스의 소유자
        - 서버프로그램 : 실제 서버 프로그램 및 경로
        - 매개변수 : 서버에 넘겨줄 명령어 라인 매개변수

    ㄷ. inetd.conf의 역할: 이 파일에서 TCP Wrapper에서 사용하는 서비스를 제어할 수 있다. 보통
                         telnet, ftp, shell, login, exec, talk, ntalk, dtalk, pop-2, pop-3,
                         imap, uucp, tftp, bootps, finger, cfinger, sysstat, netstat 등 TCP연
                         결을 기반으로 하는 것들을 제어할 수 있다. 서비스를 하지 않으려면 해당
                         서비스의 맨 앞에 '#'문자를 삽입한다. 즉, 해당서비스열이 주석처리된다.
   3) /etc/rc.d/init.d/inet: 리눅스 배포판만에 있는 스크립트 파일이다. 리눅스에서 inetd 전체의
                            시작과 종료는 이 파일을 이용한다. 커널 2.4에서는 xinetd이다.
   4) /usr/sbin/inetd 와 /usr/sbin/tcpd
     리눅스에서 /etc/inetd.conf 파일의 필드 구성을 보면 위의 구성예와 서버프로그램부분이 다
    르다.
       telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd
    그럼 /usr/sbin/tcpd는 무엇인가? inetd는 /etc/inetd.conf파일을 참고하여 TCP Wrapper의 초기
    구동을 담당한다. 즉, /etc/inetd.conf 파일의 설정을 다음과 같이 했다고 가정하자.
       telnet  stream  tcp     nowait  root    /usr/sbin/in.telnetd  in.telnetd
     이 경우에 inetd는 단순히 텔넷서비스 요청이 들어오면 텔넷서비스로 연결만 해준다. 이런 설정
    은 텔넷서비스요청에 대한 어떠한 접근 거부나 허가를 할 수 없게 된다. 그래서, 중간에 접근
    여부를 판단하는 데몬이 tcpd이다. tcpd는 접근허용 파일인 /etc/hosts.allow와 /etc/hosts.deny
    파일을 참조하여 접근 여부를 결정한다. 또한 서비스에 접근하는 과정에서 발생하는 모든 사항에
    대하여 상세한 접속 로그를 남긴다. 즉, tcpd는 inetd와 서버사이에서 중요한 판단을 수행한다.

4.TCP Wrapper의 운용
(1) 개요: TCP Wrapper의 운용은 크게 3가지로 구분할 수 있다. 첫번째는 슈퍼 데몬인 inetd를 종료
          시켜 어떠한 서비스도 하지 않는 것이고, 두번째는 inetd.conf파일을 수정(커널 2.4에서는
          /etc/xinetd.d 디렉토리내의 서비스제어)하여 선택적으로 서비스를 제어하는 것이고, 마지
          막은 /etc/hosts.allows파일과 /etc/hosts.deny파일을 가지고 클라이언트를 선택제어하는
         것이다.
(2) TCP Wrapper 전체 서비스의 중단
   1) 설명: TCP Wrapper를 작동하지 않으려면 inetd 데몬을 중단시키면 된다. 보통 리눅스배포판에
           서는 스크립트파일을 이용하면 된다.
    ㄱ. 서비스의 중단
      /etc/rc.d/init.d/inet stop
    ㄴ. 서비스의 시작
      /etc/rc.d/init.d/inet start
        => 커널 2.4버전인 경우에는 xinetd이다.
(3)선택적인 서비스의 중단
   1) 설명: TCP Wrapper에서는 여러 서비스를 한다. telnet, ftp, rlogin등 많은 서비스등을 한꺼번
          에 관리한다. 따라서, 이중 한가지 서비스를 중단하려면 /etc/inetd.conf파일을 수정하면
          된다. 만약 현재 telnet서비스를 한다면 다음과 같이 설정되어 있을 것이다.
            telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd
          그럼, 텔넷서비스를 중단해보자. 맨 앞에 주석을 뜻하는 '#'만 붙여주면 된다.
   2) 사용예
     #telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd
(4)호스트의 접근제어 : /etc/hosts.allow와 /etc/hosts.deny파일을 이용하여 선택적으로 호스트
                       를 제어할 수 있다. 실제적으로 xinetd를 사용하는 커널 2.4버전에서도 사용
                       가능한 파일이 이 두 개의 파일이다.
    1)/etc/hosts.allow : 접근이 허가된 호스트들의 목록을 적는다.
    2)/etc/hosts.deny : 접근이 금지된 호스트들의 목록을 적는다.
    3)hosts.allow와 hosts.deny의 검색순서
       hosts.allow를 먼저 검색한 후 hosts.deny를 검색한다. 만약 hosts.deny에 모든 서비스에 대
     해 접근 금지로 설정했을 경우, hosts.allow에 허용된 접근외에는 모든 접근이 금지된다.

5.접근제어 규칙
(1) 설명: /etc/hosts.allow파일과 /etc/hosts.deny파일은 정해진 접근통제규칙을 가지고 있다. 이
         규칙대로 설정을 하여 접근을 제어해야 한다.
(2) 파일 작성시 문법상의 규칙
   1) 새로운 줄(줄바꿈)은 무시되고, 줄을 연장할 경우에는 백슬래쉬를 사용해야 한다.
   2) 빈줄 혹은 '#'으로 시작되는 줄은 주석처리된다.
   3) 다른 모든 줄은 아래의 형식을 따라야 한다.
      예) daemon_list  :  client_list   [ : shell_command ]
     daemon_list : 한개 이상의 데몬(서버프로그램)프로세스 혹은 예약어(와일드카드)
     client_list : 한 개 이상의 호스트 이름, 주소, 패턴 혹은 예약어(클라이언트 이름 혹은
                  주소가 일치하는 것)
(3) 예약어(와일드카드라고도 부름)
    ALL        : 모든 서비스 또는 모든 호스트를 나타냄.
    LOCAL      : 같은 네트워크에 있는 모든 호스트
    KNOWN      : 이름이 KNOWN인 호스트, 혹은 이름 또는 주소를 알고 있는 호스트
    UNKNOWN    : 이름이 UNKNOWN인 호스트, 혹은 이름이나 주소를 모르는 호스트
    PARANOID   : 호스트네임이 주소와 일치되는 않는 호스트
    B EXCEPT A : 리스트 B에서 A를 제외한 모든 B
(4) 패턴형식 : '.'의 위치에 유념해야 하고, ALL과 ':'은 공백이 있어야 한다.
    1)모든 서비스를 모든 호스트에 대해 거부 : /etc/hosts.deny파일에 적는다.
      ALL : ALL
    2) 특정 호스트에 특정서비스 접근 허용 : /etc/hosts.allow파일에 적는다.
      ALL : localhost, .aaa.com   => localhost와 aaa.com의 모든 호스트들에게 모든 서비스를
                                    허용한다는 뜻이다.
      in.telnetd : 192.168.0.2 => 192.168.0.2에서 텔넷 접속에 대해서만 접근을 허용한다.
      ALL : .aaa.com EXCEPT killer.aaa.com => killer.aaa.com를 제외한 aaa.com의 모든 호스트들
                                             에게 모든 서비스를 허용한다.
      ALL EXCEPT in.ftpd : .aaa.com EXCEPT bad.aaa.com => bad.aaa.com를 제외한 aaa.com의 모든
                                                         호스트들에게 ftp서비스를 제외한 모든
                                                         서비스를 허용한다.
      in.telnetd, in.figerd : 233.234.235., .aaa.com => 233.234.235.* 네트워크에 속한 모든 호
                                                       스트와 .aaa.com에 속하는 모든 호스트들
                                                       은 텔넷서비스와 finger서비스를 허용함.
      ALL : ALL : DENY => 그외의 모든 네트워크 호스트는 어떠한 서비스도 받을 수 없다. 만약에
                         hosts.allow를 이렇게 설정해 놓으면 별도로 hosts.deny파일이 필요없다.
      ALL : 192.168.0.0/24 => IP/넷마스크를 이용하여 설정하는 방법으로 192.168.0.0부터 192.16
                             8.0.255까지 모든 서비스에 대하여 허가한다.
(5) Shell Command
   1) 명령
     spawn : 현재 수행중인 프로세스의 자프로세스로 수행
     twist : 현재 수행중인 프로세스의 이미지 교체 후 수행(프로세스의 이미지가 교체되므로 규칙
            의 마지막 옵션으로 사용해야 한다.
   2) 확장 옵션
     %a (%A) : 클라이언트(서버)의 주소
     %c      : 클라이언트의 정보 (user@host 또는 user@address)
     %n (%N) : 클라이언트의 이름
     %d      : 서비스 데몬의 이름
     %h (%H) : 클라이언트(서버) 이름 또는 주소
     %n      : 클라이언트(서버) 이름
     %p      : 데몬 프로세스 ID
     %s      : 서버 정보
     %u      : 클라이언트 사용자 이름
   3) 사용예 : 의심되는 호스트(cracker.aaa.com)가 시스템에 접근을 시도할 경우 이 접속을 거부하
              고 관리자에게 관련 정보를 전송하기 위하여 hosts.deny파일에 다음과 같이 설정한다.
      ALL : cracker.aaa.com : twist (finger -l @%h | mail -s %d -%h root) &

6.TCP Wrapper의 단점
TCP Wrapper는 클라이언트에서 보내진 네트워크 패킷들로부터 제공된 발신지주소의 정보를 보고 그
호스트에 대해 접근을 허가를 하든지 거부를 하든지 동작을 하는데, 이 정보를 전적으로 믿을 수는
없다. 만약 TCP Wrapper에서 192.168.0.2로 부터 오는 telnet 요청을 허가하도록 설정되어 있다고
할 때, 크래커가 자신의 주소를 192.168.0.2라고 속여서 접근한다면 속수무책이다. 이런 식의 공격을
IP 스푸핑이라고 한다.

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

 

1. r로긴에 대하여
r로 시작하는 명령중에 대표적인 명령이 rsh 및 rlogin이 있다. 이 명령은 접속하고자하는 서버에
/etc/hosts.equiv 라는 파일과 .rhosts라는 파일을 참조하여 접속을 할 수 있다. 또한, rsh과 rlogin
은 리눅스에서 inetd(커널 2.4대일 경우에는 xinetd)라는 슈퍼데몬이 관리하므로 사용하려면 /etc/
inetd.conf(커널 2.4대인 경우에는 /etc/xinetd/rlogin등)파일에서 사용할 수 있도록 활성화시켜야
한다. 리눅스에서 rlogin 등 r-command 계열의 사용이 보안상 취약점으로 인해 점점 어려워지고 있
다. 로그인하기 위한 설정이나 .rhosts파일 생성시에 더욱 더 주의를 하도록 되어 있고, 초기에 설
정하던 방법들이 적용이 잘 안된다.


2. rlogin
(1) 설명: remote login의 약어로 호스트에 원격으로 로그인할 때 사용하는 명령이다. 원격으로
          접속할 원격지에는 .rhosts파일 또는 /etc/hosts.equiv 파일에 호스트가 등록되어 있어야
          한다.
(2) 사용법
   rlogin [option] host
(3) option
  -l : 계정을 미리 지정하여 로그인 할 수 있다. 현재 이 옵션이 지원되지 않는다.
(4) 사용예
   1) rlogin www.aaa.co.kr => www.aaa.co.kr으로 접속을 한다.
   2) rlogin -l posein www.aaa.co.kr => www.aaa.co.kr로 접속을 시도할 때 aaa.co.kr의 posein
                                        이라는 계정을 가지고 한다.
   3) rlogin 203.247.xxx.xx
     => 203.247.xxx.xxx 로 접속을 시도한다. 현재 버전에서 사용가능한 방법이다.

3. /etc/hosts.equiv 파일과 .rhosts파일의 설정
(1) 설명: rlogin으로 접속하려면 /etc/hosts.equiv파일 또는 사용자의 홈디렉토리에 .rhosts파일이
          존재해야 한다. 본인 계정으로 rlogin을 이용하려면 자신의 홈디렉토리에 .rhosts파일을
          만든다.
(2) .rhosts파일 및 /etc/hosts.equiv 의 형식
   (호스트네임)  (들어올 수 있는 계정아이디)
(3) 사용예
   1) aaa.co.kr   posein
      => aaa.co.kr이라는 호스트의 posein이라는 사람이 자신의 계정에 패스워드없이 들어올 수
        있다.
   2) aaa.co.kr   +
      => aaa.co.kr이라는 호스트의 모든 계정에서 나의 계정(즉, 현재 .rhosts파일에 존재하는 홈디
        렉토리)에 패스워드없이 들어 올 수 있다.
   3) +   posein
     => 모든 호스트에서 posein이라는 계정이 있는 사람이 들어올수 있다.
   4) +   +
     => 모든 호스트의 모든 계정에서 들어올 수 있다.
   5) 203.247.xxx.xxx
     => 신뢰하는 호스트의 IP를 적는다. 해당 IP에서 접속하는 계정에 대해 패스워드없이 접속이
       가능하다. 현재 버전에서 사용가능한 방법이다.

4. rsh
(1) 설명: remote shell의 약자로 원격으로 명령을 내릴 경우에 사용한다. rlogin과 다른 점은
          rlogin으로 접속했을 경우에 who나 w명령을 치면 접속했다는 것이 보이지만 rsh로 옵션을
          주어 접속하거나 원격지에서 그냥 명령만 수행시에는 보이지 않는다. 물론 .rhosts파일이
          존재해야 사용가능하다.
(2) 사용법
   rsh [option] host
(3) option
   -l : 계정을 지정하여 로그인할 수 있다. 현재 이 옵션이 지원되지 않는다.
(4) 사용예
   1) rsh -l root aaa.co.kr sh -i
       =>  aaa.co.kr의 root 권한으로 shell을 실행시킨다. 이 명령을 실행시킨 뒤에 'id'라고 입력
         하면 root로 나타난다. 하지만, w이라고 입력하면 나타나지 않는다.
   2) rsh -l root aaa.co.kr ls -l /    
       => aaa.co.kr으로 접속한 뒤에 ls -l /을 실행시킨다.
   3) rsh aaa.co.kr cp /etc/passwd passwd
       => 원격지의 /etc/passwd 파일을 현재디렉토리에 복사한다.

5./etc/inetd.conf의 설정(커널 2.2대인 경우)
(1) 설명: rlogin과 rsh은 슈퍼데몬인 inetd에서 관리하므로 작동유무는 /etc/inetd.conf에서 한다.
          기본설정은 작동을 하지 않는다. 활성화시키려면 다음과 같은 항목에서 주석처리('#')을
          없애면 된다.
(2) 설정
   (기본설정)
     #shell  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rshd
     #login  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rlogind
   (활성화된 상태)
     shell  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rshd
     login  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rlogind

6./etc/xinetd.d 설정(커널 2.4대인 경우)

(1) 설명: 커널 2.4대 인 경우에는 xinetd라는 슈퍼데몬으로 작동한다. 각각의 해당서비스에 대한
          설정은 /etc/xinetd.d디렉토리에서 각 서비스이름과 같은 이름(예를 들면 rlogin, rsh등)
          으로 관리된다.
(2) 설정
   1) rlogin과 rsh파일을 vi편집기로 열어보면 disable = yes라는 항목이 있다. 즉 이것은 사용하지
    않겠다는 설정이다. 이 값에서 yes를 no로 바꾼다.
   2) 데몬을 재시작한다.
     /etc/rc.d/init.d/xinetd restart

7. rlogin 사용예
(1) /etc/hosts.equiv 파일이용하여 A(Client) 시스템에서 B(Server)로 접속
   1) B(Server)에서 rlogin을 허용하기 위한 설정
    ㄱ. /etc/hosts.equiv 파일에 접속을 허가하고자 하는 호스트를 등록한다.
       [root@server root]# cat /etc/hosts.equiv
       203.247.xxx.xxx
         => 해당 IP에서 들어오는 계정에 대해 패스워드 없이 로그인이 가능하다.
    ㄴ. rlogin 서비스를 열기: /etc/xinetd.d/rlogin 파일의 설정에서 disable = yes를 no로 바꾼
                             다.
    ㄷ. 참고 : 리눅스는 기본적으로 pam이라는 사용자 인증을 사용한다. rlogin사용을 위해서는
              pam에도 설정이 되어 있나 확인해야 한다.
       [root@www root]# cat /etc/pam.d/rlogin
       #%PAM-1.0
       # For root login to succeed here with pam_securetty, "rlogin" must be
       # listed in /etc/securetty.
       auth       required     /lib/security/pam_nologin.so
       auth       required     /lib/security/pam_securetty.so         // 이 부분도 필요하다.
       auth       required     /lib/security/pam_env.so
       auth       sufficient   /lib/security/pam_rhosts_auth.so       // 기본선택되어 있다.
       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
   2) A(Client)에서 B(Server)로 접속하기
    ㄱ. 조건: client와 Server에 동일 계정으로 접속해야 한다. 접속하고자하는 Server에도 posein
             이라는 계정이 있고 Client에도 posein이라는 계정이 있다고 가정하자.
    ㄴ. 접속하기
       [posein@client posein]$ rlogin 203.247.xxx.xxx
       Last login: Thu Jan 30 01:53:21 from xxx.xxx.xxx.xxx
       [posein@server posein]$
         => 패스워드없이 로그인이 됨을 알 수 있다.
(2) .rhosts파일을 이용하여 A(Client) 시스템에서 B(Server)로 접속
   1) B(Server)에서 rlogin을 허용하기 위한 설정
     ㄱ. 개인 홈디렉토리의 .rhosts파일에 만들고 그곳에 원격지 IP를 등록한다.
        [posein@server posein]$ cat .rhosts
        203.247.xxx.xxx
         => 해당 IP에서 들어오는 계정에 대해 패스워드없이도 로그인이 가능하다.
     ㄴ. 리눅스에서는 .rhosts 파일의 퍼미션을 소유자만 rw이 가능하도록 설정해야 한다. 이렇게
        설정되어 있지 않으면 운영체제에서 보안상의 이유로 무시한다.
        [posein@server posein]$ ls -l .rhosts
        -rw-------    1 posein   posein         14  1월 30 02:04 .rhosts
   2) A(Client)에서 B(Server)로 접속하기
       [posein@client posein]$ rlogin 203.247.xxx.xxx
       Last login: Thu Jan 30 02:18:34 from xxx.xxx.xxx.xxx
       [posein@server posein]$
   3) 참고 : root로 로그인하기
     root사용자로 로그인하기 위해서도 일반사용자가 로그인하기 위해 한 설정과 같다. 다만 root
    사용자인 경우에는 /etc/securetty에서 원격지 접속에 대한 제한을 두었기 때문에 접속이 불가
    하다. 만약 root로 접속하려면 /etc/securetty를 제거하거나 다른 이름(securetty~ 추천)으로
    변경하면 접속할 수 있다. 그러나 이 방법은 절대 사용하지 말아야 한다. 다만 보안상 참고로
    알아두는 수준이 좋다.

8. rsh 사용예
(1) 접속하고자하는 Server의 설정: rlogin 설정과 같다.
(2) A(Client)에서 B(Server)로 접속하기
   1) [posein@client posein]$ rsh 203.247.xxx.xxx sh -i
      sh-2.05b$
       => 프롬프트가 바뀌면서 접속한 상태와 같다.
   2) [posein@client posein]$ rsh 203.247.40.252 ls -l /
       => 접속하지 않아도 원격지 서버의 / 디렉토리의 내용확인이 가능하다.
   3) [posein@client posein]$ rsh 203.247.xxx.xxx cat /etc/passwd > passwd.txt
       => 원격지 서버의 /etc/passwd의 내용을 내 디렉토리의 passwd.txt파일로 저장 가능하다.
(3) 참고
   1) who명령이나 w 명령으로는 확인이 불가능하다.
   2) last같은 로그기록으로도 보이지 않는다.
   3) 접속의 확인은 netstat명령으로만 가능하다.

9. rlogin과 해킹
(1) rlogin과 백도어
   과거의 해커들이 루트의 홈디렉토리에 .rhosts라는 파일을 만들고 그안의 내용을 '+ +'로 하여 소
  위 백도어라는 것을 만들어 놓았다. 그러나, 현재의 리눅스는 보안의 측면이 많이 강화되어 일단 r
  oot 계정자로 rlogin이 불가능하다. 또한, 일반계정자로 .rhosts를 만들고 파일의 내용을 '+ +'라
  하여도 패스워드를 치도록 되어 있다. rsh도 현재의 리눅스시스템에서는 사용이 어렵다. 원격에서
  의 쉘권한은 상당히 규제하고 있다. 그러나, 과거의 해킹방법이라도 알아두어야만 대응하기가 쉽다.
(2) rlogin의 제한
   1) /etc/inetd.conf에서의 설정(커널 2.2대) : shell부분과 login부분을 주석처리한다.
      #shell  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rshd
      #login  stream  tcp     nowait  root    /usr/sbin/tcpd  in.rlogind
   2) /etc/xinetd.d 디렉토리의 파일제한(커널 2.4대)
      이 디렉토리에 존재하는 rlogin과 rsh파일을 삭제하거나 이 파일을 vi편집기로 열어
     disable = yes로 바꾼뒤에 데몬을 재시작한다.
   3) .rhosts파일의 제한 : rlogin과 rsh은 .rhosts파일이 존재해야 한다. 그러므로 이 파일의 생
                          성을 막는다.
     ㄱ. 퍼미션을 통한 제한 : 루트디렉토리의 퍼미션을 700으로 하여 다른 사용자에 의한 파일의
                             생성을 막는다.
     ㄴ. .rhosts의 생성 제한
       a..rhosts라는 디렉토리를 미리 생성해 놓으면 같은 이름의 파일을 생성할 수 없다.
       b. ln -s /dev/null ~/.rhosts 나 ln -s /dev/null /etc/hosts.equiv 명령을 내려 어떠한
         설정을 할 수 없도록 설정한다.
     ㄷ. 감시 : who나 w 명령으로는 나타나지 않을 수 있으니 항상 netstat 명령을 이용하여 감시한
              다.

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

 

1. RHEL 4와 LVM
(1) 개요
    RedHat Linux 9 및 RHEL 3 까지는 LVM 구성시 lvm 1 버전을 사용하였으나, RHEL 4는 lvm 2
   버전을 사용한다.
(2) LVM2가 LVM1과 비교해서 변화된 점
   1) LVM에 처음 생성시 사용하던 vgscan은 사용하지 않는다. LVM2에서는 자동적으로 이뤄진다.
   2) LV의 크기를 줄이거나 늘려주고, fsck 및 resize2fs 명령까지 수행하는 e2fsadm이라는 명령이
     없어지고 ext2online이라는 명령을 사용한다.

2. LVM 설정하기
(1) 설명: 약 1000MB씩 할당되어 있는 /dev/hda11, /dev/hda12을 lvm0이라는 볼륨그룹으로
          생성하고, 약 1200MB는 /ldata로 할당하고, 나머지 800MB는 /ldata2로 구성한다.
(2) 설정1: 1200MB의 /ldata 로 구성
   1) fdisk를 이용하여 파티션 생성 및 속성 변경
     fdisk /dev/hda 실행후 파티션을 생성하고, 파티션을 LVM 속성으로 변경하기 위하여
    t, 해당 파티션 선택, 8e, w을 누르고 재부팅한다.
   2) 물리적 볼륨(PV:Physical Volume) 생성
     [root@linux33 ~]# pvcreate /dev/hda11
       Physical volume "/dev/hda11" successfully created
     [root@linux33 ~]# pvcreate /dev/hda12
       Physical volume "/dev/hda12" successfully created
   3) 생성된 PV를 특정한 볼륨그룹(lvm)에 추가시키기
     [root@linux33 ~]# vgcreate lvm0 /dev/hda11 /dev/hda12
       Volume group "lvm0" successfully created
   4) 생성된 볼륨그룹 검사
     [root@linux33 ~]# vgdisplay -v
         Finding all volume groups
         Finding volume group "lvm0"
       --- Volume group ---
       VG Name               lvm0
       System ID
       Format                lvm2
       Metadata Areas        2
       Metadata Sequence No  1
       VG Access             read/write
       VG Status             resizable
       MAX LV                0
       Cur LV                0
       Open LV               0
       Max PV                0
       Cur PV                2
       Act PV                2
       VG Size               1.88 GB
       PE Size               4.00 MB
       Total PE              482
       Alloc PE / Size       0 / 0
       Free  PE / Size       482 / 1.88 GB
       VG UUID               pET6FH-n82q-ytwF-sdid-FnFj-9S9I-qM9yff

       --- Physical volumes ---
       PV Name               /dev/hda11
       PV UUID               6cuR47-E2hA-3dL4-DixC-gGEg-zxzx-n0qfQg
       PV Status             allocatable
       Total PE / Free PE    241 / 241

       PV Name               /dev/hda12
       PV UUID               0uHbHb-MVyr-n8N1-q4L7-jNpm-LSy6-MhhGoJ
       PV Status             allocatable
       Total PE / Free PE    241 / 241
   5) 논리적 볼륨(LV:Logical Volume) 생성
     [root@linux33 ~]# lvcreate -L 1200M -n ldata lvm0
       Logical volume "ldata" created
       => 관련 디바이스 파일명이 /dev/mapper/lvm0-ldata로 생성되고, 추가로 /dev/lvm0/ldata로
        심볼릭 링크파일이 생성된다.
   6) LV생성확인
     [root@linux33 ~]# lvscan
       ACTIVE            '/dev/lvm0/ldata' [1.17 GB] inherit
   7) VG 확인
     [root@linux33 ~]# vgdisplay -v
         Finding all volume groups
         Finding volume group "lvm0"
       --- Volume group ---
       VG Name               lvm0
       System ID
       Format                lvm2
       Metadata Areas        2
       Metadata Sequence No  1
       VG Access             read/write
       VG Status             resizable
       MAX LV                0
       Cur LV                0
       Open LV               0
       Max PV                0
       Cur PV                2
       Act PV                2
       VG Size               1.88 GB
       PE Size               4.00 MB
       Total PE              482
       Alloc PE / Size       0 / 0
       Free  PE / Size       482 / 1.88 GB
       VG UUID               pET6FH-n82q-ytwF-sdid-FnFj-9S9I-qM9yff

       --- Logical volume ---
       LV Name                /dev/lvm0/ldata
       VG Name                lvm0
       LV UUID                HVbvnV-MDS7-yrqy-ijn6-fPSu-xabk-ujIAhA
       LV Write Access        read/write
       LV Status              available
       # open                 0
       LV Size                1.17 GB
       Current LE             300
       Segments               2
       Allocation             inherit
       Read ahead sectors     0
       Block device           253:0

       --- Physical volumes ---
       PV Name               /dev/hda11
       PV UUID               6cuR47-E2hA-3dL4-DixC-gGEg-zxzx-n0qfQg
       PV Status             allocatable
       Total PE / Free PE    241 / 0

       PV Name               /dev/hda12
       PV UUID               0uHbHb-MVyr-n8N1-q4L7-jNpm-LSy6-MhhGoJ
       PV Status             allocatable
       Total PE / Free PE    241 / 182
         => Logical volume이 나타나고, Physical volumes에서 /dev/hda11은 모두 사용중이고,
           /dev/hda12도 일부 사용중이다.
   8) 파일시스템 생성
     [root@linux33 ~]# mkfs -t ext3 /dev/lvm0/ldata
   9) 마운트할 디렉토리 생성
     [root@linux33 ~]# mkdir /ldata
   10) 마운트
     [root@linux33 ~]# mount -t ext3 /dev/lvm0/ldata /ldata
(3) 설정 확인 및 등록
   1) 개요: 제대로 설정되었는지 확인하려면 mount, df 명령을 이용하여 확인하고, 이상이 없으면
           시스템 재부팅시에도 계속적으로 사용하기 위해 /etc/fstab에 등록한다.
   2) 설정의 확인
    ㄱ. mount 명령을 이용한 확인
       [root@linux33 ~]# mount
       /dev/hda1 on / type ext3 (rw)
       none on /proc type proc (rw)
       none on /sys type sysfs (rw)
       none on /dev/pts type devpts (rw,gid=5,mode=620)
       usbfs on /proc/bus/usb type usbfs (rw)
       none on /dev/shm type tmpfs (rw)
       /dev/hda5 on /home type ext3 (rw)
       /dev/hda2 on /usr type ext3 (rw)
       /dev/hda3 on /var type ext3 (rw)
       /dev/md0 on /raiddata type ext3 (rw)
       /dev/md1 on /raiddata1 type ext3 (rw)
       none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
       sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
       /dev/mapper/lvm0-ldata on /ldata type ext3 (rw)            // 이 부분이다.
    ㄴ. df 명령을 이용한 확인
       [root@linux33 ~]# df -h
       Filesystem            Size  Used Avail Use% Mounted on
       /dev/hda1             2.9G  191M  2.6G   7% /
       none                  252M     0  252M   0% /dev/shm
       /dev/hda5             2.0G   36M  1.8G   2% /home
       /dev/hda2             9.7G  5.8G  3.5G  63% /usr
       /dev/hda3             2.0G  191M  1.7G  11% /var
       /dev/md0              1.9G   35M  1.8G   2% /raiddata
       /dev/md1              950M   18M  885M   2% /raiddata1
       /dev/mapper/lvm0-ldata
                             1.2G   34M  1.1G   4% /ldata
        => 참고로 RHEL 4에서는 나타나는 디바이스 파일명이 RHEL 3 이전버전과 다른 것을 알 수 있다.
   3) /etc/fstab에 등록
    ㄱ. 설명: LVM을 시스템 재부팅후에도 사용하려면 /etc/fstab파일에 등록하면 된다.
    ㄴ. 예
       /dev/lvm0/ldata              /ldata                ext3    defaults        0 0
(4) 설정2: 남은 공간인 약 800MB를 /ldata2로 구성하기
   1) 설명: 남은 공간을 확인하려면 vgdisplay -v 명령을 내려 Free PE값을 확인하고 해당 PE값을
           할당하는 것이 좋다. lvcreate 로 남은 PE값을 지정하고 Logical Volume을 생성한다.
   2) 방법
    ㄱ. [root@linux33 ~]# vgdisplay -v
          => Free PE값을 확인한다.
    ㄴ. [root@linux33 ~]# lvcreate -l 182 -n ldata2 lvm0
          Logical volume "ldata2" created
         => lvm0이라는 볼륨그룹에 ldata2 이라는 Logical Volume을 생성하고 크기는 182PE
          (약 728MB)를 할당한다.
    ㄷ. [root@linux33 ~]# mkfs.ext3 /dev/lvm0/ldata2
         => 파일시스템을 생성한다.
    ㄹ. [root@linux33 ~]# mkdir /ldata2
         => /ldata2를 생성한다.
    ㅁ. [root@linux33 ~]# mount -t ext3 /dev/lvm0/ldata2 /ldata2
         => 마운트한다.
    ㅂ. mount 및 df 명령을 이용하여 확인한다.
    ㅅ. 재부팅후에도 사용하려면 /etc/fstab에 등록한다.

3. 설정된 LVM 확장하기
(1) 개요: 기존의 설정된 Logical Volume을 확장하려면 Volume Group의 공간이 남아 있어야 한다.
          만약 VG의 공간이 없으면 새로운 디스크 파티션을 PV로 생성하고 해당 파티션을 VG로
          확장한 뒤에 LV를 늘릴 수 있다.
(2) VG확장하기
   1) 설명: LV를 늘리기 위해서는 새로운 파티션을 생성한 후에 PV로 만든 후 해당 PV를 VG에
           속하게 해야 한다. 약 2000MB인 /dev/hda13을 VG에 속하게 해본다.
   2) 방법
    ㄱ. 파티션 생성: 'fdisk /dev/hda' 실행후 파티션을 2000MB로 생성하고, 속성을 LVM으로
                    변경하기 위하여 t, 해당 파티션 선택, 8e, w을 누르고 재부팅한다.
    ㄴ. PV 생성
       [root@linux33 ~]# pvcreate /dev/hda13
         Physical volume "/dev/hda13" successfully created
    ㄷ. VG 확장
       [root@linux33 ~]# vgextend lvm0 /dev/hda13
         Volume group "lvm0" successfully extended
    ㄹ. 확인
       [root@linux33 ~]# vgdisplay -v
         => 늘어난 Physical volumes를 확인한다.
(3) LV확장하기
   1) 설명: 약 1200MB가 할당된 /ldata를 1000MB를 추가하여 크기를 2200MB로 늘린다.
   2) 방법
    ㄱ. 마운트가 되어 있으면 umount 한다.
       [root@linux33 ~]# umount /ldata
    ㄴ. lvextend 명령을 이용하여 확장한다.
       [root@linux33 ~]# lvextend -L +1000M /dev/lvm0/ldata
         Extending logical volume ldata to 2.15 GB
         Logical volume ldata successfully resized
    ㄷ. lvscan이나 lvdisplay 명령을 이용하여 확장된 내용을 확인한다.
       [root@linux33 ~]# lvscan
         ACTIVE            '/dev/lvm0/ldata' [2.15 GB] inherit
         ACTIVE            '/dev/lvm0/ldata2' [728.00 MB] inherit
    ㄹ. ext2online 명령을 이용하여 파일시스템의 크기를 늘린다.
       [root@linux33 ~]# ext2online /dev/lvm0/ldata
       ext2online v1.1.18 - 2001/03/18 for EXT2FS 0.5b
        => 이전 버전의 fsck 및 resize2fs 대체하는 명령으로 마운트된 상태에서도 사용가능하나
          안정성을 위해 언마운트상태에서 사용하도록 한다.
    ㅁ. df명령을 이용하여 확인한다.

4. LVM 관련명령어
(1) pvcreate
   1) 설명: 물리적 볼륨(PV:Physical Volume)을 생성하는 명령어이다. fdisk를 이용하여 파티션을
           분할하고 LVM 속성으로 지정한 뒤에 해당 파티션을 PV로 만들 때 사용하는 명령이다.
   2) 사용법
     pvcreate [option] 디바이스명
   3) option
     -ff : 강제로 생성할 때 쓴다.
   4) 사용예
    ㄱ. [root@www root]# pvcreate /dev/hdb1
          => /dev/hdb1을 물리적 볼륨으로 생성한다.
    ㄴ. [root@www root]# pvcreate -ff /dev/hdb2
          => /dev/hdb2를 오류 등을 무시하고 물리적 볼륨으로 생성한다.
(2) vgcreate
   1) 설명: 볼륨그룹을 생성하는 명령어로 생성된 PV를 지정한 볼륨그룹에 포함시키면서 생성한다.
   2) 사용법
     vgcreate [option] 볼륨그룹명 디바이스명 디바이스명
   3) option
     -s 사이즈[kKmMgGtT]: PE(물리적확장:Physical Extends]의 크기를 지정한다.
   4) 사용예
    ㄱ.[root@www root]# vgcreate lvm00 /dev/hda7 /dev/hdb1
        => lvm00 이라는 볼륨그룹을 생성하고 /dev/hda7, /dev/hdb1 이라는 PV를 포함시킨다.
    ㄴ.[root@www root]# vgcreate -s 16M lvm00 /dev/hda7 /dev/hdb1
         => lvm00 이라는 볼륨그룹을 생성하고, PE의 크기를 16MB로 지정하면서 /dev/hda7,
           /dev/hdb1 이라는 PV를 포함시킨다.
(3) vgdisplay
   1) 설명: 볼륨그룹의 속성과 정보를 보여주는 명령어이다.
   2) 사용법
     vgdisplay [option] [볼륨그룹명]
   3) option
     -v: 좀 더 자세히 보여주는 옵션으로 Volume Group이외에 Logical Volume과 Physical Volume도
        같이 보여준다.
   4) 사용예
    ㄱ. [root@www root]# vgdisplay
         => Volume Group의 내용을 보여준다.
    ㄴ. [root@www root]# vgdisplay -v lvm00
         => lvm이라는 볼륨그룹의 내용을 자세히 보여준다.
(4) lvcreate
   1) 설명: 볼륨그룹안에 LV(Logical Volume)을 생성하는 명령이다.
   2) 사용법
     lvcreate 옵션 볼륨그룹명
   3) option
     -L: LV의 사이즈를 지정하는 옵션으로 K(kilobytes), M(megabytes), G(gigabytes), T(terabyt
        es) 단위를 붙여 지정가능하다.
     -l: LV의 사이즈를 지정하는 옵션으로 pe의 개수로 용량을 지정한다. 참고로 보통 1pe당 4MB
        이다. (참고로 소문자 L임)
     -n: LV의 이름을 지정하는 옵션이다.
     -i: RAID 0같은 stripe 사용시 볼륨이름을 지정하는 옵션이다.
     -I stripe_size: 스트라이프되는 크기를 지정한다. 기본단위가 kilobytes이고 크기는 반드시
                    2의 배수(2^n: n값은 2부터 9)로 지정해야 한다.
     -s: 유동적인 디렉토리 백업에 유용한 snapshot LV를 생성하는 옵션이다.
   4) 사용예
    ㄱ. [root@www root]# lvcreate -L 2000M -n backup lvm00
         => lvm00이라는 볼륨그룹에 backup라는 이름으로 2Gigabytes 용량으로 LV을 생성한다.
           이 경우 /dev/lvm00/backup이라는 디바이스파일이 생성된다.
    ㄴ. [root@www root]# lvcreate -l 250 -n data lvm00
         => lvm00이라는 볼륨그룹에 data라는 이름으로 250pe(약 1GB)용량으로 LV을 생성한다.
           이 경우 /dev/lvm00/data라는 디바이스파일이 생성된다.
    ㄷ. [root@www root]# lvcreate -i 2 -L 1G -n striped_lv lvm00
         => /dev/lvm00/striped_lv 라는 디바이스파일을 생성하고 볼륨 2를 부여한다.
    ㄹ. [root@www root]# lvcreate -s -L 500M -n snap /dev/lvm00/lvmdata4
         => /dev/lvm00/lvmdata4의 snapshot LV인 /dev/lvm00/snap를 500MB 크기로 생성한다.
   5) 참고: LV와 디바이스파일명
     RHEL 4버전에서 생성되는 디바이스 파일명은 "/dev/mapper/VG이름-LV이름"이다. 즉, VG명이
    lvm0이고 LV명이 ldata이면 /dev/mapper/lvm0-ldata로 생성된다. RHEL 3 이전버전에서는
    /dev/lvm0/ldata형태로 디바이스파일이 생성되는데, RHEL 4에서는 이 파일을 심볼릭 링크 파일로
    추가로 생성시켜주므로 이 파일을 사용해도 된다.
(5) lvscan
   1) 설명: 디스크에 있는 Logical Volume을 찾아준다.
   2) 사용법
     lvscan [option]
   3) option
     -v: 정보를 자세히 보여준다.
   4) 사용예
     lvscan
(6) lvdisplay
   1) 설명: Logical Volume의 정보를 보여준다.
   2) 사용법
     lvdisplay [option] LV명
   3) option
     -v: 정보를 자세히 보여준다.
   4) 사용예
     [root@www root]# lvdisplay -v /dev/lvm00/data
       => /dev/lvm00/data라는 LV의 정보를 자세히 보여준다.
(7) vgextend
   1) 설명: 미리 생성된 Volume Group에 추가로 Phycical Volume을 추가할 때 사용한다.
   2) 사용법
     vgextend 볼륨그룹명 새PV명
   3) 사용예
     [root@www root]# vgextend lvm00 /dev/hdc1
       => lvm00이라는 볼륨그룹에 /dev/hdc1을 추가한다.
(8) vgreduce
   1) 설명: 볼륨그룹에 있는 Physical Volume을 삭제하는 명령이다. 물론 해당 PV의 PE가 할당되어
           있으면 제거되지 않는다.
   2) 사용법
     vgreduce [option] 볼륨그룹명 PV명
   3) option
     -a : 특별한 PV명이 없을 경우에 비어있는 PV를 모두 제거한다.
   4) 사용예
     [root@www root]# vgreduce lvm00 /dev/hdc1
       => lvm00이라는 볼륨그룹에서 /dev/hdc1을 삭제한다.
(9) lvextend
   1) 설명: Logical Volume의 용량을 확장하는 명령이다.
   2) 사용법
     lvextend 옵션 [볼륨그룹명] LV명
   3) option
     -l +사이즈: 지정한 PE수만큼 용량을 늘린다.
     -L +사이즈[kmgt]: 지정한 사이즈만큼 용량을 늘린다. 단위를 표시하지 않으면 기본 Megabytes
                      단위이다.
   4) 사용예
     [root@www root]# lvextend -L +200M /dev/lvm00/data
       => 기존의 용량에 추가로 200MB를 할당한다.
(10) lvreduce
   1) 설명: Logical Volume의 용량을 줄이는 명령이다. 늘이는 경우와는 다르게 줄이는 경우에는
           데이터가 파괴되므로 주의해야 하고, 파괴된 경우에는 다시 mkfs해서 사용해야 한다.
   2) 사용법
    lvreduce 옵션 [볼륨그룹병] LV명
   3) option
     -l -사이즈: 지정한 PE수만큼 용량을 줄인다.
     -L -사이즈: 지정한 사이즈만큼 용량을 줄인다. 단위를 표시하지 않으면 기본 단위는 Megabytes
                이고, 사이즈단위로는 kKmMgGtT를 사용할 수 있다.
   4) 사용예
     [root@www root]# lvreduce -L -500 /dev/lvm00/data
      => /dev/lvm00/data의 용량을 500MB 줄인다.
(11) lvrename
   1) 설명: 논리적 볼륨의 이름을 변경하는 명령이다.
   2) 사용법
      lvrename 원_논리적볼륨_절대경로 새로운_논리적볼륨_절대경로
      lvrename 볼륨그룹명 원_논리적볼륨명 새로운_논리적볼륨명
   3) 사용예
    ㄱ. [root@www root]# lvrename /dev/lvm00/lvmdata3 /dev/lvm00/data3
         => /dev/lvm00/lvmdata3 라는 논리적 볼륨의 이름을 /dev/lvm00/data3로 바꾼다.
    ㄴ. [root@www root]# lvrename lvm00 lvmdata3 data3
         => /dev/lvm00/lvmdata3 라는 논리적 볼륨의 이름을 /dev/lvm00/data3로 바꾼다. 결과적으
           로 바로 위의 ㄱ번 예제와 같다.
(12) lvremove
   1) 설명: 논리적 볼륨을 제거하는 명령이다. 사용중인 경우에는 제거되지 않으므로 미리 umount를
           해야 한다.
   2) 사용법
     lvremove 논리적볼륨_절대경로
   3) 사용예
     [root@www root]# lvremove /dev/lvm00/lvmdata3
      => /dev/lvm00/lvmdata3라는 논리적 볼륨을 제거한다.
(13) vgchange
   1) 설명: 볼륨그룹을 속성을 변경하는 명령으로 볼륨그룹을 사용가능여부, 최대 LV 갯수등을 변경
           할 수 있다.
   2) 사용법
     vgchange 옵션 볼륨그룹명
   3) option
     -a y|n : 볼륨그룹의 사용여부를 지정한다.
     -l 갯수: 해당 볼륨그룹에 생성할 수 있는 최대 Logical Volume수를 지정한다.
   4) 사용예
    ㄱ. [root@www root]# vgchange -a y lvm00
         => lvm00이라는 볼륨그룹을 활성화시킨다.
    ㄴ. [root@www root]# vgchange -a n lvm00
         => lvm00이라는 볼륨그룹을 비활성화시킨다. 사용중이면 중지시킬 수 없다.
    ㄷ. [root@www root]# vgchange -l 100 lvm00
         => lvm00이라는 볼륨그룹을 최대 Logical Volume수를 100개로 지정한다.
(14) vgremove
   1) 설명: 볼륨그룹을 제거하는 명령이다. 사용중이면 제거가 되지 않는 umount하고 속해있는 LV를
           전부 제거해야 한다.
   2) 사용법
     vgremove 볼륨그룹명
   3) 사용예
     [root@www root]# vgremove lvm00
      => lvm00이라는 볼륨그룹을 삭제한다.
(15) pvmove
   1) 설명: 물리적확장인 PE를 이동시키는 명령이다.
   2) 사용법
     pvmove [option] 장치명 [장치명]
   3) option
     -v: 해당 장치의 정보를 보여준다.
   4) 사용예
    ㄱ. pvmove -v /dev/hda15
         => /dev/hda15의 정보를 보여준다.
    ㄴ. pvmove /dev/hda14 /dev/hda15
         => /dev/hda15의 PE의 내용을 /dev/hda15에 그대로 이동한다.
(16) ext2online
   1) 설명: 바뀐 파일시스템의 크기를 조정하는 명령으로 예전 버전의 resize2fs 명령의 기능을
           한다. resize2fs보다 더 나아진 점으로는 기본적으로 fsck를 수행하고, 또한 mount된
           상태에서 사용가능하다.
   2) 사용법
     ext2online 디바이스 파일명
   3) 사용예
     [root@linux33 ~]# ext2online /dev/lvm0/ldata
      => /dev/lvm0/ldata의 바뀐 파일시스템의 크기를 확인하여 조정해준다.

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

 

1. LVM이란?
(1) 개요: 리눅스 설치시나 하드디스크 추가시에 파티션이라는 것을 나누고 공간을 할당한다. 이
          때 한번 설정한 공간을 고정이 되어 변경이나 추가가 불가능하다. LVM(Logical Volume
          Manager)은 파티션을 원하는 대로 추가하거나 제거하고 그 크기도 조절할 수 있도록
          해주는 방법이다.
(2) 관련용어
   1) 물리적 볼륨(PV:Physical Volume): 실제로 나눈 파티션을 말한다. 즉 /dev/hda8, /dev/hdb1 등
                                      을 말한다. LVM에서는 이러한 물리적 볼륨을 하나의 구성원
                                      으로 받아 들이는 형식이다.
   2) 물리적 확장(PE:Physical Extents): 일종의 블럭같은 것으로 실제 데이터가 저장되는 공간을
                                       말한다. 보통 1PE가 약 4MB정도 차지한다.
   3) 볼륨그룹(VG:Volume Group): 물리적 볼륨이 모여서 하나의 VG를 이룬다. 이것은 더 크게 말하
                                면 지정한 크기의 PE가 모여 생성되는 하나의 큰 덩어리라고 할 수
                                있다.
   4) 논리적볼륨(LV:Logical Volume): 이 논리적 볼륨이 우리가 흔히 쓰는 정규파티션과 같다. 실제
                                    만들어서 사용하는 것이 바로 이 LV이다.

2. LVM 설정하기
(1) 설명: /dev/hda8(약 800MB)과 /dev/hda9(약 800MB)을 lvm이라는 볼륨그룹으로 생성하고 1.2GB는
          /data라는 디렉토리로 400MB는 /backup으로 구성해보자. 여기서 /data는 처음에 1GB로
          할당하고 추가로 영역을 200MB 확장하는 형태로 구성한다.
(2) 설정1 : 1000MB의 /data 로 구성
   1) fdisk를 이용하여 파티션 속성을 변경: fdisk /dev/hda 실행후에 t, 해당 파티션 선택, 8e, w
                                          을 누르고 재부팅한다.
   2) 디스크에 있는 볼륨그룹을 검색하고 /etc/lvmtab 파일 생성
     [root@www root]# vgscan
   3) 물리적 볼륨(PV:Physical Volume) 생성
     [root@www root]# pvcreate /dev/hda8
     pvcreate -- physical volume "/dev/hda5" successfully created

     [root@www root]# pvcreate /dev/hda9
     pvcreate -- physical volume "/dev/hda8" successfully created
   4) 생성된 PV를 특정한 볼륨그룹(lvm)에 추가시킨다.      // 레드햇8에서는 lvm이라는 볼륨그룹
                                                            생성불가
     [root@www root]# vgcreate lvm /dev/hda8 /dev/hda9
     vgcreate -- INFO: using default physical extent size 4 MB
     vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
     vgcreate -- doing automatic backup of volume group "lvm"
     vgcreate -- volume group "lvm" successfully created and activated
   5) 생성된 볼륨그룹 검사한다.
     [root@www root]# vgdisplay -v lvm
     --- Volume group ---
     VG Name               lvm
     VG Access             read/write
     VG Status             available/resizable
     VG #                  0
     MAX LV                256
     Cur LV                0
     Open LV               0
     MAX LV Size           255.99 GB
     Max PV                256
     Cur PV                2
     Act PV                2
     VG Size               1.66 GB
     PE Size               4 MB
     Total PE              424
     Alloc PE / Size       0 / 0
     Free  PE / Size       424 / 1.66 GB
     VG UUID               RBimFr-2W6o-O6Wr-E4Ox-egs1-z87V-cha1DA

     --- No logical volumes defined in "lvm" ---


     --- Physical volumes ---
     PV Name (#)           /dev/hda8 (1)
     PV Status             available / allocatable
     Total PE / Free PE    212 / 212

     PV Name (#)           /dev/hda9 (2)
     PV Status             available / allocatable
     Total PE / Free PE    212 / 212
   6) 논리적 볼륨(LV:Logical Volume) 생성
     [root@www root]# lvcreate -L 1000M -n data lvm
     lvcreate -- doing automatic backup of "data"
     lvcreate -- logical volume "/dev/lvm/data" successfully created
   7) LV생성확인
     [root@www root]# lvscan
     lvscan -- ACTIVE            "/dev/lvm/data" [1000 MB]
     lvscan -- 1 logical volumes with 1000 MB total in 1 volume group
     lvscan -- 1 active logical volumes
   8) VG 확인
     [root@www root]# vgdisplay -v lvm
     --- Volume group ---
     VG Name               lvm
     VG Access             read/write
     VG Status             available/resizable
     VG #                  0
     MAX LV                256
     Cur LV                1
     Open LV               0
     MAX LV Size           255.99 GB
     Max PV                256
     Cur PV                2
     Act PV                2
     VG Size               1.66 GB
     PE Size               4 MB
     Total PE              424
     Alloc PE / Size       250 / 1000 MB
     Free  PE / Size       174 / 696 MB
     VG UUID               RBimFr-2W6o-O6Wr-E4Ox-egs1-z87V-cha1DA

     --- Logical volume ---
     LV Name                /dev/lvm/data
     VG Name                data
     LV Write Access        read/write
     LV Status              available
     LV #                   1
     # open                 0
     LV Size                1000 MB
     Current LE             250
     Allocated LE           250
     Allocation             next free
     Read ahead sectors     1024
     Block device           58:0
    

     --- Physical volumes ---
     PV Name (#)           /dev/hda8 (1)
     PV Status             available / allocatable
     Total PE / Free PE    212 / 0

     PV Name (#)           /dev/hda9 (2)
     PV Status             available / allocatable
     Total PE / Free PE    212 / 174
      => 논리적 볼륨부분이 나타나고 물리적 볼륨에서 /dev/hda8은 모두 사용중인 것으로 나타난다.
   9) 파일시스템 생성
     [root@www root]# mkfs -t ext3 /dev/lvm/data
   10) 마운트하여 사용한다.
      [root@www root]# mount -t ext3 /dev/lvm/data /data
(3) 참고
   1) 설명: LVM을 시스템 재부팅후에도 사용하려면 /etc/fstab파일에 등록하면 된다.
   2) 예
     /dev/lvm/data              /data                ext3    defaults        0 0
(4) 설정2: /data 디렉토리 200MB 추가하기
   1) 설명: /data를 추가하는 방법에는 lvextend 명령을 이용하는 방법과 e2fsadm 명령을 사용하는
           방법 2가지가 있다. 이 두 방법 중 하나로 Logical Volume의 용량을 늘리고, lvscan
           명령을 이용하여 확인한다.
   2) 방법1: lvextend 사용하기
    ㄱ. [root@www root]# lvextend -L +200M /dev/lvm/data
          => 기존의 용량에 추가로 200MB를 할당한다.
    ㄴ. [root@www root]# lvscan
          => LV용량이 늘어난 것을 확인할 수 있다.
    ㄷ. 참고: lvextend로 LV에 할당된 용량을 늘렸다고 하더라도, 해당 디바이스를 다시 마운트하고
             df -h 명령으로 확인해보면 늘어나지 않았음을 알 수 있다. df는  파일시스템 관련
             명령으로 실제 파일시스템이 구성된 영역에 대해 인식한다. lvextend이후에 fsck나
             resize2fs 등의 명령이 추가로 필요하다.
        예) umount /dev/lvm/data
            e2fsck -f /dev/lvm/data
            resize2fs -f /dev/lvm/data
   3) 방법2: e2fsadm 명령이용하기
     [root@www root]# e2fsadm -L +200M /dev/lvm/data
       => e2fsadm 명령은 lvextend 수행후 resize2fs 등을 자동으로 해준다.
(5) 설정3: 남은 공간(약 400MB)를 /backup 디렉토리로 사용하기
   1) 설명: 남은 공간을 확인하려면 vgdisplay -v 명령을 내려서 Free PE값을 확인하고 해당 PE값을
           할당하는 것이 좋다. lvcreate 로 남은 PE값을 지정하고 Logical Volume을 생성한다.
   2) 방법
    ㄱ. [root@www root]# lvcreate -l 124 -n backup lvm
         => lvm이라는 볼륨그룹에 backup 이라는 Logical Volume을 생성하고 크기는 약 124PE
          (약 496MB)를 할당한다.
    ㄴ. [root@www root]# mkfs -t ext3 /dev/lvm/backup
         => 파일시스템을 생성한다.
    ㄷ. [root@www root]# mount -t ext3 /dev/lvm/backup /backup
         => 마운트하여 사용한다.

3. LVM 관련명령어
(1) vgscan
   1) 설명: 디스크에 있는 볼륨그룹(VG:Volume Group)를 검색하여 /etc/lvmtab 파일과 lvm관련 데이타
          파일을 /etc/lvmtab.d디렉토리에 생성한다. fdisk를 이용하여 파티션을 속성을 LVM으로
          지정한 후에 이 명령을 사용한다.
   2) 사용법
     vgscan
(2) pvcreate
   1) 설명: 물리적 볼륨(PV:Physical Volume)을 생성하는 명령어이다. fdisk를 이용하여 파티션을
           분할하고 LVM 속성으로 지정한 뒤에 해당 파티션을 PV로 만들 때 사용하는 명령이다.
   2) 사용법
     pvcreate [option] 디바이스명
   3) option
     -ff : 강제로 생성할 때 쓴다.
   4) 사용예
    ㄱ. [root@www root]# pvcreate /dev/hdb1
          => /dev/hdb1을 물리적 볼륨으로 생성한다.
    ㄴ. [root@www root]# pvcreate -ff /dev/hdb2
          => /dev/hdb2를 오류 등을 무시하고 물리적 볼륨으로 생성한다.
(3) vgcreate
   1) 설명: 볼륨그룹을 생성하는 명령어로 생성된 PV를 지정한 볼륨그룹에 포함시키면서 생성한다.
   2) 사용법
     vgcreate [option] 볼륨그룹명 디바이스명 디바이스명
   3) option
     -s 사이즈[kKmMgGtT]: PE(물리적확장:Physical Extends]의 크기를 지정한다.
   4) 사용예
    ㄱ.[root@www root]# vgcreate lvm00 /dev/hda7 /dev/hdb1
        => lvm00 이라는 볼륨그룹을 생성하고 /dev/hda7, /dev/hdb1 이라는 PV를 포함시킨다.
    ㄴ.[root@www root]# vgcreate -s 16M lvm00 /dev/hda7 /dev/hdb1
         => lvm00 이라는 볼륨그룹을 생성하고, PE의 크기를 16MB로 지정하면서 /dev/hda7,
           /dev/hdb1 이라는 PV를 포함시킨다.
(4) vgdisplay
   1) 설명: 볼륨그룹의 속성과 정보를 보여주는 명령어이다.
   2) 사용법
     vgdisplay [option] [볼륨그룹명]
   3) option
     -v: 좀 더 자세히 보여주는 옵션으로 Volume Group이외에 Logical Volume과 Physical Volume도
        같이 보여준다.
   4) 사용예
    ㄱ. [root@www root]# vgdisplay
         => Volume Group의 내용을 보여준다.
    ㄴ. [root@www root]# vgdisplay -v lvm00
         => lvm이라는 볼륨그룹의 내용을 자세히 보여준다.
(5) lvcreate
   1) 설명: 볼륨그룹안에 LV(Logical Volume)을 생성하는 명령이다.
   2) 사용법
     lvcreate 옵션 볼륨그룹명
   3) option
     -L: LV의 사이즈를 지정하는 옵션으로 K(kilobytes), M(megabytes), G(gigabytes), T(terabyt
        es) 단위를 붙여 지정가능하다.
     -l: LV의 사이즈를 지정하는 옵션으로 pe의 개수로 용량을 지정한다. 참고로 보통 1pe당 4MB
        이다. (참고로 소문자 L임)
     -n: LV의 이름을 지정하는 옵션이다.
     -i: RAID 0같은 stripe 사용시 볼륨이름을 지정하는 옵션이다.
     -I stripe_size: 스트라이프되는 크기를 지정한다. 기본단위가 kilobytes이고 크기는 반드시
                    2의 배수(2^n: n값은 2부터 9)로 지정해야 한다.
     -s: 유동적인 디렉토리 백업에 유용한 snapshot LV를 생성하는 옵션이다.
   4) 사용예
    ㄱ. [root@www root]# lvcreate -L 2000M -n backup lvm00
         => lvm00이라는 볼륨그룹에 backup라는 이름으로 2Gigabytes 용량으로 LV을 생성한다.
           이 경우 /dev/lvm00/backup이라는 디바이스파일이 생성된다.
    ㄴ. [root@www root]# lvcreate -l 250 -n data lvm00
         => lvm00이라는 볼륨그룹에 data라는 이름으로 250pe(약 1GB)용량으로 LV을 생성한다.
           이 경우 /dev/lvm00/data라는 디바이스파일이 생성된다.
    ㄷ. [root@www root]# lvcreate -i 2 -L 1G -n striped_lv lvm00
         => /dev/lvm00/striped_lv 라는 디바이스파일을 생성하고 볼륨 2를 부여한다.
    ㄹ. [root@www root]# lvcreate -s -L 500M -n snap /dev/lvm00/lvmdata4
         => /dev/lvm00/lvmdata4의 snapshot LV인 /dev/lvm00/snap를 500MB 크기로 생성한다.
(6) lvscan
   1) 설명: 디스크에 있는 Logical Volume을 찾아준다.
   2) 사용법
     lvscan [option]
   3) option
     -v: 정보를 자세히 보여준다.
   4) 사용예
     lvscan
(7) lvdisplay
   1) 설명: Logical Volume의 정보를 보여준다.
   2) 사용법
     lvdisplay [option] LV명
   3) option
     -v: 정보를 자세히 보여준다.
   4) 사용예
     [root@www root]# lvdisplay -v /dev/lvm00/data
       => /dev/lvm00/data라는 LV의 정보를 자세히 보여준다.
(8) vgextend
   1) 설명: 미리 생성된 Volume Group에 추가로 Phycical Volume을 추가할 때 사용한다.
   2) 사용법
     vgextend 볼륨그룹명 새PV명
   3) 사용예
     [root@www root]# vgextend lvm00 /dev/hdc1
       => lvm00이라는 볼륨그룹에 /dev/hdc1을 추가한다.
(9) vgreduce
   1) 설명: 볼륨그룹에 있는 Physical Volume을 삭제하는 명령이다. 물론 해당 PV의 PE가 할당되어
           있으면 제거되지 않는다.
   2) 사용법
     vgreduce [option] 볼륨그룹명 PV명
   3) option
     -a : 특별한 PV명이 없을 경우에 비어있는 PV를 모두 제거한다.
   4) 사용예
     [root@www root]# vgreduce lvm00 /dev/hdc1
       => lvm00이라는 볼륨그룹에서 /dev/hdc1을 삭제한다.
(10) lvextend
   1) 설명: Logical Volume의 용량을 확장하는 명령이다.
   2) 사용법
     lvextend 옵션 [볼륨그룹명] LV명
   3) option
     -l +사이즈: 지정한 PE수만큼 용량을 늘린다.
     -L +사이즈[kmgt]: 지정한 사이즈만큼 용량을 늘린다. 단위를 표시하지 않으면 기본 Megabytes
                      단위이다.
   4) 사용예
     [root@www root]# lvextend -L +200M /dev/lvm00/data
       => 기존의 용량에 추가로 200MB를 할당한다.
(11) lvreduce
   1) 설명: Logical Volume의 용량을 줄이는 명령이다. 늘이는 경우와는 다르게 줄이는 경우에는
           데이터가 파괴되므로 주의해야 하고, 파괴된 경우에는 다시 mkfs해서 사용해야 한다.
   2) 사용법
    lvreduce 옵션 [볼륨그룹병] LV명
   3) option
     -l -사이즈: 지정한 PE수만큼 용량을 줄인다.
     -L -사이즈: 지정한 사이즈만큼 용량을 줄인다. 단위를 표시하지 않으면 기본 단위는 Megabytes
                이고, 사이즈단위로는 kKmMgGtT를 사용할 수 있다.
   4) 사용예
     [root@www root]# lvreduce -L -500M /dev/lvm00/data
      => /dev/lvm00/data의 용량을 500MB 줄인다.
(12) lvrename
   1) 설명: 논리적 볼륨의 이름을 변경하는 명령이다.
   2) 사용법
      lvrename 원_논리적볼륨_절대경로 새로운_논리적볼륨_절대경로
      lvrename 볼륨그룹명 원_논리적볼륨명 새로운_논리적볼륨명
   3) 사용예
    ㄱ. [root@www root]# lvrename /dev/lvm00/lvmdata3 /dev/lvm00/data3
         => /dev/lvm00/lvmdata3 라는 논리적 볼륨의 이름을 /dev/lvm00/data3로 바꾼다.
    ㄴ. [root@www root]# lvrename lvm00 lvmdata3 data3
         => /dev/lvm00/lvmdata3 라는 논리적 볼륨의 이름을 /dev/lvm00/data3로 바꾼다. 결과적으
           로 바로 위의 ㄱ번 예제와 같다.
(13) lvremove
   1) 설명: 논리적 볼륨을 제거하는 명령이다. 사용중인 경우에는 제거되지 않으므로 미리 umount를
           해야 한다.
   2) 사용법
     lvremove 논리적볼륨_절대경로
   3) 사용예
     [root@www root]# lvremove /dev/lvm00/lvmdata3
      => /dev/lvm00/lvmdata3라는 논리적 볼륨을 제거한다.
(14) vgchange
   1) 설명: 볼륨그룹을 속성을 변경하는 명령으로 볼륨그룹을 사용가능여부, 최대 LV 갯수등을 변경
           할 수 있다.
   2) 사용법
     vgchange 옵션 볼륨그룹명
   3) option
     -a y|n : 볼륨그룹의 사용여부를 지정한다.
     -l 갯수: 해당 볼륨그룹에 생성할 수 있는 최대 Logical Volume수를 지정한다.
   4) 사용예
    ㄱ. [root@www root]# vgchange -a y lvm00
         => lvm00이라는 볼륨그룹을 활성화시킨다.
    ㄴ. [root@www root]# vgchange -a n lvm00
         => lvm00이라는 볼륨그룹을 비활성화시킨다. 사용중이면 중지시킬 수 없다.
    ㄷ. [root@www root]# vgchange -l 100 lvm00
         => lvm00이라는 볼륨그룹을 최대 Logical Volume수를 100개로 지정한다.
(15) vgremove
   1) 설명: 볼륨그룹을 제거하는 명령이다. 사용중이면 제거가 되지 않는 umount하고 속해있는 LV를
           전부 제거해야 한다.
   2) 사용법
     vgremove 볼륨그룹명
   3) 사용예
     [root@www root]# vgremove lvm00
      => lvm00이라는 볼륨그룹을 삭제한다.
(16) pvmove
   1) 설명: 물리적확장인 PE를 이동시키는 명령이다.
   2) 사용법
     pvmove [option] 장치명 [장치명]
   3) option
     -v: 해당 장치의 정보를 보여준다.
   4) 사용예
    ㄱ. pvmove -v /dev/hda15
         => /dev/hda15의 정보를 보여준다.
    ㄴ. pvmove /dev/hda14 /dev/hda15
         => /dev/hda15의 PE의 내용을 /dev/hda15에 그대로 이동한다.
(17) resize2fs
   1) 설명: 파일시스템의 크기를 늘이거나 줄이는 명령이다. 단, 변경하고자 하는 파티션의 크기는
           미리 늘이거나 줄여져 있어야 한다. resize2fs 명령으로 파티션의 크기까지 조절할 수
           없다.
   2) 사용법
    resize2fs [option] 장치명 [size]
   3) option
     -f: resize2fs는 파일시스템을 분석하여 크기를 늘이거나 줄이는 명령이다. 보통 이 명령을
        수행하기 위해서는 fsck작업을 통해 파일시스템 분석이 되어야 하는데 이 옵션을 사용하면
        fsck작업없이 한번에 가능하다.
   4) 사용예
     ㄱ. resize2fs /dev/lvm00/lvmdata
          => 파일시스템의 크기를 조정한다.
     ㄴ. resize2fs -f /dev/lvm00/lvmdata2
          => fsck 등의 명령없이 파일시스템을 검사하고 파일시스템의 크기를 조정한다.
(18) e2fsadm
   1) 설명: 논리적볼륨의 확장/축소와 동시에 파일시스템의 크기도 조정하는 명령이다.
           즉 lvcreate, lvreduce, resize2fs 등의 명령어 기능을 한번에 한다.
   2) 사용법
     e2fsadm option [+|-]논리적볼륨크기 논리적볼륨_절대경로
   3) option
     -l -/+사이즈: 지정한 PE수만큼 용량을 줄이거나 늘린다.
     -L -/+사이즈: 지정한 사이즈만큼 용량을 줄이거나 늘린다. 단위를 표시하지 않으면
                  기본 단위는 Megabytes이고, 사이즈단위로는 kKmMgGtT를 사용할 수 있다.
   4) 사용예
    ㄱ. [root@www root]# e2fsadm -L +100M /dev/lvm00/lvmdata2
         => /dev/lvm00/lvmdata2의 크기를 100M 확장한다.
    ㄴ. [root@www root]# e2fsadm -L -100M /dev/lvm00/lvmdata2
         => /dev/lvm00/lvmdata2의 크기를 100M 축소한다.
    ㄷ. [root@www root]# e2fsadm -L 50M /dev/lvm00/lvmdata2
         => /dev/lvm00/lvmdata2의 크기를 50M로 한다. 그러나, 기본 PE가 4MB 단위이므로 52MB로
           생성한다.

4. LVM 활용하기
(1) 두 개의 디스크를 하나의 striped LV로 만들기
   1) 개요: LVM과 RAID는 물리적인 여러 디스크를 묶어 하나의 논리적인 디스크처럼 사용할 수
          있다는 점에서 유사하다. 그러나, LVM은 손쉽게 확장이 가능하고, 관리가 용이하다는
          장점이 있고, RAID는 밀러링(Mirroring), 스트라이핑(Striping)등 다양한 형태가
          존재한다. LVM도 RAID-0 처럼 stripe 설정을 하여 여러 디스크를 하나의 디스크로
          묶어서 사용이 가능하다.
   2) 방법
    ㄱ. 120G 짜리 두개의 디스크를 PV로 생성한다.
       예) pvcreate /dev/hdb /dev/hdc
    ㄴ. VG를 생성한다.
       예) vgcreate vg0 /dev/hdb /dev/hdc
    ㄷ. LV를 생성한다.
       예) lvcreate -i 2 -l 4 -L 228G -n sripted_lv vg0
            => 228GB짜리 스트라이핑 LV인 /dev/vg0/striped_lv가 생성된다. -i는 사용되는 PV갯수
              를 지정하는 옵션이고, -I는 저장되는 스트라이프 사이즈를 4KB로 지정하는 옵션이다.
    ㄹ. 파일시스템 생성
       예) mke2fs -j /dev/vg0/striped_lv
    ㅁ. 마운트
       예) mount -t ext3 /dev/vg0/striped_lv /data
(2) 새로운 디스크로 PV 교체하기
   1) 개요: 사용중인 디스크를 용량이 더 큰 새로운 디스크로 교체한 경우 기존디스크의 내용을
           포함하여 PE를 그대로 보존하면서 교체할 수 있다.
   2) 방법
    ㄱ. 기존의 디스크가 /dev/hdc1이고, 새롭게 장착할 디스크가 /dev/hdd1이라고 할 때 먼저
       /dev/hdd1을 PV로 생성한다.
       예) pvcreate /dev/hdd1
    ㄴ. 볼륨그룹에 /dev/hdd1을 포함시킨다.
       예) vgextend lvm00 /dev/hdd1
    ㄷ. 기존의 디스크인 /dev/hdc1의 PE를 /dev/hdd1으로 옮긴다.
       예) pvmove /dev/hdc1 /dev/hdd1
    ㄹ. 기존의 디스크를 볼륨그룹에서 제거
       예) vgreduce lvm00 /dev/hdc1
   3) 참고: pvmove를 이용하면 기존의 PE대로 새로운 디스크에 기존의 디스크의 PE를 그대로 옮겨와
           데이터를 보존할 수 있다. 그러나, 새로운 디스크가 기존의 디스크보다 용량이 클 경우
           나머지 공간을 사용하려면 e2fsadm이나 lvextend, resize2fs를 사용하여 LV를 증가시켜야
           한다. 기존의 LV명을 그대로 승계하므로, 기존의 LV 장치명에 lvextend하면 된다.
(3) snapshot LV를 이용한 백업
   1) 개요: /var이나 데이터베이스관련 디렉토리를 백업할 때 문제점은 데이터의 변동이 심하다는
           것이다. 만약 관련 디렉토리를 LVM으로 구성했을 경우 snapshot LV를 만들어 기존의
           데이터를 고정한 뒤에, snapshot LV의 디바이스파일을 마운트하여 백업하면 좀 더 안전
           하게 백업할 수 있다.
   2) 방법
    ㄱ. 사용중인 LV의 snapshot LV를 생성한다.
       예) lvcreate -s -L 500M -n snap /dev/lvm00/lvmdata4
            => /dev/lvm00/snap 이라는 디바이스파일이 생성된다.
    ㄴ. 생성된 snapshot LV를 마운트한다.
       예) mount -t ext3 /dev/lvm00/snap /backup
    ㄷ. 해당 디렉토리를 백업한다.
       예) tar zcvf backup.tar.gz /backup
    ㄹ. 백업한 후 해당 장치를 제거한다.
       예) umount /backup          또는 umount /dev/lvm00/snap
           lvremove /dev/lvm00/snap
   3) 참고: 생성한 snapshot LV는 사용후에 제거하도록 한다. 그냥 두면 약간의 성능 저하를 유발
           하므로 꼭 제거하도록 한다.

5. LVM 운영과 오류분석
(1) 물리적 볼륨(PV)생성과 오류
   1) 개요: PV를 생성하기 위해 pvcreate 실행하면 간혹 파티션 정보로 인하여 오류가 발생하는
           경우가 있다. 특히 다른 용도로 사용했던 파티션을 fdisk를 이용하여 파티션을 지우고
           다시 생성하여도 계속 오류가 발생하는 경우가 있다. 이 경우 pvcreate 명령에서 -ff
           옵션을 사용하되지만, pvcreate 전에 dd명령으로 파티션 정보를 깨끗히 지워주는 것이
           좋다.
   2) 방법
    ㄱ. [root@www root]# dd if=/dev/zero of=/dev/hda14
    ㄴ. [root@www root]# pvcreate /dev/hda14
(2) 논리적 볼륨(LV)확장과 크기
   1) 개요: 1GB를 할당하여 /dev/lvm00/lvmdata라는 LV를 생성하고 /lvmdata라는 디렉토리로 마운트
           하여 사용하였다. 공간이 부족하여 lvextend로 1GB를 추가로 할당하여 lvscan 명령으로
           확인하면 증가되었다고 나오지만 'df -h' 등의 명령으로 살펴보면 실제사용공간은 늘어
           나지 않음을 알 수 있다. 이 때는 파일시스템 관련명령어인 resize2fs로 크기를 재조정
           해야 한다.
   2) 방법
    ㄱ. umount /lvmdata
         => 사용중인 /lvmdata를 중지시킨다.
    ㄴ. lvextend -L +1G /dev/lvm00/lvmdata
         => 논리적볼륨을 1GB 증가시킨다. 물론 lvextend 명령은 파일시스템을 조작하는 것이 아니
           므로 umount하지 않아도 된다.
    ㄷ. e2fsck -f /dev/lvm00/lvmdata
         => 파일시스템을 검사한다.
    ㄹ. resize2fs /dev/lvm00/lvmdata
         => 변경된 크기로 재조정한다.
           참고로 ㄷ,ㄹ작업을 한번에 resize2fs -f /dev/lvm00/lvmdata 라고 해도 된다.
    ㅁ. mount -t ext3 /dev/lvm00/lvmdata /lvmdata
         => 다시 마운트한다.
    ㅂ. df -h
         => 용량이 변경되었는지 확인한다.
   3) 참고
    ㄱ. 설명: LV확장을 하는 lvextend와 파일시스템을 확장하는 resize2fs 두 명령을 하나의 명령
             으로 가능하다. e2fsadm 명령을 이용하면 된다. 물론 e2fsadm명령을 사용하기 전에
             umount해야 한다.
   ㄴ. 사용예
      [root@linux224 root]# e2fsadm -L +1G /dev/lvm00/lvmdata
(3) lvm정보의 확인: lvm 상태의 확인 /proc/lvm 디렉토리에서도 가능하다. 이 디렉토리 안쪽에
                    VGs라는 디렉토리가 생성되고, 그 안에 LVs, PVs 디렉토리에서 각각 논리적
                    볼륨과 물리적볼륨에 대한 생성내역을 빈파일로 같이 생성하여 목록 등을
                    확인할 수 있다.
(4) LVM 구성시 실패후 재구성하기
   1) 개요: LVM 구성시 VG생성하기 위해 vgcreate하면 오류가 나는 경우가 있는데, 일단 lvm이라
           는 이름으로 VG생성시 레드햇 리눅스버전에 따라 않되는 경우가 있으므로 lvm0등으로
           생성한다. 또한, 처음 생성 실패후 같은 VG이름으로 재시도하는 경우에는 기존의 정보
           를 삭제해야 가능하다.
   2) 방법
    ㄱ. 명령어를 이용하는 방법
        예) vgremove lvm0
    ㄴ. 수동으로 삭제하는 경우
      a. /etc/lvmtab 삭제
       예) rm /etc/lvmtab
      b. /etc/lvmtab.d 디렉토리 삭제
       예) rm -rf /etc/lvmtab.d
      c. /etc/lvmconf 파일의 내용삭제
       예) rf -rf /etc/lvmconf/*
      d. 생성된 디바이스 삭제: vgcreate 명령을 이용하여 볼륨그룹을 생성하면 '/dev/볼륨그룹명'
                              디렉토리에 관련 디바이스가 생성된다. 이 디바이스 파일을 삭제하면
                              된다.

예) rm -rf /dev/lvm0

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

 

1. 리눅스와 보안
리눅스는 UNIX를 모태로 하여 만들어진 운영체제이다. 유닉스에 비해 다양한 하드웨어의 지원, 강
력한 네트워크 기능, 무료 공개 소프트웨어등 여러가지 이점을 가지고 급속도로 보급되어가고 있다.
리눅스의 오픈 정책으로 인하여, 운영체제 커널에서부터 일반 사용자 프로그램까지 거의 모든 것이
공개되어 있다. 이러한 정책은 일반 PC에서도 서버로 사용할 수 있게 되었다. 하지만 소스의 공개
로 인하여 해커들이 쉽게 버그를 찾아내고 테스트할 수 있어 주요 공격 대상이 될 수도 있다. 보안
과 관련된 것은 리눅스뿐만아니라, 윈도우즈계열도 위험하기는 마찬가지이다. 오히려 리눅스는 많은
사람들의 테스트와 계속적인 버그 리포트로 보안관련된 모든 것들도 무료로 지원받을 수 있다. 그러
나, 리눅스는 서버관리자가 지속적인 관심을 가지고 업데이트도 하고, 보안에 관한 기본 설정 또한
할 수 있는 만큼 강화해야 한다.


2. 물리적보안 설정
보안에 있어 가장 큰 선결조건은 바로 물리적 보안이다. 아무리 소프트웨어적으로 보안을 철저히
했더라고 누구나 쉽게 접근이 가능하다면 소용이 없다. 일단 중요한 시스템이라면 관계자이외의
접근을 막아야 한다. 그 다음에 해야 될 것이 BIOS보안이다. 일단 CMOS SETUP에서 플로피디스크나
CD-ROM드라이브로의 부팅을 불가능하게 설정해야 되며 패스워드를 설정하여 시스템을 보호해야 한
다.

3. 불필요한 서비스의 제거
리눅스 설치후에 불필요한 서비스(예를 들면 서버전용으로 사용한다면 X 윈도우도 필요없다)를 찾
아 제거하는 것이 중요하다. 응용프로그램의 버그를 통한 해킹 시도도 빈번하므로 이러한 서비스들
만 제거하더라도 위험요소를 많이 줄일 수 있다.

4. 리눅스 파일과 보안 설정
(1) /etc/lilo.conf : 만약 리눅스가 부팅할 때 부트 프롬프트에서 'single, 'linux single', 'lin
                     ux -s'등으로 부팅하면 1인용 싱글 유저환경으로 들어가게 된다. 이 경우의
                     보안상의 문제는 시스템이 패스워드를 물어 보지 않는데 있다. 이런 상황을
                     막으려면 password를 설정해야 한다. /etc/lilo.conf파일안에 다음과 같이 두
                     라인을 설정한다.
                     password=1234
                     이렇게 설정하면 항시 암호를 물어보고, 1234라고 입력해야 한다. 이렇게 설정
                     하면 모든 레벨에서 암호를 입력해야 가능하다. 일반모드는 그대로 로그인하고
                     특정계층, 즉 /etc/inittab파일에서 기본설정된 런레벨이 아닌경우에만 암호를
                     묻도록 설정할 수도 있다. 이 경우에는 'restricted'라고 추가로 입력하면 된
                     다.
                     password=1234
                     restricted
                     또한, 이렇게 설정했을 경우에는 일반사용자들이 볼 수 없도록 이 파일의 권한
                     도 제한해야 된다.

(참고1) chattr(change attrib)
   1) 설명: Red Hat리눅스에서 사용되는 ext2파일시스템에서만 사용되는 명령어로 루트사용자도
           파일을 변경할 수 없도록 설정하는 명령어이다.
   2) 사용법
     chattr option  filename
   3) option: immnutable 욥션을 사용한다.
     +i : 파일을 수정, 삭제, 이름의 변경과 링크도 만들 수 없도록 설정한다.
     -i : 특수설정을 해제한다.
   4) 특징
     ㄱ. ls명령으로도 설정된 것이 나타나지 않는다.
     ㄴ. 설정유무는 lsattr명령으로 확인해야 한다.
   5) 사용예
     ㄱ. [root@www /etc]# chattr +i /etc/lilo.conf
           => 불변하도록 설정한다.
     ㄴ. [root@www /etc]# lsattr /etc/lilo.conf
         ---i-------- /etc/lilo.conf
           => chattr 명령이 설정되어 있음을 알 수 있다.

(2) /etc/securetty : 콘솔모드에서 root 사용자가 로그인할 수 있는 터미널창의 리스트를 나타낸
                     다. 사용자 로그인과 관련된 데몬이 login 프로그램이다. 이 login프로그램이
                     참조하는 파일이다. 만약 tty1 으로 root사용자의 로그인을 막으려면 그 항목
                     을 삭제하거나 맨앞에 '#'을 표시하면 된다. 참고로 telnet으로 root를 허가하
                     려면 이 파일을 삭제하거나 이 파일안에 pts/0 등을 적어주면 로그인이 가능하
                     다. 그러나, 절대 이러한 설정은 하면 안된다.
(3) /etc/fstab
   1) 설명: /etc/fstab파일은 해당 파티션에 대한 정보를 담고 있는 파일이다. 이 파일을 이용하여
           보안을 강화할 수 있다. 보통 /home과 /var파티션 등에 SUID 및 SGID의 파일을 제한한다.
   2) fstab에서 보안과 관련된 옵션
     - default: 다음과 같이 네가지의 기본값을 가지고 있다.
      a. 부팅할 때 mount -a 명령으로 마운트할 수 있다.
      b. 읽기 및 쓰기 파일시스템으로 마운트된다.(read-write)
      c. setuid와 setgid를 사용할 수 있다. (suid)
      d. 문자장치와 블록장치를 모두 지원한다.
     - usrquota: 사용자의 용량을 제한하는 disk quota를 사용할 때 해당 파티션에 적는다.
     - noquota: 해당파티션에서 사용자들의 quota를 설정하지 않는다.
     - nosuid: 해당파티션에서 SUID나 SGID를 설정을 허용하지 않는다.
     - nodev: 해당파티션에서 문자나 특별한 장치(디바이스)를 허용하지 않는다.
     - noexec: 해당파티션에서 모든 실행 파일들을 실행할 수 없다.
     - suid: 해당 파티션에서 SUID나 SGID의 사용을 허가한다.
     - ro: 해당파티션을 읽기전용(read-only)으로 설정한다.
     - rw: 해당파티션을 읽고 쓰기(read-write)모드로 설정한다.
   3) 사용예
     LABEL=/cache            /cache                  ext3    defaults,nodev        1 2
     LABEL=/home             /home                   ext3    defaults,nosuid        1 2
     LABEL=/tmp              /tmp                    ext3    defaults,nosuid,noexec        1 2
   4) 참고: 변경한 파일시스템 내용을 재부팅없이 mount하기
     mount -o remount /home
(4) /etc/issue : 콘솔창으로 접속했을 때 메시지를 나타내주는 파일로 보통 리눅스에서는 커널의
                 버전의 출력되므로 커널버전의 유출을 막는다.
(5) /etc/issue.net : telnet등 원격으로 접속했을 때 메시지를 나타내주는 파일로 역시 커널의 버
                     전이 출력되므로 내용을 지우거나 변경하여 커널버젼의 유출을 막는다.

(참고2) /etc/issue와 /etc/issue.net의 설정
   이 파일은 현재 리눅스에서는 재부팅하면 다시 리눅스 디스트리뷰더가 지정한 값이 들어가도록
  /etc/rc.d/rc.local파일에 등록되어 있다. 따라서 현재 시스템에서 값을 변경하면 변경한 이후로
  로그인한 사용자에게는 그 내용이 보이지만 만약 시스템을 재부팅하게 되면 다시 기본값이 되므로
  계속적으로 그 값이 반영되도록 하려면 /etc/rc.d/rc.local파일에서 이 두 파일의 관련 부분을
  삭제해야 한다.

(6) /etc/bashrc : 사용자의 파일생성 권한을 설정하는 umask를 지정하는 파일로 가능한 제한된 값
                  으로 조정한다. 주로 쓰이는 값은 022, 033이고, 가장 제한적인 값은 077이다.
(7) /etc/login.defs: 사용자 패스워드의 길이 등을 설정할 수 있는 파일이다. 이 파일의 항목중에
                     'PASS_MIN_LEN    5'의 값을 수정하여 패스워드의 최소길이를 늘이도록 한다.
(8) /etc/profile: root로 로그인한 관리자가 일정시간 동안 작업을 하지 않았을 경우에 접속이
                  끊기도록 설정한다.
                 'TMOUT=시간(초단위)'를 추가한다. 일반사용자는 '~/.bashrc'파일에 넣어 개인적
                  으로 설정할 수 있다.
(9) /etc/security/console.apps: 이 디렉토리에는 일반사용자가 콘솔을 통해 접근할 수 있는 명령
                                어가 들어있다. shutdown, reboot, halt등 시스템과 직접적으로
                                연관있는 명령어를 삭제한다.
(10) /etc/services: 접속포트와 관련있으므로 chattr명령을 사용하여 보호하도록 한다.
(11) /etc/pam.d/su: su(substitute user)명령을 지정한 사용자 이외에 할 수 없도록 설정한다.
                    다음과 같은 두 줄을 삽입한다.
   예) auth sufficient /lib/security/pam_rootok.so debug
       auth required /lib/security/pam_wheel.so group=wheel
        => 이 설정은 su명령으로 root가 될 수 있는 사용자를 wheel이라는 그룹 사용자만 허용하도
          록 설정한 것이다.
(12) /etc/inittab: crtl+alt+del키를 눌러도 셧다운이 되지 않도록 한다. 다음과 같은 항을 찾아
                   주석처리한다.
   예)ca::ctrlaltdel:/sbin/shutdown -t3 -r now
(13) /etc/rc.d/init.d: 이 디렉토리에는 시스템이 부팅할 때 띄워야할 데몬관련 스크립트들이 위
                       치하고 있다. 퍼미션을 root권한자만이 읽고, 쓰고, 실행할 수 있는 상태로
                       설정한다.
(14) /etc/nologin: 이 파일을 생성하게 되면 root이외의 다른 사용자는 로그인을 할 수 없게 된다.
                   보통 이 파일안에는 일반사용자가 로그인시 거부될 때 나타나는 메시지가 기록
                   된다.

5. 기초 보안 설정
(1) 리눅스 설치시에 자동으로 생성되는 계정중에 사용하지 않는 계정은 없애도록 한다. lp, adm,
    sync, shutdown, halt, news, uucp, operator, games, gopher, mail, ftp등이 해당된다. 또한
    계정 삭제후에도 동일한 이름으로 그룹이 생성되어 있을 수도 있으니 /etc/group에서도 삭제
    한다.
(2) root계정의 접속 시간 제한 설정
   1) 설명: root로 로그인한 상태에서는 자리를 비우지 말아야 한다. 자리를 비우는 경우에는 로그
           아웃을 하는 것이 좋다. 그러나 로그아웃을 잊는 경우가 있다. 일정시간뒤에 자동으로
           로그아웃이 되게 설정해보자.
   2) 방법
     /etc/profile에 'TMOUT'라는 변수를 이용하여 설정할 수 있다. 기본 단위는 초이다.
(3) 리눅스 단일 사용자모드의 제한
   1) 설명: 부팅시 'LILO:' 프롬프트에서 'linux single', 'linux 1'등을 입력하면 패스워드를 없이
           부팅가능한 단일 사용자 모드로 부팅이 된다. 이 경우에는 루트패스워드를 바꿀 수 있는
           상태가 된다. lilo를 이용하지 않고 이 모드의 접속시에 루트 패스워드를 입력하도록 설
           정하자.
   2) 방법: /etc/inittab파일에서 'id:5:initdefault:'항목 아래에 '--:S:wait:/sbin/sulogin'이라
           고 입력한다. 그러면 리눅스 단일사용자 모드 부팅시에 패스워드를 물어본다.
(4) 섀도우 패스워드는 꼭 사용하도록 한다. 만약 섀도우 패스워드를 사용하지 않을 경우에는
    pwconv명령을 사용하여 섀도우 패스워드를 사용하도록 한다.
(5) SUID, SGID가 설정되어 있는 프로그램을 찾아 관련없는 프로그램에서 set-bit를 제거한다.
   예) find / -type f \( -perm -4000 -o -perm -2000 \) \-exec ls {} \;
       chmod a-s [program]
(6) 쉘을 사용한 기록관리
   1) 설명: bash에서는 자주 사용하는 명령이나 긴 명령들을 다시 사용하는 history기능을 지원
           한다. 보통 ~/.bash_history에 사용자가 사용한 명령을 1000개 저장한다. 시스템자원을
           아끼고 사용기록을 노출하지 않기 위해 bash가 명령을 조금만 저장하도록 설정하고, 로그
           아웃할 경우에는 이 것을 지우도록 한다.
   2) 사용법
     ㄱ. /etc/profile에서 HISTSIZE의 값을 줄인다.
     ㄴ. /etc/skel/.bash_logout파일에 다음과 같이 명령을 추가한다.
        rm -f $HOME/.bash_history
(7) 프로세스, 메모리등 자원의 사용제한
   1) 설명: 일반사용자들이 프로세스와 메모리 사용량을 제한하여 DOS(Denial Of Service attack)를
           하지 못하게 한다.
   2) 사용법
     ㄱ. /etc/security/limits.conf에서 아래부분의 주석을 풀고 설정한다.
        *               soft    core            0
        *               hard    rss             10000
        *               hard    nproc           20
          => root를 제외한 일반사용자들은 core파일을 생성하지 못하고, 메모리사용량은 10MB로
            제한하고, 프로세스는 20개로 제한한다. *는 서버에 login하는 모든 사용자를 말한다.
     ㄴ. /etc/pam.d/login파일에서 아래부분의 추가한다.
        session    required     /lib/security/pam_limits.so
(8) su 명령어 제한하기
   1) 설명: su 명령은 일반사용자가 root사용자로 전환할 수 있는 명령어이다. 이 명령어를 사용자
           에 따라 제한할 수 있다.
   2) 사용법
    ㄱ. /bin/su 명령어의 퍼미션을 변경한다.
       chmod 4750 /bin/su
        => 일반사용자에게는 어떠한 권한도 주지않고, 그룹에는 읽기와 실행권한을 부여한다.
    ㄴ. /bin/su명령어의 사용자 그룹을 변경한다.
       chgrp wheel su
        => su 실행파일의 그룹을 wheel이라는 그룹으로 변경한다.
    ㄷ. su 명령을 사용할 사용자들을 wheel 그룹에 속하게 한다.
      a. 방법 1: 그룹을 관리하는 파일은 /etc/group이다. 이 파일목록중에서 4번째필드가 추가로
                해당 그룹을 사용자를 지정할 때 쓰는 필드이다.
          wheel:x:10:root,posein
           => posein이라는 사용자를 wheel이라는 그룹으로 지정하였다.
      b. 방법 2: usermod 명령을 사용하여 지정한다.
         usermod -G wheel posein
    ㄹ. xinetd 데몬을 다시 구동한다.
       /etc/rc.d/init.d/xinetd restart

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

 

1. 프록시의 개요
  프록시서버는 보통 네트워크 속도가 느린 환경에서 보다 빠른 인터넷을 이용하기 위해 사용한다.
서비스를 하는 서버에 캐시서버를 만들어 자주 방문하는 사이트를 캐시서버에 저장하여 사용자들이
똑같은 사이트를 접속을 시도할 때 캐시서버의 저장된 데이터 정보를 전달해 줌으로써 속도를 빠르
게 한다. 또한 접근통제 등의 네트워크 보안을 유지할 때도 사용할 수 있다.


2. Squid의 개요 및 설치
(1) 개요: 스퀴드는 리눅스에서 사용하는 프록시서버 프로그램으로 HTTP,FTP캐싱을 지원하고, DNS
          검색 등을 지원한다. 관련사이트는 http://www.squid-cache.org이다.
(2) 설치하기
   1) 최신버전중에서 안정버전으로 /usr/local/src디렉토리에 다운로드한다.
     (squid-2.5.STABLE1.tar.gz)
   2) 소스의 압축을 푼다
     [root@mybestone src]# tar zxvf squid-2.5.STABLE1.tar.gz
   3) 압축이 풀린 디렉토리로 이동한다.
     [root@mybestone src]# cd squid-2.5.STABLE1
   4) 설치될 디렉토리만 설정한다.'
     [root@mybestone squid-2.5.STABLE1]# ./configure --prefix=/usr/local/squid
   5) 컴파일한다.
     [root@mybestone squid-2.5.STABLE1]# make
   6) 설치한다.
     [root@mybestone squid-2.5.STABLE1]# make install

3. Squid설치후 생성되는 디렉토리
(1) bin : squid실행과 관련된 스크립트 프로그램이 있다.
(2) etc : squid관련 환경설정파일인 squid.conf가 위치하고 있다.
(3) libexec : 서버운영과 관련된 스크립트 파일이 있는 디렉토리이다.
(4) lib : 프로그램 개발에 필요한 라이브러리 정보를가진다.
(5) man : man명령관련 정보파일을 가진다.
(6) sbin : squid 서버를 실행하고 관리하는 squid라는 명령이 위치하는 디렉토리이다.
(6) share : squid를 사용하면서 생기는 에러 메시지에 대한 정보 파일을 가진다.
(7) var : 로그 파일에 대한 정보를 가진다.

3. Squid 설정
(1) 환경설정파일: 환경설정파일은 squid.conf이다. 소스로 컴파일했을 경우에 전체경로는 /usr/loc
                  al/squid/etc/squid.conf가 된다.
(2) 주요환경설정
   1) http_port 3128
       => 스퀴드 프록시서버의 서비스포트를 지정해준다. 기본값은 3128이다.
   2) cache_mem 8 MB
       => 스퀴드서버에서 사용하는 캐시 사이즈를 설정해준다.
   3) maximum_object_size 4096 KB
       => 캐시 서버에 저장될 수 있는 객체 즉 파일의 크기를 제한해주는 옵션이다.
   4) cache_dir ufs /usr/local/squid/cache 100 16 256
       => 캐시가 저장될 경로를 지정해주는 항목으로 크기와 생성될 하위 1차 및 2차 디렉토리의 수
         를 지정한다. 현재 설정은 /usr/local/squid/cache디렉토리에 캐시데이터들이 최대 100메가
         까지 저장될 수 있고, 캐시가 저장될 1차디렉토리는 16개로 설정하고 그 밑에 2차디렉토리
         수를 256개로 설정한다.
   5) cache_access_log /usr/local/squid/logs/access.log
       => 접근로그를 기록하는 파일을 설정한다.
   6) cache_log /usr/local/squid/logs/cache.log
       => 캐쉬설정에 관한 로그를 기록하는 파일을 설정한다.
   7) cache_store_log /usr/local/squid/logs/store.log
       => 저장되는 로그를 기록하는 파일을 설정한다.
   8) debug_options ALL,1
       => 스퀴드가 동작할 때 오류체크 기능을 사용하여 로그파일에 기록할 수 있게 하는 옵션이다.
         현재 설정은 모든 항목에 대해 기본적인 값만 로그에 남도록 설정한 것이다.
   9) acl all src 0.0.0.0/0.0.0.0
       => ACL은 Access Control의 약자로 프록시 서버에 접근할 수 있는 범위를 설정하는 옵션으로
         http_access와 함께 사용해야 한다. all의 범위는 src옵션으로 지정한 범위는 속하는 네트
         워크를 지정한다. 현재처럼 0.0.0.0/0.0.0.0으로 설정하면 모든 네트워크에 대해서 프록시
         서버에 접근할 수 있다. 자신의 프록시서버에 제한없이 모든 네트워크들이 접근할 수 있도
         록 설정한 후 httpd_access로 프록시 서버사용권한을 부여할 수 있다.
   10) http_access deny all
       => 클라이언트가 프록시 서버에 접속을 허용할 것인지 거부할 것인지 결정해주는 옵션으로
         acl과 함께 사용된다. http_access다음에 all 또는 deny를 지정하고 acl리스트 중 하나를
         지정해 사용한다.
     사용예)
       ㄱ. acl all src 0.0.0.0/0.0.0.0
           http_access allow all
            => 모든 네트워크들이 자신의 프록시서버를 이용할 수 있게 지정한 것이다. 이 경우에는
              네트워크 트래픽을 초래할 수 있다.
       ㄴ. acl members src 192.168.3.0/255.255.255.0
           acl all src 0.0.0.0/0.0.0.0
           http_access allow members
           http_access deny all
            => 192.168.3.0네트워크주소를 members범위로 규정하여 http_access에서 프록시서버
              접속을 허용하고, 다른 네트워크에 대해서는 접속을 거부한다.
   11) cache_mgr webmaster
        => 캐시서버의 관리자 계정을 지정한다.
   12) cache_effective_user nobody
       cache_effective_group nogroup
        => 스퀴드 서버를 작동시킬 유저와 그룹명을 지정해준다. 보통 둘다 nobody로 설정한다.

4. Squid 실행
(1) 데몬 실행
   1) /usr/local/squid/sbin/squid -z
     => 스왑디렉토리를 초기화한다.
   2) /usr/local/squid/sbin/squid
     => 데몬을 띄운다.
(2) 데몬실행시 오류분석
   1) 서버 호스트네임이 없는 경우: squid -z 실행시 나타난다.
     [root@www193 squid]# sbin/squid -z
     FATAL: Could not determine fully qualified hostname.  Please set 'visible_hostname'

     Squid Cache (Version 2.5.STABLE1): Terminated abnormally.
     CPU Usage: 0.008 seconds = 0.002 user + 0.006 sys
     Maximum Resident Size: 0 KB
     Page faults with physical i/o: 245
     Aborted
      => (해결책)
        squid.conf 에 'visible_hostname 호스트이름'을 지정해 준다.
   2) cache 디렉토리가 없는 경우 : squid -z 실행시 나타난다.
     [root@mybestone /usr/local/squid/sbin]# ./squid -z
     2002/12/02 00:28:18| Creating Swap Directories
     FATAL: Failed to make swap directory /usr/local/squid/var/cache: (13) Permission denied
     Squid Cache (Version 2.5.STABLE1): Terminated abnormally.
     CPU Usage: 0.000 seconds = 0.000 user + 0.000 sys
     Maximum Resident Size: 0 KB
     Page faults with physical i/o: 9
      => 해결책
        ㄱ. mkdir /usr/local/squid/var/cache 해서 디렉토리를 생성한다.
        ㄴ. chmod 777 /usr/local/squid/var/cache해서 권한을 설정한다.
   3) logs디렉토리에 권한이 없는경우
     ㄱ.원인: squid 데몬을 띄운 후 클라이언트가 웹브라우저를 띄우고 프록시 서버를 실제적으로
             사용하면 squid 데몬이 죽는 경우가 발생한다. 직접적인 로그기록(프로세스아이디 등)
             을 할 수 없기 때문에 발생한다.
     ㄴ. 해결책 : nobody가 로그를 기록할 수 있도록 설정한다.
        chmod 777 /usr/local/squid/var/logs

5. Squid 서버 실행절차

(1) squid.conf에서 환경설정을 한다.
    vi /usr/local/squid/etc/squid.conf
(2) cache 영역으로 사용할 공간을 /usr/local/squid/var디렉토리밑에 생성한다.
    mkdir /usr/local/squid/var/cache
(3) 모든 사람들이 접근할 수 있도록 허가권을 설정한다.
    chmod 777 /usr/local/squid/var/cache
(4) 스왑디렉토리(캐시용 디렉토리)를 초기화한다.
    /usr/local/squid/sbin/squid -z
(5) 데몬을 실행한다.
    /usr/local/squid/sbin/squid

6. 클라이언트에서 프록시서버 설정하기
(1) 개요
  웹브라우저마다 다르므로 각 프로그램의 환경설정에서 해주면 된다.
(2) 설정
   1) Explorer
     ㄱ. [도구]-[인터넷옵션]-[연결]에서 LAN설정을 선택한다.
     ㄴ. [프록시서버]에서 프록시서버사용에 체크한다.
     ㄷ. 주소란에 프록시서버 IP주소를 적고 포트는 3128을 적는다.
     ㄹ. [고급]버튼을 클릭하여 [모든 프로토콜에 같은 프록시서버 사용]을 선택한다.
   2) 네스케이프
     ㄱ. [Edit]-[Preferences]-[Avanced]-[Proxies]항목을 선택한다.
     ㄴ. [Manual proxy configuration]를 클릭한 다음 [View]버튼을 누른다.
     ㄷ. 서버와 포트번호를 입력한다.

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

 

1. 삼바(SAMBA)란?
(1) 개요: 마이크로소프트와 인텔은 윈도우시스템이 다른 시스템의 디스크나 프린터같은 자원을
          공유할 수 있도록 Server Message Block(SMB)이라는 프로토콜을 개발하였는데, 삼바란
          이 SMB를 이용하여 리눅스와 윈도우와의 자료 공유 및 하드웨어를 공유할 수 있도록
          해준다. 현재 마이크로소프트에서는 SMB라는 이름보다는 좀 더 범위가 큰 CIFS(Common
          Internet File System)라는 프로토콜로 부른다. 이 프로토콜은 SMB 프로토콜에 LanMana
          ger와 NetBIOS 프로토콜까지 포함한다.
(2) 삼바의 기능
   1) 리눅스파티션과 윈도우와의 공유
   2) 윈도우파티션과 리눅스와의 공유
   3) 리눅스의 프린터와 윈도우와의 공유
   4) 윈도우의 프린터와 리눅스와의 공유


2. 삼바(SAMBA)의 설치
(1) rpm패키지로 설치하기
   1) 설치의 확인
     rpm -qi samba 나 rpm -qa |grep samba 명령등을 내려 삼바가 설치되어 있는지 확인한다.
   2) 설치하기
    ㄱ. 레드햇 리눅스계열을 설치했을 경우에는 CD-ROM드라이브를 마운트한다.
    ㄴ. /RedHat/RPMS디렉토리로 이동한다.
    ㄷ. rpm -Uvh samba* 명령을 내려 설치한다.
(2) 소스로 설치하기
   1) 만약 기존에 삼바가 설치되어 있으면 제거한다.
   2) cd /usr/local/src 명령을 내려 이동한다.
   3) 삼바의 공식사이트인 http://www.samba.org에서 소스파일(samba-2.2.5.tar.gz)를 다운받는다.
   4) tar zxvf samba-2.2.5.tar.gz 명령을 내린다.
   5) cd samba-2.2.5
   6) cd source
   7) ./configure --prefix=/usr/local/samba
   8) make
   9) make install
   10) 삼바소스디렉토리에서 examples라는 디렉토리의 smb.conf.default파일을 /usr/local/samba/
      lib/smb.conf파일로 복사한다.
   11) 삼바를 실행하는 스크립트파일을 /etc/rc.d/init.d/디렉토리에 복사한다. 삼바소스 디렉토리
      에서 packging/RedHat 디렉토리에 보면 삼바구동스크립트파일인 smb.init이 있는데 이 파일을
      samba라는 이름으로 복사한다.
       예) cp smb.init /etc/rc.d/init.d/samba
   12) 데몬실행파일 PATH가 설정된 경로로 복사한다. 보통 소스로 설치하면 데몬을 실행하는 파일인
      smbd와 nmbd가 /usr/local/samba/sbin디렉토리에 있다. 이 경로는 현재 PATH설정이 안 되어있
      으므로 PATH를 설정하거나 /usr/sbin디렉토리에 복사한다.
       예) cp smbd nmbd /usr/sbin

2. 삼바의 구성
(1) 데몬: 삼바를 이용하기 위해서는 두 개의 데몬이 필요하다.
   1) 기본데몬
    ㄱ. smbd: SMB데몬 - 파일과 프린터공유, 사용자의 권한부여 및 확인
    ㄴ. nmbd: 클라이언트를 위해 NetBIOS nameserver를 지원하고 browsing(서비스통지)한다.
   2) 스크립트 데몬파일: 실제 데몬을 구동하고 정지시키는 데몬으로 스타트시키면 smbd와 nmbd
                        데몬을 띄운다.
    /etc/rc.d/init.d/smb start|stop
(2) 환경파일: smb.conf
   1) 개요: smb.conf는 삼바의 환경설정파일로 파일안의 구성은 win.ini와 비슷하다. 크게 Global
           Setting과 Share Denition으로 나누고 다시 각 내용은 [] 기호를 이용하여 섹션(Section)
           으로 구분한다.
   2) 역할: 삼바를 제어하는 환경파일이다. 이 파일에서 외부와 공유시킬 시스템 자원과 어떠한
           제약을 할 것인지를 지정한다.
   3) 위치: 보통 /etc디렉토리에 위치하나 배포판에 따라 /etc/samba디렉토리에 위치할 수도 있다.
   4) 파일내부의 유형
    ㄱ. #으로 시작하는 행: 이 행은 주석처리되어 무시된다.
    ㄴ. ;으로 시작하는 행: 이 행들도 주석행으로 간주되어 무시된다. 보통 이런 행은 설정행이
                          작동하지 않도록 하는데 사용된다. ;대신에 #을 사용해도 된다. 이 두
                          가지 유형의 주석이 사용되는 이유는 #은 유닉스에서 사용하는 주석이고.
                          ;는 윈도우에서 사용하는 주석이라 두 가지 모두 사용한다.
    ㄷ. [ ]을 사용하는 행: 섹션을 정의한다. 하나의 섹션이 정의된 후 그 다음 섹션이 정의될 때
                          까지의 행들은 해당 섹션에 속한다.
    ㄹ. name = value 행: 사용하는 옵션과 해당값을 설정하는 행들이다.
   5) 기본적인 섹션
    ㄱ. [global]: 삼바서버의 전체적인 환경설정을 담당하는 섹션
    ㄴ. [homes]: 사용자들이 자신의 홈디렉토리로 접근할 때의 권한을 설정하는 섹션
    ㄷ. [printers]: 프린터관련 권한을 설정하는 섹션
(3) 실행파일
   1) smbclient
    ㄱ. 설명: 유닉스를 위한 삼바클라이언트 명령어로 윈도우의 서버로 접근하기 위해 사용한다.
    ㄴ. 사용법
       smbclient [option] [접속하고자할 호스트명]
    ㄷ. option
       -L: 접속하고자할 호스트명을 입력한다.
       -U: 접속할 때의 사용자명을 입력한다.
    ㄹ. 사용예
      a. [root@www root]# smbclient -L system2 -U administrator
          => system2라는 호스트에 administrator라는 권한으로 접속한다.
      b. [root@www root]# smbclient -L system2 -U administrator%1234
          => system2라는 호스트에 administrator라는 권한으로 접속하는데 패스워드는 1234이다.
      c. [root@www root]# smbcleint \\\\system2\work -U administrator
          => system2라는 호스트의 work라는 디렉토리를 administrator권한으로 접속한다.
   2) smbmount
    ㄱ. 설명: 공유된 윈도우폴더를 유닉스에서 마운트할 때 사용하는 명령이다.
    ㄴ. 사용법
       smbmount 윈도우호스트의_공유폴더 마운트할_디렉토리명 [-o option]
    ㄷ. option: -o를 기본적으로 적어야 하고 key=value형태로 적는다.
       username: 사용자의 권한을 적는다.
    ㄹ. 사용예
       [root@www root]# smbmount //system2/work /mnt/win -o username=administrator
        => system2의 work라는 공유폴더를 /mnt/win이라는 디렉토리로 마운트한다. 권한자는
          administrator이다.
   3) smbprint: 삼바 호스트의 프린터에 프린트를 하기 위한 스크립트
   4) smbprint.sysv: smbprint와 같지만 System V계열 유닉스에서 사용한다.
   5) smbstatus: 현재의 삼바 연결상태를 보여준다.
   6) smbrun: 삼바 호스트의 응용프로그램 실행을 용이하게 하는 스크립트이다.
   7) testparm
    ㄱ. 설명: 삼바의 환경설정파일인 smb.conf파일의 설정이 제대로 되었는지 확인하는 명령이다.
    ㄴ. 사용법
       testparm [환경설정파일경로] [IP주소]
    ㄷ. 사용예
      a. [root@www root]# testparm
          => 현재 서버에서 /etc/smb/smb.conf파일의 설정을 확인한다.
      b. [root@www root]# testparm /etc/smb/smb.conf 192.168.1.3
          => 192.168.1.3의 IP주소를 갖는 삼바서버의 /etc/smb/smb.conf파일의 설정을 확인한다.
   8) nmblookup
    ㄱ. 설명: WINS 서버에 질의할 때 사용하는 명령이다. DNS서버에 질의하는 nslookup명령과 유사
             하다.
    ㄴ. 사용법
       nmblookup option
    ㄷ. option
       -U: 서버이름을 지정한다. 보통 -R옵션과 같이 사용한다.
       -R: 조회할 이름을 지정한다.
    ㄹ. 사용예
      a. [root@www root]# nmblookup samba.org -R 'IRIX#1B'
          => samba.org 라는 서버에 IRIX#1B라는 이름을 조회한다.
      b. [root@www root]# nmblookup \*
          => 브로드캐스트 영역에 있는 모든 이름을 조회한다.

3. smb.conf를 이용한 세팅
(1) 전체설정(Global Setting)
   1) workgroup = MYGROUP
     => 윈도우의 작업그룹처럼 공유그룹을 지정한다.
   2) server string = Samba Server
     => 서버에 대한 설명을 부여해 준다.
   3) hosts allow = 192.168.1. 192.168.2. 127.
     => 삼바 서버에 접속을 허용할 호스트를 지정하는데 사용한다. 접속할 허용할 호스트는 아이피
       주소, 호스트명 등을 지정할 수 있으며, 네트워크/넷마스크형태로도 지정할 수 있다. 또한
       EXCEPT라는 키워드와 와일드문자도 사용가능하다. 참고로 삼바서버에 접속이 불가능하게 하
       려면 hosts deny로 설정한다.
        예) 1. hosts allow = 192.168.1. 192.168.2. 127.
              => 192.168.1.0 네트워크대역에 속한 모든 호스트들과 로컬시스템(127.0.0.0네트워크)
                에서 접속이 가능하다.
            2. hosts allow = 192.168.1. EXCEPT 192.168.1.220 192.168.1.244
              => 192.168.1.220 과 192.168.1.244를 제외한 192.168.1.0 네트워크에 속한 모든 호스
                트들이 삼바 서버에 접속할 수 있다.
            3. hosts allow = 192.168.1.0/255.255.255.0
              => 192.168.1.0 네트워크에 속한 모든 호스트들의 접속을 허용한다.
            4. hosts allow = posein, xitem
              => posein과 xitem이라는 호스트들만 삼바 서버 접속을 허용한다.
   4) printcap name = /etc/printcap
     => 서버에 의해 사용되는 printcap name을 겹쳐쓰기 하고자 할 때 그 위치를 지정한다.
   5) load printers = yes
     => 삼바 서버의 printcap에 정의된 모든 프린터 목록이 자동적으로 로딩되게 할 것인가를 지정
       하는 옵션이다. 네트워크 프린터를 삼바서버에 연결하여 사용하고자 한다면 선택해야 한다.
   6) printing = lprng
     => 프린터 시스템 종류를 지정하는 옵션으로 비표준 프린터시스템이 아니면 지정할 필요가
       없다.
   7) ;  guest account = pcguest
     => 공유 설정 섹션에서도 사용하는 항목으로, guest ok로 명시되어 있는 서비스에 접근할 유저
       를 지정해 준다. 보통 클라이언트가 손님서비스(guest service)에 접속할 수 있게 된다. 이러
       한 유저는 /etc/passwd파일안에 존재하는 계정이어야 하며, 보통 "nobody"로 설정하면 된다.
   8) log file = /var/log/samba/%m.log
     => 삼바 서버에 접속하는 호스트의 접속 로그에 대한 기록을 저장하는 파일을 지정한다.
   9) max log size = 0
     => 로그 파일의 최대 크기를 KB단위로 제한두려고 할 때 사용되는 옵션이다. 제한을 두었을
       경우에 이를 초과하게 되면 .old확장자를 가진 파일로 저장되고 새로운 파일이 생성된다.
       현재처럼 0으로 설정하면 파일의 크기에 제한을 두지 않는다.
   10) security = user
      => 보안관련 옵션으로 클라이언트가 삼바서버에 접속할 때 인증 레벨을 부여하는 옵션이다.
        보안모드에는 4가지모드가 있는데 user, share, server, domain등이다.
    * 4가지 모드
     user: 삼바 서버에 접속하는 클라이언트는 먼저 반드시 윈도우 시작시 사용자명과 패스워드로
          로그인을 한 후에 삼바 서버에 접속할 때 같은 사용자명으로 패스워드를 확인한 후에
          접속이 이루어진다.
     share: 유효한 사용자명과 패스워드로 삼바 서버에 로그인을 하지 않아도 서버에 접속할 수
           있게 하므로, 삼바 서버 인증과정을 필요로 하지 않을 때 이 레벨로 지정하면 된다. 공
           유 디렉토리 접근에 제한을 두는 경우에 사용할 수 있다.
     server: 윈도우 NT와 같은 다른 삼바 서버가 존재해야 하며, 다른 삼바 서버에 사용자명과 패스
            워드를 전달하여 올바른지를 확인한다.
     domain: 윈도우 NT서버가 있어야 가능하며, 삼바서버가 사용자명과 패스워드를 윈도우NT의 도메
            인 컨트롤러(Domain Controller)에 전달하여 유효한지 확인하는 방법이다.
   11) ;   password server = <NT-Server-Name>
      => 보안옵션에서 server나 domain값을 설정했을 경우에 윈도우 NT같은 다른 삼바서버의
        NetBIOS이름으로 지정한다.
   12) ;  password level = 8
       ;  username level = 8
       => 패스워드 레벨과 유저 레벨을 설정하는 것으로 8개 문자를 사용하도록 설정한다.
   13) encrypt passwords = yes
      => 삼바서버에 클라이언트의 접속이 이뤄지는 과정에서 인증을 위하여 암호화 패스워드 옵션을
        사용할 수 있다. 암호화된 패스워드를 지정하는 옵션이다.
   14) smb passwd file = /etc/samba/smbpasswd
      => 이 옵션은 encrypt passwords항목과 같이 사용되는 것으로 암호화된 삼바 사용자의 아이디
        와 패스워드가 기록되는 파일이다. 이 파일에 패스워드를 추가하는 명령은 smbpasswd이다.
   15) ;  unix password sync = Yes
       ;  passwd program = /usr/bin/passwd %u
       ;  passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password(생략)
      => 클라이언트 호스트에서 사용자의 패스워드를 변경할 수 있도록 해주는 옵션이다. 단, 이
        경우에는 encrypt password, smb passwd file 두 옵션을 반드시 사용해야 한다.
   16) ;  username map = /etc/samba/smbusers
       => 리눅스 사용자 이름과 삼바 사용자 이름이 서로 다를 경우 서로 매핑시키기 위한 사용한
         다.
   17) ;   include = /etc/samba/smb.conf.%m
      => 접속하는 각 클라이언트마다 서로 다른 설정을 사용할 수 있게 해주는 것으로 %m은 접속하
        는 NetBIOS이름으로 대치된다.
   18) socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
      => 사용자의 로컬 네트워크상에서 삼바서버가 최적의 성능을 발휘할 수 있도록 튜닝할 때 사용
        한다. IPTOS_LOWDELAY, IPTOS_THROUGHPUT 등의 옵션이 있다.
   19) ;   interfaces = 192.168.12.2/24 192.168.13.2/24
      => 삼바에 연결된 네트워크 인터페이스를 설정하는 것으로, 인터페이스는 IP/netmask조합으로
        지정할 수 있다. 즉, 위의 설명은 삼바서버가 서로 네트워크 인터페이스를 사용할 때 사용하
        는 것으로 192.168.12.2 호스트와 192.168.2.2 호스트에 연결을 허용한다는 의미이다.
   20) ;   remote browse sync = 192.168.3.25 192.168.5.255
       ;   remote announce = 192.168.1.255 192.168.2.44
      => 동기화시킬 원격 브라우저를 설정하는 부분이다.
   21) ;   local master = no
      => 이 옵션은 삼바서버가 nmbd에 의해 서브넷상에서 로컬마스터브라우저가 될 수 있도록 허용하
        는 것으로 no라고 설정하면 nmbd데몬은 서브넷상에서 로컬 마스터브라우저가 되지 않는다.
   22) ;   os level = 33
      => 삼바서버가 브라우저 선거에 있어서 자신을 알릴 수 있는 레벨을 설정하는 것으로 이 값에
        의해서 nmbd데몬이 로컬브로드캐스트지역에서 WORKGROUP에 대해 로컬마스터 브라우저가 될
        수 있는지 결정된다. 이 값을 0으로 설정하면, nmbd데몬은 윈도우 머신에 대해서 선거권을
        상실하므로 로컬마스터 브라우저가 되질 못한다. (관련문서는 BROWSING.txt)
   23) ;   domain master = yes
      => 이 옵션은 삼바가 도메인 마스터 브라우저가 되도록 해준다. 이것은 삼바와 서브넷간의
        브라우저 리스트를 모집할 수 있게 해준다. 만일 NT도메인 컨트롤러를 가지고 있다면 이
        기능을 사용해서는 안된다.
   24) ;   preferred master = yes
      => 삼바구동시 로컬 마스터 선거를 강요하여 선거에서 이길 수 있게 보다 많은 가능성을 부여
        해주는 옵션이다. 이 옵션은 domain master = yes옵션과 같이 사용하여 nmbd데몬에 의해
        도메인 마스터가 될 수 있도록 해준다.
   25) ;   domain controller = <NT-Domain-Controller-SMBName>

      => 이 옵션은 호환성 문제로 현재는 사용하는 않는다.
   26) ;   domain logons = yes
      => 삼바서버가 WORKGROUP에 윈도우98 도메인 로그온 역할을 할 것인지의 여부를 지정한다.
   27) ;   logon script = %m.bat
       ;   logon script = %U.bat
      => 사용자가 성공적으로 로그인을 하였을 때 다운로드하여 작동할 수 있도록 배치파일(*.bat)
        또는 NT명령파일(.cmd)을 지시해 주는 옵션이다. 배치파일은 마지막 줄에 cr/if가 들어있어
        야 하므로 도스편집기에서 만드는 것을 권장한다. 내용은 사용자가 임의대로 지정할 수 있
        다.
         예) 보통 모든 클라이언트 머신들이 서버와 똑같은 시간에 시간을 맞추도록 할 수 있다.
            NET TIME \\SERVER /SET /YES
   28) ;   logon path = \\%L\Profiles\%U
      => 윈도우98 및 NT에서 user.dat과 같은 로우밍 프로파일(roaming profile)을 어디에 지정할
        것인가를 지정해 주는 옵션이다. %L은 서버의 NetBIOS이름으로 대치되고, %U는 사용자 이름
        으로 대치된다. 이 옵션을 사용할 때 [Profile]공유 항목에서 주석을 풀어 주어야 한다.
   29) ;   wins support = yes
      => 삼바서버에서 nmbd데몬이 wins서버의 역할을 할 수 있는지 여부를 지정한다. 만일 이 옵션
        을 선택하기 위해서는 반드시 다중 서브넷 네트워크를 가지고 있어야 하며, wins서버로 될
        특정 nmbd데몬이 있어야 한다.

    (참고) WINS(Windows Internet Naming Service)
          마이크로소프트 윈도우NT 서버의 일부인 WINS는 각 구성 변경에 수반되는 사용자 또는
         관리자가 없는 IP주소들과 컴퓨터 이름 및 위치들과의 결합을 관리한다. WINS는 컴퓨터
         이름과 IP주소를 서로 매칭시켜 데이터를 테이블내에 자동으로 만드는데, 이 이름들은
         다른 사람의 컴퓨터 이름과 중복되지 않도록 고유한 이름으로 견지한다. 컴퓨터가 다른
         장소로 옮겨지면, IP주소의 서브넷 부분이 변경될 수 있다. WINS를 사용하면 새로운 서
         브넷 정보가 WINS테이블내에서 자동으로 갱신된다. WINS는 어떤 컴퓨터가 네트워크에 처음
         정의될 때 IP주소를 협상하는 NT서버의 DHCP를 보충하여 완전하게 한다.
          예를 들면 같은 네트워크에서 사람이 많아지면 네트워크에 부하도 많이 발생한다. 이 경우
         WINS를 사용하면 컴퓨터이름과 IP목록을 관리해주기 때문에 동보통신에 의한 부담을 줄일
         수 있다.

   30) ;   wins server = w.x.y.z
      => wins 서버가 있을 경우 wins server IP값을 지정하는 옵션이다.
   31) ;   wins proxy = yes
      => nmbd에 의해서 wins기능을 갖추지 못한 호스트들을 대신하여 브로드캐스트 이름 질의를
        대신 응답해 줄 수 있도록 지정해 주는 옵션이다. 이것을 사용하려면 네트워크상에 최소
        하나 이상의 WINS서버가 있어야 한다.
   32) dns proxy = no
      => nmbd데몬이 wins server역할을 하고, 등록되지 않는 NetBIOS이름을 찾아줄 때 DNS server
        를 사용하여 NetBIOS이름을 찾아줄 것인지의 여부를 지정하는 옵션이다.
   33) ;  case sensitive = no
       => 대소문자를 보존할 필요가 있을 때 설정하는 부분이다.

(2) 공유 정의(Share Definitions) : 삼바 서버에 접속할 수 있는 사용자의 홈디렉토리를 설정해
                                   주는 부분이다.
   1) [homes]
       comment = Home Directories
       browseable = no
       writable = yes
        => 사용자의 홈 디렉토리 서비스 사용을 위한 기본적인 설정을 해주는 항목이다. comment는
          간단한 설명문, browseable은 공유이름을 브라우저에 표시할 수 있게 하는 기능, writable
          은 쓰기허용을 설정한다.
   2) [netlogon]
        comment = Network Logon Service
        path = /home/netlogon
        guest ok = yes
        writable = no
        share modes = no
         => 도메인 로그온을 사용하고자 할 때 사용한다. 일반적으로 사용하지 않는다.
   3) [Profiles]
       path = /home/profiles
       browseable = no
       guest ok = yes
        => 특정한 프로파일을 지정할 때 사용한다. 일반적으로 사용하지 않는다.
   4) [printers]
       comment = All Printers
       path = /var/spool/samba
       browseable = no
       guest ok = no
       writable = no
       printable = yes
        => 삼바프린터를 네트워크 공유프린터로 사용하고자 할 경우에 설정한다. BSD계열의 프린터
          시스템을 사용하면 일일이 프린터를 정의하지 않아도 된다.
   5) [tmp]
       comment = Temporary file space
       path = /tmp
       read only = no
       public = yes
        => 여러 사람들이 파일을 공유할 목적으로 유효하게 사용할 수 있다. 현재 기본값인 /tmp
          는 임시작업공간 디렉토리이므로 /var/tmp처럼 다른 디렉토리를 만들어서 사용하도록
          한다.
   6) [public]
       comment = Public Stuff
       path = /home/samba
       public = yes
       read only = yes
       write list = @staff
        => 공개적으로 접근이 가능한 디렉토리이지만 staff그룹에 있는 사용자들을 제외한 사용자
          들은 오직 읽기만 사용가능하다.
   7) 사용자정의 섹션
     예) [posein]
           comment = shared-files in posein directory         // 간단한 설명이다.
           path = /home/posein/pds                      // 공유디렉토리의 경로를 지정한다.
           read only =no    // 공유디렉토리를 읽기만 가능하게 할지를 지정한다.
           writable = yes  // write ok = yes와 같은 옵션으로 쓰기가 가능하다.
           valid user = posein xitem prehee  // 서비스디렉토리에 사용가능한 사용자를 말하며,
                                               만약 이 옵션이 생략되면 모든 사용자가 접근할
                                               수 있다.
           public = no      // guest ok와 같은 옵션으로 no로 설정하면 다른 사용자들은 이용할
                              수 없고 개인사용자만 사용할 수 있게 된다.
           browseable = no  // 이용 가능한 공유리스트를 보여줄 것인가를 지정하는 것으로 no로
                              지정하면 리스트를 보여주지 않는다.
           printable = no   // 서비스로 지정된 디렉토리에 스풀파일을 지정할 것인가를 지정하
                              는 것으로, 프린터 공유 디렉토리가 아니므로 대부분 no로 설정한다.
           create mask =0765 // create mode와 같은 옵션으로 파일을 생성할 때 사용되는 모드를
                               나타낸다.
        (참고) samba 에서 공유디렉토리를 지정할 때 사용하는 옵션 설명
              - read only : 공유 디렉토리를 읽기만 가능하게 할 것인지를 결정
              - writable, write ok : 공유 디렉토리를 쓰기 가능하게 할 것인지를 결정
              - valid users : 공유 디렉토리에 로그인할 수 있는 사용자를 결정
              - public, guest ok : 다른 사용자들이 이용하게 할 지를 결정
              - browseable : 공유 디렉토리의 리스트를 보여줄 지를 결정
              - printable : 공유 디렉토리에 스풀 파일을 지정할 것인지를 결정
              - path : 공유할 디렉토리의 절대경로를 지정
              - comment : 간단한 설명을 적음
              - create mask, create mode : 파일을 생성할 때의 모드를 결정. umask값형태로 지정.
              - write list : 쓰기가 가능한 특정 사용자를 지정

4. 삼바를 이용하여 공유하기
(1) 리눅스 드라이브를 윈도우와 공유하기
   1) /etc/samba/smb.conf파일의 편집
    #======================= Global Settings =====================================
    [global]
     workgroup = WORKGROUP   // 윈도우의 워크그룹과 동일한 그룹을 지정한다.
     server string = FILE SERVER  // 리눅스서버에 대한 설명을 적는다.
     hosts allow = 192.168.0. 203.247.51. 127.  // 접근허용할 네트워크 범위를 지정한다.
     security = share
    #============================ Share Definitions ==============================
    [public]
    comment = samba            // 간단한 설명
    path = /home/posein/samba   // 공유디렉토리 지정
    public = yes
    writable = yes
    printable = no
     (참고) public으로 공유하고 writable = yes이면 공유한 해당디렉토리에 다른 사용자계층의
           퍼미션에서 쓰기권한을 부여해야 한다.
   2) 삼바 데몬을 다시 가동한다.
    /etc/rc.d/init.d/smb restart
   3) 삼바 서버에서 테스트하기
    [root@mybestone /root]# testparm
    Load smb config files from /etc/samba/smb.conf
    Processing section "[homes]"
    Processing section "[printers]"
    Processing section "[public]"
    Loaded services file OK.
    Press enter to see a dump of your service definitions
   4) /etc/hostname이라는 파일을 생성하여 윈도우에서 확인할 이름을 지정한다.
     예) linux
   5) 윈도우에서 확인하기
     네트워크환경 => linux 라는 컴퓨터이름이 생성된다. linux를 더블클릭해서 확인해보면 public
    이라는 공유폴더가 보인다.
   6) smbstatus로 서버 체크하기
    [root@mybestone /etc]# smbstatus

    Samba version 2.2.0
    Service      uid      gid      pid     machine
    ----------------------------------------------
    public       nobody   nobody   14568   posein_note (192.168.0.3) Fri Jul 26 01:18:18 2002

    No locked files
(2) 리눅스 클라이언트에서 윈도우 공유 폴더 접근하기
   1) 윈도우 PC설정 (윈도우 2000기준)
    ㄱ. 전체컴퓨터이름과 작업 그룹명 확인
       바탕화면의 [내컴퓨터]를 오른쪽버튼클릭한뒤 [네트워크식별]항목을 보고 확인한다.
        예) 전체컴퓨터이름: posein_note
            작업그룹: 신경회로망
    ㄴ. 공유할 폴더선택 및 공유설정
    ㄷ. 바탕화면의 [네트워크환경]의 등록정보에서 'Microsoft네트워크 파일 및 프린터공유'가
       있는지 확인한다.
   2) 리눅스에서 윈도우 접근(1): smbclient명령의 이용
    ㄱ. smbclient명령을 이용하여 정보확인하기
       [root@mybestone /etc]# smbclient -L posein_note -U administrator
       added interface ip=203.247.40.252 bcast=203.247.40.255 nmask=255.255.255.0
       added interface ip=192.168.1.1 bcast=192.168.1.255 nmask=255.255.255.0
       Got a positive name query response from 203.247.40.244 ( 203.247.40.244 )
       Password:
        => 패스워드를 입력하면 정보를 보여준다.
    ㄴ. 접근하여 읽거나 쓰기작업하기
       [root@mybestone /etc]# smbclient \\\\posein_note\\work -U administrator
       added interface ip=203.247.40.252 bcast=203.247.40.255 nmask=255.255.255.0
       added interface ip=192.168.1.1 bcast=192.168.1.255 nmask=255.255.255.0
       Got a positive name query response from 203.247.40.244 ( 203.247.40.244 )
       Password:
       Domain=[신경회로망] OS=[Windows 5.0] Server=[Windows 2000 LAN Manager]
       smb: \>
        => 패스워드를 정확히 입력하면 위와 같이 프롬프트가 나타난다. ?를 입력하면 기본적으로
          사용할 수 있는 명령어의 리스트가 나타난다.
   3) 리눅스에서 윈도우접근(2): smbmount명령의 이용- mount명령어와 같은 형식으로 윈도우 공유
                                                    폴더와 그 폴더를 리눅스에서 마운트할 디렉
                                                    토리가 필요하다.
    ㄱ. 마운트한다.
       [root@mybestone /etc]# smbmount //posein_note/work /mnt/win -o username=administrator
       Password:
        => 패스워드를 입력하면 해당디렉토리로 마운트된다. /mnt/win이라는 디렉토리는 생성되어
          있어야 하면 -o는 사용자이름을 지정하기 위한 옵션이다.
    ㄴ. cd /mnt/win으로 이동하여 읽거나 쓰기를 한다.

5. 삼바 User레벨로 사용하기
(1) User레벨관련 주요 파일 분석
   1) /etc/samba/smb.conf
    ㄱ. 설명: 삼바의 환경설정파일로 크게 두 개의 섹션으로 구분되어 있다.
    ㄴ. Section
      a. [global] : 삼바와 관련된 전체적인 환경설정을 하는 부분으로
      b. [share definition] : 공유영역으로 여러 섹션이 존재한다. 주요 섹션은 다음과 같다.
        - [homes] : home디렉토리와 관련된 설정을 할 수 있다.
        - [printers] : 프린터와 관련된 설정을 할 수 있다.
        - [tmp] : /tmp 디렉토리와 관련된 설정을 할 수 있다.
    ㄷ. magic cookies: 삼바의 smb.conf에서도 아래의 magic cookies를 사용할 수 있다.
       %u : 현재 사용중인 유저
       %g : 현재 사용중인 유저 그룹
       %m : 클라이언트의 NetBIOS이름
       %v : 버전
       %h : 호스트이름
       %p : 서버의 홈디렉토리 경로
       %d : 서버의 프로세서ID
       %S : 현재 사용되는 서비스 이름
       %P : 현재 사용되는 서비스의 루트 디렉토리
       %U : 세션의 유저
       %G : 셔션의 유저그룹
       %H : %u로 주어진 유저의 홈디렉토리
       %L : 서버의 NetBIOS이름
       %M : 클라이언트 머신 이름
       %N : NIS 홈디렉토리 서버의 이름
       %I : 클라이언트 머신 IP
       %T : 날짜와 시간
   2) /etc/samba/smbusers : 삼바사용자들을 설정하는 파일이다.
   3) /usr/bin/smaadduser : 삼바사용자들의 패스워드를 등록하는 명령이다.
   4) /var/log/samba : 삼바의 로그가 기록되는 파일이다.
   5) /var/spool/samba : 프린터의 스풀디렉토리이다.
(2)  삼바서버의 인증레벨
   1) 설명: smb.conf파일의 [global]섹션의 security항목에서 설정한다.
   2) security 레벨의 설정
    ㄱ. share : 인증과정을 거치지 않고 접근이 가능하다. smb.conf파일에서 hosts allow항목에 지정
               된 호스트라면 비밀번호없이 삼바를 사용할 수 있다.
    ㄴ. user
      a. 설명: 사용자의 인증을 거치는 레벨이다.
      b. 윈도우 사용자의 접속법 : 삼바서버에 설정한 계정과 패스워드로 접속한다.
      c. smb.conf파일에서의 설정 : [global] 섹션의 encrypt passwords = yes, smb passwd file =
                                  /etc/smbpasswd 설정을 추가로 해야 한다.
      d. 삼바의 사용계정: /etc/passwd에 있는 계정이어야 한다.
      e. 삼바사용자의 지정: smbpasswd 명령을 이용하여 사용자 계정과 비밀번호를 설정한다.
    ㄷ. server
      a. 설명: 사용자 정보를 담고 있는 윈도우서버와 같이 다른 운영체제가 삼바서버에 대한 사용
              자와 패스워드를 인증을 전달하는 방법이다.
      b. smb.conf파일에서의 설정: password server 지시자에 인증할 서버의 IP를 적는다.
    ㄹ. domain : 삼바서버가 윈도우 서버의 도메인 컨트롤러에 사용자명과 패스워드를 전달하여
                인증하는 방법으로 server레벨과 비슷하다.
(3) 삼바관련 명령어
   1) smbpasswd
    ㄱ. 설명: 삼바서버의 사용자 계정을 만들거나 패스워드를 설정하는 명령이다.
    ㄴ. 사용법
       smbpasswd option user_id
    ㄷ. option
       -a : 사용자계정을 추가시에 사용한다.
       -x : 사용자계정을 삭제한다.
   2) smbadduser
    ㄱ. 설명: 삼바서버의 사용자계정을 만드는 명령이다.
    ㄴ. 사용법
       smbadduser 계정명:계정명
        => 콜론(:)을 기준으로 앞의 계정명은 Unix에서 사용할 이름이고 뒤의 계정명은 윈도우에서
          사용하는 계정명이다.
    ㄷ. 사용예
       smbadduser posein:posein
        => posein이라는 사용자를 추가한다.
(4) user레벨로 삼바서버 사용하기
   1) 리눅스서버에서 설정하기
     ㄱ. smb.conf파일 설정
        security = user                // user레벨로 변경

        encrypt passwords = yes       // 활성화시킨다.
        smb passwd file = /etc/samba/smbpasswd   // 활성화시킨다.
     ㄴ. 사용자추가하기
        [root@www samba]# smbpasswd -a posein  // posein이라는 계정을 추가하였다. 리눅스서버의
                                                 계정으로 한다.

        New SMB password:                            // 패스워드를 설정한다. 반드시 리눅스서버의
                                                     //패스워드와 같지 않아도 된다.
        Retype new SMB password:
        unable to open passdb database.
        Added user posein.

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

 

1. NFS(Network File System)이란?
(1) 개요: NFS는 Sun Microsystems사에서 개발된 것으로 TCP/IP네트워크 상에서 다른 컴퓨터의 파일
          시스템을 마운트하고 공유하여 상대방의 파일 시스템 일부를 마치 자기 자신의 디렉토리인
          것처럼 사용할 수 있게 해준다. NFS가 사용되는 주된 이유는 고용량의 하드디스크를 탑재
          하고 있는 몇 대의 워크스테이션이 네트워크의 다른 컴퓨터들에게 파일 시스템서비스를
          해줌으로써 모든 컴퓨터들이 필요 이상의 자원을 가질 필요도 없고 소프트웨어를 여기저기
          깔아둘 필요도 없어지게 된다. NFS는 사용이 편리한 대신에 보안에 상당히 미약하기 때문
          에 주의해서 사용해야 한다.
(2) NFS서버의 설정
   1) 설명: NFS서버는 언제든지 클라이언트가 마운트할 수 있도록 준비되어 있어야 하며 NFS는 rpc.
          mountd와 rpc.nfsd 두 데몬을 가지고 있다. 참고로 /etc/rc.d/init.d/nfs 스트립트를 실행
          하면 이 두 데몬을 실행시킨다.
   2) 관련데몬: NFS를 사용하기 위해서는 다음과 같은 데몬을 실행시켜야 한다.
     ㄱ. netfs: 삼바, NFS, NCP등을 마운트하거나 언마운트해주는 데몬으로 NFS 서버데몬을 띄우기
               전에 미리 실행시켜야 한다.
     ㄴ. nfs: NFS서비스를 해주는 데몬이다. 참고로 이 데몬을 실행시키려면 먼저 /etc/exports
             파일을 설정해야 한다.
     ㄷ. portmap: RPC(Remote Procedure Call)연결에 관여하는 데몬으로 NFS, NIS을 사용할 때 필
                 요함으로 실행시켜야 한다.
     ㄹ. nfslock: 파일잠금을 제공하는데 이것은 동시에 여러 사람들이 동일한 파일을 수정하는
                 것을 막는다.
    (참고) 데몬의 확인
          [root@www init.d]# rpcinfo -p
             program vers proto   port
              100000    2   tcp    111  portmapper
              100000    2   udp    111  portmapper
              100024    1   udp  32768  status
              100024    1   tcp  32768  status
              100011    1   udp   1022  rquotad
              100011    2   udp   1022  rquotad
              100005    1   udp  32771  mountd
              100005    1   tcp  32769  mountd
              100005    2   udp  32771  mountd
              100005    2   tcp  32769  mountd
              100005    3   udp  32771  mountd
              100005    3   tcp  32769  mountd
              100003    2   udp   2049  nfs
              100003    3   udp   2049  nfs
              100021    1   udp  32772  nlockmgr
              100021    3   udp  32772  nlockmgr
              100021    4   udp  32772  nlockmgr
            => (설명)
              rpc.mountd: 외부의 요청에 반응하는 NFS 마운트 프로토콜이다. 클라이언트들이 서버
                         를 이용할 수 있도록 디렉토리를 공유해주는 역할을 한다. NFS는 접속해제
                         방식으로 웹서버처럼 접속요청이 있을 때만 연결이 이루어진다.
              rpc.nfsd: 서버측에서 rpc.mountd에 의해 마운트되면 클라이언트는 rpc.nfsd로 서버에
                       요구를 보내게 된다. 이 요구를 처리하는 주 데몬이다.
              rpc.lockd: 파일잠금을 제공하는데 이것은 동시에 여러 사람들이 동일한 파일을 수정
                        하는 것을 막는다.
              rpc.statd: rpc.lockd와 함께 작동하면 NFS서버가 비정상적으로 종료되었거나 리부팅
                        했을 경우 복구하는 역할을 한다.
              rpc.rquotad: 원격 쿼터 서버로서 NFS서버의 파일 시스템을 마운트한 로컬 유저의 쿼
                          터에 넘겨준다.
          [root@www /]# ps ax
            => rpc.mountd와 nfsd 데몬이 실행중인지 확인하면 된다.
   2) 관련파일: /etc/exports
     ㄱ. 개요: 파일에 마운트를 허가할 디렉토리와 마운트를 허가할 호스트 목록을 설정한다.
     ㄴ. /etc/exports에서 사용가능한 옵션들
        root_squash: 클라이언트에서 루트를 서버상에 nobody사용자로 매핑한다.
        no_root_squash: 서버와 클라이언트 모두 같은 루트(root)를 사용한다. 즉 클라이언트에서의
                       root의 요청을 서버의 root로 매핑한다.
        ro: 파일 시스템을 읽기 전용(read only)로 마운트한다.
        rw: 파일 시스템을 읽고 쓸수 있도록 마운트한다.(read write)
        insecure: 인증되지 않은 접근도 가능하도록 한다.'
        link_relative: 심볼릭 링크를 상대 심볼릭 링크로 바꿀 때 사용한다.
        noaccess: 지정된 디렉토리에는 접근을 금지한다. 특정시스템에 대한 공유 디렉토리 일부를
                 접근 못하게 할 경우에 사용한다.
        (참고) 가장 많이 나오는 옵션으로 root_squash와 no_root_squash가 있는데 squash라는 뜻이
              '짓누르다', '억압하다'라는 뜻이 있다. 따라서 root_squash라는 것은 root를 짓누르
              다. 즉 root사용자를 무시한다는 뜻이고 no_root_squash는 그 반대의 뜻이다.
     ㄷ. /etc/exports파일의 예
        /home/ftp/pub *.sample.com(ro)
        / master(rw) trusty(rw,no_root_squash)
        /projects proj*.local.domain(rw)
        /data 192.168.0.0/255.255.255.0(ro)
        /work 192.168.0.2(rw)
        /pub *(ro, insecure, root_squash)
        /pub/private *.social.com(noaccess)
         => (설명)
           1. /home/ftp/pub디렉토리를 sample.com도메인을 사용하는 모든 사용자가 읽는 것을 허용
             한다.
           2. /디렉토리를 master, trusty호스트가 읽기/쓰기를 허용한다.
           3. 도메인이름이 local.domain이고 호스트이름이 proj로 시작하는 호스트에 대해서 /pro
             jects라는 디렉토리로 읽기/쓰기를 허용한다.
           4. 네트워크주소가 192.168.0 대역에 속한 모든 호스트에 대해서 data디렉토리를 읽기만
             허용한다.
           5. /work 디렉토리를 192.168.0.2 호스트만 read and write권한으로 설정한다.
           6. /pub디렉토리에 읽기전용으로 마운트할 수 있고, 인증없이 마운트가 가능하며 마운트하
             는 모든 컴퓨터의 루트를 서버에서 nobody로 접근할 수 있게한다.
           7. /pub/private디렉토리는 social.com에 해당하는 시스템은 접근할 수 없다.
   3) NFS 서버설정예
     ㄱ. /etc/exports에 설정한다.
       예) /data 192.168.3.220/255.255.255.0(rw)
     ㄴ. 데몬을 띄운다. (netfs, portmap, nfs)
       예) /etc/rc.d/init.d/nfs start
     ㄷ. 해당디렉토리의 퍼미션을 푼다.
       예) chmod 777 /data
(3) NFS 클라이언트에서 사용하기
   1) 설명: 클라이언트에서는 mount명령을 이용하여 NFS서버의 파일시스템을 이용할 수 있다.
   2) 마운트형식
     ㄱ. 명령행에서 마운트하기
        mount -t nfs NFS-서버:Exported디렉토리 마운트포인트
     ㄴ. /etc/fstab에 정의하여 부팅시마다 사용하기
        NFS-서버:/디렉토리   마운트포인트   nfs   options 0 0
   3) 사용예
     ㄱ. mount -t nfs nfs.linux.co.kr:/usr/local /usr/local
        => nfs.linux.co.kr의 /usr/local디렉토리를 자신의 /usr/local디렉토리에 nfs파일시스템
          타입으로 마운트한다.
     ㄴ. mount -t nfs 203.247.xxx.100:/data /pds
        => 203.247.xxx.100의 /data라는 디렉토리를 현재 시스템의 /pds라는 디렉토리로 마운트한
          다.
     ㄷ. /etc/fstab을 이용한 nfs마운트 설정예
        nfs.linux.co.kr:/usr/local   /usr/local   nfs   timeo=15,intr   0 0
         => nfs.linux.co.kr의 /usr/local디렉토리를 자신의 /usr/local디렉토리에 nfs파일시스템
           으로 마운트한다. 타임아웃시간을 1.5초로 하고, 파일시스템을 인터럽트할 수 있는 옵션
           을 설정하였다.
       (참고) /etc/fstab에 사용되는 NFS마운트관련옵션
             timeo=n : RPC 타임아웃이 발생되고 나서 첫번째 재전송 요구를 보낼때 사용되는 시간
                      기본값은 7(1/10초)
             intr : 주 타임아웃이 발생되었을 때 신호를 보내 NFS호출을 인터럽트한다.
             rsize=n : NFS서버로부터 읽어들이는 바이트 수 지정. 기본값은 1024바이트
             wsize=n : NFS서버에 쓰기할 때 사용하는 바이트 수지정. 기본값은 1024바이트
             retrans=n : 주타임아웃을 발생시키는 부타임아웃을 재전송 회수 기본값은 3번의 타임
                        아웃
             port=n : NFS서버와 연결할 수 있는 포트번호 지정
             fg : 첫번째 NFS마운트 시도에서 타임아웃이 발생되면 즉시 중단함. 기본값
             hard : 주타임아웃이 발생되면 server not responding을 출력하고 무한정 재시도
             soft : 주타임아웃이 발생되면 프로그램에게 I/O 에러 보고
   4) 참고: NFS를 사용가능한 지 클라이언트 점검
    ㄱ. 설명: 클라이언트에서 NFS를 사용하기 위해서는 파일시스템에서 nfs를 지원하는지 점검해야
             한다.
    ㄴ. 확인하기
       [root@www root]# cat /proc/filesystems
       nodev   rootfs
       nodev   bdev
       nodev   proc
       nodev   sockfs
       nodev   tmpfs
       nodev   shm
       nodev   pipefs
               ext2
       nodev   ramfs
               iso9660
       nodev   devpts
               ext3
       nodev   usbdevfs
       nodev   usbfs
       nodev   autofs
       nodev   binfmt_misc
       nodev   nfs             // 이 부분이 있어야 한다.
        => /proc/filesystems는 현재 시스템에서 지원하는 파일시스템 목록을 담고 있는 파일이다.
    ㄷ. 나타나지 않는 경우
       modprobe nfs
        => nfs를 모듈로 올린다.
    ㄹ. 모듈로 올릴 때 에러가 발생하는 경우
       커널에서 nfs모듈이 설정되지 않은 경우이다. '/usr/src/리눅스버전'디렉토리로 이동한 뒤에
      make menuconfig를 실행하여 File sysmtem => Network Filesystem => NFS Client 관련항목을
      선택하고 재컴파일한다.
(4) 관련명령어
   1) exportfs
     ㄱ. 설명: NFS에서 익스포트된 리스트를 보여준다.
     ㄴ. 사용법
        exportfs [option]
     ㄷ. 옵션
        -v : 익스포트된 리스트를 자세히 보여준다.
        -r : 익스포트된 내역을 다시 읽어들인다.
     ㄹ. 사용예
        a. [root@www /]# exportfs
           /data           192.168.0.3/255.255.255.0
        b. [root@www /]# exportfs -v
           /data           192.168.0.3/255.255.255.0(rw,async,wdelay,root_squash)
        c. [root@www /]# exportfs -ar
             => 현재 설정된 내역이나 변경된 내역을 다시 읽어들인다.
   2) showmount
     ㄱ. 설명: NFS서버의 마운트된 정보를 보여준다.
     ㄴ. 사용법
        showmount [option]
     ㄷ. option
        -a : host:dir 형태로 출력한다.
        -e : 익스포트리스트를 보여준다.
     ㄹ. 사용예
        a. [root@www /]# showmount
           Hosts on www:
           192.168.0,3
        b. [root@www /]# showmount -a
           All mount points on www:
           192.168.0.3:/data
        c. [root@www /]# showmount -e
           Export list for www:
           /data 192.168.0.3/255.255.255.0

1. 개요
FTP서버란 말 그대로 File Transfer Protocol 서버, 즉 파일을 업로드하고 다운로드할 수 있도록
해주는 서버이다. 리눅스에서 초기에는 Wu-ftp를 주로 사용했지만, 기능이 부족하고 보안상 취약하여
현재는 ProFTPd를 많이 사용하고 있다. 이 ProFTPd를 이용하여 FTP서버를 구축한다.


2. 설치
(1) 설명: Proftpd의 공식사이트는 http://www.proftpd.net이다. 다운로드가 목적이라면 ftp를 이용
          하여 ftp.proftpd.net으로 접속하면 된다. proftpd는 RPM패키지로 설치하거나 소스로 설치
          할 수 있다.
(2) RPM으로 설치하기
   1) ftp.proftpd.net에 접속한 뒤에 anonymous 계정으로 접속한다.
   2) /distrib/packages/RPMS 디렉토리로 이동한다.
   3) 3개의 파일을 다운로드 받는다.
     proftpd-1.2.8rc2-1.i386.rpm
     proftpd-inetd-1.2.8rc2-1.i386.rpm
     proftpd-standalone-1.2.8rc2-1.i386.rpm
   4) 다운받은 파일 중 원래 프로그램파일인 proftpd-1.2.8rc2-1.i386.rpm을 설치한다.
     예) rpm -Uvh proftpd-1.2.8rc2-1.i386.rpm
   5) proftpd를 단독데몬으로 작동하려면 proftpd-standalone-1.2.8rc2-1.i386.rpm를 설치하고
     xinetd데몬으로 작동하려면 proftpd-inetd-1.2.8rc2-1.i386.rpm을 설치한다.
     예) rpm -Uvh proftpd-standalone-1.2.8rc2-1.i386.rpm
(3) 소스컴파일설치하기
   1) ftp.proftpd.net에 접속한 뒤에 anonymous 계정으로 접속한다.
   2) /distrib/source로 이동한다.
   3) 최신 버전인 proftpd-1.2.7.tar.gz을 /usr/local/src에 다운받는다.
   4) 압축을 푼다.
     tar zxvf proftpd-1.2.7.tar.gz
   5) 압축을 푼 디렉토리로 이동한다.
   6) 환경설정을 한다.
     ./configure --prefix=/usr/local/proftpd --enable-shadow
       => --enable-shadow는 자동으로 패스워드를 지원하도록 하는 옵션이다.
         참고로 --sysconfdir=/etc 옵션으로 컴파일하면 /etc/디렉토리에 설치한다.
   7) 컴파일한다.
     make
   8) 설치한다.
     make install

3. ProFTPd서버의 특징
(1) proftpd.conf파일에서 모든 환경설정이 이루어지며, 전체적인 설정구성이 아파치의 환경 설정
   파일과 유사하다.
(2) FTP서버를 독립적인 데몬형태(Standalone)으로 작동시킬수도 있고, xinetd서버로 선택해서
   작동시킬수 있다.

4. proftpd.conf파일 분석
(1) 설명: 보통 이 파일은 /etc 디렉토리에 위치하나 배포판에 따라 /etc/proftpd 디렉토리에 위치
          하기도 한다.
(2) 주요환경설정
   1) ServerName                      "Proftpd FTP Server"
       => 서버의 이름을 나타내는 항목이다.
   2) ServerType                      standalone
       => 서버의 작동모드를 선택하는 부분이다. standalone은 proftpd자체의 데몬으로 독립적으로
         실행시키는 경우이다. 만약 슈퍼데몬인 xinetd에 의해 실행되려면 inetd라고 설정한다.
   3) DefaultServer                   on
       => 하나의 FTP서버에 여러 개의 아이피 주소가 존재할 경우 이들 주소에 대해서 접속요청이
         있을 때 작동할 지를 결정한다. on이면 접속을 허가하고 off면 접속거부메시지를 보여주면
         서 접속이 되지 않는다.
   4) Port                            21
       => 서비스에 사용할 포트를 말한다. 만일 기본 서비스 포트를 변경하고자 한다면 /etc/servi
         ces파일 내에서 ftp서비스의 포트를 변경한 후에 이 옵션에서 변경된 서비스포트로 지정하
         면 된다.
   5) Umask                           022
       => 새롭게 생성되는 파일과 디렉토리 퍼미션에 적용될 마스크를 지정해 준다. 허가권은 디렉
         토리인 경우에는 777, 파일인 경우에는 666에서 이 값을 뺀 값이 기본설정허가권이다.
   6) MaxInstances                    30
       => 서버가 standalone모드로 작동할 때 생성될 수 있는 최대 자식의 프로세스수를 설정한다.
   7) User                            nobody
      Group                           nobody
       => 데몬을 실행할 사용자와 그룹의 소유권을 지정한다. 일반적으로 nobody로 작동된다.
   8) RootLogin                       off
       => root계정으로의 로그인여부를 지정한다.
   9) DeferWelcome                    on
       => 클라이언트가 서버에 접속했을 때 완전한 인증이 이루어질 때까지 호스트의 어떠한 정보
         도 제공하지 않도록 하는 것으로 보안유지를 위해 사용한다. 기본값은 on상태로 사용하면
         된다.
   10) DefaultRoot                   /
        => FTP 서버에 일반 계정으로 접속한 사용자에게 최상위 디렉토리를 지정해주는 것이다.
          만약 위와 같이 / 로 설정하면 / 디렉토리까지 접근가능하다. 일반 계정자의 홈디렉토리를
          최상위로 설정 즉 ~/ 로 하면 홈디렉토리가 최상위가 되므로 그 상위단계로의 접근을 막을
          수 있다. <Anonymous> ~ </Anonymous> 영역내에서는 사용하지 않는다.
   11) <Directory />

       AllowOverwrite                on
       </Directory>
        => 특정한 디렉토리의 권한을 설정하는 부분이다. 현재 설정은 기존에 있던 똑같은 파일에
          덮어쓰기를 허가할 것인지를 나타낸다. 현재 설정은 덮어쓰기를 허가한다.
   12) <Anonymous ~ftp>
        => 익명의 사용자가 로그인할 디렉토리를 지정한다.
       User                          ftp
       Group                         ftp
        => 익명의 사용자의 로그인을 위해 데몬이 ftp 사용자와 그룹으로 작동하게 하도록 하기위한
           설정이다.
       UserAlias                     anonymous ftp
        => anonymous계정이외에도 ftp라는 계정으로도 로그인할 수 있도록 하기 위한 설정이다.
          이 설정을 서버 입장에서 보면 실제 계정은 ftp라는 계정밖에 존재하지 않는다. 그러나 일
          반적인 FTP서버에서는 anonymous라는 계정으로 익명의 접속을 허가한다. 따라서 ftp라는
          계정을 anonymous라는 계정으로 로그인할 수 있도록 해주는 설정이다. 만약, 익명의 계정
          을 park로 허가하려면 "UserAlias               park ftp"로 설정한다.
       MaxClients                    10 "Sorry, maxium users %m -- try again later"
        => 서버에 접속할 수 있는 최대 클라이언트수를 지정한다. 접속차단과 함께 메시지를 보여줄
          수 있으며 %m은 접속할 수 있는 최대 클라이언트수를 나타낸다. 접속자 수를 제한하지
          않으려면 이 값을 none으로 설정한다.
       MaxClientsPerHost             2 "Sorry, Over 2 connection not allow"
        => 한 호스트당 접속할 수 있는 개수를 지정한다.
       DisplayLogin                  welcome.msg
        => 클라이언트가 서버에 접속했을 때 환영메시지를 전달해주는 메시지파일을 지정하는 항목
          이다. 파일은 상대경로나 절대경로로 지정할 수 있으며, 상대경로로 지정할 경우 user가
          접속했을 때 처음 디렉토리를 기준으로 찾게된다. 일반 user의 경우에는 user의 홈디렉토
          리가 기준이 되며, user의 홈디렉토리에 지정한 파일이 있으면 접속시에 메시지를 출력해
          주고 없더라도 파일이 없다는 등의 에러는 발생하지 않는다.
       DisplayFirstChdir             .message  
        => 클라이언트가 cwd명령어를 통해 이동할 때 클라이언트에게 출력할 메시지를 적는 파일을
          지시한다. 즉, 접속한 사용자가 cd명령을 이용해 처음으로 다른 디렉토리로 접근할 때
          접근한 디렉토리에 .message 파일이 잇으면 file의 내용을 보여주게 된다. 이 파일의
          내용은 FTP서버에 접속하여 디렉토리에 처음 접근할 때에만 보여준다.
       RequireVal!idShell             off
        => /etc/shells 파일에 정의되지 않는 shell을 사용하는 유저에게 FTP 접속을 허락하거나
          거절하는 것을 지정하는 항목이다. 기본적으로 ProFTP서버에 서는 on상태이므로 /etc/she
          lls에 User들이 사용하는 shell이 없으면 Login할 수 없게 된다. 그러므로 anonymous User
          로 접속을 하고자 한다면 RequireVal!idShell을 off로 해주어야 login이 된다.
       <Limit> ~ </Limit>
        a. 설명: 주어진 문맥속에서 FTP명령어를 사용하는데 제한을 두기 위하여 사용되는 지시자
                이다.
        b. FTP명령어
          -CWD : 작업 디렉토리를 변경할 때 클라이언트에게 전송
          -MKD : 새로운 디렉토리를 만들 때 클라이언트에게 전송
          -RNFR(Rename From), RNTO(Rename To): 디렉토리 항목의 이름을 변경할 때 클라이언트에게
                                              쌍으로 전송
          -DELE(Delete) : 파일을 삭제할 경우 클라이언트에게 전송
          -RMD : 디렉토리를 삭제할 경우 클라이언트에게 전송
          -RETR(Retrieve): 서버에서 클라이언트로 파일 전송
          -STOR(Store): 클라이언트에서 서버로 파일 전송
          -READ: 파일 읽기를 다루는 모든 FTP명령(디렉토리 목록은 제외)
          -WRITE: 파일 또는 디렉토리 쓰기/생성/삭제를 다루는 모든 FTP명령
          -DIRS: 디렉토리 목록을 다루는 모든 FTP명령(LIST, NLST, CWD)
          -LOGIN: 접속이 제한된 유저들을 anonymous부분에서는 허가할 때 사용한다.
            예) <Limit LOGIN>

                  AllowAll
                </Limit>
          -ALL: 모든 FTP명령
        c. 사용예
          1. <Limit DIRS>
             DenyAll
             </Limit>
              => 익명으로 접속한 후에 해당 디렉토리 상태에서 DIRS에 관련된 모든 명령어는 Deny
                All로 지정하여 모두 실행을 거부하도록 하는 것이다. 이러한 설정을 했을 경우에는
                ls명령을 실행하더라도 목록이 나오지 않지만, cd명령을 사용하여 디렉토리 이동은
                가능하다.
          2. <Limit DIRS READ WRITE>
             Order Allow, Deny
             Allow from 192.168.3.63 192.168.3.64
             Deny from all
             </Limit>

              => Order지시자는 호스트별 허가와 거부정책를 사용하기 위한 설정이고, 실질적인
                설정은 Allow에서 사용허가할 호스트를 지정하고 Deny에서 거부할 호스트를 설정하
                면 된다.
          3. anonymous FTP 설정 예제

User ftp Group ftp UserAlias anonymous ftp MaxClients 10 "최대 접속가능인원은 %m 명 -잠시 뒤에 다시 접속" MaxClientsPerHost 2 "한 호스트당 최대 2명까지입니다!" DisplayLogin welcome.msg DisplayFirstChdir .message RequireVal!idShell off AllowAll Order Allow, Deny Allow from mybestone.com DenyAll AllowAll 4. anonymous FTP 설정 예제(2) - download라는 디렉토리가 anonymous 유저에게 저장만 가능하고, 삭제가 불가능하도록 설정 User ftp Group ftp UserAlias anonymous ftp MaxClients 5 "최대 접속가능인원은 %m 명 -잠시 뒤에 다시 접속" MaxClientsPerHost 1 "한 호스트당 최대 1명까지입니다!" DisplayLogin welcome.msg DisplayFirstChdir .message RequireVal!idShell off AllowAll DenyAll
(3) 유용한 환경설정
   1) DefaultRoot
    ㄱ. 설명: 사용자들을 그룹별로 FTP접속되는 디렉토리를 설정한다.
    ㄴ. 특징
       a. 이 지시자를 사용하면 상위디렉토리를 볼 수가 없다.
       b. <Anonymous>지시자에는 이 기능을 포함하고 있으므로 사용하면 안된다.
    ㄷ. 사용예
      a. DefaultRoot                     ~
          => 최상위 디렉토리를 개인 홈디렉토리로 제한
      b. DefaultRoot                     /home/ftp/ terran, zerg, !protoss
          => terran, zerg그룹은 /home/ftp로 설정하고 protoss그룹은 제외한다.
   2) HiddenStor             on/off
     => on으로 설정하면 업로드중인 파일이 다운로드되는 것을 막을 수 있다.
   3) HiddenNoAccess
     => <Directory> 또는 <Anonymous>로 지정되어 있는 블럭에 로그인했을 경우 접근
       권한이 사용자에게 디렉토리를 보이지 않게 한다. 보통 "Permission denied"의 에러메시지를
       받는 디렉토리에 대해서 디렉토리를 볼 수 없도록 한다.


5. ProFTPd를 xinetd데몬으로 실행하기
(1) 설명: standalone모드가 아닌 xinetd로 작동하기 위해서는 /etc/xinetd.d디렉토리에 proftpd
          설정서비스 파일이 존재해야 한다.
(2) 설정하기
   1) proftpd.conf에서 "ServerType                    inetd"로 바꾼다.
   2) xinetd 서비스와 관련된 디렉토리인 /etc/xinetd.d 에 다음과 같은 형식으로 만든다.
     [root@www xinetd.d]# cat proftpd
     service ftp
     {
             disable                 = no                 // 이 부분의 값이 no 이어야 한다.
             flags                   = REUSE
             protocol                = tcp
             socket_type             = stream
             instances               = 50
             wait                    = no
             user                    = root
             server                  = /usr/sbin/in.proftpd
             log_on_success          = HOST PID
             log_on_failure          = HOST RECORD
     }
   3) xinetd데몬을 재가동한다.
     [root@www xinetd.d]# /etc/rc.d/init.d/xinetd restart

5. ProFTPd 기타설정
(1) 일반 계정으로 anonymous 사용하기 : movie라는 계정으로 anonymous사용하기
   1) movie라는 계정을 추가한다.
     useradd movie
   2) movie라는 계정이 텔넷같은 기타다른 접속을 막는다.
     vi /etc/passwd로 movie의 shell을 /bin/false로 바꾼다.
   3) proftpd.conf 파일 설정하기
User movie Group movie UserAlias anonymous movie MaxClients 10 "Sorry, maxium users %m -- try again later" MaxClientsPerHost 2 "Sorry, Over 2 connection not allow" DisplayLogin welcome.msg DisplayFirstChdir .message RequireVal!idShell off AllowAll 4) proftpd 데몬을 재시작한다.
(2) welcome.msg파일을 만들어 보자.
   1) 설명: welcome.msg파일은 접속시에 메시지를 보여주는 파일이다. 이 메시지파일은 Magic
           cookie라는 것을 사용하여 편리하게 정보를 보여준다.
   2) magic cookie
     %T : 현재 시간을 출력한다.
     %F : 사용가능한 하드 디스크 공간을 출력한다.
     %C : 현재 작업 디렉토리를 출력한다.
     %R : 원격 호스트 이름을 출력한다.
     %L : 로컬 호스트 이름을 출력한다.
     %u : ident프로토콜에 의해 확인된 사용자명을 출력한다.
     %U : 로그인시 사용된 사용자명을 출력한다.
     %M : 접속 가능한 최대 사용자수를 출력한다.
     %N : 현재 접속되어 있는 사용자수를 출력한다.
     %E : 서버 관리자의 메일 주소를 출력한다.
     %x : 사용자 클래스의 이름을 출력한다.
     %y : 사용자 클래스의 현재 접속 개수를 출력한다.
     %z : 사용자 클래스의 최대 접속 개수를 출력한다.
   3) 설정예
     --------------------------------------------------------------
     환영합니다.
     마이베스트 입니다.

        - 시스템 정보 -
     현재 당신이 접속한 서버는 %L입니다.
     남은 용량은 %F KB
     현재 접속자수는 %N / %M  입니다. (현재인원/총접속가능한 인원)
     당신은 %R에서 %U라는 사용자명으로 접속하였습니다.
     현재시각은 %T 입니다.
     문의하실 사항은 %E로 보내주세요.
   4) 접속 결과
     --------------------------------------------------------------
     환영합니다.
     마이베스트 입니다.

       - 시스템 정보 -
     현재 당신이 접속한 서버는 mybestone.com입니다.
     남은 용량은 3540236 KB
     현재 접속자수는 1 / 10  입니다. (현재인원/총접속가능한 인원)
     당신은 203.247.40.248에서 movie라는 사용자명으로 접속하였습니다.
     현재시각은 Thu Oct 10 03:06:36 2002 입니다.
     문의하실 사항은
root@mybestone.com로 보내주세요.
(3) Virtual Host 설정해보자
   1) 조건
     ㄱ. 가상 호스트 이름: ftp.linux.com
     ㄴ. 가상 호스트가 사용할 포트번호: 12345번
     ㄷ. 접속한 사용자들이 자신의 홈디렉토리를 벗어나지 못하도록 설정
   2) 설정예
     <VirtualHost ftp.linux.com>
          Port 12345
          DefaultRoot ~
     </VitrualHost>
(4) Root로 로긴하기
   1) FTP서버에 접속시 거부목록파일 역할을 하는 /etc/ftpusers 파일에서 root라는 계정을 삭제
     한다.
   2) proftpd.conf 파일에서 다음과 같은 지시자로 설정해준다.
     RootLogin                       on
   3) proftpd 데몬을 재시작하거나 xinetd 데몬을 재시작한다.

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

 

1. 개요
리눅스에서 FTP서버를 사용하기 위해서는 FTP서버 프로그램을 설치해야 하는데, 대표적인 프로그램
이 두가지가 있다. 하나는 Wu-ftpd라는 프로그램으로 원래 리눅스에서 전통적으로 사용하던 프로그램
이다. 또 다른 하나는 Pro-FTPd라는 프로그램으로 보안상 안전하고 설정이 아파치 웹서버 프로그램이
랑 유사하다. 여기서는 레드햇 8.0에 기본으로 설치되어 있는 Wu-ftpd에 대해 알아본다.


2. Wu-ftpd서버 데몬 작동시키기
(1) 설명: Wu-ftp는 슈퍼데몬인 xinetd에 속해 있다. xinetd에 속해있는 데몬들이 위치해 있는 디렉
         토리인 /etc/xinetd.d에서 wu-ftpd라는 파일의 설정을 바꿔주면 된다.
(2) 방법
   1) 파일을 직접 변경하기
     ㄱ. 기본 설정예
        [root@www root]# cat /etc/xinetd.d/wu-ftpd
        # default: on
        # description: The wu-ftpd FTP server serves FTP connections. It uses \
        #       normal, unencrypted usernames and passwords for authentication.
        service ftp
        {
                disable = yes
                socket_type             = stream
                wait                    = no
                user                    = root
                server                  = /usr/sbin/in.ftpd
                server_args             = -l -a
                log_on_success          += DURATION
                nice                    = 10
        }
          => 데몬 작동과 관련된 항목이 disable 항목인데 이 값이 yes라서 wu-ftp가 작동하지 않는
            다. 이 값을 no 라고 바꾼다.
     ㄴ. 변경후에 xinetd 데몬을 다시 구동한다.
        service xinetd restart
   2) chkconfig 명령어 이용하기
     ㄱ. [root@www root]# chkconfig wu-ftpd on
           => 이 명령을 시행하면 /etc/xinetd.d/wu-ftpd라는 파일의 disble항목값이 no로 바뀐다.
     ㄴ. 변경후에 xinetd 데몬을 다시 구동한다.
        service xinetd restart

3. Wu-ftp서버 작동 유무 테스트하기
(1) 설명: 기본 FTP 포트인 21번 포트로 접속을 해본다.
(2) 방법
    [root@www root]# telnet localhost 21
    Trying 127.0.0.1...
    Connected to www (127.0.0.1).
    Escape character is '^]'.
    220 www FTP server (Version wu-2.6.2-8) ready.
     => FTP서버가 작동중임을 알 수 있다. 'quit'라고 치면 접속에서 빠져나온다.

4. Wu-ftp서버 관련파일
(1) /usr/sbin/in.ftpd: 실제 wu-ftp 서버의 데몬으로 기본적으로 xinetd에 의해 관리된다.
(2) /etc/ftpaccess: FTP서버에 접근 관련 설정파일이다.
(3) /etc/xinetd.d/wu-ftpd: xinetd 데몬관련 서비스 파일이다.
(4) /etc/ftpusers: FTP서버를 이용할 수 없는 유저의 목록파일이다. 기본적으로 root 계정도 이용
                   불가이므로 root계정자가 ftp를 사용하려면 이 파일목록에서 삭제해야 한다.
(5) /etc/ftphosts: 특정호스트의 FTP서버 접근 허용 유무를 설정하는 파일이다.

5. Wu-ftp서버 환경 설정
(1) /etc/ftpaccess
   1) 설명: Wu-ftp의 주 환경설정 파일이다.
   2) 기본설정과 주요항목 설명
     [root@www root]# cat /etc/ftpaccess
     This file controls the behavior! of the wu-ftpd
     # ftp server.
     #
     # If you're looking for a graphical frontend to
     # editing it, try kwuftpd from the kdeadmin
     # package.

     # Don't allow system accounts to log in over ftp
     deny-uid %-99 %65534-
     deny-gid %-99 %65534-
     allow-uid ftp
     allow-gid ftp           // 접근을 허가할 사용자와 거부할 사용자를 지정하는 부분이다. 현재
                             //설정은 uid값이 처음부터 99까지와 65534가 넘어가는 사용자는 접속
                             //을 거부한다는 뜻이고, gid도 같은 설정이다. 위에 속해있는 uid/gi
                             //d에서 ftp사용자는 허가한다는 뜻이다.


     # Chroot all users to their home directory by default
     # (comment this out if you don't want to chroot most of your users)
     guestuser *        // 모든 사용자를 guest취급한다. 즉 anonymous처럼 자기 홈디렉토리가
                        //최상위 root디렉토리로 된다.
     # If you wish to allow user1 and user2 to access other
     # directories, use the line below:
     # realuser user1,user2               // 실제 유저로 인정할 계정을 적는다.


     # The ftpchroot group doesn't exist by default, this
     # entry is just supplied as an example.
     # To chroot a user, modify the line below or create
     # the ftpchroot group and add the user to it.
     #
     # You will need to setup the required applications
     # and libraries in the root directory (set using
     # guest-root).
     #
     # Look at the anonftp package for the files you'll need.
     guestgroup ftpchroot           // 게스트그룹으로 인정할 그룹명을 적는다.

     # User classes...
     class   all   real,guest,anonymous  *     
       // FTP서버에 접속하는 사용자와 방법, 접속자의 주소를 지정한다. 기본 형식은 아래와 같다.
       // class <class> <typelist> <addrglob> [ <addrglob> ...]
       //<typelist>는 'anonymous','guest','real'이라는 keyword가 존재하며 이 3개의 키
       //워드는 콤마(comma)로 구분하고, 각각의 사이에 공백을 넘어서는 안된다.. 'real'은 실제
       //사용자계정을 말하며, anonymous는 anonymous FTP를 위한 사용자(anonymous, ftp)를 말하고,
       //guest는 손님사용자로 처리되는 사용자를 말한다. addrglob는 ftp서버에 접속하는 사용자의
       //주소를 적는다. 도메인 이름이나 IP주소로 지정하며, 와일드문자와 여러 개의 주소도 지원
       //한다.

       // 위의 예는 all이라는 class를 지정하는 것이다. typelist에  real,guest,anonymous 라고
       //지정되어 있는데, real값이 가장 먼저 나왔으므로 ftp접속사용자와 실제 계정사용자와 일치
       //하는 지를 구별한 뒤에 해당 계정의 홈 디렉토리로 접속시킨다.
     # Set this to your email address
     email root@localhost              // ftp서버의 관리자 이메일 주소를 설정한다.

     # Allow 5 mistyped passwords
     loginfails 5                     // 지정한 로그인회수 만큼 실패하면 FTP연결을 끊는다.

     # Notify the users of README files at login and when
     # changing to a different directory
     readme  README*    login           
     readme  README*    cwd=*       // 이 설정은 안내파일인 README파일이 존재할 경우 README
                                    //파일을 존재한다고 알려주는 역할을 한다. login은 로그인
                                    //할 때 알려준다는 뜻이고, cwd는 특정디렉토리로 이동시에
                                    //알려준다는 뜻이다.

     # Messages displayed to the user
     message /welcome.msg            login     
     message .message                cwd=*     // 로그인시나 디렉토리이동시에 해당 파일의 내용
                                               //을 보여준다. 여기서 참고할 점은 /welcome.msg
                                               //이다. 만약 해당 사용자를 realuser로 등록하면
                                               //로그인 경로가 '/home/사용자계정명'이 되므로
                                               //realuser설정과 비교하면서 설정해야 한다.

     # Allow on-the-fly compression and tarring
     compress        yes             all
     tar             yes             all     // compress와 tar사용을 가능하게 한다. 실제전환은
                                             //외부파일인 /etc/ftpconversions에 의해 정의되어
                                             //진다.

     # Prevent anonymous users (and partially guest users)
     # from executing dangerous commands
     chmod           no              guest,anonymous
     delete          no              anonymous
     overwrite       no              anonymous
     rename          no              anonymous          // 특정한 명령에 대한 사용자들의 사용
                                                        //허가여부를 지정한다.

     # Turn on logging to /var/log/xferlog
     log transfers anonymous,guest,real inbound,outbound  
     // FTP사용자들의 자료전송과정을 /var/log/xferlog'에 기록하도록 하는 설정이다. 현재 설정의
     //예는 'anonymous,guest,real 사용자들의 inbound(서버안으로 파일을 전송하는 것), outbound
     //(서버에서 밖으로 파일이 전송되는 것)를 기록한다.

     # If /etc/shutmsg exists, don't allow logins
     # see ftpshut man page
     shutdown /etc/shutmsg        // shutdown 명령뒤에 있는 해당파일이 존재하면 ftp접속허가를
                                  //불허하고 그 안의 메시지를 보여준다. 참고로 이 메시지는
                                  //realuser로 등록된 사용자에 한하여 적용된다.

     # Ask users to use their email address as anonymous
     # password
     passwd-check rfc822 warn    // 익명사용자에 대한 패스워드 점검 방법을 지정한다.


6. Wu-ftp서버 환경 응용예
(1) root사용자 허가하기
   1) /etc/ftpusers 에서 root 계정을 삭제하거나 주석처리한다.
   2) /etc/ftpaccess에서 allow-uid 및 allow-gid로 root계정을 설정한다.
     예) allow-uid root
         allow-gid root
          => 다른 계정사용자를 추가로 지정하려면 한 칸 띄우고 계정명을 입력한다.
            예)
                allow-uid ftp root
                allow-gid ftp root
   3) xinetd 데몬을 재시작한다.
     service xinetd restart
(2) 일반사용자를 실제사용자로 인식시키기
   1) 설명: wu-ftp의 기본 설정은 모든 사용자를 guest로 유저로 본다. 즉, 자기 계정으로 접속한다
           고 하더라도 자기 홈디렉토리가 '/'로 인식한다. 특정한 사용자를 실제사용자로 인식시키
           면 자기가 실제 접속한 디렉토리로 확인가능하고 상위의 디렉토리로 이동이 가능하다.
   2) 방법: /etc/ftpaccess 파일항목에서 realuser라는 부분이 주석처리 되어 있는데, 주석처리를
           없애고, 사용할 계정을 적는다.
     ㄱ. vi /etc/ftpaccess 파일을 연다.
     ㄴ. 'realuser 계정명' 을 적는다.
        예) realuser posein
     ㄷ. xinetd 데몬을 재가동한다.
(3) /etc/ftpaccess의 class 사용예
   1) class   all   anonymous   *
       => 모든사이트(*)에서 접속하는 모든 사용자는 all이라는 클래스로 정의되어 익명으로 접속할
         수 있다.
   2) class   member   real   203.247.xxx.100 203.247.xxx.101 210.184.xxx.241
       => 203.247.xxx.100 203.247.xxx.101 210.184.xxx.241라는 네트워크 주소로 접속하는 사용자
         들은 member라는 클래스로 정의되고, 모든 실제 계정으로만 접속가능하고, anonymous접속
         및 guest접속은 허가하지 않는다.
   3) class   member   real,anonymous   *
       => 모든 사이트로부터 접속하는 사용자들은 member라는 클래스로 정의되고, 계정접속을 시도
         하면 계정으로 접속을 처리하고, 계정이 없으면 익명 접속으로 처리한다.
(4) /etc/ftpaccess의 readme 사용예
   1) 기본설정예
     readme  README*    login
     readme  README*    cwd=*
       => 현재 기본 설정상태이다. 이 상태에서 개인 홈디렉토리에 README파일을 생성해보자.
         (접속예) Please read the file README
                  it was last modified on Tue Feb 18 00:47:20 2003 - 0 days ago
   2) 응용예
     readme /home/posein/README       login
     readme /home/posein/pds/README   cwd=*
      => /home/posein이라는 디렉토리로 접속했을 때 README파일이 존재하면 존재한다는 메시지를
        보여주고 또한 /home/posein/pds 디렉토리로 이동시 README파일이 존재하면 존재한다는 메
        시지를 보여준다.
(5) /etc/ftpaccess의 message 사용예
   1) 기본설정예
     message /welcome.msg            login
     message .message                cwd=*
      => 이 설정상태에서 개인 사용자의 홈디렉토리에 welcome.msg파일을 만들고 안에 메시지글을
        작성하면 로그인시에 보이고, 또한 특정디렉토리에서 .message라는 파일을 생성하고 그 파일
        안에 메시지글을 작성하면 디렉토리 이동시에 글이 보인다.
   2) Magic Cookies
    ㄱ. 설명: 메시지파일 작성시에 지원하는 특별한 형태의 값이다. 다른 FTP서버 프로그램인 Pro-
             FTP도 같이 지원한다.
    ㄴ. 종류
       %T : 현재 시간을 출력한다.
       %F : 사용가능한 하드 디스크 공간을 출력한다. (모든 시스템을 지원하지는 않는다.)
       %C : 현재 작업 디렉토리를 출력한다.
       %R : 원격 호스트 이름을 출력한다.
       %L : 로컬 호스트 이름을 출력한다.
       %u : ident프로토콜에 의해 확인된 사용자명을 출력한다.
       %U : 로그인시 사용된 사용자명을 출력한다.
       %M : 접속 가능한 최대 사용자수를 출력한다.
       %N : 현재 접속되어 있는 사용자수를 출력한다.
       %E : 서버 관리자의 메일 주소를 출력한다.
       %x : 사용자 클래스의 이름을 출력한다.
       %y : 사용자 클래스의 현재 접속 개수를 출력한다.
       %z : 사용자 클래스의 최대 접속 개수를 출력한다.
    ㄷ. 설정예
       --------------------------------------------------------------
       환영합니다.
       마이베스트 입니다.

          - 시스템 정보 -
       현재 당신이 접속한 서버는 %L입니다.
       현재 접속자수는 %N / %M  입니다. (현재인원/총접속가능한 인원)
       당신은 %R에서 %U라는 사용자명으로 접속하였습니다.
       현재시각은 %T 입니다.
       문의하실 사항은 %E로 보내주세요.
    ㄹ. 접속 결과
       --------------------------------------------------------------
       환영합니다.
       마이베스트 입니다.

         - 시스템 정보 -
       현재 당신이 접속한 서버는 mybestone.com입니다.
       현재 접속자수는 1 / 10  입니다. (현재인원/총접속가능한 인원)
       당신은 203.247.40.248에서 movie라는 사용자명으로 접속하였습니다.
       현재시각은 Thu Oct 10 03:06:36 2002 입니다.
       문의하실 사항은
root@mybestone.com로 보내주세요.
(6) /etc/ftpaccess의 shutdown 사용예
   1) 기본설정예
     shutdown /etc/shutmsg
      => /etc/shutmsg 파일을 생성하여 설정하면 된다.
   2) 메시지파일 : 전달메시지부분에 magic cookies를 사용할 수 있다.
    ㄱ. 기본형식
       year month day hour minute deny_offset disc_offset
       text
         => (설명)
            year: 1970년이후의 값을 적는다.
            month: 0 ~ 11로 표시한다. 주의할 점은 0이 1월이라는 것이다.
            day: 날짜를 입력한다.
            hour: 0 ~ 23의 값을 입력한다.
            minute:0 ~ 59의 값을 입력한다.
            deny_offset: 셧다운 되기 전에 새로운 접속을 거부할 시간을 지정한다. HHMM이 기본형
                        식이다.
            disc_offset: 현재 접속중인 연결을 끊을 시간을 지정한다. HHMM이 기본형식이다.
            text: 사용자에게 보여줄 메시지를 기록한다. magic cookies의 사용이 가능하다.
    ㄴ. magic cookies
       %s : 셧다운이 될 시간
       %r : 새로운 접속을 거부할 시간
       %d : 현재 연결을 차단할 시간
    ㄷ. 사용예
       2003 01 19 17 30 0100 0001
       System will be shutdown at 17:30. You connection will connected at %d
        => 2003년 2월 19일 오후 5시 30분에 FTP서버를 종료할 것이고, 새로운 접속자는 종료시간
          1시간 이전부터 접속이 금지되며, 현재 연결된 사용자는 종료 1분전에 차단된다는 메시지
          가 보여진다.
(7) /etc/ftpaccess의 passwd-check 사용예
   1) 기본형식
     passwd-check 조건 action
   2) 조건
     none : anonymous접속자들의 패스워드 체크를 하지 않는다.
     trivial : 패스워드에 @(at)문자가 포함되어 있는지만 체크한다.
     rfc822 : rtc822에 정의한 내용대로 체크한다. rfc822설정은 정확한 이메일을 기입하라는 뜻이
             라고 생각하면 된다.
   3) action
     warn : 접속자가 '조건'을 지키지 않았을 때 경고메시지를 보내고 접속은 허가한다.
     enforce: 접속자가 '조건'을 지키지 않았을 때 접속을 허가하지 않는다.
   4) 기본설정예
     passwd-check rfc822 warn
      => rfc822와 일치하는 지를 검사하고 warn 수준으로 처리한다.
   5) 응용예
     passwd-check rfc822 enforce
      => 틀린 이메일주소를 입력하면 접속이 허가되지 않는다.

7. /etc/ftphosts
(1) 설명: 이 파일은 특정호스트 및 특정 사용자의 접속을 허가할 것인지 거부할 것인지를 지정하는
          파일이다.
(2) 기본형식
    allow 사용자계정 주소
    deny  사용자계정 주소
(3) 사용예
   ㄱ. allow * *
      => 모든 호스트의 모든 사용자를 허가한다.
   ㄴ. deny * 203.247.100.*
      => 203.247.100.0 네트워크대역을 갖는 모든 사용자의 접속을 거부한다.

8. Wu-FTP관련 명령어
(1) ftpcount
   1) 설명: ftp서버를 이용하고 있는 사용자 수를 보여주는 명령이다.
   2) 사용법
     ftpcount
   3) 사용예
     [root@www root]# ftpcount
     Service class all                  -   1 users (no maximum)
(2) ftpwho
   1) 설명: ftpcount와 유사한 명령으로 서버에 접속한 사용자 정보를 보여준다.
   2) 사용법
     ftpwho
   3) 사용예
     [root@www root]# ftpwho
     Service class all:
     18847 ?        S      0:00 ftpd: 203.247.40.247: posein: IDLE
        -   1 users (no maximum)
(3) ftpshut
   1) 설명: ftp서버를 셧다운 시킬 때 사용하는 명령이다.
   2) 사용법
     ftpshut [options] time [warning-message]
   3) options
     -l 분 : 새로운 접근을 거부할 시간을 정한다.
     -d 분 : 현재접속중인 접근을 끊을 시간을 정한다.
   4) time: ftp서버를 다운시킬 시간을 말한다.
     now     : 즉시 shutdown시킨다.
     +number : 분(number값)으로 셧다운 시간을 지정한다.
     HHMM    : 24시간형식으로 셧다운 시간을 지정한다.
   5) warning-message : 경고메시지를 적는다. 75문자의 길이 형식을 취한다. magic cookies의 사용
                       이 가능하다.
   6) 사용예
     ftpshut now
      => 지금 즉시 ftp서버를 중지시킨다.
   7) 참고
     ftpshut 명령을 사용하여 셧다운이 되면 /etc/shutmsg파일이 생성된다. 따라서, 계속적으로 ftp
    서버로의 접속이 불가능해지므로 이 파일을 삭제해야 한다.

우주곰:지구곰이 아닙니다.
지구곰이 아닙니다.
Categories (190)
Information (5)
About uzoogom (5)
My Advanced Linux (73)
Learning Linux (96)
OperatingSystem (5)
Databases (4)
OpenSource (1)
Tips! (1)
«   2021/03   »
  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)