TCP-Wrapper

System/Linux 2011. 10. 31. 17:42



TCP-Wrapper

공재순 / CERTCC-KR kong@certcc.or.kr

1. 소개

TCP-Wrapper는 네트워크 서비스에 관련한 트래픽을 제어하고 모니터링 할 수 있는 UNIX 기반의 방화벽 툴이다. 임의의 호스트가 서비스를 요청해 오면 실제 데몬을 구동하기 전에 접속을 허용한 시스템인지 여부를 확인하여 호스트명 및 서비스명을 로그에 남긴다음, 허가된 시스템은 서비스를 제공하고 허가되지 않은 경우에는 접속을 차단해 준다.

기존의 설정파일이나 소스코드에 별다른 수정이 필요치 않고, 정상적인 사용자들에게는 불편을 주지 않으면서도 허가되지 않은 접근의 제한 및 탐지가 가능하기 때문에 많은 서버 관리자들이 이 툴을 사용하고 있다.

2. inetd와 TCP-Wrapper

[그림1]에서 보는 바와 같이 UNIX 기반에서 서버프로그램인 데몬들은 standalone 모드나 inetd 모드로 구동된다.standalone 모드는 시스템 부팅과 동시에 바로 실행되어 프로세스가 항상 떠 있어야 하는 데몬들로 자체제어 메커니즘을 가지고 있다. 그에 비해, inetd모드에서는 client의 요청이 있을때만 inetd데몬에 의해서 해당 서비스데몬을 구동시키는데, inetd데몬이 client로부터 들어오는 요청에 대해 /etc/inetd.conf 파일의 구성설정과 /etc/services 파일의 정의된 포트를 이용하여 서비스를 구분하고 해당 서비스의 서버데몬을 구동시켜준다.

TCP-Wrapper 프로그램은 허락되지 않은 접속으로부터 inetd 모드로 구동되는 데몬들을 보호하는 역할을 한다고 볼 수 있다. [표1]은 inetd 모드에서 실행되는 대표적인 프로그램들의 client-server모델이다.

[표1] Examples of TCP/IP Client-Server Program

Client Server Application
telnet telnetd Remote login
ftp ftpd File transfer
finger fingerd Show users
... ... .....

위와 같은 각종 네트워크 서비스의 실제 서버들을 보호하기 위해서 단순하지만 강력한 메커니즘을 제공하는데 그것은 ined데몬이 client로부터 요청되어진 서버프로그램을 대신해 TCP-Wrapper를 구동시키는 트릭이다.

네트워크 서비스 요청이 들어오면, client host의 address,이름, 요청한 서비스 등 수행에 필요한 몇가지 정보를 확인하여 이를 syslog 파일에 저장한 다음 실제데몬을 구동시켜주거나 접근을 차단하게 되는데, 정상적인 사용자들은 실제 Telnet 서버가 구동될때와의 차이를 느끼지 못한다.

<service_name>
<sock_type>
<protocol>
<wait/nowait>
<user>
<server_program>
<server_program_arguments>
[사용하지않는경우]
ftp
stream
tcp
nowait
root
/usr/sbin/in.ftpd
in.ftpd
telnet
stream
tcp
nowait
root
/usr/sbin/in.telnetd
in.telnetd
[사용하는경우]
ftp
stream
tcp
nowait
root
/usr/sbin/tcpd
in.ftpd -l -a
telnet
stream
tcp
nowait
root
/usr/sbin/tcpd
in.telnetd

3. 설치

LINUX 시스템의 경우 Linux 6.x 버전에는 대게 TCP_Wrapper가 설치되어 있기 때문에 설치 과정 없이 /etc/hosts.deny 와 /etc/hosts.allow 파일에 접근 리스트를 설정 해 주고 inetd 데몬을 재구동 시켜주면 된다. " 4.설정 " 으로 넘어가면 된다.

설치여부나 설치된 버전을 확인하고자 경우에는 다음 명령을 이용한다.

rpm -qa | grep wrappers

[Redhat7.0 부터는 TCP_Wrapper와 유사하나 보다 강화된 Xinet가 기본적으로 설치된다.]

UNIX 시스템의 경우에는 TCP-Wrappers 프로그램을 구해서 설치해 주어야 한다. 다음과 같은 설치 과정을 거친 다음

[ ① 프로그램파일 다운로드 -> ② 압축해제 -> ③ 시스템타입 확인 및 Makefile수정 -> ④ 컴파일 -> ⑤ 실행파일 및 맨페이지 이동 -> ⑥ inetd.conf 파일 수정 -> ⑦ hosts.deny, hosts.allow 파일 생성 ]

Linux에서와 동일하게 /etc/hosts.deny 와 /etc/hosts.allow 제어파일에 접근 리스트를 설정하고 inetd데몬을 재구동 시키는 작 업을 수행해 주면 된다.

① 프로그램 파일 다운로드

■ TCP_Wrappers는 잘 알려진 툴인 만큼 여러 보안 사이트로부터 다운로드 받을 수 있다.

<대표적인 사이트>

CERTCC-KR http://www.certcc.or.kr/kisul/kisul8.htm
Porcupine.org ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz.

어떤 사이트에서 프로그램파일을 구하든 관계없으나 트로잔 버전의 TCP-Wrapper가 아닌지 확인해 볼 필요가 있다.

[자세한 사항은 advisories/CA-1999-01에서 확인.]

* Correct version:

tcp_wrappers_7.6.tar.gz
MD5 = e6fa25f71226d090f34de3f6b122fb5a
size = 99438
tcp_wrappers_7.6.tar
MD5 = 5da85a422a30045a62da165404575d8e
size = 360448

* Trojan Horse version:

tcp_wrappers_7.6.tar.gz
MD5 = af7f76fb9960a95a1341c1777b48f1df
size = 99186

② 압축 해제

다운로드받은 프로그램의 확장자를 확인해서 경우에 맞는 tar 옵션을 준다. 압축이 풀리면

tcp_wrappers_7.6 라는 디렉토리가 새로 생성되고 [그림3]과 같이 파일들 존재할 것이다.

# tar -zxvf tcp_wrappers_7.6.tar.gz 또는 # tar -xvf tcp_wrappers_7.6.tar

③ sys-type 확인 및 Makefile 수정

시스템에 TCP-Wrappers 프로그램을 컴파일 할때, system type을 지정해주어야 하는데 다음 명령을 이용하여 확인한다.

#uname -a

SunOS sparc5 5.6 Generic_105181-05 sun4m sparc SUNW,SPARCstation-5

각 system type마다 서버데몬들이 존재하는 디렉토리 위치가 차이가 있기 때문에 Makefile의 REAL_DAEMON_DIR를 시스템

스타일에 맞게 설정을 해주어야한다. 압축을 해제하면 Makefile은 readonly 모드이므로 쓰기 가능한 모드로 수정한 다음 해당 sys-type에 맞는 REAL_DAEMON_DIR을 지정해 준다.

ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd
telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
shell stream tcp nowait root /usr/sbin/in.rshd in.rshd
......

sunos5 타입인 본 시스템은 inetd.conf 파일을 확인해 보면 위와 같이 각종 서비스 데몬들이 /usr/sbin 밑에 존재하기 때 문에 REAL_DAEMON_DIR가 /usr/sbin 이 되므로 앞부분의 # 만 지워주면 된다.

그밖에 sys-type은 [그림5]를 참고하라.

④ 컴파일

압축을 해제했던 tcp_wrappers_7.6 디렉토리에서 컴파일을 수행하는데 make 명령을 이용해 다음과 같이 Makefile에서

정의한 REAL_DAEMON 위치와 sys-type을 설정해주면 된다.

# make REAL_DAEMON_DIR=/usr/sbin sys-type

본 시스템의 경우에는 susnos5를 sys-type으로 지정했는데 다음과 같이 컴파일 되는 과정이 화면에 보여진다.

#make REAL_DAEMON_DIR=/usr/sbin sunos5
cc -O -DFACILITY=LOG_MAIL -DHOSTS_ACCESS -DPARANOID -DNETGROUP -DGETPEERNAME_BUG
-DBROKEN_FGETS -DLIBC_CALLS_STRTOK -DSOLARIS_24_GETHOSTBYNAME_BUG
-DDAEMON_UMASK=022 -DREAL_DAEMON_DIR=\"/usr/etc\" -DSEVERITY=LOG_INFO
.........
.........

정상적으로 컴파일을 마쳤을 경우에 다음과 같은 5개의 실행파일이 생성된다.

-rwxr-xr-x 1 root other 10572 3월 24일 23:55 safe_finger* <--finger체크유틸리티
-rwxr-xr-x 1 root other 29888 3월 24일 23:55 tcpd* <--TCP_Wrapper데몬
-rwxr-xr-x 1 root other 29852 3월 24일 23:55 tcpdchk* <--TCP_Wrapper구성 체크
-rwxr-xr-x 1 root other 37808 3월 24일 23:55 tcpdmatch* <-- " 액세스콘트롤 체크
-rwxr-xr-x 1 root other 25176 3월 24일 23:55 try-from* <-- 유저체크유틸리티

⑤ 실행파일 및 맨페이지 파일 이동

새로 생성된 실행파일 5개를 Makefile에서 Real_Daemon_Dir로 지정해 주었던 실제 디렉토리 위치로 이동시킨다.

# cp safe_finger tcpd tcpdchk tcpdmatch try-from /usr/sbin

[ § 다른 곳에다 설치를 원할 경우에는 다음과 같은 별도의 과정을 거쳐야 한다. ]

# mkdir /other/place
# mv /usr/sbin/in.telnetd /other/place
# cp tcpd /usr/sbin/in.telnetd

온라인 설명파일들은 해당 맨페이지 디렉토리에 카피시킨다.

# cp hosts_access.3 /usr/man/man3
# cp hosts_access.5 hosts_options.5 /usr/man/man5
# cp tcpd.8 tcpdchk.8 tcpdmatch.8 /usr/man/man8

⑥ /etc/inetd.conf 파일 수정

외부의 연결로부터 보호할 네트워크 서비스들을 선택하여 tcpd가 보호하도록 inetd.conf 파일을 수정해 주어야한다.

보호하고자 하는 서비스의 서버프로그램 위치에 다음과 같이 tcpd 데몬이 설치된 위치를 지정해 주면 되는데 telnet을 예 로 들면 다음과 같다. [inetd.conf 파일은 주로 /etc 디렉토리 또는 /etc/inet 디렉토리에 존재한다.]

예) telnet 서비스를 보호하고자 하면 원래 파일을 수정된 파일처럼 지정해 주면 된다.

telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd <-- 원래 파일
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd <-- 수정된 파일

[ § TCP_Wrapper 접근제어 가능 서비스 : SYSTAT, FINGER, FTP, TELNET, RLOGIN, RSH, TALK, EXEC, TFTP 등 ]

⑦ /etc/hosts.deny , /etc/hosts.allow 파일 생성

Linux 시스템에는 파일이 존재 할 것이나 Unix시스템에는 두 파일을 만들어주어야 한다.

#echo /etc/hosts.deny
#echo /etc/hosts.allow

4. 접근제어 리스트 설정

① 접근 제어 리스트 : TCP_Wrapper는 다음 두 파일에 의해 접근이 제어된다.

/etc/hosts.deny --> 접근 제어할 리스트
/etc/hosts.allow --> 접근 허용할 리스트
(not in either : 접근 허용)

② 접근 제어 형식 : 접근 제어 리스트 파일에 아래와 같은 형식으로 데몬, 사용자 등의 리스트를 등록한다.

daemon_list : client_list : option : option .... : shell_command

■ daemon_list : 하나 이상의 데몬 프로세스 이름

■ client_list : 하나 또는 그 이상의 호스트 이름, 호스트 어드레스, 패턴/와일드카드

■ shell_command : 규칙이 매칭될 때 수행되는 shell 명령으로 주로 허가되지 않은 접속 요청이 있을 경우 접속을 요청한 클라이언트의 단말기에 에러 메시지를 출력하거나 특정인에게 메일을 발송하는 형태로 주로 사용함.

[ 아래 [표2]와 [표3]을 참고하면 다양한 접근제어 규칙을 적용 할 수 있다. ]

[표2] 접근제어 기술 형식

기술 형식 기술예
IP Address 에의한 기술 172.16.2.146
Network address와 Netmask에 의한 기술 172.16.2.146/255.255.255.0
Networkgroup에 의한 기술 @local-network
호스트 명에 의한 기술 kisa.or.kr
와일드 카드를 이용한 기술 LOCAL /etc/hosts 에 등록된 모든 호스트에 대해 적용
ALL 모든 호스트에 대해 적용
사용자명과 호스트명에 의한 기술 kong@certcc.or.kr

[표3] host_options 와일드카드 & 연산자 & 쉘 커맨드특수문자

와일드카드 지원 기능
와일드카드 ALL 모든 호스트나 모든 서비스에 대해 허가 또는 제한 설정시 사용
ex)hosts.deny 파일에 ALL:ALL 이면 모든 호스들은 어떠한 서비스에도 접근 할 수 없다.
KNOWN hosts.allow나 hosts.deny 설정에서 알 수 없는 IP의 경우
LOCAL local 호스트
PARANOID IP 주소와 일치하지 않는 호스트
UNKNOWN hosts.allow나 hosts.deny 설정에서 알 수 없는 IP의 경우
연산자 EXCEPT 데몬,클라이언트 둘다 사용할 수 있고 특정한 예외를 두고자 할때 사용
쉘 커맨드 특수문자 %a(%A) client (server) 호스트 어드레스
%c Client 정보 : user@host, user@address, 호스트명 또는 주소
%d 데몬 프로세스 이름 (argv[0] value)
%p 데몬 프로세스 id
%u 클라이언트 사용자 이름 또는 unknown
%h(H) 유용하지 않은 client (server) 호스트명 또는 어드레스

[ § 접근제어 파일(hosts.deny , hosts.allow) 기술시 # 문자는 주석을 의미하고, 역슬래쉬 (\) 문자는 한줄에 계속 이어 쓴다는 의미로 긴 리스트를 다음 줄에 이어서 나열할 경우 사용하고 한 줄이 끝나는 마지막에 입력한다. 각 대상 리스트를 나열할때는 한칸의 공백 이나 콤마(,)로 구분한다. ]

5. inetd 재구동

접근제한 파일의 설정을 완료하면 새로운 설정이 적용되도록 현재 구동되고 있는 /etc/inetd 데몬의 process id를 확인하고 다 음의 명령을 이용해 inetd를 재구동 시켜준다.

kill -HUP process-id

■사례 inetd의 프로세스 id 확인

[root@cyber118 /etc]# ps -ef | grep inetd
root 572 1 0 Mar21 ? 00:00:00 inetd
[root@cyber118 /etc]# kill -HUP 572

6. 접속제어 로그

TCP_Wrappers 프로그램은 logging 정보를 syslog데몬으로 전달하고, 일반적으로 syslog.conf 에 의해 파일이나 콘솔에 쓰여지거나 @loghost 로 전달한다. tcpd가 접속제어한 서비스명,호스트명,어드레스등의 정보를 /var/log(adm)/syslog에 저장한다. Linux시스템의 경우에는 /var/log/messages 파일에 저장된다. 일반적인 접속제어 로그내용은 다음과 같은 형태로 남는다.

date time hostname service[process id]: connect from hostname
date time hostname service[process id]: refused connection from hostname

허가되지 않은 호스트가 접속을 요청 해 올 경우 해당 콘솔로 다음과 같은 메시지를 보낸다.

■ telnet 접속을 요청 한 경우

[cert:root]:/> telnet 172.16.4.150
Trying 172.16.4.150...
Connected to 172.16.4.150.
Escape character is '^]'.
Connection closed by foreign host.

■ ftp 접속을 요청 한 경우

[cert:root]:/> ftp 172.16.4.150
Connected to 172.16.4.150.
421 Service not available, remote server has closed connection

7. 접근제어 적용 사례

우선적으로 /etc/hosts.deny 파일에서 모든 호스트에 대한 접근을 막아놓고, 접근을 허가할 호스트는 /etc/hosts.allow 파일에서 설정하는 것이 일반적이다.

■ 사례1

/etc/hosts.deny
ALL : ALL EXCEPT .or.kr --> 모든 서비스에 대해 or.kr 도메인을 제외한 다른 시스템들은 접근차단
/etc/hosts.allow
ALL : LOCAL --> 모든 서비스에 대해 local 호스트들의 접근 허용

■ 사례2 텔넷서비스는 172.16.2.146 호스트만, ftp서비스는 172.16.2.159 호스트만 허용하였다. 그밖에 모든 호스트 들은 모든 네트워크 서비스로부터 제한하여 테스트가 용이하도록 설정하였는데, 허가되지 않은 호스트로부터 서비스 요 청이 들어오면 요청한 서비스명, 호스트 어드레스등의 정보를 kong@certcc.or.kr 로 메일을 발송하도록 설정한 예이다.

[cert:root]:/etc> vi hosts.allow
ALL:172.16.2.146
in.ftpd : 172.16.2.159
[cert:root]:/etc> vi hosts.deny
ALL:ALL:/usr/sbin/safe_finger -l @%h | /usr/ucb/mail -s "Reject %d from %h to cert"kong@certcc.or.kr&

[그림6] 사례2 에서 접근제어한 172.16.2.134 호스트의 텔넷 접속시도에 의해 통보된 메일

■ 사례2 의 경우에 남은 /var/log/syslog의 로그 메시지

......
......

Mar 29 00:50:42 ids in.telnetd[2352]: refused connect from 172.16.4.134

Mar 29 00:50:42 ids sendmail[2357]: AAA02357: from=root, size=515, class=0, pri=30515, nrcpts=1, msgid=<200103281550.AAA02357@ids.certcc.or.kr>, relay=root@localhost

Mar 29 00:51:12 ids sendmail[2359]: AAA02357: to=kong@certcc.or.kr, ctladdr=root (0/1), delay=00:00:30, xdelay=00:00:30, mailer=esmtp, relay=certcc.or.kr. [211.252.150.1], stat=Sent (AAA21903 Message accepted for delivery)

8. 설치확인

접근제어 파일설정 후에 직접 테스트를 해서 접속이 되는지 여부를 확인하고 syslog나 messages 의 로그를 확인하는 방법으로 확인 할 수도 있으나 TCP_Wrapper 가 지원하는 구성설정 확인 명령들을 이용하면 간편하다.

① tcpdchk 이용

접근제어 파일의 잘못된 문법이나 잘못된 경로명, 호스트명이나 어드레스등 설정된 규칙에 대한 구성오류 발견해 낼 수 있다.

② tcpdmatch 이용

접근제어 파일에 기술된 규칙을 실제로 적용하였을 때 발생하는 상황을 보여주기 때문에 tcpdmatch를 이용하면 한번에 확인 할 수 있다. 설정이 제대로 되었다면 접근제어한 호스트에서 접속을 시도할 때 deny 되는지, 허용한 호스트는 allow하는 지 여부를 확인해 본다.

■ usage: tcpdmatch [-d] [-i inet_conf] daemon[@host] [user@]host

- d : use allow/deny files in current directory
- i : location of inetd.conf file

 사례 비정상적인 ip 어드레스 111.111.111.111 로 telnet 접속을 시도하면 /etc/hosts.deny파일의 설정과 비교하여 접속 을 차단하고 접속을 시도한 호스트정보와 요청한 서비스를 지정된 메일로 발송하는 것을 확인할 수 있다.

[ids:root]:/usr/sbin> tcpdmatch in.telnetd 111.111.111.111
client: address 111.111.111.111
server: process in.telnetd
matched: /etc/hosts.deny line 1
command: /usr/sbin/safe_finger -l @111.111.111.111 | /usr/ucb/mail -s "Reject in.telnetd from 111.111.111.111 to cert" kong@certcc.or.kr&
access: denied

9. 참고자료

TCP_Wrappers_7.6 README file
http://www.cert.org/security-improvement/implementations
http://security.kaist.ac.kr/tips/tcpwrapper/TCP_Wrapper.htm
http://www.cert.org/advisories/CA-1999-01.html
리눅스 네트워크 레퍼런스 바이블, 베스트북, 2000.9

 

자료제공 : CERTCC-KR : 한국정보보호진흥원

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

A typical north/southbridge layout  (0) 2011.11.02
일반 유저의 .rhosts 파일 생성 금지법  (0) 2011.11.01
/etc/profile 예시  (0) 2011.10.05
lsof , fuser, pgrep 명령어  (0) 2011.09.30
top 명령어  (0) 2011.09.27
Posted by linuxism
,