HOSTS_ACCESS(5)

명칭
hosts_access - 호스트 액세스 제어 파일의 서식

해설
본메뉴얼 페이지는, 클라이언트 (호스트의 이름/주소, 유저명)와 서버 (프로세스명, 호스트의 이름/주소)의 패턴을 베이스로 하는, 단순한 액세스 제어 언어를 해설합니다. 마지막에 사용예를 나타내고 있습니다. 참을 수 없는 (분)편은, 간단한 도입을 위해서(때문에), 사용 예의 마디에 진행해 주세요.

확장 버젼의 액세스 제어 언어는, hosts_options(5) 문서로 해설하고 있습니다. 프로그램 구축시에 -DPROCESS_OPTIONS 첨부로 구축하는 것으로써, 확장 기능은 온이 됩니다.

이후의 문장에 대해서는, daemon 는 네트워크 demon 프로세스의 프로세스명이며, client 는 서비스를 요구하고 있는 호스트의 이름이나 주소입니다. 네트워크 demon 프로세스의 이름은, inetd 설정 파일에 대해 지정됩니다.

액세스 제어 파일
액세스 제어 소프트웨어는, 2 개의 파일을 참조합니다. 검색은, 최초의 매치으로 종료합니다. 즉,

•   (daemon, client)의 조가 /etc/hosts.allow 파일의 엔트리에 매치 할 때, 액세스는 허가됩니다.

•   그렇지 않은 경우, (daemon, client)의 조가 /etc/hosts.deny 파일의 엔트리에 매치 할 때, 액세스는 거부됩니다.

•   그렇지 않은 경우, 액세스는 허가됩니다.

존재하지 않는 액세스 제어 파일은, 그 파일이 하늘인 것으로서 다루어집니다. 따라서, 액세스 제어 파일을 아무것도 준비하지 않는 것에보다 , 액세스 제어를 오프로 하는 것이 가능합니다.

액세스 제어 룰
각 액세스 제어 파일은, 0 개 이상의 텍스트행을 가집니다. 이러한 행은, 출현순서에 처리됩니다. 매치이 검출되었을 때에, 검색이 종료합니다.

•   개행 캐릭터는, 전에 backslash 캐릭터가 있는 경우, 무시됩니다. 이것에 의해, 긴 행의 분할이 가능해져, 편집이 용이하게 됩니다.

•   공행 또는 `#'캐릭터로 개시하는 행은 무시됩니다. 이것에 의해, 코멘트나 공백의 삽입이 가능해져, 겉(표)가 읽기 쉬워집니다.

•   다른 모든 행은, 다음의 서식을 채울 필요가 있습니다. [] 의 사이의 것은 생략 가능합니다.

    daemon_list : client_list [ : shell_command ]

daemon_list 는, 1 개 이상의 demon 프로세스명 (argv[0] 치) 또는 와일드 카드 (후술)로부터 되는 리스트입니다.

client_list 는, 1 개 이상의 호스트명, 호스트 주소, 패턴, 또는 와일드 카드 (후술)로부터 되는 리스트입니다. 이것이, 클라이언트 호스트의 이름 또는 주소에 대해서 매치 됩니다.

보다 복잡한 형식인, daemon@host 와 user@host 는, 각각 서버 종점 패턴과 클라이언트 유저명 검색의 경우(때)로 설명합니다.

리스트의 요소는, 공백이나 콤마로 단락짓습니다.

모든 액세스 제어 체크는 대문자 소문자의 차이는 영향 없습니다. 다만, NIS (YP)의 netgroup 의 검색은 예외입니다.

패턴
액세스 제어 언어는, 다음의 패턴을 실장하고 있습니다.

•   `. '캐릭터로 개시하는 캐릭터 라인. 호스트명은, 그 마지막 부분이 지정된 패턴에 매치 하는 경우, 성냥 합니다. 예를 들면, 패턴 `.tue.nl'는, 호스트명 `wzv.win.tue.nl'에 매치 합니다.

•   `. '캐릭터로 종료하는 캐릭터 라인. 호스트 주소는, 그 최초의 수치 필드가 지정된 캐릭터 라인에 매치 하는 경우, 성냥 합니다. 예를 들면, 패턴 `131. 155. '는, Eindhoven University 네트워크 (131.155.x.x)의 (거의) 모든 호스트의 주소에 매치 합니다.

•   `@'캐릭터로 개시하는 캐릭터 라인은, NIS (이전의 YP)의 netgroup 명으로서 다루어집니다. 호스트명은, 지정된 netgroup 의 멤버인 경우, 매치 합니다. demon 프로세스명 및 클라이언트 유저명에서는, netgroup 의 매치은 서포트되고 있지 않습니다.

•   `n.n.n.n/m.m.m.m'서식의 표현은, `net/mask'페어로서 해석됩니다. `net'가, 주소와 `mask'를 비트 마다 AND 한 것에 동일한 경우, 호스트 주소는 매치 합니다. 예를 들면, net/mask 패턴 `131. 155.72. 0/255. 255.254. 0'는, `131. 155.72. 0'로부터 `131. 155.73. 255'까지의 범위의 모든 주소에 매치 합니다.

•   `[n:n:n:n:n:n:n:n]/m'서식의 표현은 `[net]/prefixlen'페어로서 해석됩니다. `net'의 `prefixlen'비트가, 주소의 `prefixlen'비트로 동일한 경우, IPv6 호스트 주소는 매치 합니다. 예를 들면 [net]/prefixlen 패턴 `[3ffe:505:2:1::]/64'는, `3ffe:505:2:1::'로부터 `3ffe:505:2:1:ffff:ffff:ffff:ffff'까지의 범위의 모든 주소에 매치 합니다.

•   캐릭터 `/'로 개시하는 캐릭터 라인은 파일명으로서 다루어집니다. 호스트명 또는 주소는, 지정된 파일중의 호스트명 또는 주소의 패턴의 어느 쪽인가에 매치 할 때, 성냥 합니다. 파일의 서식은, 호스트명 또는 주소의 패턴을 공백에서 단락지어 0 개 이상 지정한 행이, 0 개 이상 존재한다고 하는 것입니다. 파일명 패턴은, 호스트명 또는 주소의 패턴을 사용 가능한 장소이면 어디에서라도 사용 가능합니다.

와일드 카드
액세스 제어 언어는, 명시적인 와일드 카드를 서포트합니다.

ALL 보편적인 와일드 카드이며, 항상 매치 합니다.

LOCAL
    이름에 닷 캐릭터를 포함하지 않는, 모든 호스트에 매치 합니다.

UNKNOWN
    이름이 미지의 모든 유저에게 매치 합니다. 또, 이름 또는 주소의 어느쪽이든 한편에서도 미지이다 모든 호스트에 매치 합니다. 이 패턴의 사용에는 주의해 주세요. 그렇다고 하는 것은, 일시적인 네임서버의 문제에 의해, 호스트명을 얻을 수 없게 되는 경우가 있기 때문입니다. 또, 어느 타입의 네트워크에 대해서 이야기하고 있는지를 소프트웨어가 나누지 않은 경우, 네트워크 주소를 얻을 수 없게 되기 때문입니다.

KNOWN
    이름이 기존의 모든 유저에게 매치 합니다. 또, 이름 및 주소가 모두 기존의 모든 호스트에 매치 합니다. 이 패턴의 사용에는 주의해 주세요. 그렇다고 하는 것은, 일시적인 네임서버의 문제에 의해, 호스트명을 얻을 수 없게 되는 경우가 있기 때문입니다. 또, 어느 타입의 네트워크에 대해서 이야기하고 있는지 소프트웨어가 모르는 경우, 네트워크 주소를 얻을 수 없게 되기 때문입니다.

PARANOID
    이름이 주소에 매치 하지 않는 모든 호스트에 성냥 합니다. tcpd 가 -DPARANOID (디폴트 모드입니다) 첨부로 구축되었을 경우, 액세스 제어표를 검색하기 전에, 이러한 클라이언트로부터의 요구를 떨어뜨립니다. 이러한 요구에 대해서 더욱 제어를 실시하고 싶은 경우, -DPARANOID 없음으로 구축해 주세요.

오퍼레이터

EXCEPT
    `list_1 EXCEPT list_2'라고 하는 형식에서 사용하는 것을 의도하고 있습니다. list_1 에 매치 하는 것으로, list_2 에 매치 하지 않는 것에, 이 구조는 성냥 합니다. EXCEPT 오퍼레이터는, daemon_lists 와 client_lists 로 사용 가능합니다. EXCEPT 오퍼레이터는, 상자 (네스트)로 하는 것이 가능합니다. 이것은, 만일 제어 언어가 괄호의 사용을 허락한다고 하여 표기한다면, `a EXCEPT b EXCEPT c'는 `(a EXCEPT (b EXCEPT c))'와 같이 해석됩니다.

쉘 명령
최초로 매치 한 액세스 제어 룰이 쉘 명령을 포함한 경우, 이 명령은 %<letter> 치환 (차절 참조)의 대상이 됩니다. 치환 결과는, 표준 입출력과 에러 출력이 /dev/null 에 접속된다 /bin/sh child process에 의해 실행됩니다. 실행 완료를 기다리고 싶지 않은 경우, 명령의 마지막에 `&'를 지정해 주세요.

쉘 명령은 inetd 의 PATH 의 설정에 의존해 되지 않습니다. 대신에, 절대 패스명을 사용하는지, 명시적인 PATH=whatever 라고 하는 문장으로 개시해야 합니다.

쉘 command field를, 이것과는 다른 호환성이 없는 방법으로 취급한다 다른 언어에 대해서는, hosts_options(5) 문서에 해설되어 있습니다.

% 의 전개
쉘 명령중에서, 다음의 전개를 사용 가능합니다.

%a (%A)
    클라이언트 (서버)의 호스트 주소.

%c  클라이언트의 정보. 이것은, user@host 인가, user@address 인가, 호스트명인가, 단지 주소인가의 머지않아인가입니다. 이 중의 어떤 것을 사용할 수 있을까는, 얻을 수 있는 정보량에 의존합니다.

%d  demon 프로세스의 이름 (argv[0] 치).

%h (%H)
    클라이언트 (서버) 호스트의 이름, 또는 이름을 얻을 수 없는 경우 주소.

%n (%N)
    클라이언트 (서버) 호스트의 이름 (또는 "unknown" 또는 "paranoid").

%p  demon 프로세스 id.

%s  서버의 정보. 이것은, daemon@host 인가, daemon@address 인가, 단지 demon명인가의 머지않아인가입니다. 이 중의 어떤 것을 사용할 수 있을까는, 얻을 수 있는 정보량에 의존합니다.

%u  클라이언트 유저의 이름 (또는 "unknown").

%%  단일의 `%'캐릭터에 전개됩니다.

% 전개중의 캐릭터로 쉘을 혼란시킬 수 있는 것은, 언더스코어로 옮겨집니다.

서버 종점 패턴
클라이언트의 구별을 위해서(때문에), 클라이언트가 접속하고 있는 네트워크 주소를 사용하려면 , 다음의 형식의 패턴을 사용합니다.

process_name@host_pattern : client_list ...

다른 인터넷 주소에 다른 인터넷 호스트명을 머신이 가지는 경우, 이러한 패턴을 사용 가능합니다. 서비스 제공자가 이 기구를 사용하는 것으로써, 복수의 인터넷의 이름을 사용해, FTP, GOPHER, WWW 라고 하는 아카이브(archive)를 제공 가능합니다. 이 경우, 인터넷의 이름은, 다른 조직에 속하는 일도 가능합니다. hosts_options(5) 문서의 `twist'옵션도 참조해 주세요. 단일의 물리 인터페이스에 1 개 이상의 인터넷 주소를 가질 수 있는 시스템이 있습니다 (Solaris 나 FreeBSD). 다른 시스템에서는, 전용의 네트워크 address 공간으로, SLIP 나 PPP 라고 하는 의사 인터페이스를 사용할 필요가 있을지도 모릅니다.

host_pattern 는, client_list 의 문맥에 있어서의 호스트의 이름 및 주소의 것과 같은 문법 룰에 따릅니다. 통상, 서버 종점 정보는, 커낵션 지향의 (connection-oriented) 서비스에 두어서만 사용 가능합니다.

클라이언트 유저명 검색
클라이언트 호스트가 RFC 931 프로토콜 또는 그 후 계 (TAP, IDENT, RFC 1413) (을)를 서포트하는 경우, connection의 소유자에 관한 추가의 정보를, 나팔 프로그램이 꺼낼 수 있게 됩니다. 클라이언트의 유저명 정보를 얻을 수 있으면(자), 클라이언트 호스트명과 함께 기록되어 다음과 같은 패턴 매치에 사용 가능합니다.

daemon_list : ... user_pattern@host_pattern ...

룰에 의거해 유저명을 검색 (디폴트)하는지, 항상 클라이언트 호스트에 문의할까의 설정은, demon 나팔의 컴파일시로 설정 가능합니다. 룰에 의거해 유저명을 검색하는 경우, 전술의 룰이 유저명 검색을 실시하는 것은, daemon_list 와 host_pattern 가 함께 매치 하는 경우만입니다.

유저스 패턴은, demon 프로세스 패턴과 같은 문법이며, 같은 와일드 카드가 사용 가능합니다 (netgroup 의 멤버는 서포트되지 않습니다). 그러나, 유저명 검색에 열중해 이성을 잃어 되지 않습니다.

•   클라이언트의 유저명 정보가 가장 필요하게 될 때, 즉 클라이언트 시스템이 위험하게 되고 있을 때야말로, 클라이언트의 유저명 정보는 신용할 수 없습니다. 일반적으로는, ALL 와 (UN) KNOWN 만이 의미가 있는 유저명 패턴입니다.

•   TCP 베이스의 서비스에 대해서만, 한편 클라이언트 호스트가 적절한 demon를 실행하고 있을 때 마셔, 유저명 검색을 사용 가능합니다. 다른 경우에는, 결과는 "unknown" 가 됩니다.

•   유저명 검색이 파이어 월(fire wall)에 블록 되면(자), UNIX 커널의 잘 알려진 (well-known) 버그에 의해, 서비스를 잃는 일이 있습니다. 커널에 이 버그가 있을까를 판단하기 위한 순서는, 나팔의 README 문서에 해설하고 있습니다.

•   유저명 검색에 의해, 비 UNIX 유저에 대한 현저한 지연을 일으키는 것이 있습니다. 유저명 검색의 디폴트의 타임 아웃은 10 초입니다. 이것은, 늦은 네트워크에 대해서는 단인가 지납니다만, PC 유저를 주물러들 시키려면 충분히 깁니다.

마지막 문제는, 선택적인 유저명 검색에 의해, 완화 가능합니다. 예를 들면, 다음과 같이 합니다.

daemon_list : @pcnetgroup ALL@ALL

이것은, 유저명 검색을 실시하지 않고 , pc netgroup 의 멤버에 매치 합니다. 그러나, 다른 시스템에 대해서는, 유저명 검색을 실시합니다.

주소 사칭 공격의 검지
많은 TCP/IP 실장에 있는 순차 순서 번호 생성기의 결함에 의해, 침입자가 신뢰된 호스트가 되어 끝낸 다음, 예를 들면 리모트 쉘 서비스를 개입시켜 침입할 수가 있습니다. IDENT (RFC931 등 )의 서비스를 사용하는 것으로써, 이러한 공격이나 다른 호스트 주소 사칭 공격을 검지 가능해집니다.

클라이언트의 요구를 받아들이기 전에, 나팔이 IDENT 서비스를 사용하는 것으로써, 그 클라이언트가 요구를 전혀 보내지 않았던 것을 검지 가능합니다. 클라이언트 호스트가 IDENT 서비스를 제공하고 있는 경우, 부정적인 IDENT 검색 결과 (클라이언트가 `UNKNOWN@host'에 매치)는, 호스트 사칭 공격의 유력한 증거가 됩니다.

긍정적인 IDENT 검색 결과 (클라이언트가 `KNOWN@host'에 매치)는, 이것보다 신뢰성이 낮습니다. 클라이언트의 접속만을 사칭 하는 것보다는 어렵습니다만, 침입자가 클라이언트의 접속과 IDENT 검색의 양쪽 모두를 사칭 하는 것이 가능합니다. 클라이언트의 IDENT 서버가 거짓말을 하고 있을 가능성도 있습니다.

주: IDENT 검색은, UDP 서비스에서는 동작하지 않습니다.

사용예
이 언어는 충분히 유연성이 있으므로, 거의 수고도 들이지 않고 , 다른 타입의 액세스 제어 방침을 표현 가능합니다. 또 이 언어는 2 개의 액세스 제어표를 사용합니다만, 한편의 겉(표)는 단순하게 하면서, 경우에 따라서는 비워도, 일반적인 방침의 대부분을 실장 가능합니다.

다음에 나타내는 사용예를 읽을 때는, 허가표가 거부표의 전에 스캔 되는 것, 검색은 매치이 검출되었을 때에 종료하는 것, 매치이 검출되지 않는 경우에는 액세스가 허가되는 것을 인식하는 것이 중요합니다.

사용예에서는, 호스트와 도메인의 이름을 사용합니다. 주소나 network/netmask 의 정보를 포함하는 것으로, 이러한 예를 개량해, 일시적인 네임서버의 검색 실패에 의한 영향을 줄이는 것이 가능해집니다.

거의 닫고 있는 상태
이 경우, 디폴트에서는 액세스는 거부됩니다. 명시적으로 권한이 주어진 호스트만이, 액세스가 허가됩니다.

디폴트의 방침 (액세스를 거부)은, 간단한 거부 파일에 의해 실장됩니다:

/etc/hosts.deny:
ALL: ALL

이것에 의해, 전호스트에 대한 전서비스가 거부됩니다. 다만, 허가 파일의 엔트리에 의해 허가된 액세스인 경우는 예외입니다.

명시적으로 권한이 주어지는 호스트는, 허가 파일에 리스트 합니다. 예를 들면 다음과 같이 합니다:

/etc/hosts.allow:
ALL: LOCAL @some_netgroup
ALL: .foobar.edu EXCEPT terminalserver.foobar.edu

최초의 룰은, 로컬 도메인의 (호스트명에 `. '를 포함하지 않는다) 호스트로부터의 액세스와 some_netgroup 의 멤버로부터의 액세스를, 허가합니다. 2 번째의 룰은, foobar.edu 도메인 (선두의 닷에 주의)의 전호스트로부터의 액세스를, 허가합니다. 다만, terminalserver.foobar.edu 는 예외입니다.

거의 열려 있는 상태
이번은, 디폴트에서는 액세스는 허가됩니다. 명시적으로 지정된 호스트만이, 서비스가 거부됩니다.

디폴트의 방침 (액세스를 허가)으로는 허가 파일은 장황하고, 생략 가능합니다. 명시적으로 권한이 주어지지 않는 호스트는, 거부 파일에 리스트 합니다. 예를 들면 다음과 같이 합니다:

/etc/hosts.deny:
ALL: some.host.name, .some.domain
ALL EXCEPT in.fingerd: other.host.name, .other.domain

최초의 룰은, 어느 호스트와 있는 도메인에 대한 전서비스를 거부합니다. 2 번째의 룰은, 다른 호스트와 다른 도메인으로부터의 finger 요구는 허가하고 있습니다.

booby 트랩
다음의 사용예는, 로컬 도메인 (선두의 닷에 주의)으로부터의 tftp 요구를 허가합니다. 다른 호스트로부터의 요구는 거부됩니다. 요구된 파일대신에, finger 프로브가 공격원호스트에 대해서 보내집니다. 결과는 슈퍼 유저에 대해서 메일 됩니다.

/etc/hosts.allow:
in.tftpd: LOCAL, .my.domain

/etc/hosts.deny:
in.tftpd: ALL: (/some/where/safe_finger -l @%h | \
	/usr/ucb/mail -s %d-%h root) &

safe_finger 는 back-finger 에서의 사용을 의도하고 있어, 적절한 장소에 인스톨 해야 합니다. 이것은, 리모트의 finger 서버로부터 보내지는 데이터에 기인해 발생 할 수 있는 데미지를 한정합니다. 통상의 finger 명령보다, 보다 좋은 방어가 됩니다.

%h (클라이언트 호스트)과 %d (서비스명)의 순차 순서의 전개에 대해서는, 쉘 명령의 마디에 기술되어 있습니다.

경고: 자기의 finger demon를 booby 트랩에 걸치지 말아 주세요. 걸쳐 버리면(자), finger 의 엔들레스 루프가 됩니다.

네트워크 파이어 월(fire wall) 시스템에서는, 이 트릭을 한층 더 폭넓게 활용할 수 있습니다. 전형적인 네트워크 파이어 월(fire wall)에서는, 외부의 세계에 대해서 한정된 서비스만을 제공합니다. 다른 전서비스는, 전술의 tftp 의 사용예와 같은 방법으로 「감시」가능합니다. 그 결과, 훌륭한 조기 경계 시스템이 생깁니다.

진단
다음의 경우, 에러가 보고됩니다. 호스트 액세스 제어 룰에 문법 에러가 있는 경우, 액세스 제어 룰이 내부 버퍼의 용량을 넘었을 경우, 액세스 제어 룰이 개행 캐릭터로 종단 되지 않았던 경우, %<letter> 의 전개 결과가 내부 버퍼를 흘러넘치게 했을 경우, 실패 해서는 안된 시스템 콜이 실패했을 경우입니다. 모든 문제는, syslog demon를 개입시켜 보고됩니다.

실장에 관한 주
 operating system에 따라서는, TCP Wrappers 를 기본 시스템의 일부로서 배포되고 있는 것이 있습니다. 이러한 시스템에서는, 네트워크 유틸리티에 랩핑 기능을 짜넣는 것이 일반적입니다. 특히, 시스템에 따라서는, tcpd(8)가 불필요한 inetd(8)를 제공하고 있는 것이 있습니다. 상세한 것에 대하여는, 시스템의 문서를 확인해 주세요.

관련 파일
/etc/hosts.allow, 액세스가 허가되었다 (daemon, client)의 페어.
/etc/hosts.deny, 액세스가 거부되었다 (daemon, client)의 페어.

관련 항목
tcpd(8) tcp/ip demon 나팔 프로그램.
tcpdchk(8), tcpdmatch(8), 테스트 프로그램.

버그
네임서버의 검색이 타임 아웃 하면(자), 호스트명이 등록되어 있었다고 해도, 액세스 제어 소프트웨어는 호스트명을 사용할 수 없게 됩니다.

도메인 네임서버의 검색은 대문자 소문자를 구별하지 않습니다. 한편, NIS (이전의 YP)의 netgroup 의 검색은 대문자 소문자를 구별합니다.

저자
Wietse Venema (wietse@wzv.win.tue.nl)
Department of Mathematics and Computing Science
Eindhoven University of Technology
Den Dolech 2, P.O.  Box 513,
5600 MB Eindhoven, The Netherlands