Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom
Bar]
[Photo of the
Author]
Javi Polo
필자 소개: 필자는 18살이며 스페인 북동부의 카탈로니아지방에서 9월까지 있을 예정인 불쌍한 고등학생이다.전산학에 관심이 많으며, 앞으로의 희망은 UIB에 들어가서 컴퓨터 과학을 전공하고 부전공으로 통신공학을 부전공으로 하고 싶다. 또 하드코어 음악을 좋아 하며 Niko-Chan's Kingdom밴드의 일원이다. 덧붙여서 내가 말할 수 있는 그 무엇보다도 중요한 Xiska 라는 애인이 있다. 0:)

필자에게 연락하기

TCPD 와 IPFWDM 을 사용한 방화벽

[Ilustration]

요약: 이 글은 여러분의 시스템에 보안을 강화하기 위하여 어떻게 inetd 서비스를 설정해야 하는지에 대한 매우 짧은 설명을 담고 있습니다. 이 글에서는 IPFWADM 이란 도구를 이용해서 inetd 서비스를 설정하고 관리하는 방법에 중점을 두어 설명합니다.




글을 시작하기에 앞서 inetd 가 무엇인가를 확실히 해두어야 한다. 기본적으로 inetd는 네트워크를 통해 연결되어 어떠한 서비스를 요구할 때 시스템에서 제공하는 서비스를 제어하는 데몬 이다. 모든 서비스를 기본 설정대로 서비스를 제공하고자 한다면 inetd를 수정하지 않아도 된다. 먼저 우리가 할 일은 /etc/inetd.conf 파일의 내용을 살펴보아서 어떠한 서비스들이 현재 설정되어있는지 확인 하는 것이다. ("#" 글자가 없이 시작하는 줄에 명시된 서비스가 현재 제공되는 서비스이다.) 가장좋은 충고의 한마디는 꼭 필요한 서비스가 아니라면, 이러한 서비스를 활성화 하지 않는 것이야 말로 사용하지도 않는 데몬들의 버그를 통해 침입하는 것을 막을 수 있는 가장 좋은 방법이라는 것이다. 필자는 이 글을 읽는 독자 여러분들이 inetd.conf 파일을 하나씩 복사,출력해서 손에 쥐고 이 글을 볼 것이라 생각한다. 이제 이것들의 의미가 무엇인지 살펴보겠다.

다음 줄을 예로 살펴 보자:
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a

첫번째 단어가 제공되는 서비스명이다(여기서는 "ftp"이며, 나중에 /etc/services파일을 통하여 어떤 포트와 관계되어 있는지 확인 할 수 있다).

두 번째 부분은 열려진 소켓이 어떤 형태인가를 나타낸다. 여기서 stream(위의 예와 같이), dgram, raw, rdm 그리고 seqpacket이 올 수 있다.

다음 세 번째 부분은 사용되어지는 프로토콜을 말한다. 이것은 반드시 TCP 프로토콜이 설정되어지는 처음 예제 파일과 같이 /etc/protocols 안에서 이미 설정되어 있어야 한다.

다음 네 번째 부분에는 wait/nowait를 설정하는 프로토콜이 온다. 여기서 데이터(datagram;dgram) 방식의 소켓이 아니라면 반드시 nowait으로 설정한다. 마지막 소켓타입설정을 위해서 만약 서버가 다중 쓰레드를 지원할 때는 nowait을, 단일 쓰레드만을 지원해줄 때에는 wait 를 지정해 주어야 한다. 이러한 이유는 다중 쓰레드를 지원하는 서버가 요청을 받았을 때 새로운 프로세스를 시작하고 inetd는 계속 다른 요청을 받을 수 있도록 하기 위하여 소켓을 자유롭게 해주기 때문이다. 이런 이유로 nowait을 사용한다. 단일 쓰레드 시스템일 경우에는 반드시 wait이라 명시해 주어야 하는데 서버가 항상 같은 소켓을 이용하기 때문에 따로따로 분리된 프로세스 안에서는 연결상태를 시작할 수 없기 때문이다. 더 설명을 하자면 nowait.50처럼 사용할 수도 있다. -- 이 때 50 의 의미는 1분동안에 실행(또는 한쪽 측면에서 보았을 때 받아들일 수 있는 요청을 허용하는 것)할 수 있는 데몬의 한계이다. 기본값은 40이다.

다섯번째 항목은 실행시킬 데몬의 실행권자 이름을 나타낸다. 위의 예에서는 ftp를 root 의 실행권으로 실행 시키고 있다.

여섯 번째와 일곱 번째는 프로그램의 변수를 통과한 것들에 따라서 프로그램을 실행시키는 역할을 한다. 위의 예를 살펴보면 데몬 tcpd는 데몬 in.ftpd를 파라메터 -l -a 와 함께 실행된다. 이부분이야말로 TCPD를 다루는 부분에 있어서 가장 중요한 부분이다.

tcpd는 필터기능을 가진 데몬이다. 그래서 서비스를 요청한 IP주소들에 대하여 데몬이 실행될때 정한 바에 따라서 한가지 이상의 동작을 수행할 수 있다. 이 필터 역할에서 결정은 /etc/hosts.allow와 /etc/hosts.deny에서 설정된 것을 바탕으로 실행된다.

원칙적으로 /etc/hosts.deny파일에는 누구를 거부할 것인가를 설정하는데 사용되며 /etc/hosts.allow 는 누가 서비스를 사용할 수 있게 할 것인가를 설정한다.

두 파일의 구성은 다음과 같다.:
DAEMON: IP[: OPTION1 [: OPTION2 ]]

여기서 DAEMON은 위의 예문에서 in.ftpd처럼 특정 데몬을 설정할 수도 있으며 또는 모든 데몬들을 ALL이라 설정하여 미리 정해진 것과 같이 실행되게 할 수도 있다.

IP 부분은 특별히 구분되어진 IP, URL 또는 일정영역의 IP (또는 URL)그룹들과 나중에 이야기될 와일드카드문자들를 포함 할 수 있다.

일정영역의 IP그룹들을 설정하기 위하여 예를 들자면 `123.32.' 라고 적을 수 있다. 이러한 표현은 123.32.XXX.XXX로 표현되는 모든 IP주소들을 대신한다. 같은 방법으로 포괄적 URL 그룹의 정의도 '.ml.org' 는 ml.org 의 부분 도메인 모두를 대신하게 된다.

일정영역의 IP그룹들을 설정하는 것은 IP/MASK 표현 방법이 더 전통적인 방식이다. 이 방식에서는 127.0.0.0/255.255.0.0라 설정하면 127.0.0.0 에서 부터 127.0.255.255 를 의미한다.

이제 와일드카드문자를 살펴보자:
ALL 가능한 모든 것을 허용하도록 한다.
LOCAL ^O.^O없이 임의의 이름과 일치한다.
UNKNOWN 어떤 컴퓨터의 IP 주소나 이름이 알려지지 않은 것이다.
KNOWN 어떤 컴퓨터의 주소와 이름 모두가 알려져 있는 것이다.
PARANOID IP주소에 일치하지 않은 이름을 가진 컴퓨터이다.
가능한 옵션들은 다음과 같다.:

allow 이는 hosts.allow 와 hosts.deny 파일에서 명시된 것과는 관계없이 반드시 허용되어야 하는 접속을 의미한다.
deny 방금 옵션과 비슷하지만 연결을 거부한다는 점에서 다르다.
spawn 어떤 접속을 요청을 받았을 때 실행할 쉘을 지정한다. 예를 들자면 외부에서 자신의 시스템으로 접속을 시도할 때 삐 하는 경고 음을 실행하는 것과 같은 역할을 부여할 수 있다.
twist 이것은 쉘 명령어에 의해서 접속 전체를 제어할 수 있다는 것을 제외하고는 spawn 과 비슷한 옵션이다

마지막 두 가지 옵션들은 tcpd 에 적합한 확장된 문자 사용을 허용하는데, 다음이 그것들이다.:

%a 클라이언트 컴퓨터의 주소
%c 클라이언트에 대한 정보(이것은 아마도 user@machine 또는 클라이언트에 따라 다른 표현으로 쓰일 것이다)
%d 데몬의 이름
%h 클라이언트에 사용 가능하도록 주어진 IP 주소나 이름
%n 클라이언트의 이름
%p데몬의 PID
%s 서버에 대한 정보(설정에 때라 daemon@machine 또는 단지 daemon 만으로 표현된다)
%u 클라이언트 사용자의 이름
%%이것은 단지 % 문자를 의미 한다.

위의 확장된 옵션과 마지막 옵션들로 당신은 많은 것들을 할 수 있다, 예를 들어 나는 어떠한 사람이 그의 시스템에 telnet 을 이용해 접속을 하려 할 때 자동으로 눈물(teardrop)을 보내도록 해둔 사람을 알고 있다 :-)

부연설명 : 여기서 눈물(teardrop)이란 Dos (Denial of Service, 재 부팅을 발생하게 하거나 시스템을 다시 시작하게 만드는 공격이다) 이것은 대부분의 오퍼레이팅 시스템이 가지고 있는(비교적 대부분의 커널에서는 이 문제에 대한 패치가 이미 되어 있다.) TCP 패킷 재 조합 시의 버그에 원리를 두고 있다. 인터넷을 통해 오고 가는 정보는 TCP/IP 프로토클을(이 프로토클은 또한 다른 형태의 인터넷과 같은 네트워크이다) 이용한다. 이것은 실질적으로 두 가지 프로토콜인데, TCP 는 정보를 패킷 단위로 나누는 부분에 관여하고 IP 프로토클로 인하여 멀리 떨어져 있는 곳으로 이 정보를 보낸다; 다른 떨어져 있는 곳에 이 정보가 도착 했을 때 TCP 프로토클을 다시 이것을 검사하여 나뉘어져 있는 패킷들을 다시 조합하여 원래의 정보형태로 만드는 것이다. 여기서 거론되었던 공격(그리고 여기에 기반으로 했던 것 많은 것들) 은 많은 오퍼레이팅 시스템이 재조합하기 전의 패킷이 너무 작다는 것을 검사하지 않아 이들을 함께 모아 둘 때에 걸리는 시간에 대하여 어려움을 겪는다는 사실을 이용하는 것이다. 막연하지만 나는 여기서 완전한 설명을 할 수가 없다 만약 어떤 정보나 충고를 주기를 원한다면 나는 언제나 환영한다. 음 설명이 짧지만 계속 이야기를 이어나가도록 하겠다.

예제:

#hosts.allow 
ALL: 127.0.0.1 # localhost가 모든 것을 이용 할 수 있도록 허용한다.
in.ftpd: ALL: spawn (wavplay /usr/share/sounds/intruder.wav & )
# 누구라도 ftp 를 이용해 접속하는 것을 허용 하지만 이때에
# wav 사운드가 시작하도록 한다 ( 스스로 경고를 해주기 위하여)

in.telnetd:  ALL: twist ( teardrop %h %h )
# 누구든지 telnet 을 통해 접근하려 할 때
# 눈물(teardrop)공격을 보낸다 

#끝


#hosts.deny 화일 내용

ALL: `.bsa.org'   # bsa.org 도메인을 포함한 누구든지 접근을 거부한다.
in.fingerd: ALL   # 모든 사람이 fingerd 서비스를 사용하지 못하게 한다.

#끝

이것이 내가 tcpd 에 대하여 말한 전부이다. 필자는 앞에서 필자가 가진 지식이 많지 않다고 밝혔다. 필자는 여러가지 설정과 그리고 메뉴얼페이지( tcpd, host_access(5) )를 읽고서 시도해 보고 직접 실험해 보기를 바란다, 내가 가르쳐 줄 수 있는 것 보다 이 방법으로 더 많은 것을 배울 것이라고 생각한다.

다음은 IPFWADM 이란 도구에 대하여 살펴보자.

먼저 요구 상황이 커널이 IP Firewalling(방화벽)을 지원하도록 컴파일 되어 있어야 한다. (커널 설정 부분 중:Networking -> Network firewalls + IP: firewalling ). 다음에 커널 컴파일이 끝났으면 이 방법을 이용 할 준비를 하기 위하여 시스템을 다시 시작하도록 한다.

IPFWADM는 TCP, UDP 그리고 ICMP 패킷들이 들어오거나 나가는 것을 관리할 수 있다. (이 글에서 필자가 이야기하고자 하는 것의 하나이다.) 간단히 말하면 관리자는 어떤 패킷이 들어올 수 있는지를 설정할 수 있는데 이때 특정 IP주소나 일정영역의 IP주소를 지정할 수도 있으며 허용하는 특정포트를 정할수도 있다. 또한 이들을 조합하여 프로토콜을 정할 수도 있다. 비슷한 원리로 우리들은 외부로 나가는 패킷들을 이와 같이 관리할 수도 있다.

ipfwadm 은 여러가지 주요한 파라메터들을 가지고 있다:

  • -A 계정규칙에 대한 지정
  • -I 들어 오는 패킷에 대한 규칙에 대한 지정
  • -O 외부로 나가는 규칙에 대한 지정
  • -F 패킷들에 대한 전면적인 규칙에 대한 지정
  • -M IP 매스큐레이딩 관리를 위한 지정

위의 파라메터들 중 -I 와 -O 에 대해서만 이야기 할 것이다. 둘 다 사용법은 동일하다.

이 파라메터에 대한 선택사항은 다음과 같다.:

  • -a 한가지 또는 여러 가지 규칙을 목록 마지막에 더한다.
  • -i 한가지 또는 여러 가지 규칙들을 목록 처음 부분에 더한다.
  • -d 목록중에서 한가지 또는 여러 가지 규칙을 삭제
  • -l 목록에 있는 규칙들을 나열
  • -f 목록에 있는 모든 규칙을 삭제
  • -p 어떤 패킷들을 받아들일지(a), 거부할지(d) 또는 제거(r) 할지를 설정
  • -c 패킷에 어떠한 규칙이 적용 되는지를 검사한다.
  • -h 도움말
중요한 파라메터들은 다음과 같다.:

-P 주어진 규칙들이 적용될 프로토콜을 지정한다. 프로토콜은 TCP, UDP, ICMP 또는 (특별히 어떤 프로토콜을 지정하지 않는다면) 모든 프로토콜일 것이다.
-S 패킷의 원주소지를 지정한다. 이 때 형태는 ADDRESS[/MASK]{PORT] 이다. 즉 123.32.34.0/255.255.255.250 25라 하면 IP주소가 123.32.34.0에서 123.32.34.5까지의 영역에 해당하는 것을 말한다.
-D -S와 동일한 사용법을 가지는데 목적지 주소를 지정한다.

이것들은 모두 기본적인 파라메터들이다. 그렇기때문에 자신의 시스템에서 나온 모든 프래임들은 필자가 규칙으로 자신의 시스템에 도착할 수 있게 하려면 다음과 같은 규칙을 더한다.:

ipfwadm -I -i a -S 127.0.0.1

그리고 123.34.22.XXX 로 온 패킷들은 거부를 한다.:

ipfwadm -I -a d -S 123.34.22.0/255.255.255.0

다음에 만약에 IP 111.222.123.221 를 제외한 netbios 포트에 접속하려는 어떠한 접근도 거부를 원한다면 다음과 같이 한다.:

ipfwadm -I -a a -P tcp -S 111.222.123.221 139
ipfwadm -I -a d -P tcp -D 0.0.0.0/0 139

자.. 내 모든 글은 나의 지식의 한계로 얼마간의 부족한 점들이 있을 것이다. O:)

번역 : 김기태


본 웹싸이트는 Miguel Angel Sepulveda님에 의해 관리됩니다.
© Javi Polo 1998
LinuxFocus 1998