'Category'에 해당되는 글 41건

  1. 2012.02.09 WS1 Less 01 Introduction
  2. 2012.02.09 SOLARIS10 Admin I Guide
  3. 2012.02.09 SOLARIS10 Essential Guide
  4. 2012.01.30 Solaris Basic CMD(s)
  5. 2011.11.28 OpenSSh 및 SELinux
  6. 2011.11.28 ACL (Access Control List)
  7. 2011.11.28 메일서비스(sendmail)
  8. 2011.11.28 samba 서비스
  9. 2011.11.28 IDS - snort 1
  10. 2011.11.28 tcpdump - packet capture / 분석

1-6 Oracle Database 10g: "g" Stands for Grid   Cluster

 Oracle's grid infrastructure:
 • Low cost
 • High quality of service
 • Easy to manage

 Oracle Database Server 제품에 구현된 Grid infrastructure
 **1) Automatic Storage Management(ASM)
   2) Real Application Clusters(RAC)
   3) Oracle Streams
 **4) Enterprise Manager Grid Control(관리 인터페이스)
==============================================================================
1-8 << Oracle Database Architecture >>
==============================================================================
 Oracle Database Service는 내부적으로 크게 2 부분으로 구성됩니다.

 • Memory       : Oracle Instance (Process)

 • Storage(HDDs): Oracle Database (Files)
==============================================================================
1-9 Database Service Structures
==============================================================================
 Oracle Service
 ==================================================
 Instance

  • System Global Area (SGA)  : Memory  구조
  ------------------------------------------
  • Background processes      : Process 구조
 ==================================================
 Database files                      : Storage 구조
 ==================================================
 << 현재 실습용 환경에 구성된 서비스 >>

 • orcl service (orcl Database 서버) <-- 개발자에게 알려주셔야 합니다.
  • orcl database
  • orcl instance

(터미널)

$ ps -ef | grep orcl
oracle    7012     1  0 May20 ?        00:00:09 ora_pmon_orcl
oracle    7014     1  0 May20 ?        00:00:03 ora_psp0_orcl
oracle    7016     1  0 May20 ?        00:00:00 ora_mman_orcl
oracle    7018     1  0 May20 ?        00:00:13 ora_dbw0_orcl
oracle    7020     1  0 May20 ?        00:00:09 ora_lgwr_orcl
oracle    7022     1  0 May20 ?        00:01:05 ora_ckpt_orcl
oracle    7024     1  0 May20 ?        00:00:10 ora_smon_orcl
oracle    7026     1  0 May20 ?        00:00:00 ora_reco_orcl
oracle    7028     1  0 May20 ?        00:00:32 ora_cjq0_orcl
oracle    7030     1  0 May20 ?        00:00:24 ora_mmon_orcl
oracle    7032     1  0 May20 ?        00:00:14 ora_mmnl_orcl
oracle    7034     1  0 May20 ?        00:00:00 ora_d000_orcl
oracle    7036     1  0 May20 ?        00:00:00 ora_s000_orcl
oracle    7060     1  0 May20 ?        00:00:00 ora_qmnc_orcl
oracle    7076     1  0 May20 ?        00:00:02 ora_q000_orcl
oracle   17758     1  0 13:32 ?        00:00:00 ora_j000_orcl
oracle   17809 17789  0 13:33 pts/1    00:00:00 grep orcl
oracle   32499     1  0 May20 ?        00:00:00 ora_q002_orcl

$ cd /u01/app/oracle/oradata/orcl/

$ ls
control01.ctl  example01.dbf  redo03.log    temp01.dbf
control02.ctl  redo01.log     sysaux01.dbf  undotbs01.dbf
control03.ctl  redo02.log     system01.dbf  users01.dbf
$
==============================================================================
1-10 Oracle Memory Structures
==============================================================================
 SGA : 교재의 그림에 표시된 메모리 컴포넌트로 구성되며,
       각 컴포넌트에 "기록된 내용 또는 메모리 영역"을
       여러 서버프로세스가 같이 공유하여 사용하게 됩니다.

       (SGA: SYSTEM GLOBAL AREA)

      << 10g 부터는 일부 SGA 컴포넌트의 크기가 자동으로 관리됨 >>

         SGA_TARGET=0    : SGA 자동관리사용않함

         SGA_TARGET>0, 적절한 값 : SGA 자동관리사용함.

       메모리 자동관리는 Workshop II Less 8 에서 자세히 설명합니다.

 메모리에 구성되는 인스턴스의 구성요소 중 System Global Area(SGA)의
 각 컴포넌트의 기능을 이해하기 전에 접속한 세션에서 요청한
 하나의 SQL 문장을 Server Process가 처리하는 과정을 이해해 봅시다.

==============================================================================
<< SGA의 각 Components 를 이해하기 위해 사전 지식(1-10) >>
==============================================================================
1] User Process, Server Process : Session (1-12)
    (Server Process가 사용하는 메모리: Program Global Area,PGA)
==============================================================================
2] SQL 문장의 처리과정(By Server Process)
==============================================================================
1) SQL*Plus(User Process in Client-Side)로 orcl Database Server에 접속합니다.

2) Database Server의 운영체제 메모리에
   특정 Server Process가 생성되어 할당(by Listener)됩니다.

   --> 세션이 구성됩니다.

3) User가 SQL*Plus(User Process)에서 SQL 문을 작성한 뒤 네트워크를 통해

4) User Process(Clinet)에서 orcl database Server상의 Server Process로

  전달됩니다.
==============================================================================
5) Database Server 상의 Server Process는 전달 받은 SQL 문을
   다음의 과정을 거쳐서 처리
==============================================================================
  (1) Parsing: 아래의 여러 검사를 수행한 뒤, 검사를 만족하는 경우
               문장을 실행할 수 있도록 분석(실행계획 작성)하여
               "Parsed-Code"라는 실행형태의 코드를 작성합니다.

               - 문장의 문법을 검사,
               - 문장에 명시된 Table이름, Column명, 사용할 수 있는 Index정보
                 저장공간 정보 등등
               - 구문을 요청한 접속사용자의 권한
==============================================================================
  (2) Executing:

   - 분석된 Parsed-Code를 실행하여 디스크 상의 Data를
                   Oracle block단위로 찾아서 메모리에 Load합니다.

     DML 또는 DDL 문장의 경우에는 메모리에 Load된 Oracle Block의
     복사본에서 수정할 행을 찾아 다음의 작업을 진행합니다.

                 - Undo Data를 구성하여 디스크의 특정영역에 저장합니다.
                 - 변경전의 행의 데이터와 DML/DDL문장에 의해 변경한 후의
                   데이터를 기반으로 redo log entry를 작성하여
     Redo Log Buffer에 기록합니다.
                 - 메모리에 Load된 Oracle Block을 수정합니다.
                 - 사용자의 User Process에게 작업완료 메세지를 전달합니다.
==============================================================================
  (3) Fetching : SELECT 문장의 경우에는 Load된 Oracle Block의 복사본에서
                 조건을 만족하는 행을 찾아 원하는 Record를 추출하여 결과로서
                 메모리에 누적한 뒤,
   이를 네트워크를 통해 User Process에게 전달합니다.

 ============================================================== 
 문장별로 위의 단계를 간단히 정리하면 다음과 같습니다.

 - SELECT 문: Parsing --> Executing --> Fetching 을 모두 수행함
 ============================================================== 
 - DML(DDL) : Parsing --> Executing 과정만 수행함
 ============================================================== 
==============================================================================

 만약 서로 다른 Server Process들이 동일한 SQL문장을 처리해야 할 때,
 맨 처음으로  SQL문을 처리하는 Server Process가 각 처리 단계별로
 작성된 내용들을 지우지 않고 메모리에 남겨놓는다면,
 두번째 문장을 처리하는 Server Process는 작성된 내용이나
 메모리 존재하는 데이터들을 그냥 사용하면 처리가 빠를 수 있겠네요.
           

 위의 각 단계를 이해하면 SGA를 구성하는 각 컴포넌트의 기능을
 이해할 수 있습니다.

(1) Shared Pool :
    - 최종적으로 분석된 Parsed-Code, 실행계획, 문장이 Hash값을 handle로
      할당받은 Memory Address에 기억(Memorize)됨.
    - 여러 검사를 위해 필요한 Dictionary 상의 System Definition들이 기억됨
    - LRU(at Least Recently Used) 알고리즘을 이용하여 메모리 공간이 관리됨

  LRU-List : MRU-END --.....-- LRU-END

(2) Database Buffer Cache
    - Disk상의 Data가 Oracle Block단위로 기억되는 영역
    - LRU 알고리즘을 이용하여 메모리 공간이 관리됨


(3) Redo Log Buffer
    - Server Process가 DML/DDL operation 중에 생성된 redo entry를
      발생순서대로 기억

    - redo entry: LGWR 에 의해서 redo log file에 저장되어
                  복구가 필요할 때 사용됨
==============================================================================

위의 구성 Components 이외에도 선택적으로 다음의 추가적인 Component가 있습니다.

(4) Large pool: 병렬처리와 관련된 메세지버퍼 또는  워킹 버퍼

(5) Java Pool : Oracle Database Server 내에
  Java로 작성된 소스코드 및 컴파일된 Class파일을
  저장해 놓고 PL/SQL subprogram등에서 호출해서 사용 시
                Java Class 파일이 메모리에 Load되는 영역

==============================================================================
PGA : 각 Server Process 및 background Process가 자신의 작업을 수행하면서
      개별적으로 서버로 부터 할당받아 사용하는 메모리 영역이며, 9i 부터는
      자동으로 관리됩니다.
==============================================================================

==============================================================================
10-12 Process Structures
==============================================================================
Client [1] User process: 사용자가 Oracle server에 접속요청을 할 때 사용자의
     시스템 상에서 기동됩니다.

     (사용자 시스템의 메모리에 구성됨)
==============================================================================
Server [2] Server process: Oracle Instance에 접속하여
       사용자가 세션을 구성할 때 시작됩니다.
       (Database Server의 메모리)

 [3] Background processes: Oracle Instance가 시작될 때 기동됩니다.
       (Database Server의 메모리)
=============================================================================
10-13 Oracle Instance Management
=============================================================================
1) Database Writer(DBWn) :
=============================================================================
    database buffer cache로 부터 DML 문에 의해 수정된 Dirty 상태의 buffer를
    해당 disk 상의 datafile 내의 Oracle block에 저장합니다.
    이 작업을 통해 database buffer cache에서 새로운 블록을 기억하기 위하여
    지울 수 있는 기존 버퍼를 확보하는 백그라운드 프로세스 입니다.
   ==========================================================================
   10-14 Server Process and Database Buffer Cache and DBWn
         (그림 참조)

   SQL문장을 처리하면서, Server Process는 처리해야 하는 Data를
   Oracle Block단위로 Database Buffer Cache로 Load 합니다.
   =================================================================
   이 때, Database Buffer Cache상의 각 buffer들은 다음의 상태
   중 하나의 상태에 있게됩니다.
   =================================================================
    - Free or unused : 사용되지 않은 빈 buffer로
                       Database Service 기동 직후에 주로 존재합니다.
   =================================================================
    - Pinned : Server Process가 SQL 처리 중에 사용중인 buffer
   =================================================================
    - Clean  : Server Process가 SQL 처리를 완료한 버퍼로
               디스크 상의 내용과 동일하여,
               필요한 경우에 지울 수 있는 buffer.
   =================================================================
    - Dirty  : Server Process가 SQL 처리를 완료한 버퍼로
               DML 문장에 의해 수정이 되어
               디스크 상의 내용과 다른 상태의 buffer.
          
               이런 Dirty Buffer가 DBWn에 의해 디스크 상에 저장이되면,
               Clean 상태의 Buffer가 됩니다.
   ==========================================================================

2) LogWriter(LGWR)
    DML/DDL을 처리하는 Server process가 Redo Log Buffer에
    작성해서 기억시킨 Redo entries를 redo log file에 저장하여
    Redo log buffer를 비웁니다.
 =====================================================
 (참고)  LGWR이 리두로그파일에 redo log buffer에 있는
         리두엔트리를 기록하는 시점.
 =====================================================
         - commit시 마다
         - 리두로그버퍼의 1/3이상 찼을 때
         - 1메가 이상의 리두가 redo log buffer에 있을 때
         - 3초마다
         - DBWn가 dirty buffer를 저장하려고 할때
           그 dirty buffer에 해당하는 Redo entry가
           리두로그 버퍼에 있을 때 (DBWn이 LGWR을 호출함)
 =====================================================


3) Checkpoint Process(CKPT)
    Datafile과 Redolog file들에 저장된 내용간의 Sync 정보를
    check 해서 그 정보를 Controlfile과 Datafile header에 저장하는
    백그라운 프로세스

=============================================================================
<< 사전 지식 >>
=============================================================================
 파일의 Sync정보에 대하여
    DBWn는 datafile에, LGWR는 redo log file에 저장을 수행합니다.
    이런 각 파일의 저장작업에 대하여
     "여기까지 저장을 완료했습니다" 를 나타내는 정보로
     checkpoint 프로세스가 다음과 같은 내용을 이용하여
     컨트롤 파일에 기록해 놓습니다.
=============================================================================
 1. System Change Number(SCN) - Commit이 발생될 때마다 1씩 증가

 -- 현재 시스템의 SCN 확인

 (Terminal)

 $ sqlplus / as sysdba      /* SYS 스키마로 접속 */

 SQL> select current_scn from v$database ;

 CURRENT_SCN
 -----------
      639104

 SQL> select current_scn from v$database ;

 CURRENT_SCN
 -----------
      639106

=============================================================================
 2. Redo Byte Address (RBA)
       - Redo Entry 각각을 구별하기 위해 Redo Entry에 기록되는 정보
       - Redo Log File 기록된 Redo Entry들 중에
  복구를 시작할 리두로그 Entry의 위치 정보를 제공함.
=============================================================================
<< Checkpoint가 수행하는 작업의 중요성 >>
=============================================================================
 만약, 100개의 서로 다른 session에 의해서 100개의
 서로 다른 data block에 변경(DML)작업이 발생되었다고 가정합시다.

 이 때, Database Buffer cache상에는 수정된 Dirty 상태의 buffer가
 모두 100개가 존재합니다.(8192byte * 100 = 819200) (Undo는 제외합니다)


 또한, Redo log buffer에는 100개의 redo entry가 기억되어 있습니다.


(가정 상황)
    - Dirty 상태의 data buffer 중 DBWn에 의해 30개가 저장되고
      아직 저장이 안된 70개의 버퍼가 database buffer존재

    - Redo Log file에는 100개의 redo entry가 모두 저장됨

      왜, 8192 바이트 중 20바이트의 행하나를 수정한 경우라도,
      Datablock은 8129바이트를 저장해야 하지만
      변경전/후 값으로 구성된 redo entry(매우작은 정보)만을
      저장하면 되므로 저장이 빠르게 수행됩니다.

      또한 Redo는 매우 자주 저장됩니다.

    - 이 상황에서 서버의 메모리(즉, instance)가 깨졌다고 가정합시다.
      (--> 이런 상태를 instance failure가 발생했다고 함).

    이 때, 파일은 정상적이지만, 메모리가 깨지기 전에 작업된 내용
    (예에서 70개의 Dirtybuffer)이 메모리로부터 디스크로
    저장이 안된 상태입니다.

 

   이런 경우, 데이터베이스는 재기동하면서
   Controlfile에 기록된 Datafile들과 Redolog 파일의 Redo entry
   정보들을 이용하여 자동으로 복구를 수행함.

   예를 가지고 쉽게 설명하면

   Datafile에는 수정된 100 개의 30개의 Dirty buffer가 저장되었고,
   Redo Log File에 기록된 리두 100 개 중에서
   1번리두부터 30번 리두에 해당하는 데이터블록의 내용은 저장되었기
   때문에 재실행할 필요가 없고, 31번째 리두부터 100째리두를 재실행 후
   복원된 dirty buffer를 파일에 저장하면 데이터베이스를
   복구할 수 있습니다.

   이러한 파일간의 Sync 정보를
   책임지고 Controlfile과 Datafile Header에 저장하는
   백그라운드 프로세스가 "CKPT"입니다.

   그리고 위와 같은 instance failure 상황에서
   데이터베이스 서비스를 정상적으로  Open시키키 위하여
   기동하는 중에 필요한 복구(이를 Instance 복구라 함)를
   수행하는 백그라운드 프로세스가 SMON 입니다.
=============================================================================
4) System Monitor(SMON) : 인스턴스 복구를 수행하는 프로세스
=============================================================================
5) Process Monitor(PMON) :
    특정 user session이 비정상적으로 종료 시,
    Database Server의 메모리상에서 해당 세션의
    리소스 및 작업내역을 clearn-up 하는 백그라운드 프로세스
=============================================================================
6) Archiver(ARCn) :
   선택적으로 구성하여 사용되며
   별도의 설정으로 Database를 Archivelog mode로 설정한 경우에
   Archived Redo Log를 생성하는 백그라운드 프로세스.
=============================================================================

=============================================================================
(참고) Archived Redo Logfile의 필요성 및 개념
=============================================================================
 Redo log file 용도 : DML을 처리하는 Server Process들이
        Redo Log Buffer에 생성한 Redo Entris가
        발생순으로 LGWR에 의하여 저장된 파일.

 Redo Log File의 사용방식
 ===============================================================
  최소 2개 이상의 Redo Logfile이 "순환적으로 사용"됨.
 --> 같은 파일이 계속 재사용되면서 오래된 Redo Log들을
     사라집니다.

    redo file1    redo file2    redo file3
 ==========================================================
 - log switch : LGWR가 사용하는 redo log file을 바꾸는 동작
 ==========================================================
        - Redo Log Sequecne Number (LSN)

          --> log switch가 발생될 때 마다 1씩 증가하는 값.
 ==========================================================
 아래의 상황을 가정하여 생각하면 쉽게 이해할 수 있습니다.
=============================================================================
 (가정)

 2010년 12월에 전체 datafile들을 백업(복사)해 놓음.

 2010년 12월부터 서비스 개시하여
 DML 작업으로 redo 로그 파일에 DML 작업의
 리두엔트리가 파일에 저장되면서 매달별로 로그스위치가 발생
 되어 현재 2011년 7월이라고 가정합시다.

  redo file1            redo file2           redo file3

 2010 12월리두(지워짐) 2011년1월리두(지워짐) 2011년2월리두(지워짐)
 2011  3월리두(지워짐) 2011년4월리두(지워짐) 2011년5월리두
 2011  6월리두         2011년7월리두(현재사용)      

 Archive redo log file : LGWR이 사용이 끝난
    redo log file의 논리적인 복사본.

=============================================================================
1-15 Physical Database Structure
=============================================================================
• Data files : 테이블을 통해 INSERT 문으로 처리된 데이터가 저장된 파일
        (Header가 있음)

• Online redo log files : DML/DDL 수행 시에 작성된
     Redo Log Entry가 저장된 파일

• Control files : Datafile과 Redologfile의 위치및 이름,
    파일들의 Sync정보, 데이터베이스이름 등
    데이터베이스의 제어 정보가 저장된 파일

 

• Parameter file : Instance 기동시에 설정해야 하는 파라미터들이 기록된 파일

• Password file  : SYSDBA 또는 SYSOPER의 패스워드가 저장된 파일

• Backup files   : Datafile이 손상된 경우, 복구를 위해 준비한 복사본

• Archive log files : 사용이 끝난 Online Redo log파일의 논리적인 복사본
 
• Alert log      : 데이터베이스가 운영되면서 발생된 Oracle 프로그램 로그

• trace files
 
  (1) Background process가 장애 시에 기록되는 trace파일

  (2) Server Process가 SQL 문장을 수행하면서
      사용한 CPU 및 메모리 사용량 및 발생시킨  DISK IO
      그리고 실행계획을 기록하는 trace파일로 SQL 문장 튜닝시에도 사용됩니다.
=============================================================================
1-16 Datafile 저장공간이 사용되는 방식(용어에 대한 정리)
=============================================================================
• Tablespace : 논리적으로 서로 관련된 데이터들이
               저장된 파일들을 묶어놓은 단위
               Datafile을 생성 시에 같이 정의됨.

  (기능) 데이터를 저장해 놓은 물리적인 파일(실제 파일)들과
         논리적인 저장단위를 서로 분리시키는 역할을 함.

         파일이 실제 OS 상의 어느 경로에 존재하던지
         관리자가 설정만 해 놓으면 SQL을 처리하는
         서버프로세스는 Tablespace에 관련된 datafile정보를
         이용하여 사용자의 SQL문에 의해 요청되는 데이터
         처리작업을 수행함.

• Segments(세그먼트) : 테이블이나 인덱스가 공간을 사용하는 단위

• Extents (확장영역) : Segment에 대한 공간 할당 단위.
                       (Segment가 확장됩니다)
                       - 전제: 연속된 Oracle Blocks

• Blocks (블록) : SQL 처리를 위해 발생되는
                  최소 IO 단위(db_block_size)
==============================================================================

Posted by logwatch

'Log > Solaris' 카테고리의 다른 글

SOLARIS10 Essential Guide  (0) 2012.02.09
Solaris Basic CMD(s)  (0) 2012.01.30
Posted by logwatch

'Log > Solaris' 카테고리의 다른 글

SOLARIS10 Admin I Guide  (0) 2012.02.09
Solaris Basic CMD(s)  (0) 2012.01.30
Posted by logwatch

2012. 1. 30. 15:46 Log/Solaris

Solaris Basic CMD(s)


운영체제 기본적인 정보 확인 명령어
 uname CMD
  # uname -a
  # cat /etc/release
 date CMD
  # rdate time.bora.net
  # date +%m%d
 cal CMD
디렉토리 이동 관련 명령어
 pwd CMD
  PS1 변수
 cd CMD
  PATH
  - 절대경로(Absolute PATH) # cd /dir1
  - 상대경로(Relatvie PATH) # cd dir1
파일의 종류
 일반 파일
 디렉토리 파일
 링크 파일
  하드링크(Hard Link)      # ln file1 file2
  심볼릭링크(Symbolic Link)# ln -s file1 file2
 디바이스 파일
  블럭디바이스(Block Device)
  캐릭터디바이스(Character Device)
man & passwd CMD
 man CMD
  # man ls
  # man -k calendar
  # man -l passwd
  # man -s 1B ls
 passwd CMD
  # passwd [USER]
--------------------------------------------------------
디렉토리 관리 명령어
 ls CMD
  # ls -l dir1
  # ls -ld dir1
  OPTIONS: -a, -l, -d, -t, -r, -F, -R, -h, -i

  # ls -altr
 mkdir CMD
  # mkdir -p dir1/dir2/dir3
 rmdir CMD
  # rm -r dir1
파일 관리 명령어
 touch CMD
 cp CMD
  # cp file1 file2
  # cp file1 dir1
  # cp -r dir1 dir2
  OPTIONS: -i, -r, -p
 mv CMD
  # mv file1 file2
  # mv file1 dir1
  # mv dir1 dir2
  OPTIONS: -i
 rm CMD
  # rm -rf dir1
  # \rm -r dir1
파일 내용 확인 명령어
 cat CMD
  # cat -n file1
  # cat file1 file2 > file3
 more CMD
  # CMD | more

  # ps -ef | more
  # pkginfo | more
  # patchadd -p | more
 head CMD
  # alias pps='ps -ef | head -1 ; ps -ef | grep $1'
 tail CMD
  # tail -f /var/adm/sulog
  # tail -f /var/adm/messages
  # tail -f /var/adm/messages | grep DHCP
기타 관리용 명령어
 wc CMD
  Data Gathering

 su CMD
  # su user01
  # su - user01
--------------------------------------------------------
 id CMD
  UID/EUID, GID/EGID
 groups CMD

 last CMD
 who CMD
 w CMD
  while [ 1 ]
  do
   CMD
   sleep 2
  done
사용자와 통신할 때 사용하는 명령어
 mailx CMD
  # mailx -s "OK: solarisXXX" root@paran.com < report.txt
 talk CMD
 wall CMD
  # wall -a /etc/hosts
파일 속성 정보 변경 명령어
 chown CMD
  # chown -R user01 dir1
 chgrp CMD
 chmod CMD
  퍼미션 변경 방법
  - Symbolic Mode(EX: chmod u+x file1)
  - Octal Mode   (EX: chmod 755 file1)

  파일 & 디렉토리 퍼미션 의미

  umask CMD
   (관리자) /etc/profile
   (사용자) $HOME/.profile
  특수 퍼미션
   SetUID/SetGID/Sticky Bits 의미
   SetUID/SetGID/Sticky Bits 설정
   SetUID/SetGID/Sticky Bits 관리
자주 사용되지 않지만 유용한 명령어
 diff/cmp CMD
  # diff file1 file2
  # dircmp dir1 dir2
--------------------------------------------------------
 sort CMD
  # df -k -F ufs
  # du -sk /etc
  # cd /etc ; du -sk * | sort -nr | more

  # sort -u file1
  # sort file1 | uniq -d
  # sort file1 | uniq -u
 file CMD
  # cd /etc ; file *
검색 관련 명령어
 grep CMD
  # grep OPTIONS PATTERN file1
  OPTIONS: -c, -n, -l, -v, -i, -w
  PATTERN: *  .  ^root  root$  [abc] [a-c] [^a]
  [참고] egrep, fgrep
 find CMD
  # find / -name core -type f
  # find / -user user01 -group class1
  # find / -mtime [-7|7|+7]
  # find / -perm [-755|755]
  # find / -size [-300c|300c|+300c]
  # find / -name core -type f -exec rm {} \;
압축 & 아카이빙
 압축(Compress)
  compress/uncompress CMD
  gzip/gunzip CMD
 아카이빙(Archiving)
  tar CMD
   (/test1 -> /test2)
   # cd /test1
   # tar cvf - . | (cd /test2 | tar xvfp -)
------------------------------------------------------------------------
  cpio CMD
 압축 + 아카이빙(Compress & Archving)
  zip CMD
  jar CMD
Visual Editor
 (vi) $HOME/.exrc(set nu)
 (vim)$HOME/.vimrc(syn on)
Korn Shell 특징
 Redirection
  ------------------
  fd
  ------------------
  0 stdin
  1 stdout
  2 stderr
  ------------------

  Redirection stdin (EX: mailx -s WARN root < report.txt)
  Redirection stdout(EX: ls -l > file.txt)
  Redirection stderr(EX: CMD > file.log 2>&1)
 Pipe
  CMD | more
  CMD | grep inetd

  CMD > file.log
  CMD | tee file.log
 ksh function
  # set -o
  # set -o vi
  # set +o vi

  # set -o noclobber
  # set -o vi
  # set -o ignoreeof
 Variable
  변수의 종류
  - 지역 변수
  - 환경 변수
  - 특수 변수

  변수 선언 방법

  export 의미?

  시스템 환경변수(set/env)
   EDITOR/VISUAL
   PS1/PS2
   PATH/MANPATH/LD_LIBRARY_PATH
   HOME/PWD/LOGNAME
   DISPLAY
------------------------------------------------------------
 Metacharacter
  ''  ""  ``  \  ;
 History
  (ksh) $HOME/.sh_history
  (bash)$HOME/.bash_history

  r, r vi
 Alias
  # alias cp='cp -i'
  # alias
  # unalias cp
 환경파일
  /etc/profile
  $HOME/.profile
  $HOME/.kshrc

 쉘별 환경 파일
  sh  ) /etc/profile, ~/.profile
  ksh ) /etc/profile, ~/.profile, ~/.kshrc
  bash) /etc/profile, ~/.bash_profile, ~/.bashrc
  csh ) /etc/.login, ~/.cshrc, ~/.login
 /etc/skel
  (주) /etc/profile
  (부) /etc/skel
Process Admin
 Process Information
  /proc/PID(pCMD: ps, pfiles, pstack, pmap, ...)
  PID, PPID, UID/EUID, TTY
 Process Admin I
  프로세스 실행
   fg) # ls
   bg) # ls &
  프로세스 확인
   # ps -ef | grep inetd
   OPTIONS: -l, -f
                                 -e, -a, -U, -t
------------------------------------------------------------
  프로세스 종료
   # kill -[1|2|9|15] PID PID
   [참고] pgrep, pkill
 Process Admin II
  잡 실행
   fg) # ls
   bg) # ls &
  잡 확인
   # jobs
  잡 종료
   # kill %1
   <CTRL + Z>, stop %1
 Process Monitoring
  # ps -ef | grep inetd
  # prstat
원격접속 & 파일전송
 System V
  telnet CMD
   원격접속 에러메세지
  ftp CMD
   /etc/ftpd/ftpusers
   /etc/shells
  [참고] auto_ftp.sh, telnet.sh
------------------------------------------------------------
 BSD
  rlogin CMD
  rsh CMD
  rcp CMD
 Secure
  ssh CMD
  sftp CMD
  scp CMD
ACL(Access Control List)
 getfacl CMD
 setfacl CMD
------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

'Log > Solaris' 카테고리의 다른 글

SOLARIS10 Admin I Guide  (0) 2012.02.09
SOLARIS10 Essential Guide  (0) 2012.02.09
Posted by logwatch

2011. 11. 28. 19:39 Log/Linux

OpenSSh 및 SELinux

OpenSSH
공식사이트 : www.openssh.com


SSH는 공개키 암호화 기법에 기반을 두고 있다.

*. 공개키
누구나 받아서 사용할 수 있는 키

*. 개인키
공개키로 암호화해서 보낸 메세지를 해석할 수 있는
유일한 키


SSH client SSH server
-- 연결요청 -->
<-- 공개호스트키,공개서버키
----- 비밀키 ------->
<--- 사용자 인증 ---


모든 암호체계는 기본적으로 두 단계가 있다.

1. 평문 (key 사용) -> 암호문 ; 암호화
2. 암호문 (key 사용) -> 평문 ; 복호화

공개호스트키
SSH 서버를 설치할때 만드는 키, 클라이언트가 다른 ssh 서버와
구별할수 있는 키.
다음에 접속할 때 이키를 가지고 그 서버가 지난번에 접속한 서버와
같은 서버라는것을 확인한다.
만약 클라이언트가 가지고 잇는 known-host list 에 서버가 보낸 공개키가
존재하지 않으면 클라이언트 프로그램은 사용자에게 ' 이런 호스트의 키가 도착했는데
현재 신뢰할수 있는 리스트에 없으니 know-host list 에 넣을까요? 라는 경고 메세지를 보여준다.

최초로 ssh 서버에 접속했다면 known-host list 에 없는것은 당연하므로 이 메세지는 뜨게된다.

공개서버키
서버의 디스크에 저장되어 있지 않고 서버가 주기적으로 생성을 하는 키.

서버로 부터 두개의 키를 받은후 클라이언트는 랜덤키를 하나 생성한후 이 랜덤키를 호스트 공개키와
서버키를 가지고 차례대로 암호화 시킨다. 클라이언트는 이키를 서버에 보내게 되고 서버와
클라이언트는 이 키를 대칭형 암호화 키로 사용하게 된다.
이와 같은 인증 방법을 호스트 기반 인증 이라고 한다.

일단 클라이언트와 서버사이에 채널이 만들어졌기 때문에 서버는 클라이언트가 해당 서버를 사용할 수 있는
사용자 인증을 해야 한다.
이 단계가 클라이언트 인증단계이다.
클라이언트 인증방법은 비밀번호 기반 인증기법과 비비밀번호 기반 인증기법 이 두가지로 나눌수 있다.

1. 비밀번호 인증기법

SSH Client ---> 클라이언트 공개키 --> SSH 서버
known host list 확인.
<----- 인증 결과 --------

2. 공개키 인증기법

SSH Client --- 클라이언트 공개키 -----> SSH 서버
Authorized_keys 확인
<-- 공개키로 암호화된 랜덤값 --
--- 128비트 MD5 해쉬 ---->
<-- 사용자 인증 ---------




SSH2 Connection Layer
----------------------
SSH2 User-Auth Layer
----------------------
SSH2 Transport Layer
======================
TCP / IP 프로토콜



OpenSSH 설치

설치는 rpm 파일을 설치하거나 소스파일을 직접 컴파일하여 설치할 수 있다.

소스를 직접 컴파일하여 설치한다면 openssh 를 이해하는데 좀 더 도움이 될것이다.

최신버전을 다운르드 하여 설치한다.


[root@centos1 ~]# rpm -qa | grep ssh
openssh-4.3p2-29.el5 <== open ssh 설정파일, 문서파일, 도움말파일, 키생성파일
openssh-askpass-4.3p2-29.el5 <== (?)
[root@centos1 ~]# rpm -ql openssh-askpass
/etc/profile.d/gnome-ssh-askpass.csh
/etc/profile.d/gnome-ssh-askpass.sh
/usr/libexec/openssh/gnome-ssh-askpass
/usr/libexec/openssh/ssh-askpass
openssh-clients-4.3p2-29.el5
openssh-server-4.3p2-29.el5

기존에 설치된 패키지는 모두 삭제한 다음 새로운 버전의 패키지를 설치한다.
[root@centos1 ssh]# yum erase openssh-clients
[root@centos1 ssh]# yum erase openssh <= 의존성에 걸려있는 나머지 두가지 패키지도 삭제한다.

기존에 설치된 ssh를 다 제거한후 다운로드 받은 소스파일을 적당한 디렉토리에 압축을 풀고 컴파일한다.

#./configure --prefix=/usr/local/openssh-5.6p1 --sysconfdir=/etc/ssh --with-lastlog=/var/log/lastlog --with-md5-passwords
#make && make install

root /usr/local/openssh-5.6p1/bin]# ls
scp sftp slogin ssh ssh-add ssh-agent ssh-keygen ssh-keyscan

scp : 안전한 romote copy utility
ssh : ssh client
ssh-agent : RSA 형태의 인증방법을 수행한다.
ssh-keygen : ssh 를 위한 생성키, RSA 키를 생성한다.

ssh client 사용방법
ssh -l 계정명 접속할host주소

안전한 통신을 위한 조건.

1. 보내고자 하는 내용을 특정 사람만 읽을수 있어야 한다.
2. 받는 사람은 보낸 사람에 대해서 신뢰를 할 수 있어야 한다.
3. 주고받는 데이터가 변형되지 않아야 한다.

암호화 방법은 크게 비밀키 암호화 방법과 공개키 암호화 방법으로
나눌 수 있다.

비밀키를 사용해서 암호화를 하는경우에는 보내는 사람과 받는 사람 둘다
암호 해독키를 가지고 있어야 한다.
원래데이터 --- 대칭키 ---> 암호화된 데이터 ----- 대칭키 ---> 원래데이터
(encryption) (decryption)
데이터 송신측과 수신측에서는 똑 같은 해독키를 가지고 있어야 하므로
적어도 한번은 키를 전송해줘야 하는것이 단점이다.
키를 전송하는 키가 해커에 의해 노출되게 되면 안전한 데이터전송을 보장 받을 수
없다.


공개키암호화 방법은
두사람이 다른 키를 가지고 메시지를 주고 받기때문에 비대칭적 암호화라고 한다.
공개키는 여러 사람이 모두 공유할 수 있는 키이다.
공개키에 기반한 암호화 구조를 PKI 라고 한다.

1. 개인키와 공개키를 만든다.
2. 공개키를 공개한다. -----------------> 3. 공개키로 데이터를 암호화 한다.
5. 개인키로 데이터를 해석한다. <---------------- 4. 공개키로 암호화된 데이터를 보낸다.

이런 방법은 메시지를 주고 받는데 확실한 보안을 제공하지만 암호화 하고 해석하는데
많은 비용을 치뤄야 한다. 따라서 인터넷을 사용할 때 모든 데이터를 암호화해서 보낸다는 것은
시스템에게는 엄청난 부하를 준다.

더 좋은 방법은

1. 개인키와 공개키를 만든다.
2. 공개키를 공개한다. ----------------------> 3. 비밀키를 만든다.
5. 개인키로 비밀키를 해석한다. <---------------- 4. 공개키로 비밀키를 암호화 한다.
6. 개인키로 데이터를 암호화해서 주고 받는다. ------------> 6. 개인키로 데이터를 암호화해서 주고 받는다.

서로 메시지를 주고 받는 단계는 많아졌지만 비밀키를 한번만 교환하게 되면 다음 메시지를 주고 받을때에는
훨씬 간단해 진다는 잇점이 있다.

컴파일해서 설치하게 되면 필요한 키가 아래처럼 /etc/ssh 디렉토리에 자동으로 생성이 된다.

[root /usr/local/openssh-5.6p1/bin]# ls /etc/ssh
moduli ssh_host_dsa_key.pub ssh_host_rsa_key
ssh_config ssh_host_key ssh_host_rsa_key.pub
ssh_host_dsa_key ssh_host_key.pub sshd_config
You have new mail in /var/spool/mail/root
[root /usr/local/openssh-5.6p1/bin]#

rpm 패키지를 설치한 경우에는 /etc/init.d/sshd 데몬스크립트를 실행시키면 키가 자동으로 생성이 된다.

*. 키를 수동으로 생성하려면
RSA 키와 DSA키 둘다 생성해야 한다. (클라이언트가 어떤것을 사용할지 모르므로.)

*. 암호없이 로그인
$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/taejun/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): xxxxxx
Enter same passphrase again: xxxxxx
Your identification has been saved in /home/taejun/.ssh/id_rsa.
Your public key has been saved in /home/taejun/.ssh/id_rsa.pub.
The key fingerprint is:
65:ac:e5:70:9a:b2:4f:25:c4:d3:0270:9a:b2:4f:25 user1@localhost

id_rsa 개인키
id_rsa.pub 공개키

생성된 파일을 서버의 자기계정으로 복사 ~/.ssh/authorized_keys 또는 authorized_keys2


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

SELinux

설정파일 : /etc/sysconfig/selinux

SELINUX = value

value 는 세가지 값이 허용된다.
enforcing - SELinux 모듈이 보안관련기능을 감지하고 제한하며 로그를 남긴다.
permissive - SELinux 모듈이 시스템 보안관련 기능을 감지하면 허용하며 로그를 남긴다.
disable - SELinux를 사용하지 않는다.

SELINUXTYPE = value
value 는 두가지 값이 허용된다.

trageted - target 으로 설정된 네트워크 데몬만 SELinux 를 적용한다.
strict - Full SELinux protection.

이 파일 설정을 변경한 경우 rebooting 을 해야 바뀐 설정이 적용된다.


selinux 관련 utility.

[root /etc/selinux]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: permissive
Mode from config file: enforcing
Policy version: 21
Policy from config file: targeted
[root /etc/selinux]#

setenfoce - SELinux 설정 변경. reboot 없이 바로 적용된다.

형식)
setenforce [ Enforcing | Permissive | 1 | 0 ]

ex) setenforce 1 <== SELinux enforcing 모드로 사용
setenforce 0 <= SELinux premisive 모드로 사용
SELinux boolean 설정
ftp_home_dir : 사용자 홈 디렉토리에 읽기/쓰기 권한설정
allow-ftpd_full_acess : ftp 서버에 로그인/읽기/쓰기 모든 access 허용
allow_ftpd_use_nfs : ftp 버서에 nfs 파일 접근 허용
allow_ftpd_anon_write : 공개 ftp에 쓰기를 허용

설정방법

setsebool -P allow_ftpd_full_access=1 ; <== ftp 서비스에 대해서 읽기/쓰기 등 모든권한 부여.
값이 0 이면 권한을 주지 않음을 의미한다.

설정값을 확인하는것은
getsebool 로 확인한다.
ex) getsebool -a
getsebool ftp_home_dir

'Log > Linux' 카테고리의 다른 글

ACL (Access Control List)  (0) 2011.11.28
메일서비스(sendmail)  (0) 2011.11.28
samba 서비스  (0) 2011.11.28
IDS - snort 1  (0) 2011.11.28
tcpdump - packet capture / 분석  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:38 Log/Linux

ACL (Access Control List)

setfacl
Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...

주요옵션
-m : acl 설정
-x : acl 삭제
-b : 모든 acl 삭제
--mask : mask 재설정
-R : 하위디렉토리까지 포함.

[root@centos1 acl]# setfacl -m u:user1:rwx a.txt
[root@centos1 acl]# ls -l a.txt
-rw-rwxr--+ 1 root root 6 8월 5 08:50 a.txt ; acl 설정이 된 경우 퍼미션 맨끝에 '+' 문자가 보인다.
[root@centos1 acl]# getfacl a.txt ; acl 설정확인을 할 수 있다.
# file: a.txt
# owner: root
# group: root
user::rw-
user:user1:rwx
group::r--
mask::rwx
other::r--

[root@centos1 acl]# setfacl -x u:user1 a.txt ; acl 설정중 user1 권한 삭제
[root@centos1 acl]# setfacl -b a.txt ; 모든 acl 설정 삭제.

[root@centos1 acl]# setfacl -m u:user1:r-x,u:user2:rw a.txt
[root@centos1 acl]# ls -l a.txt
-rw-rwxr--+ 1 root root 6 8월 5 08:50 a.txt ; 파일의 그룹권한이 바뀐다.
[root@centos1 acl]#

[root@centos1 acl]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:user1:r-x
user:user2:rw-
group::r--
mask::rwx ; mask 값은 파일그룹권한과 같다.
other::r--

[root@centos1 acl]#
[root@centos1 acl]# chmod 755 a.txt ; acl 설정이 된 파일의 퍼미션을 바꾸면...
[root@centos1 acl]# ls -l a.txt
-rwxr-xr-x+ 1 root root 6 8월 5 08:50 a.txt
[root@centos1 acl]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rwx
user:user1:r-x
user:user2:rw- #effective:r-- ; effective 권한이 실제권한이다.
group::r-- effective 권한은 설정권한과 umask 값의 교집합으로 결정된다.
mask::r-x
other::r-x

[root@centos1 acl]# setfacl -b a.txt
[root@centos1 acl]# setfacl -m u:user1:rwx,g:staff:r-x,g:root:rwx,m:r-x a.txt
[root@centos1 acl]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rwx
user:user1:rwx #effective:r-x
group::r--
group:root:rwx #effective:r-x
group:staff:r-x
mask::r-x
other::r-x
[root@centos1 acl]#

[root@centos1 acl]# mkdir d1
[root@centos1 acl]# setfacl -m default:u:user1:rw-,g:staff:rwx d1
default 옵션을 주면 d1 디렉토리내의 파일과 디렉토리는 acl권한이
자동으로 설정된다.
[root@centos1 acl]# getfacl d1
# file: d1
# owner: root
# group: root
user::rwx
group::r-x
group:staff:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:user1:rw-
default:group::r-x
default:mask::rwx
default:other::r-x
[root@centos1 acl]#

[root@centos1 d1]# echo "hello" > a.txt
[root@centos1 d1]# ls -l
합계 8
-rw-rw-r--+ 1 root root 6 8월 5 09:15 a.txt
[root@centos1 d1]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:user1:rw-
group::r-x #effective:r--
mask::rw-
other::r--

[root@centos1 d1]#

===============================================
ACL 설정 예제.

/tmp/acl/a.txt

설정권한 effective 권한
user1:rwx r-x
acgroup1:r-x
acgroup2:rw- r--
-----------------------------------------
2. /tmp/acl/project 디렉토리에(Default ACL로 설정)
*.file 생성하였을때
설정권한 effective 권한
user1:rwx r--
*.Directory 생성하였을때
설정권한 effective 권한
user1:rwx r-x

'Log > Linux' 카테고리의 다른 글

OpenSSh 및 SELinux  (0) 2011.11.28
메일서비스(sendmail)  (0) 2011.11.28
samba 서비스  (0) 2011.11.28
IDS - snort 1  (0) 2011.11.28
tcpdump - packet capture / 분석  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:36 Log/Linux

메일서비스(sendmail)

sendmail 주설정 파일

sendmail.cf : sendmail 설정파일
sendmail.mc : sendmail.cf 를 생성하기위한 m4 매크로파일

access : sendmail server access 제한 설정

access : sendmail server access 제한 설정
[root@centos1 mail]# cat access
# by default we allow relaying from localhost...
Connect:localhost.localdomain RELAY
Connect:localhost RELAY
Connect:127.0.0.1 RELAY

tag:ip또는 도메인 policy

tag
Connect: 주소 또는 도메인
From : 송신자 주소
To : 수신자 주소

ex)
Connect:localhost.localdomain RELAY
Connect:192.168.0.1 RELAY
Connect:192.168.10 RELAY
Connect:localhost RELAY
From: user1@myunix.co.kr OK
From: spam.com REJECT
To:root@ OK
TO:minki.co.kr REJECT

OK : 메일수신허용 RELAY는 불가
RELAY : 수신 및 RELAY 허용
REJECT : 수신거부



centos 5.x 버전에 설치되어 있는 sendmail 서버버전은 8.13.x 이며 과거버전에 비해서
설정문법이 조금 바뀌었다.

redhat9 버전에 설치되어 있는 sendmail 8.12.x 버전의 경우는 설정이 아래와 같다.
[root@mylinux root]# cd /etc/mail
[root@mylinux mail]# cat access
# by default we allow relaying from localhost...
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 RELAY

[root@mylinux mail]#

수정하였을경우
# makemap hash /etc/mail/access.db < /etc/mail/access 로 갱신

local-host-names : sendmail 서버가 사용하는 메일서버도메인주소
virtusertable : 다른 이메일 도메인 주소를 갖는 같은 계정을 처리하는데
사용된다.
가상의 메일계정 시스템계정

수정하였을 경우
# makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable
로 db 파일을 갱신해야 한다.


/etc/aliases : 메일 계정에 대한 alias 파일
- 이파일을 이용하여 메일링리스트를 구현할 수 있다.
대표계정 : 수신계정, 수신계정, ...

수정하였을경우
# newaliases 로 갱신한다.

[root@centos1 /etc/sysconfig]# cat sendmail
DAEMON=yes
QUEUE=1h => 메일큐에 남아있는 메일을 한시간 단위로 처리한다.

*. sendmail 설정파일

Cwlocalhost
메일서버호스트명을 localhost 로 지정.
ex)
Cwmyunix.co.kr
Cwlee.pe.kr
- 여러개의 도메인을 사용하는것도 가능하다.

Fw/etc/mail/local-host-names
Cw 명령어로 메일호스트를 등록하는대신 호스트명을 Fw 뒤에 적혀있는
파일로 설정.

Dj$w.Foo.COM
- sendmail 호스트명을 지정

FR-o /etc/mail/relay-domains
- 릴레이를 허용할 호스트명 설정
- 이부분을 주석처리하게 되면 모든 주소에 대해 relay 허용.

Kvirtuser hash -o /etc/mail/virtusertable.db
- virtusertable 설정

Kaccess hash -T<TMPF> -o /etc/mail/access.db
- access 설정

O AliasFile=/etc/aliases
- aliases 설정

O MaxMessageSize=0
- 최대 메일 크기 결정(첨부파일포함이며 byte 단위로 설정)

O DamonPortOptions=Port=smtp,Addr=127.0.0.1,Name=MTA
- relay를 제한하기 위해 로컬호스트에서 전송한 메일만 수신

local 호스트 이외의 곳에서도 relay 허용하려면 아래처럼 변경.
O DamonPortOptions=Port=smtp,Addr=0.0.0.0,Name=MTA

O QueueDirectory=/var/spool/mqueue

O Timeout.queuereturn=5d
여기에 설정된 시간동안 큐에 남아 있는 메일을 처리하지 못하게 되면
발송자에게 메일을 리턴한다.

O Timeout.queuewarn=4h
어떤 문제로 목적지 호스트로 지정한 시간동안 메일을 발송할 수 없는경우
발송자에게 경고메시지 보낸다.


POP3 및 IMAP 설정

dovecot 패키지가 설치되어 있어야 한다.
[root@centos1 /etc/sysconfig]# rpm -q dovecot
dovecot-1.0.7-7.el5
[root@centos1 /etc/sysconfig]#
설치되어 있지 않으면 yum 으로 설치할 수 있다.
ex) yum install dovecot

메일서비스 테스트

[root@centos1 mail]# mail user1@lee.pe.kr
Subject: hello
test again
hahahah
lee.pe.kr
.
Cc: [root@centos1 mail]#
[root@centos1 mail]#
[root@centos1 mail]# mail user1@lee.pe.kr
Subject: 안녕하세요?
반갑습니다.
...
그럼 이만...
.
Cc:
[root@centos1 mail]#

[root@centos1 mail]# cat /etc/mail/local-host-names
# local-host-names - include all aliases for your machine here.
lee.pe.kr
minki.co.kr
[root@centos1 mail]#

읽지 않은 메일은 이곳에 수신 계정명으로 저장되어 있다.
[root@centos1 /var/spool/mail]# ls
cuser1 mysql p2 root samuser1 samuser3 suser1 sysuser1 sysuser3 sysuser5 u10 u12 u2 user10
lee p1 p3 rpc samuser2 smuser1 suser2 sysuser2 sysuser4 u1 u11 u13 user1 user2
[root@centos1 /var/spool/mail]#
여기 있는 메일은 보안상 수신자만 볼수 있게 퍼미션 설정이 되어 있다. 편집기등으로 볼수 있다.

user1 계정이 로그인 하게 되면
You have new mail in /var/spool/mail/user1
[user1@centos1 ~]$
새로운 메일이 있다는 메시지를 출력해준다.

[user1@centos1 ~]$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/user1": 1 message 1 unread
>U 1 root@localhost.local Sun Jul 4 23:54 20/710 "hello"
&

& 1
Message 1:
From root@localhost.localdomain Sun Jul 4 23:54:46 2010
Date: Sun, 4 Jul 2010 23:54:46 +0900
From: root <root@localhost.localdomain>
To: user1@lee.pe.kr
Subject:hello

반갑습니다.
잘 지내시나요?
한번 만납시다.
이만...

& help <= 이곳에서 사용할수 있는 명령어를 보여준다.

& quit
Saved 1 message in mbox <= 읽은 메일은 $HOME/mbox 파일로 저장된다.
[user1@centos1 ~]$

메일이 전송되지 못한경우 clientmqueue 나 mqueue 디렉토리에 남으며
한개의 메일이 헤더와 본문으로 두개의 파일로 나뉘어 저장된다.
*. 목적지주소를 알 수없는 경우는 송신자한테 바로 돌아온다.

[root@centos1 spool]# cd mqueue/
[root@centos1 mqueue]# ls
dfo64EiQ5G023647 qfo64EiQ5G023647

'Log > Linux' 카테고리의 다른 글

OpenSSh 및 SELinux  (0) 2011.11.28
ACL (Access Control List)  (0) 2011.11.28
samba 서비스  (0) 2011.11.28
IDS - snort 1  (0) 2011.11.28
tcpdump - packet capture / 분석  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:36 Log/Linux

samba 서비스


마이크로소프트와 인텔은 윈도우시스템이 다른 시스템의 디스크나 프린터 자원을 공유할 수 있도록
SMB(Server Message Block) 프로토콜을 개발하였는데 삼바란 이 SMB 를 이용하여 윈도우와 다른 시스템간의 프린터및 자료를 공유할 수 있도록 해주는 서비스

현재 마이크로소프트에서는 SMB 라는 이름대신 좀 더 범위가 큰 CIFS(Common Internet Filesystem)
이라는 프로토콜로 부른다. 이프로토콜은 SMB 프로토콜에 LanManager 와 NetBios 프로토콜까지
포함한다.

삼바구성
samba 서비스는 두개의 데몬을 구성된다.
1. smbd : 파일 및 프린터 공유, 사용자 확인 및 권한부여
2. nmbd : 클라이언트를 위해 NetBios nameserver를 지원하고 서비스를 알린다.

서비스구동

/etc/init.d/smb start 또는 service smb start

삼바서비스를 위한 패키지
[root@centos2 samba]# rpm -qa | grep samba
samba-swat-3.0.33-3.28.el5 ; GUI 환경에서의 삼바설정툴
system-config-samba-1.2.41-3.el5 ; GUI 환경에서의 삼바 설정툴
samba-common-3.0.33-3.28.el5 ; 삼바 설정파일, 유틸리티, 메뉴얼 페이지
samba-3.0.33-3.28.el5 ; 삼바 서버
samba-client-3.0.33-3.28.el5 ; 삼바 클라이언트
[root@centos1 samba]#


samba 설정파일
[root@centos1 samba]# ls
lmhosts passdb.tdb secrets.tdb smb.conf smb.conf_orig smbusers
[root@centos1 samba

삼바서비스 주요설정

주석은 '#' 또는 ';' 이다.


[global]

# ----------------------- Network Related Options -------------------------
#
workgroup = MYGROUP
server string = Samba Server Version %v

; netbios name = MYSERVER

; interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24
; hosts allow = 127. 192.168.12. 192.168.13.

# --------------------------- Logging Options -----------------------------
#
# Log File let you specify where to put logs and how to split them up.
#
# Max Log Size let you specify the max size log files should reach

# logs split per machine
; log file = /var/log/samba/%m.log
# max 50KB per log file, then rotate
; max log size = 50

# ----------------------- Standalone Server Options ------------------------
#
# Security can be set to user, share(deprecated) or server(deprecated)
#
# Backend to store user information in. New installations should
# use either tdbsam or ldapsam. smbpasswd is available for backwards
# compatibility. tdbsam requires no further configuration.

security = user ( user 대신 사용할 수 있는것은 share/server/domain/ads 가 있다)
passdb backend = tdbsam

*. 과거버전의 smbpasswd 를 사용하는 경우에는
passdb backend = smbpasswd:/etc/samba/smbpasswd 로 설정.

#============================ Share Definitions ==============================

[homes]
comment = Home Directories
browseable = no
writable = yes
; valid users = %S
; valid users = MYDOMAIN\%S

[homes]는 공유이름.
browseable : 공유자원을 보이게 하거나 숨길 수 있다.
writable : 공유자원에 대한 쓰기권한 설정
valid users : 공유자원에 대해서 access 가능한 사용자
두명이상이면 스페이스문자를 구분자로 하고 계정을 적는다.




[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
guest ok = no
writable = no
printable = yes

# A publicly accessible directory, but read only, except for people in
# the "staff" group
[public]
comment = Public Stuff
path = /home/samba
public = yes
writable = yes
; printable = no
write list = +staff
[public] 공유이름
public : yes 로 설정될 경우 모든 사용자에게 공유자원 access를 허용
write list : 쓰기 가능한 사용자 리스트. +staff 는 그룹사용자를 의미한다.




[public22]
comment = Public Stuff
path = /home/samba1
public = yes
writable = yes
; printable = no
write list = +staff

[share2]
comment = Public Stuff
path = /home/samba2
public = yes
writable = yes
; printable = no
write list = +staff

*. 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 : 날짜와 시간


TDB (Trivial DB)

passdb.tdb 파일에 삼바 사용자 계정과 패스워드가 기록된다.
이 파일을 보거나 설정하기위해서는 pdbedit 툴이 필요하다.

계정생성
[root@centos1 samba]# pdbedit -a -u sysuser2
new password:
retype new password:
Unix username: sysuser2
NT username:
Account Flags: [U ]
User SID: S-1-5-21-1841115434-4086067128-1488843553-1000
Primary Group SID: S-1-5-21-1841115434-4086067128-1488843553-513
Full Name:
Home Directory: \\centos1\sysuser2
HomeDir Drive:
Logon Script:
Profile Path: \\centos1\sysuser2\profile
Domain: CENTOS1
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: never
Kickoff time: never
Password last set: 토, 26 6월 2010 13:56:54 KST
Password can change: 토, 26 6월 2010 13:56:54 KST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[root@centos1 samba]#

*. 삼바 계정을 추가할 경우 /etc/passwd 에 등록되어 있는 계정이라야 한다.

[root@centos1 samba]# pdbedit -L ; 계정정보보기
user2:1012:
suser1:1009:
user1:500:
smuser1:1011:
sysuser2:1016:
[root@centos1 samba]#
[root@centos1 samba]# pdbedit -x sysuser2 ; 삼바계정 삭제
[root@centos1 samba]# pdbedit -L sysuser2
Username not found!
[root@centos1 samba]#

암호를 변경하는 경우에는 smbpasswd 명령어로 한다.
계정 생성 및 삭제 변경은 smbpasswd 로도 할수 있다.
[root@centos1 samba]# smbpasswd -a sysuser4
New SMB password:
Retype new SMB password:
Added user sysuser4.
[root@centos1 samba]#

삼바계정 삭제하기.
[root@centos1 samba]# smbpasswd -x sysuser4
Deleted user sysuser4.
[root@centos1 samba]#

삼바계정 disable 하기
[root@centos1 samba]# smbpasswd -d sysuser3
Disabled user sysuser3.
[root@centos1 samba]#

disable 상태의 삼바계정 enable 상태로 설정하기
[root@centos1 samba]# smbpasswd -e sysuser3
Enabled user sysuser3.
[root@centos1 samba]#

mswindows 공유자원 보기

[root@centos1 ~]# smbclient -L //192.168.203.1 -U lee
Password:
Domain=[UNIXUNIX-LEE] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]

Sharename Type Comment
--------- ---- -------
ms_share Disk
E$ Disk Default share
IPC$ IPC Remote IPC
D$ Disk Default share
I$ Disk Default share
G$ Disk Default share
F$ Disk Default share
ADMIN$ Disk Remote Admin
H$ Disk Default share
C$ Disk Default share
J$ Disk Default share
session request to 192.168.203.1 failed (Called name not present)
session request to 192 failed (Called name not present)
Domain=[UNIXUNIX-LEE] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]

Server Comment
--------- -------

Workgroup Master
--------- -------
[root@centos1 ~]#


[root@centos1 ~]# smbclient //192.168.203.1/ms_share -U lee
Password:
Domain=[UNIXUNIX-LEE] OS=[Windows 5.1] Server=[Windows 2000 LAN Manager]
smb: \>

명령어 리스트는 help 로 볼수 있다.
smb: \> help
? altname archive blocksize cancel
case_sensitive cd chmod chown close
del dir du exit get
getfacl hardlink help history lcd
link lock lowercase ls mask
md mget mkdir more mput
newer open posix posix_open posix_mkdir
posix_rmdir posix_unlink print prompt put
pwd q queue quit rd
recurse reget rename reput rm
rmdir showacls setmode stat symlink
tar tarmode translate unlock volume
vuid wdel logon listconnect showconnect
!
smb: \> help pwd
HELP pwd:
show current remote directory (same as 'cd' with no args)

smb: \>

* ftp 명령어와 비슷한것이 많다.
cd ; remote 디렉토리 이동
lcd : local 디렉토리 이동
put,mput : 파일 upload
get,mget : 파일 download
prompt : 파일전송시 interactive mode on/off

/tmp 디렉토리에 파일을 다운 받는 예.
smb: \> ! pwd
/root
smb: \> lcd /tmp
smb: \> ! pwd
/tmp
smb: \> get abc.txt
getting file \abc.txt of size 7 as abc.txt (0.6 kb/s) (average 0.6 kb/s)
smb: \>

삼바공유자원 mount

mount.cifs

[root@centos1 ~]# mount.cifs //192.168.203.1/ms_share /mnt/mswin1 -o user=lee
Password:
[root@centos1 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 4956284 4394240 306212 94% /
/dev/sda5 497829 10544 461583 3% /data
/dev/sda2 1649488 684620 879724 44% /home
tmpfs 257720 0 257720 0% /dev/shm
//192.168.203.1/ms_share
81923432 78173908 3749524 96% /mnt/mswin1
[root@centos1 ~]#

부팅할때 자동으로 마운트되게 하거나 마운트할때 마다 옵션을 사용하기 싫으면
/etc/fstab 파일에 아래처럼 등록한다.

[root@centos1 mswin1]# tail -1 /etc/fstab
//192.168.203.1/ms_share /mnt/mswin1 cifs noauto,user=lee,pass=1234,dir_mode=0755,file_mode=0644,noexec 0 0
[root@centos1 mswin1]#
noauto 옵션은 부팅할때 자동 마운트 하지 않는다.
dir_mode 및 file_mode 는 윈도우 자원을 마운트 했을때 퍼미션이 비정상적으로 표시될 수 있는데
그것을 제대로 설정하기 위한것이다.
ex)
[root@centos1 mswin1]# ls -l
합계 2
-rwxrwSrwx 1 root root 5 6월 26 11:23 2.txt
-rwxrwSrwx 1 root root 7 6월 26 12:26 abc.txt
-rwxrwSrwx 1 root root 26 6월 26 11:07 testfile.txt

*. 연결 상태는 linux 에서는 smbstatus 그리고 mswindows cmd 에서는 net use 로 확인할 수 있다.

[root@centos1 home]#
[root@centos1 mswin1]# mount.cifs //192.168.203.1/d$/ms_share /mnt/mswin1 -o user=lee,pass=xxxx
[root@centos1 mswin1]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 4956284 4530284 170168 97% /
/dev/sda5 497829 10544 461583 3% /data
/dev/sda2 1649488 684416 879928 44% /home
tmpfs 257720 0 257720 0% /dev/shm
//192.168.203.1/d$/ms_share
81923432 73597756 8325676 90% /mnt/mswin1
[root@centos1 mswin1]#

[root@centos1 mnt]# mount.cifs //192.168.203.1/d$/ms_share /mnt/mswin1 -o user=lee
Password:

root@centos1 home]# smbstatus
[root@centos1 samba]# smbstatus

Samba version 3.0.33-3.28.el5
PID Username Group Machine
-------------------------------------------------------------------

Service pid machine Connected at
-------------------------------------------------------
share2 3522 unixunix-lee Fri Jun 25 20:24:30 2010
public 3522 unixunix-lee Fri Jun 25 20:11:42 2010
public22 3522 unixunix-lee Fri Jun 25 20:24:31 2010
IPC$ 3522 unixunix-lee Fri Jun 25 20:12:40 2010

Locked files:
Pid Uid DenyMode Access R/W Oplock SharePath Name Time
------------------------------------------------------------------------------------------------------------------------------------
3522 99 DENY_NONE 0x100001 RDONLY NONE /home/samba . Fri Jun 25 20:16:18 2010


C:\Documents and Settings\lee>net use
새 연결 정보가 저장됩니다.

상태 로컬 원격 네트워크

-------------------------------------------------------------------------------
OK \\Centos1\public Microsoft Windows 네트워크
OK \\CENTOS1\PUBLIC22 Microsoft Windows 네트워크
OK \\CENTOS1\SHARE2 Microsoft Windows 네트워크
명령을 잘 실행했습니다.


C:\Documents and Settings\lee>
C:\Documents and Settings\lee>net use \\Centos1\public22
로컬 이름
원격 이름 \\Centos1\public22
리소스 유형 Disk
상태 OK
열린 수 1
연결 수 12
명령을 잘 실행했습니다.


C:\Documents and Settings\lee>net use \\Centos1\public
로컬 이름
원격 이름 \\Centos1\public
리소스 유형 Disk
상태 OK
열린 수 1
연결 수 12
명령을 잘 실행했습니다.

* 연결을 끊는경우
C:\Documents and Settings\lee>net use \\Centos1\public /del

* 연결을 전부 끊는경우
C:\Documents and Settings\lee>net use * /del
새 연결 정보가 저장됩니다.

*. pdbedit 로 삼바 계정을 관리할 수 있다.
[root@centos1 mswin1]# pdbedit -L
user2:1012:
suser1:1009:
user1:500:
smuser1:1011:
[root@centos1 mswin1]#

*. windows 에서 삼바서버 접속시 한글파일명이 깨져서 보이는 경우에는
다음과 같이 smb.conf 파일에 문자셋 설정을 하여야 한다.
# ----------------------- Network Related Options -------------------------
dos charset=euckr
unix charset=UTF-8

*. MSwindos 에서 웹페이지를 작성하여 /usr/local/apache/htdocs 디렉토리에 저장하는 경우
에는 아래처럼 하면 된다.
htdocs 에 파일을 저장할 수 있는 권한을 smbuser1 이라는 삼바계정으로 하고자 한다면
[root /etc/samba]# chown -R smbuser1 /usr/local/apache/htdocs
그리고 smbuser1의 계정으로 자신의 홈디렉토리에 htodcs 디렉토리를 심볼릭 링크 걸면된다.
[smbuser1@centos1 ~]$ ln -s /usr/local/apache/htdocs htdocs
여기까지 작업이 끝나면 mswindows 에서 쉽게 리눅스의 htdocs 에 파일을 저장할 수 있다.

*. iptables 을 사용하는 경우 remote에서 삼바서버에 접속하기 위해서 삼바서버포트를
열어둬야 한다.
[root@centhost ~]# vi /etc/sysconfig/iptables
아래 내용 추가

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 137:139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137:139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT

'Log > Linux' 카테고리의 다른 글

ACL (Access Control List)  (0) 2011.11.28
메일서비스(sendmail)  (0) 2011.11.28
IDS - snort 1  (0) 2011.11.28
tcpdump - packet capture / 분석  (0) 2011.11.28
포트스캔 및 차단  (0) 2011.11.28
Posted by logwatch

2011. 11. 28. 19:35 Log/Linux

IDS - snort 1

snort (http://www.snort.org)

참고 문서 : snort.pdf

네트워크기반 IDS

Ineternet ---- Router ------------ firewall ------------------ intranet
| | |
IDS | IDS
|----- IDS
|
DMZ

- open source NIDS
실시간 네트워크 트랙픽 분석과 로깅을 할수 있다.
프로토콜 분석, 다양한 공격을 탐지할 수 있다.
버퍼오버플로오 스탤스 스캔 , CGI 공격, OS 핑거프린터 시도를 포함한 다양한 공격을 탐지해 낼수 있다.

- 설치

snort 설치전에 필요한 패키지를 먼저 설치하여야 한다.

1. mysql 서버 및 클라이언트를 설치하여야 한다.
2. libpcap 을 설치해야 한다. (yum 으로 설치가능하다)
- snort 를 설치하기위해서는 libpcap을 컴파일해서 설치하는것이 더 편리한거
같습니다.
http://www.tcpdump.org/release (여기서 libpcap 소스파일을 다운로드 받는다)
다운받아서 압축을 풀고 ./configure ; make ; make install

4. http://www.pcre.org 에서
pcre(Perl Compatible Regular Expressions)최신 소스 패키지를 다운로드 받는다.
압축을 풀고 ./confiugre 스크립트를 옵션없이 실행하고 컴파일 한다.
./configure ; make ; make install

5. snort 설치
http://www.snort.org
http://www.snort.org/downloads 여기서 소스파일을 받는다.
6월14일 현재 최신버전은 snort-2.8.6.tar.gz 이다.

압축을 풀고
./configure --prefix=/usr/local/snort-2.8.6 --with-mysql=/usr/local/mysql

옵션설명
--prefix ; make install 이 끝났을때 snort 가 설치될 디렉토리를 명시하기 위한것.
--with-mysql ; snort 가 mysql 과 연동되기 위한 옵션.
에러없이 configure 가 완료되면
make && make install

*. 아래내용은 snort 가 패킷을 table 에 저장하기 위해서
필요한 테이블을 생성하는 작업이다.

[root@centos1 libpcap-0.9.4]# mysql -u root -p
mysql> create database snort
mysql> use snort
Database changed
mysql> source /tmp/snort-2.8.6/schemas/create_mysql
mysql> show tables;
+------------------+
| Tables_in_snort |
+------------------+
| data |
| detail |
| encoding |
| event |
| icmphdr |
| iphdr |
| opt |
| reference |
| reference_system |
| schema |
| sensor |
| sig_class |
| sig_reference |
| signature |
| tcphdr |
| udphdr |
+------------------+
16 rows in set (0.01 sec)

mysql>

mysql> grant insert,select on snort.* to snort@localhost
-> identified by 'pass1234'; <= snort 계정을 만들고 암호는 pass1234 로 지정.
그리고 snort db 에 대해서 insert 권한과 select 권한을 허락함.
Query OK, 0 rows affected (0.06 sec)

mysql>flush privileges; <= user table reload

세가지 주 사용방법.
- tcpdump 와 같은 packet sniffer 로 사용.
- 패킷 logger 로 사용(network traffic 디버깅에 유용하다)
- 네트워크 탐지 시스템으로 사용.

snort 로그패킷은 database 또는 아스키코드 포맷으로 변환할 수 있다.

-b tcpdump 패킷처럼 바이너리형태로 캡처한다. 이 옵션은 text 형태의 변환과정이 필요없으므로
빠르다. 디폴트 파일명은 snort.log.timestamp 형식이다.
다른이름으로 캡처하려면 -L 옵션이 필요하다.

-c configfile
config 파일이 있는 rule 을 사용한다.

-e Display/log the link layer packet headers.

-b Log packets in tcpdump format (much faster!)
-c Use Rules File
-d Dump the Application Layer
-D Run Snort in background (daemon) mode
-T Test and report on the current Snort configuration
-v Be verbose
-V Show version number
-X Dump the raw packet data starting at the link layer


packet sniffer 방식

[root@centos1 snort]# snort -v
Running in packet dump mode

--== Initializing Snort ==--
Initializing Output Plugins!
***
*** interface device lookup found: eth0
***
Initializing Network Interface eth0
Decoding Ethernet on interface eth0

--== Initialization Complete ==--

,,_ -*> Snort! <*-
o" )~ Version 2.8.6 (Build 38)
'''' By Martin Roesch & The Snort Team: http://www.snort.org/snort/snort-team
Copyright (C) 1998-2010 Sourcefire, Inc., et al.
Using PCRE version: 8.02 2010-03-19

Not Using PCAP_FRAMES
05/27-19:46:09.562589 ARP who-has 192.168.0.21 tell 192.168.0.1

05/27-19:46:09.565495 ARP reply 192.168.0.21 is-at 0:17:31:15:CD:E6

05/27-19:46:11.026841 192.168.0.1:3072 -> 239.255.255.250:1900
UDP TTL:1 TOS:0x0 ID:0 IpLen:20 DgmLen:293 DF
Len: 265
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
05/27-19:46:11.028662 192.168.0.1:3072 -> 239.255.255.250:1900
UDP TTL:1 TOS:0x0 ID:0 IpLen:20 DgmLen:365 DF
Len: 337
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

05/27-19:46:11.030237 192.168.0.1:3072 -> 239.255.255.250:1900
UDP TTL:1 TOS:0x0 ID:0 IpLen:20 DgmLen:361 DF
Len: 333
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=

- 패킷 logging 방식 (패킷을 파일에 저장하는 방식)

먼저 패킷을 저장할 디렉토리를 생성한다.
mkdir /var/log/snort


[root@centos1 snort]# snort -vde -l /var/log/snort -K pcap

-v : verbose
-d : 애플리케이션 계층의 데이터를 Hex code나 아스키 코드로 출력한다.
-e : MAC 주소 정보도 출력한다.
-l : log를 저장할 디렉토리
-K [logging-mode] : default logging mode is pcap.
유효한 옵션은 pcap, ascii, none.
pcap : pcap(tcpdump) format 으로 저장
ascii : 아스키포맷으로 저장
none : 로깅하지 않음.
디폴트 로깅디렉토리는 /var/log/snort 임.

*. 기타옵션
snot -vde port 80 ; 웹 서비스 관련 패킷만 캡처
snot -vd host 192.168.100.1 ; 특정 호스트 관련 패킷만 캡쳐
snot -vde udp ; udp 프로토콜 관련 패킷만 캡쳐


[root@centos1 snort]# snort -vd -l /var/log
-l : logging 디렉토리 지정.

[root@centos1 snort]# ls /var/log/snort.log.*
/var/log/snort.log.1274959324
[root@centos1 snort]#

root@centos1 snort]# snort -vd -l /var/log -K ascii

침입탐지모드(NIDS mode)
- rule 을 이용한 패킷캡처.

*. snort rule 설치후 test ( 에러가 나면 아래처럼 에러를 수정한다)
==========================================================
root@centos1 /usr/local/snort-2.8.6/etc]# snort -c ./snort.conf
Running in IDS mode

--== Initializing Snort ==--
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file "./snort.conf"
PortVar 'HTTP_PORTS' defined : [ 80 1220 2301 3128 7777 7779 8000 8008 8028 8080 8180 8888 9999 ]
PortVar 'SHELLCODE_PORTS' defined : [ 0:79 81:65535 ]
PortVar 'ORACLE_PORTS' defined : [ 1024:65535 ]
PortVar 'SSH_PORTS' defined : [ 22 ]
Detection:
Search-Method = AC-Full-Q
Split Any/Any group = enabled
Search-Method-Optimizations = enabled
Maximum pattern length = 20
ERROR: parser.c(5161) Could not stat dynamic module path "/usr/local/lib/snort_dynamicpreprocessor/": No such file or directory.
Fatal Error, Quitting..
[root@centos1 /usr/local/snort-2.8.6/etc]#
설정 파일안에 경로가 잘못되어 에러가 발생했다.
정확한 파일경로를 찾아서 설정파일에서 해당파일 경로를 수정한다.

[root@centos1 /usr/local/snort-2.8.6]# find . -name snort_dynamic*
./lib/snort_dynamicengine
./lib/snort_dynamicpreprocessor
./src/snort_dynamicsrc
[root@centos1 /usr/local/snort-2.8.6]#

[root@centos1 /usr/local/snort-2.8.6/etc]# snort -c ./snort.conf
Running in IDS mode

--== Initializing Snort ==--
Initializing Output Plugins!
Initializing Preprocessors!
Initializing Plug-ins!
Parsing Rules file "./snort.conf"
PortVar 'HTTP_PORTS' defined : [ 80 1220 2301 3128 7777 7779 8000 8008 8028 8080 8180 8888 9999 ]
PortVar 'SHELLCODE_PORTS' defined : [ 0:79 81:65535 ]
PortVar 'ORACLE_PORTS' defined : [ 1024:65535 ]
PortVar 'SSH_PORTS' defined : [ 22 ]
Detection:
Search-Method = AC-Full-Q
Split Any/Any group = enabled
Search-Method-Optimizations = enabled
Maximum pattern length = 20
ERROR: parser.c(5161) Could not stat dynamic module path "/usr/local/snort-2.8.6/lib/snort_dynamicrules": No such file or directory.
Fatal Error, Quitting..
에러가 발생했다.
[root@centos1 /usr/local/snort-2.8.6/etc]# find . -name snort_dynamicrules
[root@centos1 /usr/local/snort-2.8.6/etc]# cd ..
[root@centos1 /usr/local/snort-2.8.6]# find . -name snort_dynamicrules
[root@centos1 /usr/local/snort-2.8.6]# ; 해당 파일이 없다.
설정파일에서 주석처리해야 한다.

[root@centos1 /usr/local/snort-2.8.6/etc]# snort -c ./snort.conf
...
...
...
161 client (Footprint)
443 client (Footprint) server (Footprint)
Stream5 UDP Policy config:
Timeout: 180 seconds
ERROR: ./snort.conf(193) => Invalid keyword 'compress_depth' for 'global' configuration.
Fatal Error, Quitting..
[root@centos1 /usr/local/snort-2.8.6/etc]# ; 193라인에서 에러 발생

파일열어서 주석처리한다. compress_depth 2048
========================================================



snort 를 실행하고 패킷이 수집되는 동안 잠시기다렸다가 끝내고 확인해보면
아래와 같이 패킷이 저장된 파일을 확인할 수 있다.

[root@centos1 snort]# pwd
/var/log/snort
[root@centos1 snort]# file snort.log.1274957588
snort.log.1274957588: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 1514)

[root@centos1 snort]# ls -F
111.67.211.105/ 192.168.0.21/ PACKET_NONIP snort.log.1274947830 snort.log.1274949793
192.168.0.1/ 192.168.100.100/ snort.log.1274943849 snort.log.1274949769 snort.log.1274957588
[root@centos1 snort]#

* alert 파일 내용
[**] [1:1002:13] WEB-IIS cmd.exe access [**]
[Classification: Web Application Attack] [Priority: 1]
05/28-09:03:28.187553 192.168.100.100:35845 -> 192.168.100.1:80
TCP TTL:64 TOS:0x10 ID:7084 IpLen:20 DgmLen:66 DF
***AP*** Seq: 0x2AF77A2 Ack: 0x610DE601 Win: 0x5C TcpLen: 32
TCP Options (3) => NOP NOP TS: 247890360 87338255

[**] [119:19:1] (http_inspect) LONG HEADER [**]
[Priority: 3]
05/28-09:05:22.604075 192.168.0.29:1402 -> 202.131.27.89:80
TCP TTL:128 TOS:0x0 ID:38217 IpLen:20 DgmLen:1454 DF
***A**** Seq: 0xAC6BD2D Ack: 0x9CA28C12 Win: 0x4470 TcpLen: 20

snort 가 남긴 alert 파일 내용이다.

snort.conf 파일에 보면
include $RULE_PATH/web-iis.rules

그리고 rule 파일은 rule 을 설치한 디렉토리에
web-iis.rules 파일에 보면

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"WEB-IIS cmd.exe access"; flow:to_server,established; uricontent:" cmd.exe"; fast_pattern; nocase; metadata:policy balanced-ips drop, policy connectivity-ips drop, policy security-ips drop, servi ce http; classtype:web-application-attack; sid:1002; rev:13;)

이 rule 설정에 의해 위에 출력된것과 같은 alert 메세지가 남는다.


*. mysql db 와 연동이 되게 하기위해서는
운영중인 snort 를 종료시키고

=> killall snort

snort.conf 파일에서 아래내용을 확인하고 수정한다.

# database
# output database: alert, , user= password= test dbname= host=
# output database: log, , user= password= test dbname= host=

아래처럼 수정한다.

# database
output database: alert, mysql, user=snort password=pass1234 dbname=snort host=localhost
output database: log, mysql, user=snort password=pass1234 dbname=snort host=localhost

그런다음

다시 snort 를 구동한다.

snort -c 경로명/snort.conf

snort 가 구동될때 에러가 발생하면 에러를 잡고 다시 구동한다.


그리고 snort 계정으로 db 접속후 아래와 같이 확인해보면
table 에 로그가 잘 저장되어 있는것을 확인할 수 있다.

mysql> select * from signature
-> ;
+--------+----------------------------------------------------------------------+--------------+--------------+---------+---------+---------+
| sig_id | sig_name | sig_class_id | sig_priority | sig_rev | sig_sid | sig_gid |
+--------+----------------------------------------------------------------------+--------------+--------------+---------+---------+---------+
| 1 | (portscan) TCP Portscan | 0 | 3 | NULL | 1 | 122 |
| 2 | (portscan) Open Port | 0 | 3 | NULL | 27 | 122 |
| 3 | Consecutive TCP small segments exceeding threshold | 0 | 3 | 1 | 12 | 129 |
| 4 | WEB-IIS cmd.exe access | 1 | 1 | 13 | 1002 | 1 |
| 5 | ICMP Destination Unreachable Fragmentation Needed and DF bit was set | 2 | 3 | 7 | 396 | 1 |
| 6 | (http_inspect) LONG HEADER | 0 | 3 | 1 | 19 | 119 |
| 7 | Bad segment, adjusted size <= 0 | 0 | 3 | 1 | 5 | 129 |
+--------+----------------------------------------------------------------------+--------------+--------------+---------+---------+---------+
7 rows in set (0.03 sec)

mysql> select * from sig_class;
+--------------+------------------------+
| sig_class_id | sig_class_name |
+--------------+------------------------+
| 1 | web-application-attack |
| 2 | misc-activity |
+--------------+------------------------+
2 rows in set (0.02 sec)

mysql>

'Log > Linux' 카테고리의 다른 글

메일서비스(sendmail)  (0) 2011.11.28
samba 서비스  (0) 2011.11.28
tcpdump - packet capture / 분석  (0) 2011.11.28
포트스캔 및 차단  (0) 2011.11.28
로그서비스 - syslog / logrotate / logwatch  (0) 2011.11.28
Posted by logwatch
tcpdump - dump traffic on a network http://www.tcpdump.org/

tcpdump 는 네트워크 인터페이스상의 패킷 헤더를 출력한다.
그리고 파일로 출력하여 분석해 볼수도 있다. 파일로 출력할 경우에는 -w 옵션을 사용하며
저장된 파일내용을 볼때는 -r 옵션을 사용한다.

tcpdump 는 패킷을 캡쳐할 카운터를 지정하지 않는 경우에는 SIGINT 또는 SIGTERM signal 을 받을때까지
계속 실행된다.

tcpdump 사용법

tcpdump --help
tcpdump version 3.9.4
libpcap version 0.9.4
Usage: tcpdump [-aAdDeflLnNOpqRStuUvxX] [-c count] [ -C file_size ]
[ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ] [ -y datalinktype ] [ -Z user ]
[ expression ]
[root@centos1 ~]#

ex)
tcpdump -i eth0 -w /tmp/tcpdump.pkt ; eth0 으로 패킷캡처하여 파일로저장
tcpdump -r /tmp/tcpdump.pkt ; 저장된 파일 모니터로 출력.
tcpdump -i eth0 -c 10 ; 10개만 캡처.
tcpdump -w /tmp/tcpdump.pkt -s 1500 tcp port 21 and host client
-s 1500 ; 캡처할 패킷길이(1500 byte 는 전체길이를 뜻한다)
tcpdump host client
tcpdump -nn host client and port 21
tcpdump -nne host client and port 21

[root@centos1 ~]# tcpdump -n host 192.168.100.100 and port 23 -w /tmp/tcpdump.pkt
[root@centos1 ~]# tcpdump -r /tmp/tcpdump.pkt | head -4
reading from file /tmp/tcpdump.pkt, link-type EN10MB (Ethernet)
20:09:51.200931 IP 192.168.100.100.59708 > 192.168.100.1.telnet: S 3013182863:3013182863(0) win 5840
20:09:51.205507 IP 192.168.100.1.telnet > 192.168.100.100.59708: S 3185271194:3185271194(0) ack 3013182864 win 5792
20:09:51.211135 IP 192.168.100.100.59708 > 192.168.100.1.telnet: . ack 1 win 92

20:09:52.719159 IP 192.168.100.1.telnet > 192.168.100.100.59708: P 1:13(12) ack 1 win 91

옵션설명
-n : Don’t convert host addresses to names. This can be used to avoid DNS lookups.
호스트 이름을 도메인 또는 호스트이름으로 풀이하지 않고 ip 주소로 출력해준다.
DNS 를 찾지 않으면 그만큼의 트래픽을 줄일 수 있다.

20:09:51.200931 : 패킷수집시간
192.168.100.100.59708 > 192.168.100.1.telnet : source ip.포트번호 > destination ip.포트번호(또는 서비스이름)
*. 포트번호가 /etc/services 파일에 등록이 되어 있는경우라면 서비스이름으로 표시된다.
S : 패킷 Sequence number
win 5840 mss 1460 : max-segment-size
sackOK :
nop:

패킷 flag
S : SYN - 연결요청
F : FIN - 연결종료요청
R : RST - 즉시연결종료
P : PSH - 프로세스로 데이터전송
U : URG - 긴급한 데이터에 데이터전송 우선순위를 할당.
. : flag 가 설정되지 않았음.

*. 패킷출력내용중 세번째 라인까지가 3way hand-shaking 이다.
* 네번째 라인부터는 데이터 전송.

[root@centos1 ~]# tcpdump -r /tmp/tcpdump.pkt | tail -5
reading from file /tmp/tcpdump.pkt, link-type EN10MB (Ethernet)
20:10:12.538184 IP 192.168.100.1.telnet > 192.168.100.100.59708: P 1075:1082(7) ack 106 win 91
20:10:12.543157 IP 192.168.100.100.59708 > 192.168.100.1.telnet: . ack 1082 win 159
20:10:12.674086 IP 192.168.100.1.telnet > 192.168.100.100.59708: F 1082:1082(0) ack 106 win 91
20:10:12.686700 IP 192.168.100.100.59708 > 192.168.100.1.telnet: F 106:106(0) ack 1083 win 159
20:10:12.688650 IP 192.168.100.1.telnet > 192.168.100.100.59708: . ack 107 win 91

[root@centos1 ~]#

* 패킷 출력 결과중 끝에서 3번째 라인부터가 접속종료 과정이다.

비활성화 되어 있는 서비스로 접속할 경우

[root@centos1 ~]# tcpdump -n host 192.168.100.100 and port 23 -w /tmp/tcpdump2.pkt
[root@centos100 ~]# telnet 192.168.100.1
Trying 192.168.100.1...
telnet: connect to address 192.168.100.1: Connection refused
telnet: Unable to connect to remote host: Connection refused
[root@centos100 ~]#
[root@centos1 ~]# tcpdump -r /tmp/tcpdump20.pkt
reading from file /tmp/tcpdump20.pkt, link-type EN10MB (Ethernet)
20:44:35.063400 IP 192.168.100.100.56378 > 192.168.100.1.telnet: S 787328461:787328461(0) win 5840
20:44:35.067331 IP 192.168.100.1.telnet > 192.168.100.100.56378: R 0:0(0) ack 787328462 win 0
[root@centos1 ~]#

*. 서버측에서 Sequence number 로 응답하는대신 R flag 를 세팅하여 보내고 클라이언트측에서 그 패킷을 받는 즉시 연결종료된다.

방화벽에 막혀있는경우
[root@centos1 ~]# iptables -F
[root@centos1 ~]# iptables -A INPUT -s 192.168.100.100 -p tcp --dport telnet -j DROP
[root@centos1 ~]# tcpdump -n host 192.168.100.100 and port 23 -w /tmp/tcpdump3.pkt
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

[root@centos100 ~]# telnet 192.168.100.1
Trying 192.168.100.1...
telnet: connect to address 192.168.100.1: Connection timed out
telnet: Unable to connect to remote host: Connection timed out
[root@centos100 ~]#

[root@centos1 ~]# tcpdump -r /tmp/tcpdump4.pkt
reading from file /tmp/tcpdump4.pkt, link-type EN10MB (Ethernet)
20:58:16.099647 IP 192.168.100.100.43630 > 192.168.100.1.telnet: S 1498268765:1498268765(0) win 5840
20:58:20.900736 IP 192.168.100.100.43630 > 192.168.100.1.telnet: S 1498268765:1498268765(0) win 5840
20:58:27.744399 IP 192.168.100.100.43630 > 192.168.100.1.telnet: S 1498268765:1498268765(0) win 5840
20:58:40.580851 IP 192.168.100.100.43630 > 192.168.100.1.telnet: S 1498268765:1498268765(0) win 5840
20:59:08.779405 IP 192.168.100.100.43630 > 192.168.100.1.telnet: S 1498268765:1498268765(0) win 5840
21:00:05.366996 IP 192.168.100.100.43630 > 192.168.100.1.telnet: S 1498268765:1498268765(0) win 5840
[root@centos1 ~]#

*. 클라이언트가 같은 패킷을 계속 보내지만 서버가 응답하지 않는다.

[root@centos1 ~]# iptables -F
[root@centos1 ~]# iptables -A INPUT -s 192.168.100.100 -p tcp --dport telnet -j REJECT ; REJECT 로 거부할 경우.

[root@centos1 ~]# tcpdump -n host 192.168.100.100 and port 23 -w /tmp/tcpdump5.pkt
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

root@centos100 ~]# telnet 192.168.100.1
Trying 192.168.100.1...
telnet: connect to address 192.168.100.1: Connection refused
telnet: Unable to connect to remote host: Connection refused
[root@centos100 ~]#

[root@centos1 ~]# tcpdump -r /tmp/tcpdump5.pkt
reading from file /tmp/tcpdump5.pkt, link-type EN10MB (Ethernet)
21:05:06.955754 IP 192.168.100.100.51055 > 192.168.100.1.telnet: S 1879397660:1879397660(0) win 5840
[root@centos1 ~]#

*. DROP 과 다른점이 없어보인다. 차이가 있다면 클라이언트가 패킷을 하나만 보내고 끝난다.

udp를 기반으로 하는 서비스인경우
[root@centos1 tftpboot]# tcpdump -n host 192.168.100.100 and port 69 -w /tmp/tcpdump9.pkt

[root@centos100 temp2]# tftp 192.168.100.1 -c get a.txt
[root@centos1 tftpboot]# tcpdump -r /tmp/tcpdump9.pkt
reading from file /tmp/tcpdump9.pkt, link-type EN10MB (Ethernet)
22:27:08.416478 IP 192.168.100.100.33136 > 192.168.100.1.tftp: 13 RRQ "1" netascii
22:27:08.734306 IP 192.168.100.100.33136 > 192.168.100.1.tftp: 13 RRQ "2" netascii
22:27:09.029195 IP 192.168.100.100.33136 > 192.168.100.1.tftp: 13 RRQ "3" netascii

* udp 는 3way - hand-shaking 이 없다.

*. udp 서비스가 방화벽에 막혀 있는 경우
[root@centos1 tftpboot]# iptables -F
[root@centos1 tftpboot]# iptables -A INPUT -p udp --dport 69 -j DROP
[root@centos1 tftpboot]# tcpdump -n host 192.168.100.100 and port 69 -w /tmp/tcpdump10.pkt
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

[root@centos100 temp2]# tftp 192.168.100.1 -c get a.txt b.txt c.txt
Transfer timed out.
[root@centos100 temp2]#

[root@centos1 tftpboot]# tcpdump -r /tmp/tcpdump10.pkt
reading from file /tmp/tcpdump10.pkt, link-type EN10MB (Ethernet)
22:34:29.379785 IP 192.168.100.100.49576 > 192.168.100.1.tftp: 17 RRQ "a.txt" netascii
22:34:34.796127 IP 192.168.100.100.49576 > 192.168.100.1.tftp: 17 RRQ "a.txt" netascii
22:34:40.635185 IP 192.168.100.100.49576 > 192.168.100.1.tftp: 17 RRQ "a.txt" netascii
22:34:45.510690 IP 192.168.100.100.49576 > 192.168.100.1.tftp: 17 RRQ "a.txt" netascii
22:34:51.942627 IP 192.168.100.100.49576 > 192.168.100.1.tftp: 17 RRQ "a.txt" netascii
[root@centos1 tftpboot]#

*. 패킷에서 패스워드 찾기

[root@centos1 tftpboot]# tcpdump -X -r /tmp/telnet.pkt > /tmp/telnet.txt

[root@centos100 temp2]# telnet 192.168.100.1
Trying 192.168.100.1...
Connected to 192.168.100.1 (192.168.100.1).
Escape character is '^]'.
CentOS release 5.3 (Final)
Kernel 2.6.18-128.el5 on an i686
login: user1
Password:
Last login: Wed Jun 2 20:24:36 from 192.168.100.100
[user1@centos1 ~]$ logout
Connection closed by foreign hos

[root@centos1 tftpboot]# tcpdump -X -r /tmp/telnet.pkt > /tmp/telnet.txt

-X : Print each packet (minus its link level header) in hex and ASCII. This is very handy for analysing new protocols.

-X 옵션을 사용하면 hexa 코드와 아스키코드로 출력해주므로 그냥 보기에는 출력결과가 많아서 어렵다.
그러므로 파일로 저장해서 특정문자열을 검색하는 방법으로 보는것이 패스워드를 쉽게
찾을수 있는 방법이다.
vi 편집기로 열어서 Password 라는 문자열을 검색한 후 아래쪽을 보면 캡쳐된 암호가
보일것이다.

패스워드는 apple 이다. 내용이 많아서 편의상 app 까지만 출력하였다.
각 패킷에서의 마지막 문자가 암호인데 한 패킷씩 건너뛰고 저장되어 있다.
당연히 그렇게 저장된다.

0x0030: 06b2 00d3 5061 7373 776f 7264 3a20 ....Password:.
22:50:28.490812 IP 192.168.100.100.55824 > 192.168.100.1.telnet: . ack 146 win 92
0x0000: 4510 0034 1460 4000 4006 dc9d c0a8 6464 E..4.`@.@.....dd
0x0010: c0a8 6401 da10 0017 e1f1 fd47 1bf1 13c1 ..d........G....
0x0020: 8010 005c fad9 0000 0101 080a 06b2 0140 ...\...........@
0x0030: 1114 2fb7 ../.
22:50:29.198462 IP 192.168.100.100.55824 > 192.168.100.1.telnet: P 90:91(1) ack 146 win 92
0x0000: 4510 0035 1461 4000 4006 dc9b c0a8 6464 E..5.a@.@.....dd
0x0010: c0a8 6401 da10 0017 e1f1 fd47 1bf1 13c1 ..d........G....
0x0020: 8018 005c 9716 0000 0101 080a 06b2 03fa ...\............
0x0030: 1114 2fb7 61 ../.a
22:50:29.242685 IP 192.168.100.1.telnet > 192.168.100.100.55824: . ack 91 win 91
0x0000: 4510 0034 050c 4000 4006 ebf1 c0a8 6401 E..4..@.@.....d.
0x0010: c0a8 6464 0017 da10 1bf1 13c1 e1f1 fd48 ..dd...........H
0x0020: 8010 005b f52a 0000 0101 080a 1114 32ac ...[.*........2.
0x0030: 06b2 03fa ....
22:50:29.494741 IP 192.168.100.100.55824 > 192.168.100.1.telnet: P 91:92(1) ack 146 win 92
0x0000: 4510 0035 1462 4000 4006 dc9a c0a8 6464 E..5.b@.@.....dd
0x0010: c0a8 6401 da10 0017 e1f1 fd48 1bf1 13c1 ..d........H....
0x0020: 8018 005c 8420 0000 0101 080a 06b2 04fa ...\............
0x0030: 1114 32ac 70 ..2.p
22:50:29.497150 IP 192.168.100.1.telnet > 192.168.100.100.55824: . ack 92 win 91
0x0000: 4510 0034 050d 4000 4006 ebf0 c0a8 6401 E..4..@.@.....d.
0x0010: c0a8 6464 0017 da10 1bf1 13c1 e1f1 fd49 ..dd...........I
0x0020: 8010 005b f32a 0000 0101 080a 1114 33ab ...[.*........3.
0x0030: 06b2 04fa ....
22:50:29.615998 IP 192.168.100.100.55824 > 192.168.100.1.telnet: P 92:93(1) ack 146 win 92
0x0000: 4510 0035 1463 4000 4006 dc99 c0a8 6464 E..5.c@.@.....dd
0x0010: c0a8 6401 da10 0017 e1f1 fd49 1bf1 13c1 ..d........I....
0x0020: 8018 005c 82a4 0000 0101 080a 06b2 0576 ...\...........v
0x0030: 1114 33ab 70 ..3.p

이하 생략...

Let’s assume that we want to watch packets used in establishing a TCP connection. Recall that TCP uses a 3-way handshake protocol
when it initializes a new connection; the connection sequence with regard to the TCP control bits is

1) Caller sends SYN
2) Recipient responds with SYN, ACK
3) Caller sends ACK



URG | ACK | PSH | RST | SYN | FIN

URG : Urgent pointer is valid
RST: Reset the connection
ACK : Acknowlegement is valid
SYN : Syncronize sequence numbers
PSH : Request for push
FIN : Terminate the connection


TCP 연결 (3way hand shaking)

Client Server
Segment 1: SYN
| ---------------- seq : 1000, ack : - --------------> |
| |
| Segment 2: SYN ACK |
|<---------------- seq : 4000, ack : 1001 ---------|
| |
| Segment 3: ACK |
| -------------------------- ack ------------------->|
| |
v v
Time Time

TCP data 전송

Client Server
Segment 1:
| ---------------- seq : 2000, 200bytes : - -------------->|
|| |
| <-------------------- ACK :2200 ------------------------- |
| | | Segment 2: |
|<---------------- seq : 2200, 200 bytes ----------------- |
| |
| -------------------- ACK : 2400 -------------------------> |
| |
| Segment 3: |
| -------------------- seq : 2400, 200 bytes -----------> |

time out 까지 응답없음.
| |
| Segment 3: (다시 전송) |
| ----------------- seq : 2400, 200bytes ---------------> |
| |
v v
Time Time

TCP 연결 종료 과정

Client Server
Segment 1: FIN
| ---------------- seq : 2000, ack : - --------------> |
| |
| Segment 2: ACK |
|<---------------- seq : 5000, ack : 2001 ---------|
| |
| Segment 3: FIN |
| <-------------------- seq : 5001, ack 2001 -------- |
| |
| Segment 4: ACK |
| ----------------- ack 5002 ------------------------->|
| |
v v
Time Time

TCP 상태
state Description
--------------------------------------------------------------------------------
closed : There is no connection. (연결되지 않았다)
listen : The server is waiting for calls from the client (클라이언트의 접속을 기다리고 있다)
syn-sent : A connection request is sent; waiting for acknowlegement. (접속 요청을 보내고 응답을 기다리고 있다)
syn-recvd : A connection request is received (접속요청에 대한 응답을 받았다)
established : Connection is established (접속완료)

fin-wait-1 : The application has requested the closing of the connection. (연결 끊기를 요청)
fin-wait-2 : The other side has accepted the closing of the connection. (요청에 대한 응답을 받았다)
time-wait : Waiting for retransmitted segments to die.(연결 끊기에 대한 응답을 다시 기다림)
close-wait : The server is waiting for the application to close.(서버가 클라이언트로부터 연결종료를 기다림)
last-ack : The server is waiting for the last acknowlegement. (서버가 클라이언트로부터 연결종료에 대한 마지막 응답을 기다림)

'Log > Linux' 카테고리의 다른 글

samba 서비스  (0) 2011.11.28
IDS - snort 1  (0) 2011.11.28
포트스캔 및 차단  (0) 2011.11.28
로그서비스 - syslog / logrotate / logwatch  (0) 2011.11.28
리눅스 방화벽 - iptables  (0) 2011.11.28
Posted by logwatch
이전버튼 1 2 3 4 5 이전버튼

블로그 이미지
내가 나에게 확인 하는 블로그
logwatch

태그목록

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.11
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

최근에 올라온 글

최근에 달린 댓글

글 보관함