TCP wrappers

System/Linux 2011. 1. 25. 23:14
TCP wrappers는 간단하면서도 효율적으로 네트워크 서비스를 보호하는 방법
을 제공한다.

글/ Lee E. Brotzman 역/ 이기동(자유기고가)

인터넷이 폭발적인 성장을 이루면서 컴퓨터 시스템의 보안은 대기업, 작은 사
업자, 개인과 같은 이들의 주된 관심사가 되었다. 어떤 네트워크에서는 며칠이 
멀다하고 보안 문제가 발견되는 경우가 적지 않다. 많은 기업들은 내부 네트워
크와 인터넷 사이에 방화벽을 설치하여 위험을 줄이고자 하지만 리눅스를 집이
나 사무실에서 운영하는 개인 사용자에게는 사실 너무 비용이 많이 들고 귀찮
은 일이 많다. TCP_wrappers는 네덜란드 Eindhoven 공과대학의 Wietse 
Venema씨가 만들었다. TCP_wrappers는 침입자가 접근하거나 악용할 수 있는 
네트워크 서비스를 보호하는 간단하고 효율적인 방법을 제공한다. 
이 글에서는 TCP_wrappers가 무엇이고, 어떻게 동작하는지 그리고 허용되지 
않은 접근으로부터 시스템을 보호하기 위하여 TCP_wrappers를 어떻게 설정하
는지 설명할 것이다. 또한 우리는 TCP_wrappers의 더 뛰어난 특징으로 자세
한 로그인 정보를 제공하고 시스템을 파괴하려는 시도를 추적하는데 도움을 주
는 기능에 대해서도 다룰 것이다.

TCP_wrappers는 무엇이며, 어떻게 동작하는가?
우선, 우리는 텔넷에서 처럼 전송 제어 프로토콜(TCP)의 연결이 어떻게 이루
어지는지 알 필요가 있다. TCP 네트워크 연결은 ‘클라이언트/서버’ 모델에 
기반을 둔다. 텔넷 프로그램은 서버 프로그램 또는 telnetd 또는 in.teln etd(시
스템 설정에 따라 다르다)라 불리는 데몬과 통신하는 하나의 클라이언트이다. 
대부분의 리눅스 배포본들은 네트워크 데몬으로 /usr/sbin 디렉터리에서 
in.[serv ice]d라는 이름을 사용하기 때문에 필자는 여기서부터 이름을 정하는 
관례를 따를 것이다.
모든 네트워크 서비스에 대한 요청은 가장 먼저 인터넷 데몬, inetd 통하여 이
루어진다(세상살이가 다 그렇지만 이 규칙에도 예외가 있다. 뒤에서 알아보겠
다). 데몬은 네트워크 연결 요청에 대해서 어떻게 응답할 것인지 결정하기 위
하여 두개의 설정 파일을 사용한다. /etc/servi ces에는 각각의 서비스 이름과 
그 포트 번호가 나열되어 있다. /etc/inetd.conf에는 서비스 이름, 프로그램 이
름, 서비스를 제공하는 데몬의 이름이 나와 있다. 리스트 1과 2는 /etc/services
와 /etc/inetd.conf 파일의 일부이다. 내 시스템의 인터넷 주소를 
my.linux-box.com이라 가정하고 다음과 같이 입력하였다면,

telnet your.machine.com

텔넷 클라이언트는 출발지의 인터넷 주소 my.linux-box.com과 도착지의 인터
넷 주소 your.machine.com와 포트 번호를 담은 패킷을(다른 것들과 함께) 보낸
다. 텔넷의 포트 번호는 23번이다. inetd는 /etc/services에서 23번 포트를 찾고 
서비스 이름이 텔넷이라는 것을 알게 된다. 그 다음 텔넷을 /etc/inetd.conf에서 
찾고 in.teln etd라 불리는 데몬을 실행할 필요가 있는지 알아본다. 리스트 2의 
가장 오른쪽 컬럼에서 볼 수 있다. inetd는 in.telnetd를 포트 23을 연결하기 위
하여 in.telnetd를 실행한다. 그 다음 또 접속하는 요구가 있는지 감시하는 일을 
한다. in.telnetd가 클라이언트에 응답하면 사용자 이름과 패스워드를 묻고 텔넷 
세션을 시작한다.
만약 여러분의 시스템으로 누구도 텔넷 접속을 하지 못하도록 하고 싶다면 어
떻게 할까? 접속을 요청하는 출발지 주소를 보거나 또는 시스템이나 도메인 밖
의 모든 주소를 거부하기 위해서 in.telnetd의 코드를 수정할 수 있다. 만약 텔
넷이 유일한 네트워크 서비스라면 이 문제는 무척 쉽지만 수많은 네트워크 서
비스가 존재하기 때문에 시스템에서 모든 데몬마다 접근을 제한하도록 수정하
는 것은 끔직한 일이다.

리스트 1:/etc/services의 예
ftp-data 20/tcp
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp mail
exec 512/tcp # BSD rexecd(8)
login 513/tcp # BSD rlogind(8)
shell 514/tcp cmd # BSD rshd(8)

리스트 2:/etc/inetd.conf의 예
ftp stream tcp nowait root in.ftpd
telnet stream tcp nowait root in.telnetd
#smtp stream tcp nowait root smtpd
shell stream tcp nowait root in.rshd
login stream tcp nowait root in.rlogind
exec stream tcp nowait root in.rexecd

여기서 TCP_wrappers가 이러한 끔직한 일에서 구해 줄 것이다. wrappers 프
로그램은 inetd와 in.telnetd, in.ftpd와 같은 네트워크 데몬 사이에 있는 작은 데
몬이다. 모든 TCP 접속은 시작될 때 기본적으로 같은 방식을 따르게 되므로 
wrappers 프로그램은 거의 모든 TCP 네트워크 서비스에 대한 접근을 제어하
는데 사용할 수 있다. 
wrappers가 설치되면 인터넷 데몬은 보통 네트워크 데몬 대신 wrappers를 실
행하기 위하여 다시 설정된다. wrappers는 접속된 출발지 주소와 서비스를 체
크하고 접속을 허가할 것인지 결정한다. 만약 your.machine.com이 내가 보낸 
텔넷 세션의 요청을 거부한다면 접속을 끊는 길밖에 없다. 접속이 허용되면 모
든 것은 정상적으로 처리되는데 wrappers는 실제로 내 텔넷 클라이언트에서만 
작동하는 것은 아니다. 어느 쪽에나 wrappers는 시스템에 성공적으로 연결되었
는지 알 수 있도록 하기 위해서 시스템 로그에 기록한다.

TCP_wrappers 설치하기
대부분의 리눅스 배포본에는 TCP_wrappers가 네트워크 패키지의 한 부분으로 
설치된 상태로 따라온다. 시스템에 TCP_wrappers를 설치하였는지 확인하려면 
/etc 디렉터리의 hosts.allow와 hosts.deny 두 파일을 확인해 보면 된다. 이들은 
TCP_wrappers 데몬, 즉 tcpd에 쓰이는 설정 파일이다. 또한 /etc/inetd.conf 파
일에서 다음과 같은 것을 볼 수 있다.

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
/usr/sbin/tcpd 옵션은 누군가가 여러분의 시스템에 텔넷을 시도하려고 할 때를 
알려준다. 접속을 시도하려고 하면 우선 TCP_wrappers에 연결될 것이다.
아마도 TCP_wrappers는 이미 리눅스 시스템에 설치되어 있을 것이므로 여기
서 필자는 컴파일 과정부터 시작하지는 않는다. 어떻게 TCP_wrappers를 다운
로드하고 설치하는지 자세한 정보를 얻기 위해서는 ‘TCP_wrappers를 구하는 
방법’을 보기 바란다.

TCP_wrappers 설정하기
필자가 지금까지 설명하였듯이 TCP_wrappers 데몬 tcpd는 액세스를 허가하고 
거부하는데 대한 규정을 /etc/hosts.allow와 /etc/hosts.deny에서 참조한다. tcpd
는 특정한 서비스와 컴퓨터 호스트 이름을 일치시키는 ‘규칙’으로 
/etc/hosts.allow를 먼저 조사한 다음 /etc /hosts.deny를 조사한다. 일치하는 것
이 없으면 접근이 허가된다. 기본적으로 대부분의 배포본에서는 TCP_wrappe 
rs가 ‘완전히 개방된’ 상태로 실린다. 예를 들어, /etc/hosts. allow와 
/etc/hosts.deny가 비어 있으면 누구나 인터넷 서비스에 접근할 수 있다.
TCP_wrappers를 설정하기 전에 여러분은 반드시 시스템을 ‘대부분 개방’시
킬지 아니면 ‘대부분 거부’시킬지에 대한 정책을 결정해야 한다. ‘대부분 
개방’ 정책은 인터넷의 다른 컴퓨터가 대부분의 서비스를 이용할 수 있음을 
의미한다. 이는 몇몇 말썽이 잦은 사이트의 접근을 금지시키거나 한두 가지 서
비스를 막고자 할 때 유용하다. ‘대부분 거부 정책’은 보통 많은 이들이 원
하는 방향이 될 것이다. 여기에는 특별히 몇 가지 보안 옵션이 있다.
먼저 ‘대부분 개방’설정부터 살펴보자. 대부분의 연결을 받아들일 것이기 때
문에 /etc/hosts.allow 파일은 비어 있는 상태로 남겨 둘 것이다. 
/etc/hosts.deny 파일에는 nasty.badguy.net 호스트와 cracker.org 도메인에서 
온 사람들에게 telnet과 rlogin 접속을 거부하는 규칙을 세워 보자. 
/etc/hosts.deny에 필히 있어야 할 줄은 다음과 같을 것이다.

in.telnetd in.rlogind : nasty.badguy.net .cracker.org
cracker.org 앞에 ‘ . ’이 온다는 것에 주의하기 바란다. 이는 그 인터넷 도
메인에 있는 어떤 시스템이라도 접근을 거부해야 함을 알린다. 이러한 사이트
의 크래커는 아마도 telnet, rlogin를 제외한 다른 네트워크 서비스를 이용하는 
방법을 알고 있기 때문에 여러분은 와일드카드 ALL을 써서 모든 서비스에 대
하여 접근을 거부할 수 있다.

ALL : nasty.badguy.net .cracker.org
특정한 호스트 이름을 대치할 수 있는 다른 와일드카드로는 LOCAL, 
UNKNOWN, KNOWN, PARANOID가 있다. LOCAL은 ‘ . ’이 없는 모든 
이름에 해당된다. 예를 들어 로컬 도메인의 이름을 들 수 있다. KNOWN과 
UNKNOWN은 각각 도메인 네임 서비스(DNS: Domain Name Service)에서 호
스트를 찾을 수 있는 호스트, 찾을 수 없는 호스트를 지칭한다. PARANOID는 
인터넷 주소에 맞지 않는 어떤 이름의 호스트이던지 일치한다. 이 옵션은 그렇
게 자주 사용되는 것은 아니다. 왜냐하면 이미 wrappers가 hosts.allow와 
hosts.deny 파일을 체크하기 전에 이러한 조건에 일치하는 호스트는 접근을 거
부하도록 컴파일되었기 때문이다. 우리의 로컬 도메인에서 네트워크 서비스의 
접근을 전부 허가하고자 한다면 /etc/hosts.allow에 다음과 같이 쓸 수 있다.

ALL : LOCAL
자, 이제 ‘대부분 거부’ 설정을 살펴보자. hosts.allow를 가장 먼저 체크하고 
다음에 hosts.deny, 마지막으로 hosts.deny에서 일치하는 호스트 이름을 찾을 
수 없는 경우에만 접근을 허가하게 된다는 것을 명심하기 바란다. 외부의 다른 
모든 시스템에 대한 서비스를 막고자 할 때는 규칙에 따라 hosts.deny 파일에 
다음과 같이 적어 둔다.

ALL : ALL
우리는 hosts.allow안에 다른 사람이 사용할 수 있는 특정한 서비스만 나열하
였다. 물론, 우리는 로컬 시스템에서 모든 서비스에 접근이 가능하도록 하고 싶
다. 또한 인터넷 서비스 제공 회사인 my.isp.net의 셸 계정에서 우리 시스템으
로 텔넷하고자 한다고 했을 때 그리고 사용자의 정보를 finger로 보여줄 수 있
도록 하고 싶다면 그 규칙을 /etc/hosts.allow에 다음과 같이 하면된다.

ALL : localhost
in.telnetd : my.isp.net
in.fingerd : ALL
cracker.org의 크래커가 finger를 통해서 우리의 정보를 빼가는 것을 막고자 한
다면 다음과 같이 고칠 수 있다.

ALL : localhost
in.telnetd : my.isp.net
in.fingerd : ALL EXCEPT .cracker.org
지금까지 알아본 것처럼 여기에는 상당히 융통성 있다. 그러나 그러한 융통성 
때문에 혼동할 여지가 있고 더 나빠지면 오류를 일으킬 수도 있다. 여러분은 
안전하다고 생각할지 모르지만 TCP_wrappers의 설정 파일이 잘못되었다면 그
렇지 않다. 여러분이 설정한 것을 체크하고 보호 기능을 시험하기 위해서 
Wietse Venema씨는 추가로 두 가지 프로그램을 제공하였다. 그것은 tcpdchk
와 tcpdmatch이다. tcpdchk는 설정 파일에 문제가 없는지 체크한다. 이는 ALL
이나 LOCAL과 같은 와일드카드를 잘못 사용하였는지, 접근 규칙 중에 존재하
지 않는 호스트 이름이 있는지, /etc/inetd.conf 파일의 tcpd에 의하여 제어되는 
서비스 규칙이 있는지 등의 정보를 알려준다. 예로써, 대부분 거부 설정에서 
tcpdchk의 출력은 다음과 같은 정보를 내놓는다.

# tcpdchk -v

>>> Rule /etc/hosts.allow line 6:
daemons:ALL
clients:localhost
access: granted
>>> Rule /etc/hosts.allow line 7:
daemons:in.telnetd
clients:my.isp.net
warning:/etc/hosts.allow, line 7:my.isp.net:host not found
access: granted
>>> Rule /etc/hosts.allow line 8:
daemons:in.fingerd
clients:ALL EXCEPT .cracker.org
access: granted
>>> Rule /etc/hosts.deny line 9:
daemons: ALL
clients: ALL
access: denied

필자는 tcpdchk가 더 자세한 결과를 생성하도록 -v 스위치를 사용하였다. 위에
서 my.isp.net은 찾을 수 없다는 것을 알려주는 것은 이 예제에서 임의로 만든 
이름이기 때문이다. 마찬가지로 가상 도메인인 .cracker.org에서는 비슷한 메시
지를 얻지 못하는 것은 이는 전체 도메인이기 때문이고 오히려 특정한 호스트 
이름이 DNS에 등록되어 있다면 tcpdchk는 도메인에 등록되었는지 체크하지 
않는다.
tcpdmatch는 가상적인 인터넷 접속 요청을 만들어 내서 설정한 것을 시험해 
본다. 데몬의 이름과 호스트 이름을 주면 그 접속이 허가되는지 또는 거부되는
지 알려줄 것이다. 예를 들어 www.linuxjournal.com의 웹마스터가 필자의 시
스템의 사용자들에게 finger를 걸 수 있는지 알기를 원한다면 다음과 같이 입
력하면 된다.

# tcpmatch in.fingerd webmaster@www.linuxjournal.com
client: hostname www.ssc.com
client: address 199.184.169.67
client: username webmaster
server: process in.fingerd
matched: /etc/hosts.allow line 8
access: granted

tcpmatch는 www.linuxjournal.com의 실제 호스트 이름이 www.ssc.com이고 
그 인터넷 주소를 보고한다는 것에 주의한다. 마지막 줄에는 finger가 정말로 
허가된다는 것을 보여준다.
S. Garfinkel씨와 G. Spafford씨가 쓴 O' Reilly & Asso ciates 출판사가 1996
년 출간한 Practical UNIX and Internet Security 두 번째 판에서 저자는 다음
과 같이 설명한다. “tcpdchk와 tcpdmatch같은 프로그램은 보안 프로그램 
tcpwrappers의 훌륭한 보완책이 된다, 왜냐하면 두 프로그램은 문제가 발생하
기 전에 보안 문제를 발견하는데 도움을 주기 때문이다. Wietse Venema씨는 
일어날 수 있는 모든 가능성을 예측하고 tcpwrappers를 발표할 때 그들을 제
작하여 같이 포함하였다. 다른 프로그래머들도 이러한 예를 따라야 하겠다.” 
필자는 이 말에 전적으로 동의하는 바이다.

Wrappers를 이용한 사용 추적
TCP_wrappers는 접속을 요청 받았을 때 그 접근을 받아들이는지 그렇지 않은
지에 대한 메시지를 시스템 로그에 기록한다. 위에서 볼 수 있는 로그의 엔트
리만으로도 TCP_wrappers를 설치할 만한 충분한 이유가 된다. 메시지는 표준 
syslog 기능을 통해 기록되고 기본적으로 메일 전송을 통하여 같은 곳으로 가
게 된다. 필자의 리눅스 배포본인 레드햇 리눅스를 기반으로 한 칼데라 네트워
크 데스크탑에서는 메시지가 다른 데몬과 같이 같은 로그 파일에 기록되도록 
기본값이 바뀌었다(LOG_DAEMON 기능). 어떠한 이벤트이건 누군가가 필자의 
시스템에 텔넷을 통하여 접근하려 할 때 다음과 같은 메시지가 
/var/log/message에 기록된다.

Apr 9 17:24:58 ads in.telnetd[15339]: connect from
someother.place.com
접속이 거절되면 메시지는 다음과 같다.

Apr 9 17:25:15 ads in.telnetd[15604]: refused connect from
someother.place.com
모든 로그에서 telnet 시도를 보기를 원한다면 간단히 다음과 같은 명령을 입력
한다.

grep telnetd /var/log/messages

TCP_wrappers는 ‘부비 트랩’을 사용하여 더 많은 정보를 제공한다. 
TCP_wrappers는 특정한 서비스가 요청되었을 때 셸 명령을 실행할 수 있도록 
설정할 수 있다. nasty.badguy.com의 누군가가 패스워드 파일을 훔치기 위하여 
Trivial FTP (TFTP) 프로그램을 사용한다고 가정해보자. /etc/hosts.deny 파일
에 다음과 같은 줄을 추가할 수 있을 것이다(이 예제는 TCP_wrappers에 따라
오는 hosts_access(5) 맨페이지에서 가져온 것이다).

in.tftpd : nasty.badguy.com:(/usr/sbin/safe_finger-l@%h l 
/bin/mail -s %d->%h root) &
nasty.badguy.com의 모든 사용자가 TFTP에 접근하는 것은 거부된다. 덧붙여
서, 

safe_finger @nasty.badguy.com

이 명령이 실행되면 결과를 파이프를 통하여 메일 메시지로 바꾸어 루트 사용
자에게 보낸다. 제목은 다음과 같이 붙게 된다.

in.tftpd->nasty.badguy.com
safe_finger는 제어 문자나 초과된 데이터와 같은 ‘잘못된’ 글자를 제거하는, 
TCP_wrappers에서 같이 제공되는 명령이다. safe_finger @hostname을 실행시
키면 현재 로그인한 모든 이들의 리스트가 생성된다. %h, %d 문자열은 확장자
라 불리고 tcpd는 여기에 각각 호스트 이름과 데몬 프로세스를 대입한다. 다른 
확장자로는 클라이언트 인터넷 주소 %a, 클라이언트 사용자 이름인 %u가 있
다. 그러나, 이것은 완벽한 해결책이 아니다. 크래커란 친구는 자신의 finger 서
비스를 사용하지 못하게 하거나 잘못된 정보를 넘겨주도록 고칠 수 있기 때문
이다. 그러나, 위의 예제는 TCP_wrappers 프로그램의 위력을 충분히 보여준다.

확장된 옵션 사용하기
/etc/hosts.allow와 /etc/hosts.deny 파일의 접근 제어는 간단하지만 매우 강력
하다. 그러나, TCP_wrappers는 통상적인 접근 제어에 더 강력하고 확장된 기
능을 포함해서 컴파일할 수 있다. 

service : host
윗줄에 다음을 추가할 수 있다.

service : host : option : option ...

옵션은 allow, deny 또는 여러 다른 확장된 옵션이 될 수 있다. 확장된 옵션
을 사용하기 위해서는 -DPROCESS_ OPTIONS 플래그를 주어 wrappers 프로
그램을 컴파일한다. 칼데라/레드햇 배포본에서 wrappers는 이러한 방식으로 컴
파일되었다. 배포본에서 이러한 옵션을 사용할 수 있는지 체크하려면 tcpdchk 
-a를 실행한다. 필자의 시스템에서는 다음과 같은 출력을 볼 수 있었다.

warning:/etc/hosts.allow, line 6:implicit "allow" at end of rule
warning:/etc/hosts.allow, line 7:my.isp.net:host not found
warning:/etc/hosts.allow, line 7:implicit "allow" at end of rule
warning:/etc/hosts.allow, line 8:implicit "allow" at end of rule
‘allow’를 내포한 메시지는 wrappers 버전이 /etc/ hosts.allow 파일에서 추
가적인 옵션을 찾고 있다고 알려준다. 배포본에서 PROCESS_OPTIONS을 가
지고 있지 않다면 이와 같은 메시지를 볼 수 없을 것이다. 확장된 옵션을 사용
하면 우리는 /etc/hosts.allow 파일을 완전히 제거할 수 있는데 ‘allow’와 
‘deny’ 옵션을 어떠한 규칙에도 추가할 수 있기 때문이다. 로그인 레벨, 네
트워크 서비스의 우선순위 (‘niceness’)제어, RFC 931 ‘ident’ 프로토콜에 
따른 사용자 탐색, 각 서비스마다 ‘배너’에 맞추어진 디스플레이 등을 바꿀 
수 있다.
확장된 기능에 대한 상세한 정보는 TCP_wrappers에 포함된 host_options(5) 
맨페이지 또는 위에서 이야기한 Garfinkel & Spafford씨가 쓴 책(네트워크 보
안에 관계된 누구나 반드시 읽어야 할 것)에서 찾을 수 있다. 일단 
/etc/hosts.allow와 /etc/hosts.deny 파일을 확장된 옵션을 사용하여 바꾸어 보
자. /etc/hosts.deny 파일은 더이상 필요치 않다. /etc/hosts.allow에서 규칙에 
따라 다음과 같이 다시 쓴다. 

ALL : localhost :allow
in.telnetd : my.isp.net :allow
in.fingerd : ALL EXCEPT .cracker.org allow
in.tftpd : nasty.badguy.com : spawn 
(/usr/sbin/safe_finger -l @%h l
/bin/mail -s %d-%h root) &
: deny
ALL : ALL : deny

위의 설정 파일은 다음과 같이 풀이할 수 있다.

1. 로컬 시스템에서 접속할 때는 모든 서비스가 허가된다.
2. my.isp.net에서의 telnet이 허가된다.
3. cracker.org 도메인을 제외한 모든 호스트에서 finger가 허가된다.
4. nasty.badguy.com으로부터의 tftp는 허가되지 않는다. 그리고 그들이 시도하
려고 하면 우리는 범죄 집단을 찾아내기 위해서 부비 트랩을 튀어 오르게 할 
것이다.
5. 모든 곳으로부터의 나머지 모든 서비스는 거부된다.

TCP_wrappers가 할 수 없는 것은 무엇이 있는가?
지금까지 보아 왔지만 TCP_wrappers는 시스템에 대한 접근을 제어하는 간단
하고 효율적인 수단을 제시한다. 그러나 우리가 반드시 기억해야 하는 것은 
“컴퓨터 보안에서 안전이란 없다, 더 안전하거나 덜 안전한 것뿐이다”라는 
것이다. 모든 보안 방책들이 있음에도 TCP _wrappers에는 한계가 있다.
무엇보다도 wrappers는 부트할 때 시작하고 시스템을 셧다운할 때까지 실행되
는 서비스-inetd에서 관리하지 않는 서비스에 대한 접근을 제어할 수 없다. 
sendmail이나 httpd(월드 와이드 웹 서버)와 같은 서비스가 이러한 부류에 해
당한다. 이러한 서비스들은 항상 할당된 포트를 감시하고 자체적인 접근 통제
를 필요로 한다. sendmail과 월드 와이드 웹의 보안에 관한 논의는 너무 방대
한 문제이고 분명히 이 기사의 범위에 벗어난다. 
TCP_wrappers는 ‘host name spoofing’으로 공격받기 쉽다. rsh와 rlogin과 
같은 서비스는 호스트 이름이 정확한지에 따라 좌우된다. 여러분이 호스트 이
름을 찾을 수 없는 DNS 서버를 사용하면 공격자가 자신의 컴퓨터 이름을 
‘신뢰’할 수 있는 이름으로 변조함으로써 탐색하는 이름에 ‘속임수
(spoofing)’를 부릴 가능성이 있다. 인터넷 주소와 호스트 이름을 로컬의 
/etc/hosts에 넣은 엔트리로 이러한 공격을 막을 수 있다. 따라서 외부의 DNS 
탐색에 의존하지 않아도 된다(또 다른 장점으로는 호스트 이름을 빨리 찾을 수 
있다는 것이다). 여러분이 /etc/hosts 파일을 항상 최신으로 유지해야 할 책임
은 없다. 한 컴퓨터의 /etc/hosts파일에서 인터넷 주소를 변경하게 되면 여러분
이 엔트리를 바꾸지 않는 한 접근은 거부될 것이다. 다행히도 이러한 일은 거
의 일어나지 않아서 필자는 보통 /etc/hosts의 엔트리에 자주 접속하는 컴퓨터
와 접근을 허가하는 모든 호스트의 이름을 넣어 둔다. 
TCP_wrappers는 또한 host name spoofing을 막는 또 다른 과제를 해결한다. 
기본값 옵션인 PARANOID로 컴파일할 때(와일드카드에 대해 설명한 곳을 참
조한다) wrappers는 이름을 탐색하는 것은 물론 주소(IP 번호)로도 탐색하여 
인터넷 주소를 체크한다. 두 가지가 일치하지 않으면 접근은 자동적으로 거부
된다.
또다른 공격받을 가능성은 ‘소스 라우팅’에 있는데 다른 ‘바깥’ 주소로부
터의 컴퓨터가 ‘내부’의 신뢰받은 컴퓨터임을 사칭하는 경우이다. 
TCP_wrappers는 소스 라우팅을 금지하기 위하여 KILL_IP_OPTIONS와 같이 
컴파일할 수 있다. 운이 좋게도 리눅스 사용자들은 일반적으로 그러한 공격에 
대한 걱정을 할 필요가 없다. IP 소스 라우팅은 커널에서 기본값으로 사용하지 
않도록 하였기 때문이다. 
마지막으로 어떠한 서비스의 접근을 제어하는데 wrapp ers를 사용하더라도 한 
서비스의 악용을 피하는 가장 좋은 방법은 아예 서비스를 하지 않는 것이다. 
만약 rsh나 rlogin을 써야 할 일이 없다면 /etc/inetd.conf 파일에서 해시 마크 #
를 셸과 로그인 서비스 줄의 맨 앞에 넣어 둔다. 이것은 사용하지 않는 어떠한 
서비스이든지 마찬가지로 적용된다. 서비스를 완전히 사용할 수 없게 하였을 
때 보안 구멍은 악용될 수 없다. ‘의심이 갈 때는 무력화시킨다’ 이것이 필
자의 신조이다.

결론 
TCP_wrappers는 리눅스 컴퓨터에 접근을 제어할 수 있는 저렴하고 효율적인 
도구이다. wrappers의 접근 제어 기능을 사용하지 않더라도 시스템 로그를 통
한 모든 접속 추적 기능은 매우 값진 것이다. TCP_wrappers는 폭넓고 광범위
한 기법으로 혹은 촘촘하고 세밀한 기법으로 접근을 제어할 수 있다. 필자는 
이 글이 여러분 시스템의 네트워크를 제어할 수 있다는 의식을 깨워 줄 수 있
기를 바란다.

Lee Brotzman씨는 펜실베니아주 State 대학 안의 컨설팅 회사인 Advanced 
Data Solutions의 부사장이다. 그는 인터넷 보안 강사로도 일하고 많은 미 연
방정부 유닉스 시스템 보안 교육과정에도 참가한다. 그는 네트워크 정보 시스
템과 전자 출판 시스템을 설계하고 개발하는 컨설턴트로 일하기도 한다. 사업 
파트너이기도 한 부인, 세명의 자녀, 강아지 한 마리, 두 고양이와 강아지 비스
킷을 잘 먹는(이 때문에 고양이는 매우 화를 낸다고 한다) 금붕어와 함께 15년 
동안 State 대학 안에서 살고 있다. 전자우편 leb@vicon.net을 통해서 그에게 
연락할 수 있다.

TCP_wrappers를 구하는 방법
다음에서 TCP_wrappers를 다운로드 할 수 있다.
ftp://ftp.win.tue.nl/pub/security 또는 
ftp://ftp.cert.org/pub/tools/tcp_wrappers/ 
이 글을 쓸 때 최신 버전은 7.6이다. wrappers를 설치하기 위해서 압축된 tar 
파일을 편리한 디렉터리에 푼다. 예를 들면, 

cd /usr/local/src
tar xvzf /directory/tcp_wrappers_7.6.tar.gz
cd tcp_wrappers_7.6

물론, 컴파일, 설치하기 전에 README 파일을 읽어보아야 한다. Wietse 
Venema씨는 TCP_wrappers를 설치하는 방법에는 두 가지가 있다고 설명하고 
있다. ‘쉬운’설정과 ‘확장된’ 설정이 있다. 쉬운 설정은 모든 네트워크 데
몬을 다른 디렉터리로 옮기고 tcpd wrappers 프로그램을 그 데몬들로 바꾼다. 
확장된 설정은 모든 데몬을 남겨 두고 TCP_wrappers를 데몬 대신 tcpd를 호
출하기 위해 /etc/inetd.conf 파일을 편집한다.
Venema 박사님을 존경하지만 필자는 ‘확장된’ 설정이 실제로 더 쉽다고 생
각한다. Garfinkel & Simpson씨가 지적한 대로 확장된 설정은 어떻게 네트워
크 서비스가 /etc/inetd.conf 파일 한군데서 호출되는지 정확하게 보여주는 장점
을 가지고 있다. TCP_wrappers를 시스템에 어떻게 설치하는지는 전적으로 여
러분에게 달려 있지만 필자는 우선 모든 문서와 맨페이지를 읽어보기를 강력히 
추천하는 바이다.

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

linux - 정규 표현식  (0) 2011.02.06
리눅스 - usb 마운트  (0) 2011.02.06
리눅스 - xinetd과 서비스  (0) 2011.01.25
리눅스 - xinetd  (0) 2011.01.25
리눅스 - telnet-server 설치  (0) 2011.01.25
Posted by linuxism
,