|
허가되지 않은 접속을 막아주는 tcp wrapper를 솔라리스 2.5.1 시스템에 설치, 설정, 운용하기 |
||||||||||
|
|
||||||||||
유닉스 서버는 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의 실행 파일을 만들려면, 다음과 같은 것이 필요하다.
|
||||||||||
|
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 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
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 sunos5 NIS(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/include tcpd.h가 라이브러리가 설치된 디렉토리와 다른 곳에 위치한다면, 라이브러리를 사용하는 다른 툴들을 설치할 때 약간의 수정을 해주어야 한다. 헤더 파일을 통상적인 시스템 디렉토리에 놓아두는 것이 아주 좋은 해결책이다. 그러나 이런 방법을 싫어한다면 헤더 파일을 /opt/lib 에 복사해 두어라. |
||||||||||
tcpd 설정하기 |
tcpd 프로그램을 설치한 후 설정 파일을 수정해야 한다. tcpd가 접근 제어와 기록 둘 다에 사용된다면 두 가지 설정 파일을 사용해야 한다. 설정 파일의 구조와 몇 가지 옵션, 키워드를 설명하기 위해 예제를 포함했다. 더 자세한 것은 man 페이지에서 얻을 수 있다: hosts_options (3), host_options (5), and hosts_access (5). |
||||||||||
|
tcp wrapper로 모든 네트워크 데몬을 다 보호할 수는 없다. |
||||||||||
|
네트워크 프로토콜과 서비스가 아주 다양하기 때문에 tcpd로 모든서버를 다 보호할 수는 없다:
|
||||||||||
|
설정 파일의 용도 |
||||||||||
|
모든 규칙은 설정 파일에 저장된다. 규칙은 놓여진 순서대로 적용된다. 어떤 규칙이 해당 접속에 일치한다면 다른 규칙은 고려하지 않는다. 기본적으로 두 개의 파일이 정의된다. 접속이 두 개의 파일 중 어떤 것에도 일치하지 않는다면 접근이 허가된다:
두 개의 파일을 가지는 대신에 모든 규칙을 하나의 파일 안에 둘 수도 있다. 이 때는 각 규칙이 어떻게 적용될지 지정하기 위해 옵션으로 "ALLOW"와 "DENY" 키워드를 사용한다. |
||||||||||
|
설정 파일의 구조 |
||||||||||
|
한 줄에 하나의 규칙이 오며, 최소 세 개의 항목으로 이루어 진다. 이 때 각 항목은 ":" 문자로 구분된다:
|
||||||||||
|
설정 파일에 사용 가능한 옵션 |
||||||||||
|
예제의 옵션들은 가장 많이 쓰이는 것들이다. 옵션들의
의미는 다음과 같으며, 아무 규칙에나 순서와 조합에 상관 없이 사용할
수 있다.
|
||||||||||
예제 |
다음 예는 세 개의 서브네트워크가 있음을 가정한다. 부서 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 <pid of inetd> |
||||||||||
배겨 지식과 추가로 알아둘 만한 것 |
|
||||||||||
|
덫을 준비하기 |
||||||||||
|
조기 경보를 위해 덫을 준비해둘 수도 있다. 즉, 설정할 때 필요하지 않은 서비스를 활성화시켜 두고, tcpd를 사용해서 모든 접속을 기록한 다음 서비스를 거부해 버리는 것이다. 이렇게 해두면 침입자가 더욱 고도의 기술을 쓰기 전에 먼저 잘 알려진 공격을 시도해 볼 때 매우 유효할 것이다. 이런 접근 방법은 제한 적으로 사용돼야 한다. 다음은 시스템에 대한 정보를 제공하는 두 가지 서비스에 대한 접속을 허용해준다: systat stream tcp nowait nobody /opt/sbin/tcpd /bin/false netstat stream tcp nowait nobody /opt/sbin/tcpd /bin/false tcpd의 매개 변수로 서비스를 제공하는 실제 프로그램을 넣지 않는 것이 중요하다. 접근이 실수로 허용되더라도(예를 들면, 잘못된 설정 때문에)부주의하게 서비스를 제공하고 싶지는 않을 것이다. /bin/false로 두면 즉시 종료돼서 사용자 입력을 전혀 받아들이지 않기 때문에 매우 안전한 방법이 된다. |
||||||||||
|
설정 사항 점검 |
||||||||||
|
tcp wrapper의 설정 사항은 호스트의 보안에 심각한
영향을 미친다. 그래서 두 가지 검사 프로그램이 소프트웨어의 일부로
제공된다:
|
||||||||||
|
IP spoofing의 위험성 |
||||||||||
|
접근 제어와 기록은 IP 프로토콜의 IP 주소를 기반으로 이루어진다. 그러나 특정한 환경에서는 IP 주소를 속일 수도 있으며, 이는 침입자가 접근 권한을 얻을 수 있는 가능성을 주게 된다. tcp wrapper는 약점을 줄이기 위해 두 번의 DNS 탐색을 행함으로서 이런 방식의 공격을 탐지하려고 한다:즉, 연결을 요구한 IP 주소에 대한 호스트명을 찾아보고, 다시 해당 호스트명에 대해 IP 주소를 찾아본다. 그 결과 얻어낸 IP 주소가 원래의 주소와 일치하지 않는다면, 접속은 거부된다. 이 모드는 "PARANOIDE"라고 부르며 컴파일할 때 꺼놓을 수 있다. (DNS를 통해서 원래의 주소로 호스트명을 얻을 수 없다면 적법한 호스트였을지라도 접속은 거부된다. 이것은 reverse 탐색이 제공되지 않는 사이트에 특히 영향을 미칠 수 있다.) 부연하자면, 접속을 제한하려는 모든 주소는 IP 주소로 기술되야 한다. 호스트 명은 접속을 제한하려는 곳을 IP 주소로는 표현할 수 없을 때만 사용해야 한다. |
||||||||||
|
설정 사항을 보호하기 |
||||||||||
|
설정 파일은 시스템에 저장되므로 조작될 가능성이 있다. 그러므로 이런 파일들의 관리용 복사본을 만들어서 물리적으로 쓰기 금지된 매체에 옮겨서 보관할 필요가 있다. 그리고 나서 Tripwire와 같은 결함 검사 도구 중 하나를 사용해서 이런 설정 파일들을 검사해 볼 필요가 있다. |
||||||||||
이 문서는 본래 cert에 있는 것을 handdol이 번역한 것입니다. 내부적인 목적에 사용하기 위한 것이므로 다른 곳에 배포를 금해주십시오. Copyright 1999 Carnegie Mellon University |
|||||||||||