JAIL(2)

명칭
jail - 현재의 프로세스와 그 장래의 자손을 가둔다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/jail.h> int jail(struct jail *jail)

해설
jail 시스템 콜은 감옥을 만들어, 현재의 프로세스를 그 중에 가둡니다.

인수는 감옥을 기술하는 구조체에의 포인터입니다.

    struct jail {
    	u_int32_t	version;
            char 		*path;
            char 		*hostname;
            u_int32_t	ip_number;
    };

“version” 에는 사용하는 API 의 버젼을 정의합니다. 현재 0 으로 설정합니다.

“path” 포인터에는 감옥의 루트가 되는 디렉토리를 설정합니다.

“hostname” 포인터에는 감옥의 호스트명을 설정합니다. 이것은 감옥중에서 변경할 수 있습니다.

“ip_number” (은)는 감옥에 할당하는 IP 번호를 설정합니다.

감옥?
프로세스는 한 번 감옥에 넣어지면(자), 그것 자신과 그 자손은 감옥으로부터 피할 수 없습니다. 기존의 감옥에 프로세스를 추가할 수 없습니다.

감옥 중(안)에서는 "슈퍼 유저" 의 개념은 매우 약해지고 있습니다. 일반적으로 전체가 감옥안에 있는 것은 아닌 것을 감옥중에서 엉망으로 하는 것은 할 수 없다고 생각됩니다. 예를 들면 “path” 의 아래의 디렉토리 트리는 “rm -rf /*” 도 포함해, root 를 보통으로 할 수 있도록(듯이) 조작할 수 있습니다만, 디바이스형 특수 노드는 공유된 리소스 (커널안의 디바이스 드라이버)를 참조하므로, 새롭게 만들 수 없습니다.

IP 활동은 모두 지정된 IP 번호에 제한됩니다. 지정된 IP 번호는 네트워크 인터페이스 중 1 개의 별명으로 있어야 합니다.

“/proc/<pid>/status” (을)를 조사하는 것으로 갇힌 프로세스를 식별할 수가 있습니다. 줄 끝의 필드가, 갇히지 않은 프로세스에서는 하이픈 1 개(살), 갇힌 프로세스에서는 현재 감옥으로 설정되어 있는 호스트명이 됩니다.

에러
jail() (은)는 다음의 경우에 실패합니다.

[EINVAL]
    인수의 버젼 번호가 올바르지는 않습니다.

한층 더 jail() (은)는 내부에서 chroot(2) (을)를 부르므로, 완전히 같은 이유로 실패할 가능성이 있습니다. 자세하게는 chroot(2) 의 메뉴얼 페이지를 참조해 주세요.

관련 항목
chdir(2), chroot(2)

역사
jail() 함수 호출은 FreeBSD 4.0 그리고 등장했습니다.

저자
jail 의 기능은 Poul-Henning Kamp 에 의해 R&D Associates “http://www.rndassociates.com/” (을)를 위해서(때문에) 쓰여져 FreeBSD 에 기증되었습니다.