JAIL(8)

명칭
jail - 프로세스와 그 자손을 가둔다

서식
jail path hostname ip-number command ...

해설
jail 유틸리티는 프로세스와 그 장래의 자손을 가둡니다.

자세한 것은 jail(2) 의 메뉴얼 페이지를 참조해 주세요.

사용예

  jail 용 디렉토리 트리 설정
이 예는, FreeBSD 배포물 전체를 포함한 jail 용 디렉토리 트리를 어떻게 구축하는지를 나타내고 있습니다:

    D=/here/is/the/jail
    cd /usr/src
    mkdir -p $D
    make world DESTDIR=$D
    cd etc
    make distribution DESTDIR=$D
    cd $D/dev
    sh MAKEDEV jail
    cd $D
    ln -sf dev/null kernel

많은 경우, 이 예의 방법에서는, 필요를 아득하게 넘은 수의 것을 jail 에 넣어 버리겠지요. 이제(벌써) 한편의 극단적인 예에서는, jail 는 다만 1 개의 파일만을 보관 유지합니다: 즉 jail 중(안)에서 실행하는 실행 형식 1 개 뿐입니다.

“굵다” jail 로부터 개시해 움직이지 못하게 될 때까지 서서히 것을 삭제해 나가는 (분)편이, “가늘다” jail 로부터 개시해 움직이게 될 때까지 서서히 것을 추가해 나가는 것보다도 꽤 간단하므로, 시험하려면 추천입니다만, 또 조심하는 일도 추천합니다.

  jail 의 설정
jail 용 디렉토리 트리의 구축을 위해서(때문에)는, jail 용 디렉토리 트리 설정 에 기술되고 있는 순서를 실행해 주세요. 이 예에서는, jail 된 IP 주소용으로 /data/jail/192. 168.11. 100 에 구축하는 것과 가정합니다. 이후, 당신이 필요로 하는 디렉토리, IP 주소, 호스트명으로 옮겨놓아 주세요.

우선, 열매 시스템의 환경을 “jail 에 적절한 환경” (으)로 합니다. 일관성을 위해서(때문에), 부모가 되는 열매 머신을 “호스트 환경” (이)라고 불러, jail 되는 가상 머신을 “jail 환경” (이)라고 부릅니다. jail 는 IP 앨리어스(alias)를 사용해 실장되고 있기 때문에, 최초로 해야 할것의 하나는, 호스트 시스템의 IP 서비스로, 전로컬 IP 주소에 대해서 서비스를 listen 하고 있는 것을, 무효화하는 것입니다. 이것은, inetd(8) (을)를 수정해, 적절한 IP 주소만 listen 시킨다고 했다 일을 의미합니다. 다음의 설정을, 호스트 환경의 /etc/rc.conf 에 추가합니다:

    sendmail_enable="NO"
    inetd_flags="-wW -a 192.168. 11.23"
    portmap_enable="NO"

이 예에서는, 192.168. 11.23 (은)는 호스트 시스템의 원래의 IP 주소입니다. inetd(8) (으)로부터 실행되는 demon는, 지정된 호스트 IP 주소를 사용하도록, 간단하게 설정 가능합니다. 다른 demon는 수동에서의 설정이 필요합니다 — 몇개인가에 대해서는, rc.conf(5) 플래그 엔트리에서 가능합니다만, 다른 것에 대해서는 어플리케이션 마다의 설정 파일을 만지는지, 재컴파일이 필요합니다. 실행에 사용하는 IP 주소를 지정 불가능한 어플리케이션에 대해서는, 가능하면 이것들을 무효로 하는 편이 좋습니다.

베이스 시스템에 부속되는 많은 demon는, jail 중추 환경내에서 jail 로부터 실행되면(자), 문제를 가질 수 있습니다. 이것에는 sendmail(8), named(8), rpcbind(8) 하지만 포함됩니다. sendmail(8) (와)과 named(8) (은)는, 자신의 설정 파일을 사용해, 특정의 IP 마셔 listen 하도록(듯이) 설정 가능합니다만, 대부분의 경우, demon를 단지 jail 내에서만 실행해, 호스트 환경에서는 실행하지 않는 것이 간단합니다. 호스트 환경으로부터의 NFS 에 서비스하려고 하면(자), 혼란이 생길지도 모르고, 특정의 IP 만을 사용하도록(듯이)는 간단하게는 재설정할 수 없습니다. 이것은, NFS 의 서비스에는, 직접 커널이 실행하는 것이 있기 때문입니다. 호스트 환경내에서 동작하고 있다 모든 써드파티 네트워크 소프트웨어도 또 확인 및 설정해, 모든 IP 주소에 bind 하지 않게 해야 합니다. 결과적으로, 이러한 서비스도 또, jail 환경으로부터 제공되고 있는 것처럼 보이겠지요.

한번 이러한 demon가 무효화 또는 호스트 환경내에 고정화되었다면, 후의 혼란 (jail 에 메일을 보낼 때에, jail 의 sendmail 가 다운하고 있어, 메일이 호스트에 배송되어 버리는 등) 의 가능성을 줄이기 위해서(때문에), 리부트해 전demon가 기존 상태가 되도록(듯이) 하는 것이 최선입니다.

최초로 jail 를 기동할 경우에는, 네트워크 인터페이스를 설정하지 말아 주세요. 이것은, 네트워크 인터페이스를 조금 정리하거나 어카운트를 설정하기 (위해)때문입니다. 어떤 머신이라도 (가상이어도 그렇지 않아도), root 의 패스워드나 타임 존이라고 하는 정보를 설정할 필요가 있겠지요. 시작하기 전에, sysinstall(8) (을)를 jail 의 트리에 카피하는 것으로써, 간단하게 설정할 수 있습니다. 다음과 같이 실시합니다:

    mkdir /data/jail/192. 168.11. 100/stand
    cp /stand/sysinstall /data/jail/192. 168.11. 100/stand

그리고, jail 를 개시합니다:

    jail /data/jail/192. 168.11. 100 testhostname 192.168. 11.100 /bin/sh

마지막으로, 에러 없음으로, jail 내의, 쉘 prompt로 끝나겠지요. 여기서, /stand/sysinstall (을)를 실행해, 인스톨 후의 설정으로 여러가지 설정 옵션을 설정할 수 있습니다. 또, 같은 일을 실현하기 위해서(때문에), /etc/rc.conf 등을 수동으로 편집할 수 있습니다.

•   하늘의 /etc/fstab (을)를 작성해, fstab 가 존재하지 않는다고 하는 기동 경고를 해소합니다.
•   포트맙파를 무효화합니다 (/etc/rc.conf: portmap_enable="NO")
•   newaliases(1) (을)를 실행해, sendmail(8) 의 경고를 해소합니다.
•   인터페이스 설정을 무효화해, ifconfig 관련의 기동 경고를 해소합니다 (network_interfaces="")
•   /etc/resolv.conf (을)를 설정해, jail 내의 이름 해석이 올바르게 동작하도록(듯이) 합니다.
•   root 의 패스워드를 설정합니다. 열매 호스트 시스템과는 달라도 좋습니다.
•   타임 존을 설정합니다.
•   jail 환경내의 유저에게 유저 어카운트를 추가합니다.
•   jail 환경에 필요한 패키지를 추가합니다.

패키지 고유의 설정 (웹 서버나 SSH 서버등 )이나, 기호의 로그를 취하기 위한 /etc/syslog.conf 의 수정등을 실시해 주세요.

쉘로부터 빠지면, jail 는 셧다운 합니다.

  jail 의 개시
jail 를 재개해, 전demon와 다른 프로그램과 함께 환경을 시작할 준비를 할 수 있었습니다. 이것을 실행하려면 , 우선 가상 호스트의 인터페이스를 시작해 그리고 jail 의 /etc/rc 스크립트를 jail 내로부터 실행합니다.

주: 신뢰할 수 없는 유저에게 jail 내에서 root 액세스를 허락할 예정이라면, security.jail.set_hostname_allowed (을)를 0 으로 설정하는 것을 검토하면 좋을 것입니다. 관리상의 이유를 참조해, 왜 이것이 좋은 생각인가를 봐 주세요. 이 변수를 설정하기로 했다면, 모든 jail 의 기동전에 이것을 설정하는 것이 필요하고, 또 부트의 번에 1 번 필요합니다.

    ifconfig ed0 inet alias 192.168. 11.100/32
    mount -t procfs proc /data/jail/192. 168.11. 100/proc
    jail /data/jail/192. 168.11. 100 testhostname 192.168. 11.100 \
    	/bin/sh /etc/rc

대부분의 sysctl(8) 설정 변수는 jail 내로부터 설정 불가이기 (위해)때문에, 약간의 경고가 표시됩니다. 왜냐하면, 이러한 설정 변수는, 모든 jail 환경과 호스트 환경에 건너 포괄적이기 때문입니다. 그렇지만, 모두 올바르게 동작하겠지요. inetd(8), syslogd(8) 및 다른 프로세스가 jail 내에서 동작하고 있는 것은, ps(1) (을)를 사용하는 것으로써, jail 된 프로세스의 옆에 ‘J’ 플래그가 붙어 있는 것으로 확인 가능합니다. jail 된 환경에는, 호스트명 또는 IP 주소로 telnet(1) 가능하고, 전술의 순서로 작성한 어카운트를 사용해 로그인 가능합니다.

  jail 의 관리
통상의 머신의 셧다운 명령, 예를 들면 halt(8), reboot(8), shutdown(8) (은)는 jail 내에서는 잘 사용할 수 없습니다. jail 내의 전프로세스를 죽이기 위해서(때문에)는, jail 에 root 로 로그인해, 하고 싶은 것에 의존해 다음의 몇개의 명령을 사용합니다:

    kill -TERM -1
    kill -KILL -1

이것에 의해, SIGTERM 또는 SIGKILL 의 시그널을, jail 내로부터 jail 내의 전프로세스에 통지합니다. jail 의 용도에 의존해, jail 내에서 /etc/rc.shutdown (을)를 실행하고 싶을지도 모릅니다. 현재로서는, jail 내에 신규 프로세스를 삽입하는 수단은 없기 때문에, 이러한 동작을 실시하기 전에 우선 jail 에 로그인할 필요가 있습니다.

jail 외로부터 프로세스를 죽이기 위해서(때문에)는, 죽이는 프로세스의 개개의 PID 를 판별하는 것이 필요합니다. /proc/pid/status 파일의 마지막 필드에는, 프로세스가 동작하고 있는 jail 의 호스트명인가, 이 프로세스가 jail 내에서 동작하고 있지 않는 것을 나타내기 위해서(때문에) “-” (을)를 포함합니다. ps(1) 명령도 또, jail 내의 프로세스에 대해서 ‘J’ 플래그를 나타냅니다. 그러나, jail 용의 호스트명은 디폴트에서는 jail 내로부터 개서 가능이기 (위해)때문에, 디폴트에서는 /proc 의 status 엔트리는 신뢰할 수 없습니다. jail 내로부터의 호스트명 설정을 금하려면 , 호스트 환경의 sysctl 변수 security.jail.set_hostname_allowed (을)를 0 으로 설정합니다. 이것은 모든 jail 에 영향을 줍니다. sysctl.conf(5) (을)를 사용하는 것으로, 부트마다 이 sysctl 설정을 실시할 수 있습니다. 다음의 행을 /etc/sysctl.conf 에 추가할 뿐입니다:

    security.jail.set_hostname_allowed=0

장래의 버젼의 FreeBSD 그럼, jail 를 관리하기 위한 기구는, 보다 좋아지고 있겠지요.

  Sysctl MIB 엔트리
jail 봉쇄 환경의 특정의 측면은, 호스트 환경으로부터, sysctl(8) MIB 변수를 사용해 변경 가능합니다. 현재로서는, 이러한 변수는 시스템상의 모든 jail 환경에 영향을 줍니다만, 장래적으로 이 기능은 보다 세입도가 될 예정입니다.

security.jail.set_hostname_allowed
    본 MIB 엔트리는, jail 내의 프로세스가 hostname(1) 또는 sethostname(3) (을)를 사용해, 호스트명을 변경 가능한가 아닌가를 지정합니다. 현재의 jail 실장에서는, jail 내로부터 호스트명을 설정 가능하게 되면(자), /proc 안의 jail 정보가 정확한 것으로 의존하고 있는 관리툴에 영향을 줍니다. 이 때문에, 신뢰할 수 없는 단체에 jail 에의 특권 액세스를 허락하고 있는 환경에 있어서는, 본기능은 무효화해야 합니다.

security.jail.socket_unixiproute_only
    jail 기능은, 단일의 IPv4 주소를 각 jail 에 bind 해, IPv4 공간에 있어서의 다른 네트워크 주소에의 액세스를 제한합니다. 이것들은, 호스트 환경에서는 액세스 가능한가도 알려지지 않습니다. 그렇지만 jail 는 현재로서는, jail 기능을 가지지 않는 다른 네트워크 프로토콜 스택에의 액세스를 제한할 수 없습니다. 이 때문에 디폴트에서는, jail 내의 프로세스는 PF_LOCAL, PF_INET, PF_ROUTE 도메인의 프로토콜에게만 액세스 가능하므로, UNIX 도메인 소켓, IPv4 주소, 루팅 소켓에 액세스 가능합니다. 다른 도메인에 액세스를 유효하게 하려면 , 본 MIB 엔트리를 0 으로 설정합니다.

security.jail.sysvipc_allowed
    본 MIB 엔트리는, jail 내의 프로세스가 System V IPC 원시적에의 액세스를 가지는지 아닌지를 지정합니다. 현재의 jail 실장에서는, System V 원시적은, 호스트 환경과 jail 환경 에 걸치는 단일의 이름 공간을 공유합니다. 이것은, jail 내의 프로세스가 jail 외의 프로세스나 다른 jail 내의 프로세스와 통신 가능한 (또 잠재적으로 방해도 가능한) 것을 의미합니다. 이 때문에, 이 기능은 디폴트로 무효입니다만, 본 MIB 엔트리를 1 으로 설정하는 것으로 유효하게 할 수 있습니다.

관련 항목
chroot(2), jail(2), procfs(5), rc.conf(5), sysctl.conf(5), halt(8), inetd(8), named(8), reboot(8), rpcbind(8), sendmail(8), shutdown(8), sysctl(8), syslogd(8)

역사
jail 유틸리티는 FreeBSD 4.0 그리고 처음 등장했습니다.

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

Robert Watson 하지만 추가의 문서를 써, 조금 버그를 찾아내 신규 기능을 조금 추가해, 유저 랜드의 jail 환경을 깨끗이 했습니다.

버그
jail 는 현재로서는, 강력한 관리 기구를 가지지 않습니다. 이것에는 예를 들면, jail 내의 전프로세스에 시그널을 보내는, procfs(5) 에 대해서 특정의 jail 정보를 ps(1) 경유로 액세스 할 수 있도록(듯이) 하는 것이 포함됩니다. 또, 주소 앨리어스(alias) 플래그를 추가해, 전 IP (INADDR_ANY) 위에서 listen 하는 것 같은 demon가 이 플래그를 가지는 주소에는 bind 하지 않게 하면 좋을지도 모릅니다. 이것에 의해, jail 내로부터 제공되는 서비스에 대해서 호스트 demon가 부담을 주지 않는, 안전한 호스트 환경을 구축 가능으로 합니다. 현재로서는, 가장 단순한 대답은 호스트상에서 제공하는 서비스를 최소화하는 것이어, 아마 간단하게 설정 가능한 inetd(8) (으)로부터 제공되는 것으로 한정하겠지요.