RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'분류 전체보기'에 해당되는 글 379
출처 블로그 > 『해킹.... 속임수의 예술....』
원본 http://blog.naver.com/zsup1343/60003542397
원문 작성자 : 백선우
-서문-

밑에 팁란에 이미 ProFTPD 와 MySQL을 연동하는 방법이 올라와
있어서 ProFTPD의 Stable 버전인 1.2.4 를 사용해서 그 방법으로
해보았는데 셋팅에 별다른 문제가 없음에도 제대로 동작하지 않았습니다.
디버그 모드로 실행해본결과 Signal 11이 발생하면서 종료가 되더군요.
그래서 이곳 질답란에 문의를 해보았지만 아무도 답변을 안해주시더군요.
어쨌든 그냥 포기할까 하다가 1.2.5rc1 을 설치하고 다시 시도한 결과
성공했습니다. 그런데 1.2.5에서는 1.2.4 까지의 SQL 관련 설정 방법에
차이가 있어서 이곳 팁란에 이렇게 글을 올리게 되었습니다.

-ProFTPD 설치 방법-

일단, MySQL은 설치되었다고 가정하고...저의 경우에는 RedHat 7.2에
기본적으로 들어있는 RPM 으로 설치를 했습니다.

그다음은 ProFTPD 설치를 합니다.
www.proftpd.org 에 가셔서 1.2.5rc1 버전을 다운받습니다.
압축 푸시고
./configure --prefix=/usr --with-modules=mod_sql:mod_sql_mysql \
--with-includes=/usr/include/mysql --with-libraries=/usr/lib/mysql \
--sysconfdir=/etc --localstatedir=/var
make
make install

-설정 방법-

그리고 mysql에 database를 만듭니다.
database 이름은 proftp로 짓습니다.
그리고 아래의 테이블을 만듭니다. 아래 테이블은 아래에 있던
ProFTP + MySQL 팁에서 가져왔습니다. 단 한가지 다른 점이 있다면
group 테이블에서 Field 에 gname 을 groupname으로 변경했습니다.
1.2.5rc1에서 Default로 groupname을 찾습니다.

* 테이블명: users
   +---------+------------------+------+-----+---------+-------+
   | Field   | Type             | Null | Key | Default | Extra |
   +---------+------------------+------+-----+---------+-------+
   | userid  | char(12)         |      | PRI |         |       |
   | uid     | int(10) unsigned | YES  |     | NULL    |       |
   | gid     | int(10) unsigned | YES  |     | NULL    |       |
   | passwd  | char(63)         | YES  |     | NULL    |       |
   | shell   | char(255)        | YES  |     | NULL    |       |
   | homedir | char(255)        | YES  |     | NULL    |       |
   | count   | int(10) unsigned |      |     | 0       |       |
   | valid   | int(10) unsigned | YES  |     | NULL    |       |
   +---------+------------------+------+-----+---------+-------+

* 테이블명: groups
   +-----------+------------------+------+-----+---------+-------+
   | Field     | Type             | Null | Key | Default | Extra |
   +-----------+------------------+------+-----+---------+-------+
   | groupname | char(12)         |      | PRI |         |       |
   | gid       | int(10) unsigned |      |     | 0       |       |
   | members   | text             | YES  |     | NULL    |       |
   +-----------+------------------+------+-----+---------+-------+

그리고 /etc/proftpd.conf 를 아래와 같이 편집합니다.
물론 서버명이나 포트, 디렉토리 같은 부분은 여러분에게
맞게 변경해주시기 바랍니다.

ServerName                      "r2al3ac's FTP server"
ServerType                      standalone
ServerIdent                     on "r2al3ac's FTP server ready..."
ServerAdmin                     "r2al3ac@hananet.net"
DefaultServer                   on

Port                            21

Umask                           022

MaxInstances                    30

User                            nobody
Group                           nobody

#아래 SQLConnectInfo 문에서 proftp는 데이터베이스명이며 아이디와 비밀번
호는
#여러분의 mysql 설정에 맞게 변경해주시면 됩니다.
#보시면 1.2.4 버전때와는 다른점이 있음을 알 수 있습니다.
SQLConnectInfo                  proftp@localhost:3306 아이디 비밀번호
SQLAuthTypes                    Backend
SQLAuthenticate                 on
SQLUserInfo                     users userid passwd uid gid homedir  
shell
SQLLog                          PASS updatecount
SQLNamedQuery                   updatecount UPDATE "count=count+1  
WHERE userid='%u'" users
SQLUserWhereClause              "valid = 1"
SQLDefaultHomeDir               /var/ftp
DisplayLogin                    welcome.msg
DisplayFirstChdir               .message

DefaultRoot                     /var/ftp
MaxClients                      4
MaxClientsPerHost               1
MaxHostsPerUser                 1

RequireValidShell               off

AllowRetrieveRestart            on
AllowStoreRestart               on
AllowOverwrite                  on



AllowAll





DenyAll





AllowAll


DenyAll





DenyAll


AllowAll



-테스트 하기-

1. mysql에서 proftp 데이터베이스에 users 테이블에 사용자를 하나 등록 시
킵니다. 단, 반드시 valid 값을 1로 주셔야 됩니다. 만약 1이 아닐경우에는  
로그인이 되지 않습니다.

2. /usr/sbin/prftpd start 를 쳐서 proftpd 를 실행합니다.

3. ftp 나 ncftp 를 사용해서 1번에서 등록해준 사용자와 비밀번호로 로그인
을 해봅니다.

-만약 안된다면-

proftpd.conf 셋팅에 문제는 없는지 확인해보시고,
포트를 다른 걸로 바꿔보시고,
그래도 안된다면 아래와 같은 방법으로 proftpd를 디버그 모드로 실행해서
어디서 어떻게 잘못되었는지 알아보시기 바랍니다.

/usr/sbin/proftpd -d 5 -n -c /etc/proftpd.conf

이렇게 입력하시면 디버그 모드로 실행이 됩니다.

그리고 터미널 창을 하나 더 열어서 ftp 로 접속을 시도해 보시면
어디서 어떻게 잘못되었는지 알 수 있습니다.

-덧붙이는 말-

위에서 SQLAuthenticate 부분을 on 이라고 해놓았는데, 만약
group 테이블을 사용하지 않으시면 SQLAuthenticate users 로
바꿔서 사용하시면 됩니다.

하지만 on으로 해놓아도 별문제 없이 쓰실수 있습니다.

설정문과 관련해서 자세한 것은 proftpd 문서를 참고하시기
바랍니다. 참고로 proftpd.oops.org 나 www.proftpd.org 문서들은
outdate 되어서 1.2.5rc1 과는 차이가 있으므로 proftpd1.2.5rc1을
다운받으면 안에 첨부된 문서를 참조하셔야됩니다.

그럼 꼭 성공하시길 바랍니다.
2006/09/08 14:04 2006/09/08 14:04
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > semigifn님의 블로그
원본 http://blog.naver.com/semigifn/16469526



출처 : 오라닉스 ( http://cafe.daum.net/oranix )

1. bash에서의 쉘변수와 환경변수(1) 쉘변수
 1) 개요: 말 그대로 특정한 쉘 즉 bash에서만 적용되는 변수를 말한다.
 2) 특징
  ㄱ. 지정하는 방법은 '변수명=값' 형태로 지정하면 된다.
    예) [posein@www posein]$ COLOR=red
  ㄴ. 변수값을 출력할 때는 변수명 앞에 $을 붙여 echo명령을 사용하면 된다.
    예) [posein@www posein]$ echo $COLOR
      red
(2) 환경변수: 모든 쉘에 영향을 미치는 변수라는 것을 제외하고는 쉘변수와 지정방법이나 특징이
        유사하다.
(3) bash에서 쉘변수를 환경변수화시키기: export명령을 사용하면 된다.

2. 일반적인 환경변수목록(1) 환경변수
 1) HOME : 사용자의 홈디렉토리
 2) PATH : 실행파일을 찾는 경로
 3) LANG : 프로그램 사용시 기본 지원되는 언어
 4) PWD : 사용자의 현재 작업하는 디렉토리
 5) TERM : 로긴 터미널 타입
 6) SHELL : 로그인해서 사용하는 쉘
 7) USER : 사용자의 이름
 8) DISPLAY : X 디스플레이 이름
 9) VISUAL : visual 편집기의 이름
 10) EDITOR : 기본 편집기의 이름
 11) COLUMNS : 현재 터미널이나 윈도우 터미널의 컬럼수
 12) PS1 : 명령프롬프트변수
 13) PS2 : 2차 명령프롬프트이다. 명령행에서 를 사용하여 명령행을 연장했을 때 나타난다.
 14) BASH : 사용하는 bash 쉘의 경로
 15) BASH_VERSION : bash의 버전
 16) HISTFILE : history 파일의 경로
 17) HISTFILESIZE : history 파일의 크기
 18) HISTSIZE : history에 저장되는 갯수
 19) HISTCONTROL : 중복되어지는 명령에 대한 기록 유무를 지정하는 변수이다.
 20) HOSTNAME : 호스트의 이름
 21) LINES : 터미널의 라인 수
 22) LOGNAME :로그인이름
 23) LS_COLORS : ls 명령의 색상관련 옵션
 24) MAIL : 메일을 보관하는 경로
 25) MAILCHECK : 메일확인시간
 26) OSTYPE : 운영체제 타입
 27) SHLVL :쉘의 레벨
 28) TERM :터미널종류
 29) UID : 사용자의 UID
 30) USERNAME : 사용자이름
(2) 사용예
 1) [posein@www /]$ mkdir $HOME/backup
   [posein@www /]$ ls -ld $HOME/backup
   drwxrwxr-x   2 posein  posein     4096 1월 15 01:31 /home/posein/backup
 2) [posein@www /]$ echo $PS1
   [u@h W]$
    => 프롬프트 형식
      d : '요일 달 날짜'형태로 나타내준다. (예 "Wed Jan 15")
      h : 호스트이름을 보여준다. 보통 '.'를 사용한 이름인 경우 첫번째 '.'까지 보여준다.
      H : 호스트이름을 보여준다.
      l : 쉘의 터미널 장치의 이름을 보여준다.
      s : 쉘의 이름을 보여준다.
      t : 24시 형태의 현재 시간을 보여준다. (예 HH:MM:SS)
      T : 12시 형태의 현재 시간을 보여준다. (예 HH:MM:SS)
      @ : am/pm 12시 형태의 현재시간을 보여준다.
      u : 현재 사용자의 이름을 보여준다.
      w : 현재 작업디렉토리를 보여준다.
      W : 현재작업디렉토리의 마지막 디렉토리만 보여준다.
      ! : 현재 명령의 히스토리 넘버를 보여준다.
      : 를 보여준다.
 3) [posein@www posein]$ PS1="[u@t W]$ "
   [posein@00:53:51 posein]$
    => 프롬프트에서 호스트이름대신에 현재시간을 표시하도록 설정하였다.

3. 환경변수관련 명령
(1) set : shell변수를 표시하고 값을 지정할 수 있다. C-shell에서는 변수와 값지정시에 필수적으
      로 사용해야 하지만, Bash에서는 변수와 값지정시에 꼭 set 명령을 지정하지 않아도 된다.
 1) 사용법
  set [option] [argument]
 2) option
  -o : 현재 set옵션의 상태를 표시한다.
 3) 사용예
  ㄱ. set
    => 옵션이나 인자가 주어지지 않으면 이미 지정된 shell변수와 함수이름,값이 표시된다.
  ㄴ. set -o
    => 현재 set옵션의 상태가 표시된다.
 4) 응용예
  [posein@www posein]$ a=1          // bash에서는 set 명령없이 "변수=값" 형태로 지정
                              하면 된다. 확인은 인자없이 set 이라고 입력한다.
  [posein@www posein]$ echo $a
  1
   => 변수로 선언되었으므로 $a하면 1이라는 값이 출력된다.
  [posein@www posein]$ /bin/csh       // 임시로 C-shell로 전환.
  [posein@www ~]$
   => C-shell로 전환하면 프롬프트로 바뀜을 알 수 있다.
  [posein@www ~]$ b=2
  b=2: Command not found.
   => bash에서 변수지정하는 것처럼 하면 오류가 나타남을 알 수 있다.
  [posein@www ~]$ set b=2
   => C-shell 계열에서는 변수와 값지정시 set 명령을 사용해야 한다. 확인하려면 인자없이 set
    이라고 입력한다.
  [posein@www ~]$ echo $b
  2
    => 변수로 선언되었으므로 $b하면 2라는 값이 출력된다.

(2) env : 환경변수에 대한 정보를 보여준다.
 1) 환경변수란 : 로그인할 때나 새로운 쉘을 파생시킬 때 쉘의 환경을 정의하는 중요한 역할을
           수행한다. env를 실행하면 환경 변수 설정값들을 확인할 수 있고 또한 각 환경
           변수를 나타낼 때 변수이름앞에 $를 붙인다.
 2) 사용예
  [root@www /root]# env
   => 현재 시스템의 환경변수를 보여준다.
 3) 환경변수의 설정 : 값을 지정한후 export해야 한다. 현재 리눅스의 bash에서는 export를 생략
              해도 반영된다.
  예) 패스변경하기
    [posein@www posein]$ echo $PATH
    /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin
      => 현재 패스를 확인하면 홈디렉토리를 없다. 홈디렉토리를 추가해보자.
    [posein@www posein]$ PATH="$PATH:/home/posein"
    [posein@www posein]$ export PATH
    [posein@www posein]$ echo $PATH
    /usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/posein/bin:/home/posein
(3) export : 쉘변수를 환경변수로 만들어주는 명령이다. 현재 리눅스 bash에서 일시적인 반영시에
        는 생략해서 사용할 수 있다.
 1) 사용법
  export 환경변수=변수값
 2) 사용예
  ㄱ. [root@www root]# export PATH="$PATH:/usr/local/apache/bin"
      => 현재 설정된 패스값에 /usr/local/apache/bin이라는 경로를 추가한다.
  ㄴ. [posein@www posein]$ PATH="$PATH:/home/posein"
      => 현재 설정된 패스값에 "/home/posein"이라는 경로를 추가한다. export명령을 생략해서
       사용해도 된다.
 3) 참고: export 명령은 쉘변수를 환경변수로 만들어 준다. 그러나, 쉘에서 export로 선언하여
      사용한 뒤에 로그아웃하게 되면 초기화된다. 따라서, 해당 환경변수의 값을 계속적으로
      반영되도록 하려면 /etc/profile(전체시스템)이나 ~/.bash_profile(개인사용자)파일안에
      선언하면 된다.

(4) unset : 선언된 변수를 제거하는 데 사용한다.
 1) 사용법
  unset 변수이름
 2) 사용예
  [root@www /root]# TEL=042
  [root@www /root]# echo $TEL
  042
  [root@www /root]# unset TEL
  [root@www /root]# echo $TEL  // 변수가 제거되었으므로 아무값도 출력되지 않는다.

(참고) bash에서는 환경변수를 만들 때 변수 값을 설정한 후, 환경에 변수를 익스포트(export)하는
    두 단계를 거친다.
 * 사용예
  [posein@www posein]$ echo $LANG     // 언어관련 환경변수값 확인
  ko_KR.eucKR
  [posein@www posein]$ date
  수 5월 21 01:28:56 KST 2003       // 한글로 표시된다.
  [posein@www posein]$ LANG=euc_UN    // 영어로 변경
  [posein@www posein]$ export LANG    // 일시적으로 변경할 경우에는 생략가능
  [posein@www posein]$ date
  Wed May 21 01:29:07 KST 2003       // 영어로 표시된다.


4. 명령어 히스토리(command history)
(1) history에 대하여
 1) 설명: bash에서는 입력하여 실행했던 모든 명령들은 히스토리 리스트 버퍼에 스택으로 저장된
      다. 이 기능은 반복하여 입력하거나 명령을 수정할 때 유용하게 쓰인다. 사용법은 방향키
      위/아래를 누르면서 사용가능하다. 히스토리 파일은 각 사용자의 홈 디렉토리에
      .bash_history라는 이름으로 존재하며 쉘 실행 중에는 메모리에만 명령어 히스토리를
      기억하고 있다가 로그아웃시에 .bash_history파일에 저장한다.
 2) 사용예
  [posein@www posein]$ history
   => 입력한 명령어들의 리스트를 보여준다.
(2) history 관련 변수
 1) 종류
  ㄱ. HISTSIZE : 히스토리 스택의 크기가 지정되어 있다. 단위는 명령의 개수이다. 이 변수의
            설정값을 변경했을 경우 history명령을 내리면 해당개수만큼만 출력된다. 또한
            방향키로 검색했을 경우에는 설정한 명령한 개수만 검색된다.
  ㄴ. HISTFILESIZE : 실질적인 히스토리파일의 크기이다.
  ㄷ. HISTFILE   : 히스토리 파일의 위치를 보여준다.
  ㄹ. HISTCONTROL : 중복되어지는 명령에 대한 기록 유무를 지정하는 변수이다.
 2) 사용예
  ㄱ. [posein@www posein]$ echo $HISTFILE
     /home/posein/.bash_history
  ㄴ. [posein@www posein]$ HISTSIZE=1
      => 실질적인 히스토리 파일의 스택크기가 1이 되므로 방향키로 조회해도 나오지 않는다.
(3) ! 과 히스토리 명령문 : 느낌표(!)를 이용하여 실행할 수 있다.
 1) 사용법
  !! : 마지막으로 실행했던 명령문을 실행한다.
  !n : n번째 실행한 명령문을 실행한다.
  !-3 : n번째 이전에 실행했던 명령문을 실행한다.
  !string : 가장 최근에 'string(문자열)'으로 시작하는 명령문을 실행한다.
  !?string? : 가장 최근에 실행했던 명령문중 string을 포함하고 있는 명령문을 실행한다.
          배포판에 따라 string뒤에 ?는 생략가능하다.
  ^string1^string2 : 마지막 실행 명령문의 string1을 string2로 대체한 후 실행한다.
 2) 사용예
  ㄱ. [posein@www posein]$ pwd
     /home/posein
     [posein@www posein]$ !!
     pwd
     /home/posein
      => pwd가 실행된다.
  ㄴ. [posein@www posein]$ !-4
     date
     수 5월 21 01:51:08 KST 2003
      => history 스택을 거슬러 4만큼 올라가서 해당 명령을 실행한다. 현재의 예제는 date
       명령임을 알 수 있다.
  ㄷ.[posein@www posein]$ !100
      => history의 번호중에서 100번 명령을 실행한다.
  ㄹ. [posein@www posein]$ set
     .....
     [posein@www posein]$ !s
      => 가장 최근에 's'로 시작하는 set명령이 실행된다.
  ㅁ. [posein@www posein]$ ls -alF
     .....
     [posein@www posein]$ !?al
      => ls -alF가 실행된다.
  ㅂ. [posein@www test]$ ls
     a.txt
     [posein@www test]$ cp a.txt b.txt
     [posein@www test]$ ^b.txt^c.txt
     cp a.txt c.txt
     [posein@www test]$ ls
     a.txt b.txt c.txt
(4) 참고 - history관련 테크닉
 1) [CTRL] + [r]
    => 명령프롬프트상태에서 이 키 조합을 누르면 검색할 수 있는 명령프롬프트가 뜬다. 이 때
     특정한 문자를 입력하면 가장 최근에 그 문자로 수행한 명령을 보여준다.
 2) [ESC] 후에 [.] 또는 [ALT] + [.]
    => 최근에 사용된 인자(argument)를 붙여준다. 텔넷으로 접속한 경우에는 [ALT]+[.]은 사용할
     수 없다.
 3) export HISTCONTROL=ignoreboth
    => 중복되어지는 명령어는 히스토리에 기억하지 않는다. 명령행에 입력하거나 계속적으로
     반영시키려면 .bashrc파일에 기록한다.

5. alias
(1) 개요 : 명령어에 별명(alias)를 만드는 것이다. 어떠한 명령에 기본으로 옵션을 추가시키거나
      자신만의 독특한 명령어를 만들 수 있다. 기본적으로 alias만 입력했을 경우에는 현재
      설정된 alias를 보여준다.
(2) 사용법
  alias 별명이름='실행될 명령의 정의'
(3) 사용예
 1) alias
    => 현재 설정된 alias를 보여준다.
 2) alias rm='rm -i'
    => rm명령에 기본으로 -i옵션을 부여하여 rm명령을 실행시킬때마다 확실히 지울 것인지 물어
     본다.
 3) unalias rm
    => rm에 설정된 ailas를 해제한다.
(4) 특징
  1) 일반쉘상태에서 alias를 설정한 뒤 로그아웃하면 그 설정은 무효가 된다.
  2) alias의 해제는 unalias명령을 이용한다.
  3) alias의 설정을 지속적으로 반영시키려면 ~/.bashrc파일안에 설정하면 된다.
(참고) ~/.bashrc파일안에 설정하면 다음 로그인부터 그 값이 반영된다. 만약 즉시 반영하고 원할
    경우에는 'source .bashrc'를 실행시키면 된다.



출처 - 오라닉스

2006/09/08 14:03 2006/09/08 14:03
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > seafig님의 블로그
원본 http://blog.naver.com/seafig/60005184191
아파치에서 전송 속도 제한하기 (모든 설명은 레드햇 6.0을 기준으로 합니다.)  

1. 아파치 1.3.x용 bandwidth 모듈이 필요합니다.  

ftp://ftp.cohprog.com/pub/apache/module/1.3.0/mod_bandwidth.c를  
받아  
오시면 됩니다. 레드햇 6.0 이상을 기반으로 한 배포판에는 이 모듈이  
포함되어 있습니다. /usr/lib/apache/mod_bandwidth.so가 이미 존제하는 분은  
컴파일 과정을 생략하시면 됩니다.  

참고: 레드햇에 포함된 버젼은 1.2 버젼입니다. 최신 버젼은 2.0 버젼이며  
다음의 설명들에 1.2 버젼에는 없는 기능의 경우에는 *로 마크를  
하겠습니다.  

2. 아파치 모듈로의 컴파일이 필요합니다.  

o 아파치 소스와 같이 컴파일 하려면 아파치 소스의 src/modules/extra/  
디렉토리로 mod_bandwidth.c를 복사한 후에 ./configure시에  
--add-module=mod_bandwidth.c 옵션을 주시면 됩니다.  

o 직접 컴파일 하려면 다음의 명령을 따라하시면 됩니다. 물론 그러기  
위해서는 아파치의 개발용 헤더들이 시스템에 설치되어 있어야 합니다.  
레드햇의 경우 apache-devel이라는 패키지로 존재합니다. 그 위치는  
/usr/include/apache/에 있습니다. (배포판에 따라 틀릴 수 있습니다.)  

$ gcc -c -I/usr/include/apache -O2 -m486 -fno-strength-reduce   
mod_bandwidth.c -fpic -DSHARED_MODULE mod_bandwidth.c  
$ gcc -shared -o mod_bandwidth.so mod_bandwidth.o  

$는 쉘 프롬프트를 나타내며 는 줄이 이어진다는 뜻입니다. 그러니까 한  
줄로 붙여 쓰시기 바랍니다.  

3. 컴파일된 모듈을 아파치 모듈이 위치하는 디렉토리로 옮기시기 바랍니다.  
레드햇의 경우 /usr/lib/apache/에 위치합니다. 직접 컴파일하셨다면 지정한  
것에 따라 틀릴 수 있습니다. 알아서 하시기 바랍니다. :)  

4. 아파치의 설정 파일을 고쳐야 할 것입니다. 그럼 하나씩 고치는 방법에  
대해서 알아 보겠습니다.  

1. 모듈로 컴파일 했기 때문에 모듈을 읽도록 해야 합니다. httpd.conf에서  
LoadModule foobar_modules modules/mod_foobar.so 같은 내용이 있는  
부분이 있습니다. 그 하단부에 다음 줄을 추가 하십시오.  

LoadModule bandwidth_module modules/mod_bandwidth.so  

마지막은 모듈의 위치입니다. 설치한 것에 따라 설정하십시오.  

httpd.conf 설정에 ClearModuleList가 있다면 다음 줄이 추가되어야  
합니다.  

AddModule mod_bandwidth.c  

비슷한 내용이 있는 부분의 아래에 적으시면 될 것입니다. :)  

2. 이제 전송 속도 제한 기능을 하는 모듈을 사용하겠다는 것을 지정해  
주어야 합니다. 디렉토리별 설정 위에 다음 줄을 추가하시면 됩니다.  

BandWidthModule On  

3. 이 모듈이 사용하기 위해서는 데이타를 기록할 장소가 필요합니다.  
기본값으로 /tmp/apachebw 디렉토리를 사용합니다.  

/tmp/apachebw/link  
/tmp/apachebw/master  

이렇게 디렉토리를 생성해 주시십시오. 퍼미션은 nobody 사용자가 쓸 수  
있는 권한이 있어야 합니다. (여기서 nobody는 아파치가 사용하는  
사용자입니다. 다른 사용자를 사용한다면 그 사용자의 권한으로 줘야  
겠지요.) 생각하기 싫으신 분은 다음 명령을 실행하십시오.  

chown root.nobody /tmp/apachebw  
chmod -R 770 /tmp/apachebw/  

4. 이제 실제적인 전송 속도 제한의 옵션을 알아 보겠습니다.  

BandWidth, LargeFileLimit, MinBandWidth 이렇게 세가지의 지시자?가  
있습니다. 각각에 대해서 알아 봅시다.  

o BandWidth  

문 법: BandWidth <도메인|IP주소|all> <속도>  
기본값: 없음  
사용처: 전체 설정, 디렉토리별 설정, .htaccess  

호스트에 따라 속도의 제한을 걸 수 있습니다. all은 모든 호스트에  
대해서 제한을 거는 것입니다. 도메인이나 IP주소로 접속 호스트를  
지정할 수 있습니다. 그리고 네트워크/마스크 포맷*으로 지정할 수도  
있습니다. (예: 192.168.0.0/24)  

속도는 Bytes/second로 나타냅니다. 0의 경우는 제한이 없는 것입니다.  

디렉토리별 설정에서 사용한 예를 들겠습니다.  


BandWidth 192.168.1 0  
BandWidth foobar.net 0  
BandWidth all 1024  


/home/httpd/html 디렉토리에서의 제한을 한 것입니다. 192.168.1.* IP  
주소를 가진 호스트와 *.foobar.net이라는 도메인명을 사용하는  
호스트에 대해서는 제한을 걸지 않으며 그 외 모든 접속에 대해서  
1024Bytes/sec으로 제한을 걸었습니다.  

o LargeFileLimit  

문 법: LargeFileLimit <파일크기> <속도>  
기본값: 없음  
사용처: 전체 설정, 디렉토리별 설정, .htaccess  

일정 이상의 크기를 가진 파일을 누군가가 받아 가려 할 때 그 속도의  
제한을 걸 수 있습니다. 파일크기는 KByte 기준이며 속도는 역시  
Bytes/secound입니다.  

LargeFileLimit 1024 4096  
LargeFileLimit 2048 2048  

위 예제는 1024 ~ 2047KB 크기의 파일을 받아가려 할 때 속도를  
4KB/sec으로 제한하고 2048KB 이상의 파일은 2KB/sec으로 제한을 하는  
것입니다.  

o MinBandWidth  

문 법: MinBandWidth <도메인|IP주소|all> <속도>  
기본값: all, 256  
사용처: 전체 설정, 디렉토리별 설정, .htaccess  

데이타 전송의 최저 속도를 지정하게 됩니다. 예를 들어서 설명하는  
것이 가장 좋을 것 같군요.  

BandWidth를 4096 (4KBytes/sec)으로 지정하고 MinBandWidth가 1024로  
지정이 되어 있을 때:  

- 지정된 호스트에서 하나만 접속할 경우, 4096bytes/sec이 최고의  
속도가 됩니다.  

- 지정된 호스트에서 두개가 동시에 접속할 경우, 각각의 세션에 대해  
2048Bytes/sec이 최고의 속도가 됩니다.  

- 더 많은 동시 접속이 일어나도 세션 당 최고 속도는 1024Bytes/sec  
이하로는 줄지 않습니다. (MinBandWidth 값이 1024기 때문에)  

MinBandWidth가 "-1"로 지정되면 모든 세션에 대해 최고 속도는  
BandWidth나 LageFileLimit에서 지정한 속도가 나올 수 있게 됩니다.  

BandWidth를 4096으로 지정하고 MinBandWidth가 -1이라면 동시에 지정된  
호스트에서 몇개의 접속을 하더라도 각 세션의 속도는 4096Bytes/sec  
까지 나오게 되는 것입니다.  
출처: 적수네
2006/09/08 14:02 2006/09/08 14:02
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 14:00
출처 블로그 > 폴라리스
원본 http://blog.naver.com/neodays/20008467438

최상위 dns 의 정보가 기록되어있는 파일 named.ca 가 갱신되어 일부 사이트의 정보를

제대로 가져오지 못할 경우가 있다.

2달정도에 한번씩은 named.ca 를 갱신시켜주는것이 바람직하다.
(물론 갱신이 자주되는것은 아니다.)

아래는 named.conf 에서 named.ca 가 정의된 모습이다.

zone "." {
         type hint;
         file "named.ca";
};



named.ca 의 갱신은 아래와 같은 커맨드로 진행한다.
갱신하기전에 cp named.ca named.ca.old 등으로 백업하여 만일의 경우에 대비하도록 하자.


dig . ns >/var/named/named.ca

2006/09/08 14:00 2006/09/08 14:00
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 13:59
출처 블로그 > 픽시시스템
원본 http://blog.naver.com/tipscorea/10001610033

logrotate.conf 샘플

logrotate의 설정디렉토리 /etc/logrotate.d/에 있는 여러개의 파일중 syslog파일의 일부이다.

물론, 이 설정을 /etc/logrotate.conf 파일내에 있어도 마찬가지 결과를 얻을 수 있다.

위의 설정을 설명하면 다음과 같다.

/var/log/messages  
대상로그파일, 즉, logrotate에 의해서 작업될 로그파일을 절대패스로 지정해둔 것이다.
그리고, 그 다음의 "{" 부터 "}"까지는 이 로그파일에 대한 개별적인 설정이 된다.

monthly
대상로그파일(/var/log/messages)을 순환시킬 주기이며, monthly이므로 한달에 한번씩 이 파일이 순환(rotate)되게 된다.
뒤에서 설명하게되겠지만 참고로 순환주기에는 daily, weekly, monthly등이 있다. 이에 대한 설명은 뒤에서 자세히 다루게 된다.

compress
순환(rotate)된 파일이 gzip에 의해서 압축이 된다. 반대의 옵션은 nocompress이며 압축을 하지 않게 된다.
(기우겠지만, 순환되어 새로 생성되어 저장되고 있는 로그파일은 압축이 되지 않는다.)

rotate 2
순환되는 파일갯수를 지정한다. 0부터 시작하게되며 위의 예에서 monthly로 지정했기 때문에 2달간 로그파일이 저장되어 있게된다.

mail  
순환되어 지정된 갯수를 지나게되는 로그파일은 지정된 메일주소로 메일로 보내지게 된다.
메일을 보내지 않으려면 nomail이라고 하면 된다.

errors
지정된 log파일의 logrotate작업시에 에러가 발생을 하면 지정된 메일주소로 메일을 발송하게 된다.

postrotate/endscript
이것은 지정된 로그파일에 logrotate작업이 끝나고 난 이후에 실행할 작업을 설정해둔 것이다.
대부분 이부분에 설정되는 작업은 rotate된 로그파일의 데몬을 재시작시키는 작업이다.
반대의 작업을 하려면 즉, logrotate작업 전에 실행할 작업이 있다면
postrotate/endscript대신에 prerotate/endscript를 사용하면 된다.


6. logrotate 주요옵션

(참고 : "man logrotate" 해서 보면 logrotate에 대한 옵션이 굉장히 많다. 아래에 소개해드리는 옵션은 자주사용하는 옵션이거나 필자의 견해로 보아 중요하다고 생각되는 옵션을 설명드린 것이므로 이외의 옵션에 대해서 알고자 한다면 man page를 참조바란다. )

-f, --force  

강제순환시킨다. 이 옵션은 새로운 항목을 추가한 후에 로그파일을 순환시키거나 옛날 로그파일이 이미 삭제되어 새로운 로그파일이 생성되어 로그기록이 계속되고 있을 경우에 유용한 옵션이다.


-s, --state <statefile>

기본 상황파일인 /var/lib/logrotate.status 파일대신에 지정한 state파일을 사용한다.


--usage

logrotate의 기본 사용법을 간단히 보여준다.


compress

순환되는 로그파일을 gzip으로 압축하게된다. nocompress와는 반대.


nocompress

순환되는 로그파일의 압축을 하지 않는다. 반대는 compress


create mode owner group

순환되어  생성되는 로그파일의 파일퍼미션(mode)과 소유자(owner), 그리고 그룹소유자(group)를 지정한 것이다.
(예, create root 600 wheel)


daily

로그파일을 매일주기로 순환시킨다.


weekly

로그파일을 매주주기로 순환시킨다.


monthly

로그파일을 한달주기로순환시킨다.


errors address

logrotate작업시에 에러가 발생한다면 지정된 메일주소로 메일을 보내게 된다.


extension ext

logrotate 실행후에 순환되어 생성되는 파일의 이름뒤에 확장자로 붙일 확장자명을 지정한다.
만약 compress라는 옵션으로 gzip으로 압축을 했다면 gz라가 확장자 뒤에 붙게된다.
예를 들면 compress라는 옵션과 함께 "extension ext"옵션이 주어졌다면 logrotate실행후에 생성되는 파일은 messages.0.ext.gz과 같은 모양새를 갖게되는 것이다


ifempty

로그파일이 비어있는 경우에도  rotate(순환)을 하게된다. 기본값이다.


notifempty

ifempty와는 반대로 로그파일이 비어있을 경우에는 순환을 하지 않는다.


mail address

logrotate작업후에 이전로그파일을 지정된 메일주소로 메일을 보낸다. (특정한 경우의 로그파일은 보내지 않을 수도 있다. )


postrotate/endscript

logrotate작업 이후에 지정된 작업(스크립트)을 실행한다.


prerotate/endscript

logrotate작업 이전에 지정된 작업(스크립트)을 실행한다.


rotate count

logrotate의 실행결과 순환되는 파일들의 총 갯수라고 이해하자.
즉, logrotate의 결과 삭제되거나 지정된 주소로 메일로 보내지기전의 총 파일갯수라고 이해하면 된다.
그리고 rotate 0로 설정하고 나면 이전파일은 순환과 함께 삭제되어 버린다.


size size

logrotate의 결과 순환된 결과 파일사이즈가 지정한 크기를 넘지 않도록 한다.
지정하는 방법은 100k, 100M등으로 용량단위를 붙여서  지정하면 된다.

2006/09/08 13:59 2006/09/08 13:59
이 글에는 트랙백을 보낼 수 없습니다

최신 PortSentry 2.0 설치 및 설정 메뉴얼 한글판
글쓴이 : 장훈 (2002년 08월 24일 오후 12:05) 읽은수: 6,357
보안 Psionic PortSentry - 포트 스캔 탐지와 능동적 방어
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

$Id: README.install,v 1.30 2002/04/08 17:24:14 crowland Exp crowland $

E-Mail : sentrysupport@psionic.com
Date : 04-08-2002
Version: 2.0b1

소 개
=-=-=

이것은 긴 인스톨 매뉴얼이다. 만일 여러분이 뒤에 이어질 모든 것과 프로그램 로직안에 깃든 나의 광기어린 방법을 이해하길 원한다면, 여러분은 이 매뉴얼 파일을 읽어야만 한다.
만일 여러분이 이런 것에 대해 관심이 없다면 아래의 내용들을 뛰어넘어라.

PortSentry는 보안 제품들 중에 Psionic의 TriSentry Suite의 일부분이다.
만약 여러분들이 이 도구가 마음에 들고 여러분들이 정말 우리의 다른 제품들에 관심이 있다면 우리의 웹사이트를 참고하라:

http://www.psionic.com

PortSentry는 포트스캔을 탐지하기 위한 많은 옵션들을 가지고 있다.
포트스캔이 발견되면, PortSentry는 다음과 같은 방식들로 반응한다.

- 사건을 나타내는 log 는 syslog()를 통해 만들어진다.
- 타겟 호스트(포트 스캔 공격을 한 컴퓨터)는 TCP Wrappers를 위해서 자동적으로 /etc/hosts.deny에 기록된다.
- 로컬 호스트에서는 타겟 시스템을 데드 호스트(인터넷상에 없는 컴퓨터)로 간주하여, 타겟 호스트를 경유하는 모든 경로가 자동적으로 재구성된다.
- 로컬 호스트는 로컬패킷필터를 통하여, 타겟 호스트로부터 오는 모든 패킷을 무시하기 위하여 자동적으로 재구성된다.

이러한 의도는 관리자에게 그들의 호스트가 스캔되고 있다는 것을 확신시켜주기 위함이다.
이미 이러한 동작을 하는 유사한 프로그램들이 있다.( klaxon 등등) 나는 단지 전체적인 아이디어에 작은 변화(auto blocking 과 같은)를 더했을 뿐이다. 더하여, 스텔스 스캔 탐지(stealth scan detection)를 위한 포괄적인 지원까지...

PortSentry 2.x는 libpcap을 사용하기 위해서 재구성되었다. 이전에 공격을 감지하기 위해 묶여진 포트들을 사용하던 "고전적인" 모드들은 사라졌다. 만약 그 "고전적인" 모드들을 선호한다면, PortSentry 1.1 버전을 사용하길 바란다.

설치
=-=-=-=

첫 단계:

여러분의 에디터로 portsentry_config.h 파일을 가져와서 다음사항이 여러분이 원하는 바와 맞는지 확인해라:

CONFIG_FILE - PortSentry 구성파일의 경로
WRAPPER_HOSTS_DENY - TCP wrapper의 hosts.deny 파일의 경로와 이름
SYSLOG_FACILITY - PortSentry가 사용할 syslog 프로그램
SYSLOG_LEVEL - 메시지를 보내기 위한 syslog level

나는 여러분이 무엇을 하고 있는지 알지 못한다면 이러한 옵션들을 절대 바꾸지 말 것을 제안한다.

※ 참고

1. 고급사용자들은 SYSLOG_FACILITY를 LOG_DAEMON에서 LOG_LOCAL0로 바꾸고 싶어할 수도 있을 것이다. (아니면, 또 다른 LOCAL log 감시프로그램)
여러분은 syslog.conf 파일을 편집할 수 있으며 이것으로 분리된 모니터링을 위해 PortSentry 메시지를 직접 시스템에 있는 PortSentry 자신만의 파일에 가져다 놓을 수도 있다.

2. [경고] : 절대로 이 파일 내용에서 "#" 표시를 지우지 마시오.

이런 "#" 표시들은 주석표시가 아니라, 헤더들을 예비적으로 처리하기 위해 C 컴파일러를 요구하는 것들입니다.
만약 여러분들이 "#" 표시들을 지워버린다면 여러분들은 컴파일 에러들을 보게 될 것입니다.

3. 참고 2번을 다시 한번 읽어보라. 우리는 "#" 표시를 지우고 그로 인해서 프로그램을 컴파일 할 수 없게 되어 문의를 해오는 수많은 사람들을 보았다. portsentry_config.h 파일은 2.x 버전이 베타 버전으로 있는 한은 계속 같이 존재할 것이다.


두번째 단계:

이어서, portsentry.conf를 여러분의 에디터로 가져와서 다음의 옵션을 체크하고 바꿔라:

INTERFACE - 여러분이 모니터 하기를 원하는 interface(CPU와 단말 장치와의 연결 부분을 이루는 회로) 이름. 대부분의 사람들은 이 부분을 "auto"로 남겨둘 수 있고 이 때 PortSentry는 첫번째 interface를 선택하여 모니터 할 것이다. 다른 분들은 아마도 여러개의 interface들을 가지고 있음에도 오직 하나만 보기를 원할 것이다(말하자면 외부 방화벽 interface). 이런 경우는 여러분들이 interface 이름을 직접 설정해 줄 수도 있다. eth0를 보기 위해서는 "/dev/eth0"과 같이 경로명을 포함시키지 말고, 단순히 interface 이름 "eth0"를 적어 넣는다. 등등.. 이런 식으로... PortSentry는 한 번에 오직 한 개의 interface 만을 볼 수 있기 때문에 여러개의 Interface 이름을 적어 넣으면 안된다.

INTERFACE_ADDRESS - PortSentry는 당신이 감시하려 하는 Interface의 IP 주소를 필요로 한다. 현재 버전의 PortSentry는 자동으로 해당 Interface의 IP주소를 찾아내지 못한다. 하지만 앞으로 곧 지원될 것이다. 만약 여러분이 IP 주소를 적어 넣지 않는다면 PortSentry는 당연히 아무런 일도 하지 않을 것이다. 이것은 DHCP 또는 유동 IP 사용자들에게는 적합하지 못하다(매번 바뀌어지는 IP주소를 적어 넣어주고 재시작 해야하므로...-.-a). 하지만 베타 버전이 버전업 되면서 DHCP나 유동 IP 사용자들도 편리하게 사용할 수 있도록 할 것이다. 현재로서는 매번 IP주소를 적어주거나 아니면 스크립트를 작성하여 매번 시스템을 재시작 할 때마다 자동으로 실행되어 새로이 바뀐 IP주소를 자동으로 지정해 주도록 해줘야 한다.

TCP_PORTS - 콤마(,)로 분리된 PortSentry가 감시하기를 원하는 TCP포트의 문자열. 이 문자열은 그 안에 어떠한 공백문자도 가져서는 안된다. 여러분은 여러분이 원하는 만큼의 소켓을 집어넣을 수 있다. 하지만 아마도 Berkely Packet Filter (BPF) 의 길이가 너무 커져서 문제가 될 수도 있다. 만일 이런 문제가 발생한다면 여러분들은 로그 파일에서 에러 메시지를 볼 수 있을 것이고 문자열의 길이를 더 줄여야만 할 것이다.

UDP_PORTS - 이것은 UDP 포트 라는 것을 제외하고는 위와 동일하다.

IGNORE_FILE - 여러분이 항상 무시하길 바라는 호스트의 IP 주소들의 목록이 기록된 파일의 경로. 이것은 나중에 설명될 것이다.

BLOCKED_FILE - 접속금지(blocked)된 호스트의 IP 주소들의 목록이 기록된 파일의 경로.

RESOLVE_HOST - 이 옵션은 호스트들에 대한 DNS 해석을 꺼버린다. 만약 여러분이 느린 DNS 서버를 가지고 있다면 해석을 끄는 것은 더욱 효과적일 것이다. 또한 만약 여러분이 이것을 켜놓는다면 공격자는 되돌아 오는 DNS 응답을 볼 수 있을 것이고 여러분이 연결상태를 감시하고 있다는 것을 (공격자가) 알게 될 것이다. 기본값으로 이 옵션을 꺼놓는다.

BLOCK_UDP -이 옵션(0)은 UDP탐지에 대한 모든 자동적인 반응을 못하도록 한다. UDP는 쉽게 위조될 수 있기 때문에, 정상적으로 존재해야 할 모든 호스트들을 접근금지 시키는 방식으로, 공격자가 보호받는 호스트에 대해 DOS공격(서비스거부공격)을 할 수 있다. 이 옵션을 "0"으로 하면 연결이 여전히 log된 상태라도, 모든 자동적인 반응을 못하게 할 것이다. 이 옵션(0)은 주로 인터넷에 노출되어 있는 호스트에 유용하다. 내부 호스트에 대해서는 여러분은 이 옵션을 (자동적인 반응이) 가능 하도록 놔둬야 할 것이다. 만약 누군가 내부적으로 여러분에게 스푸핑된(spoofed) 패킷을 보낸다면 여러분은 서비스거부보다 더 큰 문제점에 직면하게 될 것이기 때문이다.

BLOCK_TCP - TCP라는 것을 제외하곤 BLOCK_UDP와 같다. (패킷 위조는 그리 큰 문제가 아니다. 왜냐면 PortSentry가 완전한 접속이 이루어지를 기다리고 있고, 이것은 베이직모드에 있어 패킷위조를 하는 것보다 더 힘들기 때문이다. 나는 이것을 인터넷에 연결된 호스트에 대해서도 사용가능하도록 남겨둘 것이다.) 스텔스 스캔 탐지모드에 있어서 UDP 경고는 다음과 같다:

공격자는 패킷 위조를 통하여, 여러분이 막지 않길 원하는 호스트에 대해서 접근금지(block)시킬 수 있다.

(나는 이것이 문제가 될 때까진 걱정하지 않지만 여러분은 이것에 대해 인식하고 있어야 한다.)

수개월간 우리는 이 명백한 문제에 대해서 글을 올리고 말해주는 사람들을 접해왔다. 그렇다. 우리는 패킷 위조, 서비스 거부, 등등에 대해서 알고 있다. 우리는 단지 그 문제의 심각성을 시스템 절충안과 비교하지 않는다. 우리는 이 옵션을 대부분의 호스트([방화벽] 위에서 싸우기 일쑤인 특정 호스트들을 제외하고)들에 대해서 사용 가능하게(막도록) 놔둘 것이다. 여러분이 어떤 설정을 해야 할 지에 대한 좀 더 자세한 답변은 README.stealth를 읽어보라.

KILL_ROUTE - 여기에는 공격이 탐지되었을 때, 공격자가 타고온 경로를 없애기(drop) 위해 실행될 명령을 정의할 수 있다. 정상적인 실행을 위해서는, *절대경로* 전체와 필요한 옵션을 다 붙인 route 명령이 필요하다. $TARGET$ 문자열은 공격하고 있는 호스트 IP주소로 대체될 것이며, 반드시 이 옵션안에서 존재해야 한다. 자신의 gateway는 local subnet상에서 *죽어있는 호스트*가 될 것이다. 어떤 시스템에서는 로컬호스트 주소인 (127.0.0..1)을 넣더라도 아마 작동을 할 것이다. 공격중인 호스트로부터의 모든 패킷은 이 주소로 보내질 것이며, 호스트를 엉망으로 만들지 않을 것이다. 좀 더 현대적인(발전된) route 명령어는 "-blackhole" or "-reject" 옵션을 포함할 것이다. 여러분의 man(1) 페이지를 체크해 보라. 만약 route 명령어가 이런 기능을 지원한다면 이것을 사용할 수 있다.(비록 그럴지라도 나는 그 대신에 패킷필터링을 사용할 것을 권장한다. 아래를 참조하라.)

또한 "asynchronous route"라고 알려진, 기본적으로는 하나의 루트를 통해 여러분의 호스트에 들어가고 다른 (죽은) 루트에 보내져버리는 패킷을 의미하는, 것이 생길 수 있음을 알고 있어야 한다. 이것은 완전한(full) TCP 접속요구에는 잘 동작하지만, UDP나 스텔스 스캔모드에 있어서는 이것은 패킷이 PortSentry를 활성화시키는 것을 여전히 허용하고 여러분은 PortSentry가 보내주는 "already blocked"라는 경고를 계속하여 받게 될 것이다. UDP 스캔에 대해서 이 방법은 ICMP message들이 공격자에게 되돌아가는 것을 막아서 모든 포트가 open 된 상태로 나타나게 된다. 그러나, 만약 공격자가 실제 공격소스 exploit를 실행하고 있다면, 앞의 drop route 방법은 소용이 없다. asynchronous route는 만약 공격자가 대응되는 응답이 어떻게 진행 될지 알고 있으면, 패킷이 시스템에 도달하게 되고, 공격자가 UDP를 이용하여 장님상태의 (blind) 공격을 할 수 있도록 허용할 것이다.

이것을 막는 최선의 방법은 Linux ipfwadm/ipchains 나 *BSD ipfw와 같은 로컬 패킷필터를 사용하는 것이다. 이것은 매우 깔끔한 방법이며 config 파일안에 자세하게 설명되어 있다. $PORT$ 문자열은 공격자에 의해 연결된 포트로 대체될 것이지만, 이 옵션이 항시 요구되는 것은 아니다. $MODE$ 문자열은 (tcp, udp)에서 blocking이 일어난 모드를 나타내는 것이지만, 이 역시 항시 요구되는 것은 아니다.

KILL_HOSTS_DENY - 이것은 TCP wrappers가 사용하는 hosts.deny 파일에 적기 위한 스트링의 포맷이다. 다시말해 $TARGET$ 문자열은 공격자의 IP로 대체되기 위해 확장되며 반드시 요구된다. 여러분은 (%h, twist 등)뿐만 아니라 어떠한 TCP wrapper의 escape 코드들을 넣을 수 있다. $PORT$ 문자열은 공격자에 의해 연결된 포트로 대체될 것이지만, 이 옵션이 항시 요구되는 것은 아니다. $MODE$ 문자열은 (tcp, udp)에서 blocking이 일어난 모드를 나타내는 것이지만, 이 역시 항시 요구되는 것은 아니다.

KILL_RUN_CMD - 이것은 공격자를 향한 route를 제거하기 *이전에* 작동시키기 원하는 명령이다. 공격이 탐지되었을 때, 여러분이 실행하기 원하는 어떠한 program이나 script를 집어넣을 수 있다. 나는 절대 ATTACKING HOST(공격하는 호스트)에 대해서 보복공격 작업을 집어넣지 않길 권고한다. 실제로, 포트스캔을 하고 있는 호스트는 해킹을 당한 임의의 호스트이다. 그러므로, 만약 여러분이 보복을 한다면, 아마도 여러분은 선량한(?) 사람들을 공격하는 것이 될 것이다. 보안의 목적은 쫓아버리는 것이다. 여러분은 그들을 화나게 해서 여러분에게 개인적인 복수를 하게 되기를 원치 않을 것이다. 유념하라. 비록 13살 어린이도 그들의 윈도우 컴퓨터에서 DoS(서비스거부) 공격을 실행하여서, 여러분의 인생을 비참하게 만들 수 있다는 것을...
위에서 보았듯이 $TARGET$, $PORT$, 그리고 $MODE$ 문자열은 유용하지만 이 옵션에 반드시 요구되는 것은 아니다.

KILL_RUN_CMD_FIRST - 이 값을 "0"으로 설정하면 위의 명령이 route가 제거되기 전에 실행되도록 만든다. 이 값을 "1"로 설정하면 위의 명령이 이미 blocking이 된 후에 실행되도록 만든다. (역자 주: portsentry.conf 파일의 해당 설정 부분의 주석 설명을 보면 "0"이 이후에 실행되는 것이고 "1"이 이전에 실행되는 것으로 반대로 설명이 되어 있습니다. 아마도 portsentry.conf 파일에 있는 내용이 맞는 것 같습니다.. README.install 파일 내용이 틀린 듯 하네요.. 쩝.. );P

SCAN_TRIGGER - PortSentry는 자신의 호스트에 접속하였던 호스트를 기억하는 state engine를 가지고 있다. 이 값의 설정은 PortSentry가 반응동작하기 전에 PortSentry에게 감시되는 port의 몇 번까지의 접속을 허용하도록 말해줄 것이다. 이것은 순차인 것과 임의적인 포트스캔을 둘 다 탐지한다. 디폴트값은 0이며, 이는 즉각 반응한다. 그 값을 1 또는 2로 해주면 잘못된 경고를 줄일 것이다. 그리고 이보다 높은 값들은 3회이상 다른 포트들에 접근했을 때와 같은 경우, 아주 수상한 행동을 감지하게 될 것이다. 일반적으로 여러분은 아무런 생각없이, 이 값을 0으로 놔둘 수 있다.


세번째 단계:

여러분의 문서 편집기로 portsentry.ignore 파일을 가져와서 그 안에 감시되고 있는 포트에 접근해도 (보안장치를 작동하지 않고) 무시해 버릴 호스트를 추가하라. 이것은 적어도 localhost(127.0.0.1)와 내부 네트워크의 IP주소를 포함해야만 한다. 우리는 *절대* 여러분과 동일네트워크상에 있는 모든 호스트 IP 주소를 집어넣는 것을 권장하지 않으며, 대신 그렇게 하기 위해서 여러분들은 netmask를 사용할 수 있다. 설정하는 형식은 아래와 같다:

<IP Address>/<Netmask Bits>

192.168.2.0/24
192.168.0.0/16
등등...

우리는 너무 많은 호스트들을 적어 넣는 것을 권장하지 않는다. 아주 "신뢰관계"에 있는(friendly) 호스트일지라도 여러분에게 있어 누가 여러분에게 연결을 하고 있는지를 보는 것은 아주 중요한 일일 것이다. 이것은 여러분이 내부 호스트의 결탁(외부의 해킹에 의한)을 보다 빨리 탐지하는데 도움을 줄 것이다.

자신의 편집증에 충실해라. 그렇다. 이런 일은 일어나며 우리는 *상당수*의 경우 관리자들이 너무 많은 무시해버릴 호스트들을 적어 넣었고 그들 *내부 호스트들의 결탁(외부의 해킹에 의한)*에 의해서 해킹당했다는 사례들을 들었다.


네번째 단계:

컴파일(Compile). make 명령을 내리면, 여러분은 여러분의 시스템타입을 고르고, build하고 인스톨할 수 있게 된다. 원래 default directory는 /usr/local/psionic/portsentry2 이다. 만약 여러분이 이 디렉토리가 마음에 들지 않는다면 Makefile을 수정하고 새로운 경로에 영향을 주는 여러분의 portsentry.conf 와 portsentry_config.h 파일들을 확인하라.

build한 후에 make install 명령을 내리면 여러분이 지정한 인스톨 디렉토리에 복사본 파일들을 만들어 준다.


다섯번째 단계:

PortSentry를 작동시켜라. 설치한 후에 PortSentry를 작동하는데 있어 두 가지 방법이 있다:

1) 설치 디렉토리(/usr/local/psionic/portsentry2, 등등..)로 이동(cd)하여 다음을 실행시켜라:

./portsentry

2) 바로 명령을 실행시켜라:

/usr/local/psionic/portsentry2/portsentry


"Stealth" TCP scan detection mode [BETA] (스텔스 TCP 스캔 탐지 모드 - 베타)

PortSentry는 자신의 호스트로 들어오는 모든 패킷들을 감시할 것이다. 만일 들어오는 패킷이 portsentry.conf 설정 파일에서 TCP_PORTS 변수에 입력되어진 감시 대상 포트 목록의 포트를 향한다면 그에 대응하여 호스트를 막아버릴 것이다.
이 방법은 connect() 스캔, SYN/half-open 스캔, XMAS 스캔, FIN 스캔, NULL 스캔, 등을 감지해 낼 것이다. UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.)

"Stealth" UDP scan detection mode [BETA] (스텔스 UDP 스캔 탐지 모드 - 베타)

이것은 위의 TCP stealth mode와 작동방법은 동일하다. UDP 포트들을 나열하면, 그 포트들은 감시된다. 이것은 어떠한 소켓도 묶지 않으며, 실제 스텔스 스캔 탐지 모드가 아닌 중에도 거의 동일하게 동작한다.( 모든 UDP 패킷에 반응한다.) UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.)

** Advanced Logic Mode **
-PortSentry는 포트들을 감시하는 방법이 아주 뛰어나다. FTP와 같은 몇몇 프로토콜에 있어서, 클라이언트는 실제적으로 ephemeral range인 1024번에서 65535번까지의 범위에서 포트들을 연다. 그리고 서버는 *역으로* 여러분에게 접속한다. 보통은 이런 방식이 포트스캐너가 동작할 수 있게 해준다. 그러나 PortSentry는 호스트로 들어오는 접속을 감시할 것이고, 이러한 "임의적인" 접속연결(binding)로 향하는 것인지 아닌지를 결정할 것이다. 만약 임의적인 접속연결로 향한다면, 그 한번의 접속이 무시된다. 접속이 끊어지자마자 window는 닫히고 모든 방어체계가 다시 활동한다. 이것은 실제로 초보적인 stateful inspection engine이다. UDP/스텔스 스캔 경고가 적용된다. (README.stealth파일을 읽어보라.)


인스톨을 확인하라:

local log 파일의 마지막부분에 PortSentry의 초기화 메시지가 있어야 한다.

성공적인 PortSentry의 초기화 메시지는 아래와 같이 나타날 것이다:

Mar 5 21:16:00 nemesis portsentry[2286]: adminalert: Monitoring interface eth0 and address: 10.1.1.1
Mar 5 21:16:00 nemesis portsentry[2286]: adminalert: Monitoring TCP ports: 1,11,110,143,635,1080. . .
Mar 5 21:16:00 nemesis portsentry[2286]: adminalert: PortSentry is initialized and monitoring.

********************************************************************
** 마지막 줄은 PortSentry가 적절하게 초기화되었음을 나타낸다...... **
** 만약 여러분이 이런 메시지를 보지 못했다면 무언가가 틀린 것이다. **
********************************************************************

이제 여러분은 다른 호스트로 가서 텔넷으로 은폐된 폭팔물(PortSentry)이 장치된 포트로 접근할 수 있다.

[주의] 절대로 여러분이 서비스 받을 위치에서 보호받는 호스트로 접근하지 마시오. 이유는 만일 그렇게 하면 여러분은 스스로 자신을 막아버리게 될 것이기 때문이다.

위의 주의점을 다시 한 번 숙지하라. 우리는 아래와 비슷한 것을 우리에게 알리는 사람들을 봤다.(만들어진 예기지만, 여러분들은 이 예기를 참고 할 수 있다)

"안녕하세요, 제가 일년에 일주 정도만 헬리콥터를 타고서만 접근가능한 north atlantic의 고립된 석유 시추선에 있는 나의 웹 서버에다가 port sentry 를 설치했는데요. 그리고 나서 저는 웹 서버에 접속할 수 있는 온전한 행성에서 유일한 관리 시스템으로 가서 보호받는 포트에 텔넷으로 접근하여 port sentry 를 테스트 해 보았습니다. 지금으로서는 port sentry가 온전하게 작동하는 것 같습니다. 왜냐하면 제가 저의 컴퓨터에 접근할 수 없기 때문입니다. 하지만 이젠 제 컴퓨터에 접근해야겠는데요. 저 좀 도와주시겠어요?"

그건 그렇고...

여러분은 곧 다음과 같은 것들을 보게 될 것이다:

Mar 5 21:17:39 packetmonkey portsentry[2286]: attackalert: Host 192.168.2.15 has been blocked via wrappers with string: "ALL: 192.168.2.15"
Mar 5 21:17:39 packetmonkey portsentry[2286]: attackalert: TCP SYN scan from host 192.168.2.15/192.168.2.15 to TCP port: 143 from TCP port: 31337

만약 여러분이 접속이 끊어지고 다시 telnet으로 접속하기를 시도한다면 여러분은 방금 전의 호스트에 접근할 수 없음을 확인해야 한다. 이러한 동작이 확인된다면, 축하한다! 여러분은 PortSentry를 제대로 작동시킨 것이다.

만약 여러분의 로그체크 데몬이 띄워져 있다면 여러분이 서버에 접속할 때, 위의 접근거부 상황에 대한 경고 메시지 내용이 로그파일에 나타나는 것을 확인할 수 있을 것이다.

만약 여러분이 netstat -rn 명령을 하면 여러분은 이전에 동작하던 의심가는 호스트로의 죽은 경로를 보게 될 것이다.( 내가 이전에 권장했던 것과 같이, 패킷필터를 사용하지 않으면...)

PortSentry 명령들을 리눅스 시작 스크립트파일(startup file)에 쓰고 나서, 여러분이 한 작업으로 돌아와라.

이게 어떻게 도움이 될 것인가 하면??

여기 몇몇 좋은 생각들이 있다.

- Run as a UDP service on port 69 to catch TFTP probes.
(TFTP 침입을 잡기 위해서는 포트 69에 UDP 감지모드를 가동하라.)
- Run as a UDP service on port 161,162 to catch SNMP probes.
(SNMP 침입을 잡기 위해서는 포트 161,162에 UDP 감지모드를 가동하라.)
- Run as a UDP service in the port range 32000-33000 to catch RPC probes.
(RPC 침입을 잡기 위해서는 포트범위 32000-33000 에 UDP 감지모드를 가동하라.)
- Run as a TCP service on port 143 to catch IMAP probes.
(IMAP 침입을 잡기 위해서는 포트 143에 TCP 감지모드를 가동하라.)
- Run as a TCP service on ports 11,15 to catch netstat/systat probes.
(netstat/systat 침입을 잡기 위해서는 포트 11,15에 TCP 감지모드를 가동하라.)
- etc. 등등

실제로 PortSentry는 빠르게 반응해서, 공격자에 의한 호스트 포트스캔은 감시대상 포트에 접근이 있은 후 1초이내에 차단될 것이다.

UDP 스캔에 대해서는 모든 포트가 "열려진 상태"로 나타나게 함으로써 여러분을 스캔하는 이들을 매우 짜증스럽게 만들 것이다.
TCP 스캔에서 공격자는 어떠한 응답도 얻을 수 없을 것이다.


안전성
=-=-=-

만약 우리가 프로그램의 안전에 대한 고려사항 중 잊고 놓친 것이 있다면, 여러분이 그 내용을 BugTraq에 올리기 전에 우리에게 알려주기를 원한다 :).


메시지
=-=-=-=-

가능한 모든 states/errors/successes and unknowns(상태/오류/성공 그리고 알 수 없는 것들)은 syslog 파일에 쓰여진다.
다음의 tag들이 의미하는 바는:

adminalert: - PortSentry의 상태를 나타내는 메시지.
securityalert: - 보안 관련 사건들이 일어났음을 나타내는 메시지
attackalert: - 스캔을 감지했다는 것과 그에 따른 동작이 실행되었다는 것.


파일들
=-=-=

현 상태로는, 모든 호스트들은 그들이 접속금지(blocked) 되었을 때 portsentry.history 파일뿐만 아니라 portsentry.blocked 파일에 기록된다. blocked file은 PortSentry가 다시 시작될 때마다 지워진다. history file은 간단히 덧붙여지며 일정한 기한까지 접속금지(blocked)된 호스트들의 기록으로 사용할 수 있다.

기한이 지난 후에 여러분은 공격했던 호스트들에 대해 죽은 경로를 삭제하고, 호스트를 hosts.deny 파일에 저장하길 원할 수도 있다. 이것은 전적으로 여러분의 결정에 달려있다. 만약 여러분이 공격자가 다시 접근할 때 접근금지(blocking)을 작동시키기를 원한다면, 단지 PortSentry를 재시작하거나 혹은 blocked file에서 개개의 호스트를 제거하면 된다.

대부분의 시스템에서 여러분이 접근금지시킨 호스트로의 경로를 회복시키길 원한다면 여러분은 단순히 아래와 같이 경로를 지움으로써 회복시킬 수 있다:

리눅스:

route del <ip_address> reject

기타:

route delete <ip_address> <dead_route>

또는 간단히 여러분의 패킷 필터들을 쏟아냄으로써 가능하다.

이것이 바로 내가 말하고자 한 것이다. 로그파일의 내용을 보는 것뿐만이 아니라 여러분이 다른 문제점들도 알 수 있도록 하기 위해서, 나는 여러분이 Abacus 프로젝트의 Logcheck를 사용하길 강력히 권장한다. 그리고 PortSentry가 여러분에게 무엇을 알리려고 하는지 살펴보길 권장한다. 여러분은 본 프로그램을 아래 주소에서 찾을 수 있다:

http://www.psionic.com

이 문서를 읽어준 것에 감사히 생각하고, 질문이나 추가적인 조언이 있다면 내게 메일로 써 주기를 바란다.

감사한다,

-- Craig

2006/09/08 13:58 2006/09/08 13:58
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 13:43
출처 블로그 > Hazelnut Tree
원본 http://blog.naver.com/etrangers/90001389312
SUBJECT:   SED 명령어 사용법


o sed 스트림 편집기
  ed명령어와 grep명령어 기능의 일부를 합친 것이 sed(stream editor)명령어이다.
  sed명령어도 grep명령어와 같은 필터이지만 이 명령어는 화일을 수정할 수 있게 하는 반면 ed처럼 대화식
  처리는 불가능하다. sed 명령어는 1개 라인씩 입력 라인을 읽어들여 표준 출력에 출력한다.
  sed는 각 라인을 읽을 때마다 ed에서 사용하던 형식의 대치작업을 실행한다.
  일치하는 문자열이 있으면 그 문자열을 대치한 후 출력하고 일치하는 문자열이 없으면 그 라인은
  수정되지 않고 그대로 출력된다.
  이 sed 명령어가 ed보다 좋은 점은 라인들을 하나씩 읽고 , 수정하고, 출력하기 때문에 기억장치 안의
  버퍼를 사용하지 않는다는 것이다. 버퍼를 사용하지 않으면 화일의 크기에 제한 없이 작업을 할 수 있다.
  ed와 같이 버퍼를 사용하는 경우는 버퍼의 크기보다 큰 화일은 처리할 수 없으며 대개 버퍼의 크기는
  1MB정도이다. 따라서 sed는 아주 큰 화일을 처리할 때 주로 사용된다.
  sed 명령어를 호출하는 형식은 grep명령어와 같지만 완전한 형식의 대치 연산자를 사용한다는 점만이 다르다.
    # sed "s/hello/goodbye" in.file
  위의 명령어는 in.file이라는 화일에 있는 각 라인에서 첫번째 등장하는 hello라는 문자열을 goodbye로
  교체한 후 그 라인을 표준 출력에 출력한다.
    # echo "1234hello5678" | sed "s/hello/goodbye/"
  대치 명령어를 따옴표로 둘러싸야 올바로 사용할 수 있다. 여기서 문자열은 정규식으로 표현될수 도 있다.
  그외에도 sed명령어에는 여러 가지 연산자를 사용할 수 있다. 다음의 명령어를 사용하면 hello라는
  문자열을 포함하고 있는 모든 문자열을 삭제할 수 있다.
    # sed "/hello/d" in.file
  위 명령어의 의미는 "hello라는 문자열을 포함하고 있는 라인을 찾아 그 라인을 삭제하라"는 것이다.
  이 sed 명령어는 다음 명령어와 같은 의미이다.
    # grep -v hello in.file
  라인을 전부 삭제하지 않고 hello라는 문자열만을 삭제하려면 다음 명령어를 사용하다.
    # sed "s/hello//" in.file
  ed와 같이 sed에서도 화일의 일부만을 대상으로 작업하는 경우는 라인의 범위를 지정할 수 있다.
    # sed "3,7s/hello//" in.file
  위의 명령어는 in.file이라는 화일의 라인3에서 7까지만을 대상으로 첫번째 hello를 삭제하고 화일의
  그 외의 부분은 변경시키지 않는다. 또한 다음과 같이 사용하면 라인 번호 대신 문맥을 범위로 
  지정할 수 있다.
    # sed "/hello/,/goodbye/s/bad/good/g" in.file
  위의 명령어는 hello라는 단어를 포함하고 있는 첫번째 라인부터 goodbye라는 단어를 포함하고 있는
  라인까지 검색하면서 bad라는 문자열을 모두 good으로 변경한다.
  또한 문자열 goodbye를 만난 이후에도 다시 다른 hello가 등장하면 다음 goodbye가 나올 때까지 대치
  작업은 반복된다.
  sed명령어의 기능은 지금까지 우리가 살펴본 것보다 더 강력하다.
  sed명령어의 -f(file)선택자를 사용하면 명령어를 일일이 키보드에서 입력하지 않고 하나의 화일에
  기억시켜 놓고 사용할 수도 있다.
    # sed -f command.file in.file
  여러 개의 명령어를 연속적으로 자주 사용할 때 이 명령어 화일이 유용하게 사용된다.
  예를 들어 다음과 같은복수 개의 명령어가 화일에 기억되어 있는 경우는
    # vi command.file
      s/hello/goodbye
      s/good/bad
  다음과 같은 명령어를 입력하면
    # echo "1234hello5678" | sed -f command.file
  다음과 같이 출력된다.
    # echo "1234hello5678" | sed -f command.file
      1234badbye5678
 
o sed 기본
    # sed '' ljs --> cat ljs 와 동일

o sed 편집 명령어
     일상적인 sed 명령
   ---------------------------------------------------------------------------------------
    a\          다음 라인(들)을 적용될 라인들에 부가한다  (라인뒤)
    c\          적용될 라인들을 다음 라인(들)로 변경한다  (라인 대체)
    d           적용될 라인들을 삭제한다
    g           단지 첫번째의 것만이 아니라 라인의 모든 부합 패턴 대체가 적용 되게 한다 
    i\          다음 라인(들)을 적용될 라인들 위에 삽입한다  (라인앞)
    p           - n 옵션하에 있을지라도, 라인을 프린트한다
    q           명시된 라인에 도달할 때 중지한다
    r filename  filename을 판독한다. 내용을 출력에 부가한다
    s/old/new/  "old"를 "new"로 대체한다
    =           라인 번호를 프린트한다
    !command    라인이 선택되지 않는 경우 command를 적용한다.
   --------------------------------------------------------------------------------------

o 라인 명시
  sed명령은 두가지 방법을 사용한다. 첫 번째는 번지를 번호로 명시하는것이다.
  여러분은 특정한 라인을 가리키기 위해 단일 번호를 사용할 수 있다.
    # sed '3d' ljs  --> 세번째 라인을 삭제
  또는, 라인들의 범위를 가리키기 위해 콤마(,)로 분리된 두 번호들을 사용할 수 있다.
    # sed '2,4 s/e/#/' ljs  --> 대체 명령은 단지 2-4 라인들에만 적용된다. (단순 대체 명령은 라인에서
                                첫번째 어커런스에만 적용된다는 점을 기억하라. 따라서 각 적용 라인의
                                첫 번째 e만이 #로 대체된다)
    # sed -n '/kingdom/p' ljs  --> kingdom이 들어있는 line만 프린트
    # sed '/kingdom/p' ljs  --> 모든 line이 나타나고 그와 동시에 kingdom line이 중복해서 나타남
    # sed '[Pp]rincess/d' ljs  --> princess 또는 Princess를 포함하고 있는 라인들을 삭제함
    # sed '1,/fragrant/d' ljs  --> 라인 1로부터 fragrant를 포함하고 있는 첫번째 라인까지의 모든
                                   라인들을 삭제함
o sed 명령 하이라이트
    # more ljs
      I am a boy
      You are a girk
      He is a doctor
    # sed 'a\\
      Hey la la\! Doo de dah\!' ljs  --> 각 라인뒤에다 Hey la la!를 입력
       I am a boy
       Hey !
       You are a girk
       Hey !
       He is a doctor
       Hey !
    # sed 'a\\
      Oh\! good\\  --> \\을 사용함으로써 하나 이상의 라인들을 부가할 수 있다
      yeh' ljs
    # sed '3a\\
      Good Morning' ljs  --> 3 line뒤에다 내용 삽입
    # sed 'c\\
      Oh marvelous delight! sing to me! ' ljs  --> 기존의 라인들을 이것으로 대체시킴
      Oh marvelous delight! sing to me!
      Oh marvelous delight! sing to me!
      Oh marvelous delight! sing to me!
    # sed '2q' ljs  = sed 2q ljs --> q명령은 편집기로 하여금 그것이 명시된 라인에 도착한 뒤
                                     중지하게 한다. 즉 2라인만 보여줌
    # sed -n '1s/a/#/gp' ljs  --> 전체적으로 바꿔줌

o sed의 패턴-부합
     패턴-부합에 대한 sed메타 문자
    -------------------------------------------------------------------
      메타 문자            작    용
    -------------------------------------------------------------------
      \              다음 문자의 특수한 의미를 부정한다
      ^              라인의 시작과 부합한다
      $              라인의 끝과 부합한다
      .              어떠한 단일 문자와도 부합한다
      [ ]            둘러싸인 문자들 중의 어느 하나와 부합한다
      [^...]         ...리스트에 없는 어떠한 문자와도 부합한다
      pat*           0 또는 그 이상의 pat 어커런스들과 부합한다
                     여기에서 pat는 단일문자 또는 [ ]패턴이다
      &              s 명령의 newpattern부분에서 사용되어 oldpattern
                     부분의 재 산출을 나타낸다
    -------------------------------------------------------------------

o 간략한 예
  ----------------------------------------------------------------------------------------
   명 령         결  과
  ----------------------------------------------------------------------------------------
  /Second/       Second를 포함하고 있는 어떠한 라인과도 부합한다.
  /^Second/      Second로 시작하는 어떠한 라인과도 부합한다.
  /^$/          공백라인, 즉 라인의 시작과 끝 사이에 아무것도 없는 라인과 부합한다.
                 이것은 공백 스페이스들로 된 라인과는 부합하지 않는바, 스페이스 자체가
                 문자이기 때문이다.
  /c.t/          cat, cot, 기타 등을 포함하고 있는 라인들과 부합한다. 이 패턴은 단어의
                 일부일 수 있음에 유의하라. 예를 들어, apricot와 acute도 부합된다.
  /./            적어도 한 문자를 포함하고 있는 라인들과 부합한다.
  /\./           피리어드를 포함하고 있는 라인들과 부합한다. \는 .의 특수한 의미를 부정
  /s[oa]p/       sop또는 sap와는 부합하지만 sip 또는 sup와는 부합하지 않는다.
  /s[ ^oa]p/     sip또는 sup와는 부합하지만 sop또는 sap와는 부합하지 않는다.
  s/cow/s&s/     cow를 scows로 대체한다.
  /co*t/         * --> 어떠한 수
  ----------------------------------------------------------------------------------------

o 간단한 sed 해법
    # sed '/^$/d' ljs  --> 모든 공백 라인 제거
    # sed '/^ *$/d' --> space로 만들어진 공백까지 제거 (조심! ^와 *사이에 공백이 있어야 한다)
    # sed 'a\\
      ' ljs   --> 각 line마다 공백라인 추가
    # sed '/^#/d' ljs  --> 첫번째 열에 #을 가진 라인 제거
    # sed 's/^/     /' ljs  --> 각 line의 시작을 5 space로 대체

o 다중 명령
    # sed 's/Bob/Robert/g\
           s/Pat/Patricia/g' ljs  --> sh을 사용하는 경우에는 \을 생략하라
    # sed 's/cat/dog/g\
           s/dog/pigs/g' ljs  --> 먼저 모든 cats를 dogs로 변환한 다음에 모든 dogs를 pigs로 변환한다.
    # sed 's/Bob/Robert/g\
           s/Pat[^a-z]/Patricia/g' ljs  --> ^a-z은 a에서 z까지의 문자들이 아닌 모든 문자를
                                            의미한다는 점을 상기하라

o 태그
  위에서 Pat!와 같은 것이 발견될때 !를 포함한 전체 문자열이 Patricia로 대체되므로 !가 소실된다.
  우리는 !를 유지하면서 Pat를 대체하는 방법을 필요로 한다. 우리는 이것을 태그(tag)를 사용하여
  수행할 수 있다. 패턴의 일부를 "태그"하려면, 그것을 좌측에는 \(로 우측에는 \)로 둘러싸라.
  그 다음에, 명령의 newpattern부분에서, 여러분은 그렇게 둘러싸인 패턴의 첫 번째 것은 \1로,
  두번째 것은 \2 등으로 인용할 수 있다. 이 방법을 사용하면 다음의 명령이 부여된다.
     # sed 's/\(Pat\)\([^a-z]\)/\1ricia\2/g' ljs

o 쉘 스크립트와 sed
     # vi twospace
       sed 'a\\
       ' $*   --> $*은 모든 인자들을 나타냄
     # twospace ljs | pr | lpr
  위 예는 sed가 어떻게 하여 UNIX 프로그래밍과 쉘 스크립트에 적합한가를 나타낸다.
2006/09/08 13:43 2006/09/08 13:43
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 13:43
출처 카페 > windows 와 linux.. / 고슴도치
원본 http://cafe.naver.com/praying4u/67

1. nmap 은 네트워크 어떤포트가 열려있는가 listening되고 있는가를 스캔하기 위한 tool입니다.

nmap을 다운받는곳은 (http://www.insercuer.org)

2. 설치 방법
#tar xvfj nmap-3.27.tar.bz2
#./configure --prefix=/usr/local/nmap
# make
#make install


3. 옵션
-sT : TCP connection() scan: 가장 기본적인 형태 포트가 listenning상태라면 connection() 그렇지 않으면 rechable 되지않는다.

-sS : TCP SYN scan : full Tcp 접속을 하지 않으므로 "half-open" 스캐닝이라 한다.
-sF : stealth FIN, xmax tree, null scan: 이들은 syn packet을 막아놓은 방화벽이나 패킷
-sX 필터 또는 synlogger와 courteny 같은 스캔을 탐지하는 프로그램을 무사히 통과 할 수
-sN 있다. open 포트로 FIN 패킷을 보내면 이 패킷을 무시하고, closed port로 보내면 RST
패킷이 온다. 이들 스캔은 주로 유닉스 계열 OS에서만 사용 가능하며, 루트퀀한이 필요
-sU : 이것은 호스트의 어떠한 UDP포트가 열려있는지 결정하기위해 사용한다. 이 기술은 시
스템의 각 포트에 0 바이트 UDP 패킷을 보낸다. 만일 ICMP port unrechable메세지를
받았다면 close된거다.
-sA : ACK scan : 이것은 방화벽의 rool set을 정밀하게 계획하기 위해 사용한다. 특히 방화
벽이 stateful한지 아니면 단순히 들어오는 syn패킷을 차단하는 패킷필터인지를 점검하
하는데 도움이 된다. 포트에 ACK 패킷을 보내어 RST응답을 받으면 그 포트는 "unfilter
"이다. nmap은 "unfilterd', 포트는 프린트 하지 않는다.
-sW : window scan : TCP window 크기의 변칙 때문에 filtered/nonfiltered 이며, 아무런
응답이 없으면 filtered이다.
-sR : RPC scan : 이것은 열려져 있는 TCP/UDP포트에 대해 그들이 RPC포트인지, 서비스
를 제공하는 프로그램은 무엇이며, 버젼은 무엇인지 등을 확인하기 위해 SunRPC
program NULL, commands을 계속 보내게 된다. 따라서 호스트 portmaper방화벽(또
는 TCP wrapper)안에 있다 하더라고 'rpcinfo -p'와 같은 정보를 얻을 수 있다.
-b : FTP bounce attack : 익명 ftp 서버를 이용해 그 FTP서버를 경유해서 호스트를 스캔 .
f : packet을 조그만하게나눈어 사용하라는 것으로 필터링을 피하거나 침입탐지시스템을
피해가기 위한 것이다.
-P0 : 방화벽에 의해 ICMP echo requests( or responses)을 막아놓는 네트워크 스캔을 가
능하게 한다. ping을 막아놓은 호스트를 스캔하가ㅣ 위해서는 -P0, -PT80을 사용한다.
-PT : 어느호스트가 살아 있는가를 알기 위해 TCP "ping"을 사용한다, 이것은 ICMP echo
request 패킷을 보내고 응답을 기다리는 대신에, 네트워크에 TCP ACK를 보내어 응답
이 오기를 기다린다. 이 옵션은 ping 패킷을 차단하는 네트워크나 호스트를 스캔하는
동안은 호스트가 살아 있는것고 같다. -PT를 사용하며, default port 80
-PI : 이것은 살아있는 호스트를 찾으며, 또한 네트워크 subnet-directed broadcast address
를 찾는다. 이들은 들어오는 IP패킷을 컴퓨터의 서브넷으로 broadcast 하기 위한 ip주소
-PB : ping을 기본형태 ACK(-PT)와 ICMP(-PI) 모두를 사용한다.
-O : TCP/IP fingerprinting을 통한 호스트를 파악하는데 사용된다.
-v : verbose mode: interactive한 사용에 매우 유용한 옵션이다.
-p : 접속하고자 하는 포트를 지정하는 옵션이다. -p 20-30,139,60000 -'은 20에서 30사이의
포트와 139번 포트,60000번 이상의 포트에 대해 스켄한다.
-n/-R dns lookup을 하지 않는다 / dns lookup을 한다.
-S : packet source 주소를 지정한다.
-e : 네트워크의 interface을 지정한다.
-g : packet의 소스 포트번호를 지정한다.
-oN : 스캔한 결과를 logfile에 남긴다.
-D : scan을 당하는 상태 호스트가 어디에서 진짜 scan을 했는지 판단하기 힘들게 만든다.

4. 사용법

[root@www2 bin]# ./nmap -v localhost
No tcp, udp, or ICMP scantype specified, assuming SYN Stealth scan. Use -sP if you really don't want to portscan (and just want to see what hosts are up).

Starting nmap 3.27 ( www.insecure.org/nmap/ ) at 2003-05-19 17:53 KST
Host localhost.localdomain (127.0.0.1) appears to be up ... good.
Initiating SYN Stealth Scan against localhost.localdomain (127.0.0.1) at 17:53
Adding open port 22/tcp
Adding open port 21/tcp
Adding open port 873/tcp
Adding open port 80/tcp
Adding open port 3306/tcp
Adding open port 25/tcp
The SYN Stealth Scan took 2 seconds to scan 1623 ports.
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1617 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
873/tcp open rsync
3306/tcp open mysql

Nmap run completed -- 1 IP address (1 host up) scanned in 2.355 seconds

# nmap -p 1-65535 localhost

Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )
Interesting ports on localhost.localdomain (127.0.0.1):
(The 65527 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
873/tcp open rsync
3306/tcp open mysql
20000/tcp open unknown
20001/tcp open unknown


Nmap run completed -- 1 IP address (1 host up) scanned in 5 seconds

#nmap -O localhost

Starting nmap V. 2.54BETA31 ( www.insecure.org/nmap/ )
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1548 ports scanned but not shown below are in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
80/tcp open http
873/tcp open rsync
3306/tcp open mysql

Remote operating system guess: Linux Kernel 2.4.0 - 2.4.17 (X86)
Uptime 188.936 days (since Mon Nov 11 19:27:32 2002)

Nmap run completed -- 1 IP address (1 host up) scanned in 1 second

#nmap -sP -PT80 localhsot/25
#nmap -sT localhost
#nmap -sS localhost
#nmap -sF -sX -sN localhost

#nmap -sU localhost
#nmap -sT -sR -O -I -F localhost
#nmap -v -sF localhost -oN scan.txt
#nmap -sX -p 22,53,110,143,4564 192.168.*.1-27
#nmap -v --randomiz_hosts -p 80 '*.*.2.3-5'
#nmap -p 20,21,23,53,80,110 -PO -vv xxxx.com
#nmap -sP PT80 192.168.0.1/24
#nmap -f -sS -p 23 localhost

참고로 함부로 network scanning 하면 해킹으로 간주하기 때문에 조심해야 합니다.^^


자료출처 : 한서버

2006/09/08 13:43 2006/09/08 13:43
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > Beyond Tomorrow
원본 http://blog.naver.com/jinoxst/140021504341

=========================
Linux Shell Script 메모장
=========================

-------------------------
VI 사용기
-------------------------
1. 치환(substitution)
- 전체문서 치환 1,$s/common/fooboo
- s/common/fooboo => 커서가 있는 줄만 치환됨.

2. 삭제
- 단어 삭제 : dw 명령어 사용
- 라인 삭제
:set nu
하고 난후 삭제하고 싶은 라인를 선택한 후
:1,10 d
전체 라인을 삭제하려면
:1,$ d 라고 하면 전부 삭제됨.

3. 저장
- 다른 이름으로 저장 : w + "filename"

4. !
- vi 에디터 안에서 명령어 를 입력해서 확인 => :!pwd

5. 문서의 모든 부분[혹은 부분(라인 넘버를 넣어줌)]을 소문자->대문자,
대문자->소문자로 변환
:1,$ s/[a-z]/\u&/g   소문자를 대문자로
:1,$ s/[A-Z]/\l&/g

7. copy
- 일정 라인을 copy 해서 해당 라인에 삽입
:set nu
:30,33 co 5 => 30 부터 33 라인을 복사해서 5라인 이후(6라인부터) 삽입한다.
- 일정 라인을 copy 해서 첫라인 혹은 맨마지막 라인에 삽입
:30,33 co 0 => 첫 라인에 삽입
:30,33 co $ => 마지막 라인에 삽입


------------------------
변수 초기값할당/계산
------------------------
$x=20 (= 좌우에 스페이스를 넣으면 안됨.)
$y=5  (= 좌우에 스페이스를 넣으면 안됨.)
$z=`expr $x / $y` (= 좌우에 스페이스를 넣으면 안됨. / 좌우에 스페이스를 넣어야 함.)
$echo $z
$4

-----------------------------
Linux Command Reference (LCR)
-----------------------------
1. find

- 수정된지 2일이 됬고 apr 로 시작하는 jsp 파일들의 목록
$ll `find . -ctime 2 -name apr*.jsp`

- 오늘 수정된 jsp 파일 목록
$find . -ctime 0 -name *.jsp -print

- 특정 문자를 포함하고 있는 파일 이름리스트 찾기
$find . -exec grep -l 'src="/banking/js' {} \;

2. ls & wc
- 현재 디렉토리에 있는 파일의 총 갯수 구하기
$ll mur2_3*.jsp | wc -l

3. Back quote(`) 는 명령어를 실행하라는 의미의 문자이다.
$echo "Today is `date`"

4. Exit Status
- 리눅스에서 Shell script 가 종료되면 종료상태가 zero 혹은 non zero 값을 가지게
  된다. 보통 0 이면 정상종료, 1 혹은 2이면 비정상 종료를 의미
- Exit Status 를 확인해 보는 명령어는 다음과 같다.
$echo $?

4. Redirection
- 파일의 내용을 sort 하고 영문자를 모두 대문자로 변환시켜주는 shell 2줄
sort < $1 > sortedFile
tr < sortedFile "[a-z]" "[A-Z]" > upperCaseFile

6. Shell Script 를 디버그 할때 유용한 명령어(-x, -v 옵션)
$sh -x ./dsh1.sh 5 6
$sh -v ./dsh1.sh 5 6

7. /bin/bash 명령어의 두가지 의미
- 지역변수 : Now load second shell in memory (Which ignores all old shell's variable)
- 글로벌 변수(export 키워드 사용) :  Now load second shell in memory (Old shell's variable is accessed from second shell,
if they are exported )

8. 도스 버젼의 text 파일(^M 들어 있는 것들)을 유닉스로 변환시켜주는 명령어 :
$dos2unix *.jsp


-----------------------------
CPU 및 Memory 정보 표시 방법
-----------------------------
1. CPU
$cat /proc/cpuinfo

2. Memory
$cat /proc/meminfo

2006/09/08 13:42 2006/09/08 13:42
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > + HAVE A GOOD TIME +
원본 http://blog.naver.com/blueji78/140003790197

파일 나누기
#split -b 1440k 파일이름




파일 합치기
#cat * > 원래파일이름

2006/09/08 13:42 2006/09/08 13:42
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   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
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)