출처 : 대전국제IT교육센터 정성재 강사
1. 접근통제란?
(1) 설명: 네트워크
환경체제에서는 항상 권한이라는 것이 있다. 어떠한 시스템에 접근하려면 그
시스템에 접근권한이 있어야 한다. 권한을
가지지 않은 자가 권한이 부여되지 않은 자료에
불법적인 접근을 시도할 때 이를 차단하는 행위를 접근통제(Access
Control)이라 한다. 리
눅스시스템에서도 소유자, 그룹, 그 외의 사용자 등 3계층으로 분리하여, 파일 또는
디렉
토리에 읽기, 쓰기, 실행에 대한 권한을 부여한다.
(2) 접근통제방법: 접근통제하는 방법에는 학문적으로
보면 어떤 계층에서의 통제냐 운영체제의
위치가 어디냐에 따라 굉장히 많이 나누지만 여기서는 간단히
분류해보자.
1) 완전접근통제: 말 그대로 어떠한 사람도 접근을 못하게 막는 것이다. 그러나,
완전통제라면
네트워크로서의 기능이 없다고 말할 수 있다.
2) 일부접근통제: 선별적으로
접근을 허가하는 통제법이다. 대표적인 방법이 TCP Wrapper이다.
(3) 참고: 일부접근통제방식과 Set-Uid
1) 설명: 리눅스에서 비밀번호를 변경할 때 passwd라는 명령을 이용한다. 이 passwd의 권한은
root에게
있다. (실제적으로 확인해보면 소유자와 소유그룹 모두 root다. 파일의 위치는
/usr/ bin/passwd)
그런데, 어떻게 일반 사용자가 그 명령을 사용할 수 있을까? 그것은
root가 패스워드 권한 일부를 양도했기
때문이다. 이를 setuid, setgid라고 부른다. 이
러한 경우와 같이 패스워드를 바꾸는 행위 또는 그 역할에만
권한을 허용한 경우가 일부
접근통제방법에 해당한다.
2) passwd의 setuid 확인
ㄱ.
/etc/bin으로 이동한다.
ㄴ. 'ls -l passwd'라고 입력
ㄷ. 다음과 같이 결과가
출력된다.
-r-s--x--x 1 root root 12244 Feb 8 2000
passwd
=> 이와 같이 소유자부분에서 x가 있어야 할 자리에 s가 있다. 이런 경우가 setuid
또는
setgid가 부여된 경우이다. 이 파일의 소유자와 그룹은 root이다.
2. TCP Wrapper란?
리눅스 커널 2.2 버전에서 TCP Wrapper는 슈퍼데몬인
inetd데몬에 의하여 수행되는 서비스들의 접근
을 제어한다. 즉, 시스템에 접속을 허락한 호스트만 접속할 수 있도록 한다거나, 또는
원하지 않는
호스트의 접근을 막도록 해주는 접근 제어 프로그램이다. TCP 연결을 기반으로 하는 TELNET, FTP,
FINGER,RLOGIN 등을 감시하고 필터링할 수 있다. 현재 사용하는 커널 2.4 버전에서는 inetd가 확장
된
xinetd라는 슈퍼데몬을 사용하면서 자체적으로 접근제어를 하지만 tcp wrapper의 구성요소중
/etc/hosts.allow와
/etc/hosts.deny을 이용한 접근제어는 아직도 사용하고 있다.
3. TCP Wrapper의
구성
(1) 개요: TCP Wrapper는 데몬 프로세서인 /usr/sbin/inetd와 환경파일인
/etc/inetd.conf로 구성
되어 있다. 또한 리눅스에서는 스크립트파일인 /etc/rc.d/init.d/inet이
있고, /usr/sbin
/tcpd에서 참조하는 /etc/hosts.allow 파일과 /etc/hosts.deny파일이
있다.
(2) 구성파일
1) /usr/sbin/inetd
이 데몬은 여러 가지 다른 서버 프로그램들(telnet,
ftp 등)을 관리하기 때문에 슈퍼 데몬이라고
불리운다. 만약 호스트에서 telnet서비스를 요청하면 inetd는 환경파일인
/etc/inetd.conf파일을
참고하여 in.telnetd를 구동하고 telnet서비스를 처리한다.
2)
/etc/inetd.conf(커널 2.2 버전만 해당)
ㄱ. 설명: TCP Wrapper가 구동될 때 참고하는 환경파일이다.
전반적인 설정에 관여한
다.
ㄴ. inetd.conf 필드의 구성 : 총 7개의 필드로 구성되어
있다.
a. 구성예
telnet stream tcp nowait root
/usr/sbin/in.telnetd in.telnetd
(서비스이름) (소켓타입)(프로토콜)(플래그)(사용자)(서버프로그램)
(매개변수)
b. 필드의 설명
- 서비스이름 : /etc/services에 정의된 이름
- 소켓타입 : stream은 tcp, dgram은 udp이다.
- 프로토콜 : /etc/protocols에 있는
이름
- 플래그 : 프로세스의 시작방법
- 사용자 : 서비스가 수행될 때 그 서비스의
소유자
- 서버프로그램 : 실제 서버 프로그램 및 경로
- 매개변수 : 서버에 넘겨줄 명령어 라인
매개변수
ㄷ. inetd.conf의 역할: 이 파일에서 TCP Wrapper에서 사용하는 서비스를 제어할 수 있다.
보통
telnet, ftp, shell, login, exec, talk, ntalk,
dtalk, pop-2, pop-3,
imap, uucp, tftp, bootps,
finger, cfinger, sysstat, netstat 등 TCP연
결을 기반으로 하는
것들을 제어할 수 있다. 서비스를 하지 않으려면 해당
서비스의 맨 앞에 '#'문자를 삽입한다.
즉, 해당서비스열이 주석처리된다.
3) /etc/rc.d/init.d/inet: 리눅스 배포판만에 있는 스크립트 파일이다. 리눅스에서
inetd 전체의
시작과 종료는 이 파일을 이용한다. 커널 2.4에서는
xinetd이다.
4) /usr/sbin/inetd 와 /usr/sbin/tcpd
리눅스에서
/etc/inetd.conf 파일의 필드 구성을 보면 위의 구성예와 서버프로그램부분이 다
르다.
telnet
stream tcp nowait root /usr/sbin/tcpd in.telnetd
그럼
/usr/sbin/tcpd는 무엇인가? inetd는 /etc/inetd.conf파일을 참고하여 TCP Wrapper의 초기
구동을
담당한다. 즉, /etc/inetd.conf 파일의 설정을 다음과 같이 했다고 가정하자.
telnet stream
tcp nowait root /usr/sbin/in.telnetd in.telnetd
이 경우에 inetd는
단순히 텔넷서비스 요청이 들어오면 텔넷서비스로 연결만 해준다. 이런 설정
은 텔넷서비스요청에 대한 어떠한 접근 거부나 허가를 할 수
없게 된다. 그래서, 중간에 접근
여부를 판단하는 데몬이 tcpd이다. tcpd는 접근허용 파일인 /etc/hosts.allow와
/etc/hosts.deny
파일을 참조하여 접근 여부를 결정한다. 또한 서비스에 접근하는 과정에서 발생하는 모든
사항에
대하여 상세한 접속 로그를 남긴다. 즉, tcpd는 inetd와 서버사이에서 중요한 판단을
수행한다.
4.TCP Wrapper의 운용
(1) 개요: TCP
Wrapper의 운용은 크게 3가지로 구분할 수 있다. 첫번째는 슈퍼 데몬인 inetd를 종료
시켜 어떠한 서비스도 하지
않는 것이고, 두번째는 inetd.conf파일을 수정(커널 2.4에서는
/etc/xinetd.d 디렉토리내의
서비스제어)하여 선택적으로 서비스를 제어하는 것이고, 마지
막은 /etc/hosts.allows파일과
/etc/hosts.deny파일을 가지고 클라이언트를 선택제어하는
것이다.
(2) TCP Wrapper 전체
서비스의 중단
1) 설명: TCP Wrapper를 작동하지 않으려면 inetd 데몬을 중단시키면 된다. 보통
리눅스배포판에
서는 스크립트파일을 이용하면 된다.
ㄱ. 서비스의 중단
/etc/rc.d/init.d/inet stop
ㄴ. 서비스의 시작
/etc/rc.d/init.d/inet
start
=> 커널 2.4버전인 경우에는 xinetd이다.
(3)선택적인 서비스의 중단
1) 설명:
TCP Wrapper에서는 여러 서비스를 한다. telnet, ftp, rlogin등 많은 서비스등을 한꺼번
에
관리한다. 따라서, 이중 한가지 서비스를 중단하려면 /etc/inetd.conf파일을 수정하면
된다. 만약 현재
telnet서비스를 한다면 다음과 같이 설정되어 있을 것이다.
telnet stream tcp
nowait root /usr/sbin/tcpd in.telnetd
그럼, 텔넷서비스를 중단해보자. 맨 앞에
주석을 뜻하는 '#'만 붙여주면 된다.
2) 사용예
#telnet stream tcp nowait
root /usr/sbin/tcpd in.telnetd
(4)호스트의 접근제어 : /etc/hosts.allow와
/etc/hosts.deny파일을 이용하여 선택적으로 호스트
를 제어할 수 있다. 실제적으로
xinetd를 사용하는 커널 2.4버전에서도 사용
가능한 파일이 이 두 개의
파일이다.
1)/etc/hosts.allow : 접근이 허가된 호스트들의 목록을 적는다.
2)/etc/hosts.deny : 접근이 금지된 호스트들의 목록을 적는다.
3)hosts.allow와 hosts.deny의
검색순서
hosts.allow를 먼저 검색한 후 hosts.deny를 검색한다. 만약 hosts.deny에 모든 서비스에
대
해 접근 금지로 설정했을 경우, hosts.allow에 허용된 접근외에는 모든 접근이 금지된다.
5.접근제어 규칙
(1) 설명: /etc/hosts.allow파일과 /etc/hosts.deny파일은
정해진 접근통제규칙을 가지고 있다. 이
규칙대로 설정을 하여 접근을 제어해야 한다.
(2) 파일 작성시 문법상의
규칙
1) 새로운 줄(줄바꿈)은 무시되고, 줄을 연장할 경우에는 백슬래쉬를 사용해야 한다.
2) 빈줄 혹은 '#'으로
시작되는 줄은 주석처리된다.
3) 다른 모든 줄은 아래의 형식을 따라야 한다.
예) daemon_list :
client_list [ : shell_command ]
daemon_list : 한개 이상의 데몬(서버프로그램)프로세스 혹은
예약어(와일드카드)
client_list : 한 개 이상의 호스트 이름, 주소, 패턴 혹은 예약어(클라이언트 이름
혹은
주소가 일치하는 것)
(3) 예약어(와일드카드라고도 부름)
ALL :
모든 서비스 또는 모든 호스트를 나타냄.
LOCAL : 같은 네트워크에 있는 모든 호스트
KNOWN
: 이름이 KNOWN인 호스트, 혹은 이름 또는 주소를 알고 있는 호스트
UNKNOWN : 이름이 UNKNOWN인 호스트,
혹은 이름이나 주소를 모르는 호스트
PARANOID : 호스트네임이 주소와 일치되는 않는 호스트
B EXCEPT A
: 리스트 B에서 A를 제외한 모든 B
(4) 패턴형식 : '.'의 위치에 유념해야 하고, ALL과 ':'은 공백이 있어야 한다.
1)모든 서비스를 모든 호스트에 대해 거부 : /etc/hosts.deny파일에 적는다.
ALL : ALL
2) 특정 호스트에 특정서비스 접근 허용 : /etc/hosts.allow파일에 적는다.
ALL :
localhost, .aaa.com => localhost와 aaa.com의 모든 호스트들에게 모든 서비스를
허용한다는 뜻이다.
in.telnetd :
192.168.0.2 => 192.168.0.2에서 텔넷 접속에 대해서만 접근을 허용한다.
ALL : .aaa.com
EXCEPT killer.aaa.com => killer.aaa.com를 제외한 aaa.com의 모든
호스트들
에게 모든 서비스를 허용한다.
ALL EXCEPT in.ftpd : .aaa.com EXCEPT bad.aaa.com => bad.aaa.com를 제외한 aaa.com의
모든
호스트들에게 ftp서비스를
제외한 모든
서비스를
허용한다.
in.telnetd, in.figerd : 233.234.235., .aaa.com =>
233.234.235.* 네트워크에 속한 모든
호
스트와 .aaa.com에 속하는 모든
호스트들
은 텔넷서비스와
finger서비스를 허용함.
ALL : ALL : DENY => 그외의 모든 네트워크 호스트는 어떠한 서비스도 받을 수
없다. 만약에
hosts.allow를 이렇게 설정해 놓으면 별도로 hosts.deny파일이
필요없다.
ALL : 192.168.0.0/24 => IP/넷마스크를 이용하여 설정하는 방법으로 192.168.0.0부터
192.16
8.0.255까지 모든 서비스에 대하여 허가한다.
(5) Shell
Command
1) 명령
spawn : 현재 수행중인 프로세스의 자프로세스로 수행
twist : 현재
수행중인 프로세스의 이미지 교체 후 수행(프로세스의 이미지가 교체되므로 규칙
의 마지막 옵션으로 사용해야
한다.
2) 확장 옵션
%a (%A) : 클라이언트(서버)의 주소
%c : 클라이언트의 정보
(user@host 또는 user@address)
%n (%N) : 클라이언트의 이름
%d : 서비스
데몬의 이름
%h (%H) : 클라이언트(서버) 이름 또는 주소
%n : 클라이언트(서버)
이름
%p : 데몬 프로세스 ID
%s : 서버 정보
%u : 클라이언트
사용자 이름
3) 사용예 : 의심되는 호스트(cracker.aaa.com)가 시스템에 접근을 시도할 경우 이 접속을
거부하
고 관리자에게 관련 정보를 전송하기 위하여 hosts.deny파일에 다음과 같이 설정한다.
ALL : cracker.aaa.com : twist (finger -l @%h | mail -s %d -%h root)
&
6.TCP Wrapper의 단점
TCP Wrapper는
클라이언트에서 보내진 네트워크 패킷들로부터 제공된 발신지주소의 정보를 보고 그
호스트에 대해 접근을 허가를 하든지 거부를 하든지 동작을
하는데, 이 정보를 전적으로 믿을 수는
없다. 만약 TCP Wrapper에서 192.168.0.2로 부터 오는 telnet 요청을
허가하도록 설정되어 있다고
할 때, 크래커가 자신의 주소를 192.168.0.2라고 속여서 접근한다면 속수무책이다. 이런 식의
공격을
IP 스푸핑이라고 한다.