2005년 02월 27일
TCP Wrapper
유닉스 서버는 TCP/IP 프로토콜을 통해 서비스를 제공할 때 모든 사람에게 개방하거나 폐쇄하거나 둘 중 택일해야 한다. 이런 개념적인 약점 외에도 출처(source)나 시간과 같은 접속 기록은 최소한 이거나 아예 포함되어 있지 않다. 접속 시도는 사이트가 공격받고 있음을 조기에 경보해주는 신호가 될 수 있으므로 가능하면 많은 정보를 얻고 싶을 것이다.
tcpd(tcp wrapper를 구현한 프로그램)는 실제로 있었던 공격의 산물로 만들어진 것이다. tcpd는 (1) 접속 요구를 한 출처와 목적지에 기반한 몇 가지 수준의 접근 제어와 (2) 성공하거나 실패한 접속 기록을 제공한다. tcp wrapper는 요구한 실제 서버 프로세스를 시작하기 전에 필터 프로그램을 시작한다. 실제 서버 프로세스는 접속 요구가 접근 제어 목록에 의해 허가된 다음에 실행된다. 접속과 접속 시도에 관한 모든 메시지는 syslogd를 통해 기록된다.
이 문서는 Sun 솔라리스 운영체제 버전 2.5.1에 tcp wrapper tcpd 버전 7.6을 내려 받고 설치하고 설정하는 데 필요한 정보를 설명한다.
--------------------------------------------------------------------------------
준비 작업
tcp wrapper의 최신 버전은 ftp://ftp.porcupine.org/pub/security/에서 anonymous ftp로 얻을 수 있다.
설치 요구 조건을 만족하는지 확인
tcp wrapper의 실행 파일을 만들려면, 다음과 같은 것이 필요하다.
최근 버전을 얻기 위한 인터넷 접속
소프트웨어의 진위를 확인하기 위한 PGP(www.pgp.com 참조)
내려 받기한 파일의 압축을 풀기 위한 GZIP
실행 파일을 만들기 위한 C 컴파일러
tcp wrapper 배포판을 내려 받기
ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz에서 anonymous ftp로 파일을 받아와라. 바로 다음 과정을 수행하려면 ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz.sig 파일도 필요하다.
tcp wrapper 배포판이 진짜인지 확인하기
이 과정을 수행하려면, 당신 자신의 PGP 공개 키 목록에 "wietse venema "의 PGP 공개키가 필요하다. W. Venema는 tcp wrapper 소프트웨어 프로그램을 만들 사람이며, 그의 디지털 서명과 일치한다면 내려 받기한 소프트웨어가 아무 이상 없음을 보증해 준다. 디지털 서명을 확인하려면, 다음 명령을 내려 받기한 파일이 있는 디렉토리에서 실행해라.
$ pgp tcp_wrappers_7.6.tar.gz.sig tcp_wrappers_7.6.tar.gz서명이 일치하지 않는다면 소프트웨어가 조작되었을 가능성이 있다. 그렇다면 이 버전을 사용해서는 안 된다.
tcp wrapper 배포판 풀기
압축된 파일을 GNU gunzip 유틸리티로 압축을 푼 후, 시스템 tar 명령어로 다시 풀어라.
$ gunzip tcp_wrappers_7.6.tar.gz
$ tar xvf tcp_wrappers_7.6.tar이 명령을 실행하고 나면 tcp_wrappers_7.6 라는 이름의 부 디렉토리가 생긴다. 이 후의 모든 작업은 이 부 디렉토리에서 이루어진다.
--------------------------------------------------------------------------------
실행 파일 만들기와 설치
Makefile 은 솔라리스 2.X를 비록한 많은 운영체제에서 아무 문제없이 동작한다.
tcp wrapper 이진 파일 만들기
make 명령어로 tcpd와 libwrap.a의 이진 파일을 만들려면 몇 가지 옵션을 지정해 주어야 한다.
$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS FACILITY=LOG_DAEMON sunos5옵션
설명
REAL_DAEMON_DIR
telnetd와 같은 기존 네트워크 디몬 프로그램의 경로
STYLE
추가적인 설정 옵션을 활성화
FACILITY
syslog 메시지에 사용
sunos5
운영체제를 지정
tcpd는 기본적으로 모든 메시지를 LOG_MAIL facility를 사용하여 기록한다. 우리는 네트워크 서버에 의해 만들어진 메시지들은 LOG_MAIL에 의해 생성된 파일과는 다른 곳에 저장되길 권고한다.
주의: 시스템에 Sun C 컴파일러(cc) 대신 GNU C 컴파일러(gcc)가 설치되어 있다면, make 명령을 다음처럼 실행해야 한다.
$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS FACILITY=LOG_DAEMON CC=gcc sunos5NIS(Network Information Service, 전에는 YP(Yellow Pages)라 불림)를 사용 가능하다면 tcpd가 사용하는 접근 규칙에 Netgroup을 사용할 수 있다. Netgroup을 사용하려면 make 명령에 "NETGROUP= -DNETGROUP" 옵션을 포함시켜라.
tcp wrapper와 부속 파일 설치하기
make를 이상 없이 실행한 후, 프로그램과 man 페이지를 미리 정한 시스템 디렉토리로 복사해라:
$ cp tcpd /opt/sbin
$ cp safe_finger /opt/sbin
$ cp tcpdchk /opt/sbin
$ cp tcpdmatch /opt/sbin
$ cp try-from /opt/sbin
$ cp hosts_access.3 /opt/man/man3
$ cp hosts_access.5 /opt/man/man5
$ cp hosts_options.5 /opt/man/man5
$ cp tcpd.8 /opt/man/man8
$ cp tcpdchk.8 /opt/man/man8
$ cp tcpdmatch.8 /opt/man/man8
tcp wrapper 라이브러리 설치하기
logdaemon처럼 tcp wrapper의 라이브러리를 사용하는 다른 프로그램이 있다면 다음 명령을 실행해야 한다:
$ cp libwrap.a /opt/lib
$ cp tcpd.h /opt/includetcpd.h가 라이브러리가 설치된 디렉토리와 다른 곳에 위치한다면, 라이브러리를 사용하는 다른 툴들을 설치할 때 약간의 수정을 해주어야 한다. 헤더 파일을 통상적인 시스템 디렉토리에 놓아두는 것이 아주 좋은 해결책이다. 그러나 이런 방법을 싫어한다면 헤더 파일을 /opt/lib 에 복사해 두어라.
--------------------------------------------------------------------------------
tcpd 설정하기
tcpd 프로그램을 설치한 후 설정 파일을 수정해야 한다. tcpd가 접근 제어와 기록 둘 다에 사용된다면 두 가지 설정 파일을 사용해야 한다. 설정 파일의 구조와 몇 가지 옵션, 키워드를 설명하기 위해 예제를 포함했다. 더 자세한 것은 man 페이지에서 얻을 수 있다: hosts_options (3), host_options (5), and hosts_access (5).
tcp wrapper로 모든 네트워크 데몬을 다 보호할 수는 없다.
네트워크 프로토콜과 서비스가 아주 다양하기 때문에 tcpd로 모든서버를 다 보호할 수는 없다:
tcpd는 접속 기록을 하기 위해 새로 접속할 때마다 시작되도록 설계되었다. 부하가 많이 걸리는 sendmail과 같은 서버들은 보통 시작 부하를 줄이기 위해 한번만 시작된다; 그러므로 그런 서버들은 첫번째 접속만 기록하는 tcpd로는 관리하기가 힘들다.
tcpd는 TCP (transmission control protocol)와UDP (user datagram protocol)를 사용하는 서버만 보호할 수 있다.
어떤 서버들은 TCP와 RPC (remote procedure call) 프로토콜을 둘 다 사용한다. 이런 서버들은 tcp wrapper로 보호할 수 없다. 이런 서버들은 inetd.conf (4)의 세 번째 항인 프로토콜에 rpc/tcp가 기록되어 있다.
한번에 하나의 접속만을 처리하는 서버만 보호할 수 있다. (주어진 시간에 서버 프로세스의 복사본이 여러 개 있을 수는 있지만, 각 복사본은 정확히 하나의 접속만을 처리하고 완료되자마자 종료됨을 주의해라. 이것은 하나의 복사본이 도착하는 여러 개의 접속을 처리하는 것과는 다르다.) 그 외의 서버들은 초기 접속을 처리한 후에도 살아남아서 다른 접속 요구를 기다린다. 그런 서버들은 inetd.conf의 네 번째 항이 "wait"로 되어 있어서 구별할 수 있다.
설정 파일의 용도
모든 규칙은 설정 파일에 저장된다. 규칙은 놓여진 순서대로 적용된다. 어떤 규칙이 해당 접속에 일치한다면 다른 규칙은 고려하지 않는다. 기본적으로 두 개의 파일이 정의된다. 접속이 두 개의 파일 중 어떤 것에도 일치하지 않는다면 접근이 허가된다:
hosts.allow
말 그대로, 접근을 허가하는 규칙들.
hosts.deny
말 그대로, 접근을 거부하는 규칙들. 명시적으로 허가하지 않는 접속 외에는 모두 거부하는 "만물상" 규칙을 둘 것을 권한다.
두 개의 파일을 가지는 대신에 모든 규칙을 하나의 파일 안에 둘 수도 있다. 이 때는 각 규칙이 어떻게 적용될지 지정하기 위해 옵션으로 "ALLOW"와 "DENY" 키워드를 사용한다.
설정 파일의 구조
한 줄에 하나의 규칙이 오며, 최소 세 개의 항목으로 이루어 진다. 이 때 각 항목은 ":" 문자로 구분된다:
첫번째 항목은 inetd.conf에 등록된 서비스를 지정한다. 단 서비스를 수행하는 프로그램을 적어준다. 예를 들면, "telnet" 서비스는 "in.telnetd" 프로그램에 의해 제공된다. 그러므로 "telnet" 서비스의 규칙은 "in.telnetd"로 시작해야 한다. "ALL" 키워드는 모든 서비스를 의미한다.
두번째 항목은 규칙이 적용될 출처 주소를 지정한다. 호스트 명과 도메인명을 사용할 수도 있지만 IP(Internet protocol) 주소나 IP 주소 범위를 사용하는 것이 더 적절하다. 호스트 명과 도메인 명은 추가로 DNS(domain name system)탐색을 해야 하고, DNS spoofing 공격(외부 호스트의 IP 주소가 조직 안의 호스트 명을 가진 것처럼 조작)의 위험성도 있다. 두 가지 키워드를 사용할 수 있다: (1) "LOCAL"은 같은 서브넷이나 서브 도메인에 있는 모든 호스트를 말하고 (2) "ALL"은 주소에 상관없이 모든 호스트를 의미한다.
세번째 항목은 옵션을 지정한다. 여러 개의 옵션이 올 수 있으며, ":" 문자로 구분한다.
설정 파일에 사용 가능한 옵션
예제의 옵션들은 가장 많이 쓰이는 것들이다. 옵션들의 의미는 다음과 같으며, 아무 규칙에나 순서와 조합에 상관 없이 사용할 수 있다.
옵션
설명
RFC931
접속할 때마다 ident 탐색이 수행된다. ident에 사용되는 프로토콜은 원래 RFC 931(현재는 RFC 1413)에 문서화되어 있다. ident 서비스를 제공하는 시스템으로부터 접속 요구가 온다면 해당 시스템에 사용자 명을 요구할 수 있다. 이렇게 하는 것이 사용자 확인을 완벽하게 보장해주지는 못하지만 침입을 분석할 때 유용한 정보를 제공할 수는 있다. ident 요구는 접속을 지연시켜서 사용자가 알아차릴 수도 있다.
BANNERS
이 옵션은 telnet, ftp, rlogin과 같은 프로토콜에 대해 접근 제한, 기록 등이 이루어지고 있음을 사용자에게 부가적인 텍스트를 보여줄 수 있다. 배너가 출력될 서비스의 이름과 같은 파일이 지정된 디렉토리 안에 존재해야 한다. (더 자세한 것은 각각의 서비스에 대해 배너를 만들어주는 도구에 첨부된 프로그램 문서에서 얻을 수 있다.)
SPAWN
특정한 명령을 수행하는 프로세스를 만든다. 명령어 안에 접속을 요구한 곳의 IP 주소나 호스트 명을 %h 변수를 사용하여 넣을 수도 있다. %d는 서비스를 나타내는 변수이고, %u는 ident 탐색의 결과를 나타내며, "UNKNOWN"은 결과를 얻을 수 없을 때 얻는 값이다. (%u 변수가 사용되면 RFC931 옵션이 없더라도 ident 탐색이 이루어진다.)
--------------------------------------------------------------------------------
예제
다음 예는 세 개의 서브네트워크가 있음을 가정한다. 부서 A는 네트워크 주소가 10.0.1.0이고, netmask는 255.255.255.0이다. 전산소는 netmask는 같지만, 네트워크 주소는 10.0.250.0이다. 부서 B의 서버는 원격 접근을 허용하고 IP 주소는 10.0.2.15이다.
다음 설정은 부서 B에서 사용된다:
/etc/hosts.allow
같은 서브넷과 부서 A, 전산소에서는 모든 서비스에 대한 접근이 허용된다. 원격 접근 서버에서 접속한 사용자는 telnet과 ftp만 허용된다.
ALL: LOCAL 10.0.1.0/255.255.255.0 10.0.250.0/255.255.255.0: RFC931 : BANNERS /opt/sbin/sec/banners
in.telnetd: 10.0.2.15: RFC931 : BANNERS /opt/sbin/sec/banners
in.ftpd: 10.0.2.15: RFC931 : BANNERS /opt/sbin/sec/banners
/etc/hosts.deny
다른 모든 접속은 거부된다.
ALL: ALL: RFC931 : BANNERS /opt/sbin/sec/reject :
SPAWN (/usr/sbin/sec/safe_finger -l @%h | /usr/ucb/mail -s %d-%h root) &
더 자세한 설명
예로 든 설정에서, RFC931과 BANNERS가 모든 접속에 대해서 사용된다. 이 회사는 ident 서버를 지원하므로 사용자는 지연되는 것을 거의 느낄 수 없다. banners는 추가적인 보안을 위해 확장된 기록을 할 목적으로 사용된다. 접속이 거부되면, 특별한 "reject" 배너를 출력해서 추후에 접속하지 않도록 해준다.
SPAWN 명령어는 접속이 거부되었을 때 사용된다. 즉, 접속을 요구한 곳에 대한 더 자세한 정보를 얻어와서 필요하다면 더욱 자세한 분석을 할 수 있도록 관리자에게 경보를 보내준다. SPAWN은 tcp wrapper의 일부인 safe_finger 프로그램을 호출 해서, finger 탐색을 한 후 메일 프로그램으로 결과를 보낸다. 메일 프로그램은 요구한 서비스와 접속을 요구한 호스트 또는 IP 주소를 나열한다.
--------------------------------------------------------------------------------
inetd 설정하기
tcp wrapper는 inetd.conf를 수정하여 몇 가지 서비스를 대신하도록 설정되어 있다. 이런 서비스들에 대한 접속은 모두 기록되며, 접근 제어가 적용된다. tcpd는 hosts.allow나 hosts.deny 파일 안의 규칙에 지정된 서비스만을 보호한다. 그 외 다른 서비스들은 "ALL"을 사용하여 보호된다. inetd.conf 안에서 tcpd 가 호출되면 규칙의 유무에 상관없이 모든 접속이 기록된다.
inetd 안에서 tcpd 호출하기
다음은 inetd.conf 설정의 예로부터 따온 것이다:
ftp stream tcp nowait root /opt/sbin/tcpd in.ftpd
telnet stream tcp nowait root /opt/sbin/tcpd in.telnetd
shell stream tcp nowait root /opt/sbin/tcpd in.rshd
login stream tcp nowait root /opt/sbin/tcpd in.rlogind
finger stream tcp nowait nobody /opt/sbin/tcpd in.fingerd이 문장들은 위의 예에서 계속된 것이다. ftp와 telnet 외에 세 개의 다른 서비스들(rsh, rlogin, finger)가 tcpd로 보호되고 있다. 예에서는 명시적으로 지정되지 않은 이런 서비스들은 두 개의 "ALL" 규칙에 의해 적용을 받는다. 이 규칙은 같은 서브넷/서브도메인, 부서 A와 B, 전산소에 위치한 시스템의 사용자에게는 접근을 허용한다. 그 외의 다른 곳에서의 접근은 거부된다.
Activate the updated configuration.
수정을 한 후에는 inetd를 재시작해야 한다:
$ kill -HUP
--------------------------------------------------------------------------------
배겨 지식과 추가로 알아둘 만한 것
다음은 몇 가지 추가로 알아둘 만한 것들이다.
덫을 준비하기
조기 경보를 위해 덫을 준비해둘 수도 있다. 즉, 설정할 때 필요하지 않은 서비스를 활성화시켜 두고, tcpd를 사용해서 모든 접속을 기록한 다음 서비스를 거부해 버리는 것이다. 이렇게 해두면 침입자가 더욱 고도의 기술을 쓰기 전에 먼저 잘 알려진 공격을 시도해 볼 때 매우 유효할 것이다.
이런 접근 방법은 제한 적으로 사용돼야 한다. 다음은 시스템에 대한 정보를 제공하는 두 가지 서비스에 대한 접속을 허용해준다:
systat stream tcp nowait nobody /opt/sbin/tcpd /bin/false
netstat stream tcp nowait nobody /opt/sbin/tcpd /bin/falsetcpd의 매개 변수로 서비스를 제공하는 실제 프로그램을 넣지 않는 것이 중요하다. 접근이 실수로 허용되더라도(예를 들면, 잘못된 설정 때문에)부주의하게 서비스를 제공하고 싶지는 않을 것이다. /bin/false로 두면 즉시 종료돼서 사용자 입력을 전혀 받아들이지 않기 때문에 매우 안전한 방법이 된다.
설정 사항 점검
tcp wrapper의 설정 사항은 호스트의 보안에 심각한 영향을 미친다. 그래서 두 가지 검사 프로그램이 소프트웨어의 일부로 제공된다:
tcpdchk(8)는 inetd.conf를 분석해서 tcp wrapper와 관련된 모든 에러를 보여준다.
tcpdmatch(8)는 주어진 IP 주소에 대해서 설정이 어떻게 되어 있고, 접속이 허가되는지 거부되는지 결과를 출력해준다.
IP spoofing의 위험성
접근 제어와 기록은 IP 프로토콜의 IP 주소를 기반으로 이루어진다. 그러나 특정한 환경에서는 IP 주소를 속일 수도 있으며, 이는 침입자가 접근 권한을 얻을 수 있는 가능성을 주게 된다. tcp wrapper는 약점을 줄이기 위해 두 번의 DNS 탐색을 행함으로서 이런 방식의 공격을 탐지하려고 한다:즉, 연결을 요구한 IP 주소에 대한 호스트명을 찾아보고, 다시 해당 호스트명에 대해 IP 주소를 찾아본다. 그 결과 얻어낸 IP 주소가 원래의 주소와 일치하지 않는다면, 접속은 거부된다. 이 모드는 "PARANOIDE"라고 부르며 컴파일할 때 꺼놓을 수 있다. (DNS를 통해서 원래의 주소로 호스트명을 얻을 수 없다면 적법한 호스트였을지라도 접속은 거부된다. 이것은 reverse 탐색이 제공되지 않는 사이트에 특히 영향을 미칠 수 있다.) 부연하자면, 접속을 제한하려는 모든 주소는 IP 주소로 기술되야 한다. 호스트 명은 접속을 제한하려는 곳을 IP 주소로는 표현할 수 없을 때만 사용해야 한다.
설정 사항을 보호하기
설정 파일은 시스템에 저장되므로 조작될 가능성이 있다. 그러므로 이런 파일들의 관리용 복사본을 만들어서 물리적으로 쓰기 금지된 매체에 옮겨서 보관할 필요가 있다. 그리고 나서 Tripwire와 같은 결함 검사 도구 중 하나를 사용해서 이런 설정 파일들을 검사해 볼 필요가 있다.
tcpd(tcp wrapper를 구현한 프로그램)는 실제로 있었던 공격의 산물로 만들어진 것이다. tcpd는 (1) 접속 요구를 한 출처와 목적지에 기반한 몇 가지 수준의 접근 제어와 (2) 성공하거나 실패한 접속 기록을 제공한다. tcp wrapper는 요구한 실제 서버 프로세스를 시작하기 전에 필터 프로그램을 시작한다. 실제 서버 프로세스는 접속 요구가 접근 제어 목록에 의해 허가된 다음에 실행된다. 접속과 접속 시도에 관한 모든 메시지는 syslogd를 통해 기록된다.
이 문서는 Sun 솔라리스 운영체제 버전 2.5.1에 tcp wrapper tcpd 버전 7.6을 내려 받고 설치하고 설정하는 데 필요한 정보를 설명한다.
--------------------------------------------------------------------------------
준비 작업
tcp wrapper의 최신 버전은 ftp://ftp.porcupine.org/pub/security/에서 anonymous ftp로 얻을 수 있다.
설치 요구 조건을 만족하는지 확인
tcp wrapper의 실행 파일을 만들려면, 다음과 같은 것이 필요하다.
최근 버전을 얻기 위한 인터넷 접속
소프트웨어의 진위를 확인하기 위한 PGP(www.pgp.com 참조)
내려 받기한 파일의 압축을 풀기 위한 GZIP
실행 파일을 만들기 위한 C 컴파일러
tcp wrapper 배포판을 내려 받기
ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz에서 anonymous ftp로 파일을 받아와라. 바로 다음 과정을 수행하려면 ftp://ftp.porcupine.org/pub/security/tcp_wrappers_7.6.tar.gz.sig 파일도 필요하다.
tcp wrapper 배포판이 진짜인지 확인하기
이 과정을 수행하려면, 당신 자신의 PGP 공개 키 목록에 "wietse venema "의 PGP 공개키가 필요하다. W. Venema는 tcp wrapper 소프트웨어 프로그램을 만들 사람이며, 그의 디지털 서명과 일치한다면 내려 받기한 소프트웨어가 아무 이상 없음을 보증해 준다. 디지털 서명을 확인하려면, 다음 명령을 내려 받기한 파일이 있는 디렉토리에서 실행해라.
$ pgp tcp_wrappers_7.6.tar.gz.sig tcp_wrappers_7.6.tar.gz서명이 일치하지 않는다면 소프트웨어가 조작되었을 가능성이 있다. 그렇다면 이 버전을 사용해서는 안 된다.
tcp wrapper 배포판 풀기
압축된 파일을 GNU gunzip 유틸리티로 압축을 푼 후, 시스템 tar 명령어로 다시 풀어라.
$ gunzip tcp_wrappers_7.6.tar.gz
$ tar xvf tcp_wrappers_7.6.tar이 명령을 실행하고 나면 tcp_wrappers_7.6 라는 이름의 부 디렉토리가 생긴다. 이 후의 모든 작업은 이 부 디렉토리에서 이루어진다.
--------------------------------------------------------------------------------
실행 파일 만들기와 설치
Makefile 은 솔라리스 2.X를 비록한 많은 운영체제에서 아무 문제없이 동작한다.
tcp wrapper 이진 파일 만들기
make 명령어로 tcpd와 libwrap.a의 이진 파일을 만들려면 몇 가지 옵션을 지정해 주어야 한다.
$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS FACILITY=LOG_DAEMON sunos5옵션
설명
REAL_DAEMON_DIR
telnetd와 같은 기존 네트워크 디몬 프로그램의 경로
STYLE
추가적인 설정 옵션을 활성화
FACILITY
syslog 메시지에 사용
sunos5
운영체제를 지정
tcpd는 기본적으로 모든 메시지를 LOG_MAIL facility를 사용하여 기록한다. 우리는 네트워크 서버에 의해 만들어진 메시지들은 LOG_MAIL에 의해 생성된 파일과는 다른 곳에 저장되길 권고한다.
주의: 시스템에 Sun C 컴파일러(cc) 대신 GNU C 컴파일러(gcc)가 설치되어 있다면, make 명령을 다음처럼 실행해야 한다.
$ make REAL_DAEMON_DIR=/usr/sbin STYLE=-DPROCESS_OPTIONS FACILITY=LOG_DAEMON CC=gcc sunos5NIS(Network Information Service, 전에는 YP(Yellow Pages)라 불림)를 사용 가능하다면 tcpd가 사용하는 접근 규칙에 Netgroup을 사용할 수 있다. Netgroup을 사용하려면 make 명령에 "NETGROUP= -DNETGROUP" 옵션을 포함시켜라.
tcp wrapper와 부속 파일 설치하기
make를 이상 없이 실행한 후, 프로그램과 man 페이지를 미리 정한 시스템 디렉토리로 복사해라:
$ cp tcpd /opt/sbin
$ cp safe_finger /opt/sbin
$ cp tcpdchk /opt/sbin
$ cp tcpdmatch /opt/sbin
$ cp try-from /opt/sbin
$ cp hosts_access.3 /opt/man/man3
$ cp hosts_access.5 /opt/man/man5
$ cp hosts_options.5 /opt/man/man5
$ cp tcpd.8 /opt/man/man8
$ cp tcpdchk.8 /opt/man/man8
$ cp tcpdmatch.8 /opt/man/man8
tcp wrapper 라이브러리 설치하기
logdaemon처럼 tcp wrapper의 라이브러리를 사용하는 다른 프로그램이 있다면 다음 명령을 실행해야 한다:
$ cp libwrap.a /opt/lib
$ cp tcpd.h /opt/includetcpd.h가 라이브러리가 설치된 디렉토리와 다른 곳에 위치한다면, 라이브러리를 사용하는 다른 툴들을 설치할 때 약간의 수정을 해주어야 한다. 헤더 파일을 통상적인 시스템 디렉토리에 놓아두는 것이 아주 좋은 해결책이다. 그러나 이런 방법을 싫어한다면 헤더 파일을 /opt/lib 에 복사해 두어라.
--------------------------------------------------------------------------------
tcpd 설정하기
tcpd 프로그램을 설치한 후 설정 파일을 수정해야 한다. tcpd가 접근 제어와 기록 둘 다에 사용된다면 두 가지 설정 파일을 사용해야 한다. 설정 파일의 구조와 몇 가지 옵션, 키워드를 설명하기 위해 예제를 포함했다. 더 자세한 것은 man 페이지에서 얻을 수 있다: hosts_options (3), host_options (5), and hosts_access (5).
tcp wrapper로 모든 네트워크 데몬을 다 보호할 수는 없다.
네트워크 프로토콜과 서비스가 아주 다양하기 때문에 tcpd로 모든서버를 다 보호할 수는 없다:
tcpd는 접속 기록을 하기 위해 새로 접속할 때마다 시작되도록 설계되었다. 부하가 많이 걸리는 sendmail과 같은 서버들은 보통 시작 부하를 줄이기 위해 한번만 시작된다; 그러므로 그런 서버들은 첫번째 접속만 기록하는 tcpd로는 관리하기가 힘들다.
tcpd는 TCP (transmission control protocol)와UDP (user datagram protocol)를 사용하는 서버만 보호할 수 있다.
어떤 서버들은 TCP와 RPC (remote procedure call) 프로토콜을 둘 다 사용한다. 이런 서버들은 tcp wrapper로 보호할 수 없다. 이런 서버들은 inetd.conf (4)의 세 번째 항인 프로토콜에 rpc/tcp가 기록되어 있다.
한번에 하나의 접속만을 처리하는 서버만 보호할 수 있다. (주어진 시간에 서버 프로세스의 복사본이 여러 개 있을 수는 있지만, 각 복사본은 정확히 하나의 접속만을 처리하고 완료되자마자 종료됨을 주의해라. 이것은 하나의 복사본이 도착하는 여러 개의 접속을 처리하는 것과는 다르다.) 그 외의 서버들은 초기 접속을 처리한 후에도 살아남아서 다른 접속 요구를 기다린다. 그런 서버들은 inetd.conf의 네 번째 항이 "wait"로 되어 있어서 구별할 수 있다.
설정 파일의 용도
모든 규칙은 설정 파일에 저장된다. 규칙은 놓여진 순서대로 적용된다. 어떤 규칙이 해당 접속에 일치한다면 다른 규칙은 고려하지 않는다. 기본적으로 두 개의 파일이 정의된다. 접속이 두 개의 파일 중 어떤 것에도 일치하지 않는다면 접근이 허가된다:
hosts.allow
말 그대로, 접근을 허가하는 규칙들.
hosts.deny
말 그대로, 접근을 거부하는 규칙들. 명시적으로 허가하지 않는 접속 외에는 모두 거부하는 "만물상" 규칙을 둘 것을 권한다.
두 개의 파일을 가지는 대신에 모든 규칙을 하나의 파일 안에 둘 수도 있다. 이 때는 각 규칙이 어떻게 적용될지 지정하기 위해 옵션으로 "ALLOW"와 "DENY" 키워드를 사용한다.
설정 파일의 구조
한 줄에 하나의 규칙이 오며, 최소 세 개의 항목으로 이루어 진다. 이 때 각 항목은 ":" 문자로 구분된다:
첫번째 항목은 inetd.conf에 등록된 서비스를 지정한다. 단 서비스를 수행하는 프로그램을 적어준다. 예를 들면, "telnet" 서비스는 "in.telnetd" 프로그램에 의해 제공된다. 그러므로 "telnet" 서비스의 규칙은 "in.telnetd"로 시작해야 한다. "ALL" 키워드는 모든 서비스를 의미한다.
두번째 항목은 규칙이 적용될 출처 주소를 지정한다. 호스트 명과 도메인명을 사용할 수도 있지만 IP(Internet protocol) 주소나 IP 주소 범위를 사용하는 것이 더 적절하다. 호스트 명과 도메인 명은 추가로 DNS(domain name system)탐색을 해야 하고, DNS spoofing 공격(외부 호스트의 IP 주소가 조직 안의 호스트 명을 가진 것처럼 조작)의 위험성도 있다. 두 가지 키워드를 사용할 수 있다: (1) "LOCAL"은 같은 서브넷이나 서브 도메인에 있는 모든 호스트를 말하고 (2) "ALL"은 주소에 상관없이 모든 호스트를 의미한다.
세번째 항목은 옵션을 지정한다. 여러 개의 옵션이 올 수 있으며, ":" 문자로 구분한다.
설정 파일에 사용 가능한 옵션
예제의 옵션들은 가장 많이 쓰이는 것들이다. 옵션들의 의미는 다음과 같으며, 아무 규칙에나 순서와 조합에 상관 없이 사용할 수 있다.
옵션
설명
RFC931
접속할 때마다 ident 탐색이 수행된다. ident에 사용되는 프로토콜은 원래 RFC 931(현재는 RFC 1413)에 문서화되어 있다. ident 서비스를 제공하는 시스템으로부터 접속 요구가 온다면 해당 시스템에 사용자 명을 요구할 수 있다. 이렇게 하는 것이 사용자 확인을 완벽하게 보장해주지는 못하지만 침입을 분석할 때 유용한 정보를 제공할 수는 있다. ident 요구는 접속을 지연시켜서 사용자가 알아차릴 수도 있다.
BANNERS
이 옵션은 telnet, ftp, rlogin과 같은 프로토콜에 대해 접근 제한, 기록 등이 이루어지고 있음을 사용자에게 부가적인 텍스트를 보여줄 수 있다. 배너가 출력될 서비스의 이름과 같은 파일이 지정된 디렉토리 안에 존재해야 한다. (더 자세한 것은 각각의 서비스에 대해 배너를 만들어주는 도구에 첨부된 프로그램 문서에서 얻을 수 있다.)
SPAWN
특정한 명령을 수행하는 프로세스를 만든다. 명령어 안에 접속을 요구한 곳의 IP 주소나 호스트 명을 %h 변수를 사용하여 넣을 수도 있다. %d는 서비스를 나타내는 변수이고, %u는 ident 탐색의 결과를 나타내며, "UNKNOWN"은 결과를 얻을 수 없을 때 얻는 값이다. (%u 변수가 사용되면 RFC931 옵션이 없더라도 ident 탐색이 이루어진다.)
--------------------------------------------------------------------------------
예제
다음 예는 세 개의 서브네트워크가 있음을 가정한다. 부서 A는 네트워크 주소가 10.0.1.0이고, netmask는 255.255.255.0이다. 전산소는 netmask는 같지만, 네트워크 주소는 10.0.250.0이다. 부서 B의 서버는 원격 접근을 허용하고 IP 주소는 10.0.2.15이다.
다음 설정은 부서 B에서 사용된다:
/etc/hosts.allow
같은 서브넷과 부서 A, 전산소에서는 모든 서비스에 대한 접근이 허용된다. 원격 접근 서버에서 접속한 사용자는 telnet과 ftp만 허용된다.
ALL: LOCAL 10.0.1.0/255.255.255.0 10.0.250.0/255.255.255.0: RFC931 : BANNERS /opt/sbin/sec/banners
in.telnetd: 10.0.2.15: RFC931 : BANNERS /opt/sbin/sec/banners
in.ftpd: 10.0.2.15: RFC931 : BANNERS /opt/sbin/sec/banners
/etc/hosts.deny
다른 모든 접속은 거부된다.
ALL: ALL: RFC931 : BANNERS /opt/sbin/sec/reject :
SPAWN (/usr/sbin/sec/safe_finger -l @%h | /usr/ucb/mail -s %d-%h root) &
더 자세한 설명
예로 든 설정에서, RFC931과 BANNERS가 모든 접속에 대해서 사용된다. 이 회사는 ident 서버를 지원하므로 사용자는 지연되는 것을 거의 느낄 수 없다. banners는 추가적인 보안을 위해 확장된 기록을 할 목적으로 사용된다. 접속이 거부되면, 특별한 "reject" 배너를 출력해서 추후에 접속하지 않도록 해준다.
SPAWN 명령어는 접속이 거부되었을 때 사용된다. 즉, 접속을 요구한 곳에 대한 더 자세한 정보를 얻어와서 필요하다면 더욱 자세한 분석을 할 수 있도록 관리자에게 경보를 보내준다. SPAWN은 tcp wrapper의 일부인 safe_finger 프로그램을 호출 해서, finger 탐색을 한 후 메일 프로그램으로 결과를 보낸다. 메일 프로그램은 요구한 서비스와 접속을 요구한 호스트 또는 IP 주소를 나열한다.
--------------------------------------------------------------------------------
inetd 설정하기
tcp wrapper는 inetd.conf를 수정하여 몇 가지 서비스를 대신하도록 설정되어 있다. 이런 서비스들에 대한 접속은 모두 기록되며, 접근 제어가 적용된다. tcpd는 hosts.allow나 hosts.deny 파일 안의 규칙에 지정된 서비스만을 보호한다. 그 외 다른 서비스들은 "ALL"을 사용하여 보호된다. inetd.conf 안에서 tcpd 가 호출되면 규칙의 유무에 상관없이 모든 접속이 기록된다.
inetd 안에서 tcpd 호출하기
다음은 inetd.conf 설정의 예로부터 따온 것이다:
ftp stream tcp nowait root /opt/sbin/tcpd in.ftpd
telnet stream tcp nowait root /opt/sbin/tcpd in.telnetd
shell stream tcp nowait root /opt/sbin/tcpd in.rshd
login stream tcp nowait root /opt/sbin/tcpd in.rlogind
finger stream tcp nowait nobody /opt/sbin/tcpd in.fingerd이 문장들은 위의 예에서 계속된 것이다. ftp와 telnet 외에 세 개의 다른 서비스들(rsh, rlogin, finger)가 tcpd로 보호되고 있다. 예에서는 명시적으로 지정되지 않은 이런 서비스들은 두 개의 "ALL" 규칙에 의해 적용을 받는다. 이 규칙은 같은 서브넷/서브도메인, 부서 A와 B, 전산소에 위치한 시스템의 사용자에게는 접근을 허용한다. 그 외의 다른 곳에서의 접근은 거부된다.
Activate the updated configuration.
수정을 한 후에는 inetd를 재시작해야 한다:
$ kill -HUP
--------------------------------------------------------------------------------
배겨 지식과 추가로 알아둘 만한 것
다음은 몇 가지 추가로 알아둘 만한 것들이다.
덫을 준비하기
조기 경보를 위해 덫을 준비해둘 수도 있다. 즉, 설정할 때 필요하지 않은 서비스를 활성화시켜 두고, tcpd를 사용해서 모든 접속을 기록한 다음 서비스를 거부해 버리는 것이다. 이렇게 해두면 침입자가 더욱 고도의 기술을 쓰기 전에 먼저 잘 알려진 공격을 시도해 볼 때 매우 유효할 것이다.
이런 접근 방법은 제한 적으로 사용돼야 한다. 다음은 시스템에 대한 정보를 제공하는 두 가지 서비스에 대한 접속을 허용해준다:
systat stream tcp nowait nobody /opt/sbin/tcpd /bin/false
netstat stream tcp nowait nobody /opt/sbin/tcpd /bin/falsetcpd의 매개 변수로 서비스를 제공하는 실제 프로그램을 넣지 않는 것이 중요하다. 접근이 실수로 허용되더라도(예를 들면, 잘못된 설정 때문에)부주의하게 서비스를 제공하고 싶지는 않을 것이다. /bin/false로 두면 즉시 종료돼서 사용자 입력을 전혀 받아들이지 않기 때문에 매우 안전한 방법이 된다.
설정 사항 점검
tcp wrapper의 설정 사항은 호스트의 보안에 심각한 영향을 미친다. 그래서 두 가지 검사 프로그램이 소프트웨어의 일부로 제공된다:
tcpdchk(8)는 inetd.conf를 분석해서 tcp wrapper와 관련된 모든 에러를 보여준다.
tcpdmatch(8)는 주어진 IP 주소에 대해서 설정이 어떻게 되어 있고, 접속이 허가되는지 거부되는지 결과를 출력해준다.
IP spoofing의 위험성
접근 제어와 기록은 IP 프로토콜의 IP 주소를 기반으로 이루어진다. 그러나 특정한 환경에서는 IP 주소를 속일 수도 있으며, 이는 침입자가 접근 권한을 얻을 수 있는 가능성을 주게 된다. tcp wrapper는 약점을 줄이기 위해 두 번의 DNS 탐색을 행함으로서 이런 방식의 공격을 탐지하려고 한다:즉, 연결을 요구한 IP 주소에 대한 호스트명을 찾아보고, 다시 해당 호스트명에 대해 IP 주소를 찾아본다. 그 결과 얻어낸 IP 주소가 원래의 주소와 일치하지 않는다면, 접속은 거부된다. 이 모드는 "PARANOIDE"라고 부르며 컴파일할 때 꺼놓을 수 있다. (DNS를 통해서 원래의 주소로 호스트명을 얻을 수 없다면 적법한 호스트였을지라도 접속은 거부된다. 이것은 reverse 탐색이 제공되지 않는 사이트에 특히 영향을 미칠 수 있다.) 부연하자면, 접속을 제한하려는 모든 주소는 IP 주소로 기술되야 한다. 호스트 명은 접속을 제한하려는 곳을 IP 주소로는 표현할 수 없을 때만 사용해야 한다.
설정 사항을 보호하기
설정 파일은 시스템에 저장되므로 조작될 가능성이 있다. 그러므로 이런 파일들의 관리용 복사본을 만들어서 물리적으로 쓰기 금지된 매체에 옮겨서 보관할 필요가 있다. 그리고 나서 Tripwire와 같은 결함 검사 도구 중 하나를 사용해서 이런 설정 파일들을 검사해 볼 필요가 있다.
# by | 2005/02/27 00:14 | Technical.Doc | 트랙백



☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]