Jailの場合

ホスト側の環境

jailで閉じ込められた環境と、それを取り巻くホスト側の環境の役割を 区別して考える

ホスト側で問題になるのが、ホスト側で起動しているサービスが、 jail用に割り当てられたIPアドレスを listenしないようにすること。

namedや、sendmail、sshdなどの 常駐デーモン(inetdから起動されないデーモン)が しばしば問題になる。
これらのサービスを停止して、jail内だけで起動するようにするのが、 単純で分かりやすい解決法ではあるが、今回の用途にはいまひとつしっくりしない 方法である。

(将来考えが変わるかもしれないが)ホスト側でも、これらのサービスを 起動させたままにする手法を一応検討しておくことにする。

以下の説明では、ホスト側に割り当てられた IPアドレスを hip、 jail側に割り当てられたアドレスをjipとする。

sshdの場合

一番、単純な場合だ。
ホスト側では、/etc/ssh/sshd_config に、

ListenAddress hip
を追加する。

sendmailの場合

ホスト側の sendmail.mc に

DAEMON_OPTIONS(`Name=IPv4, Addr=hip, Family=inet')dnl
DAEMON_OPTIONS(`Name=IPv4, Addr=127.0.0.1, Family=inet')dnl
を追加して、sendmail.cf を作成する。
MSAについても同様の処理をする場合はさらに、
FEATURE(no_default_msa)dnl
DAEMON_OPTIONS(`Name=MSA, Addr=hip, Port=587, M=E')dnl
DAEMON_OPTIONS(`Name=MSA, Addr=127.0.0.1, Port=587, M=E')dnl
を追加する。

namedの場合

(named9の場合) /etc/namedb/named.conf に

listen-on hip;
を追加する。(注: 動作未確認)

(namedなんかは、どうせきちんとした管理者がいなければ設定できないの だから、無理してそれぞれのjailの中で独立に動かさなくてはいけない 必要性などあまりないんだよなぁ... それこそ集中管理にした方がよいサービスの典型かもしれない)

proxyを使うか、それとも...

sendmailも、namedもどちらも、本来の機能としてproxyの性格を備えているので、 特にproxyを考える必要はないだろう。
問題は、sshで、外部から hipに sshでアクセスしてきた場合に、これらを jail環境の各IPアドレスのサーバーへのアクセスに振り分ける必要がある。

delegateを使った場合

ユーザー名だけでは認証情報が不足しているので、ユーザー名+ホスト名の形で 認証を行うことになる。

ホスト名の部分に勝手なホストを許すと悪用される可能性が出てくるので この部分は特定のホスト名だけを許すように制限する。

問題は、deleateのようなproxyで sshポートを受けるようにすると、 ホストそのものへ sshでアクセスしたい場合には、ホスト上では別のポートで sshdを動かす必要がある(? 逃げ道がある?)ことだ。

(詳細はまだ)

テクニカルノート

FreeBSD5.xになってjailの設定方法がかなり変わってきているので、 備忘用のメモ。
5.xになってから、dfなどのコマンドで、jailが使用していないマウントポイントが 表示されないようになった。

/etc/rc.confのjail関連の記述法

devfs_enableとしないと外部から telnetやsshができない。

ifconfig_dc0_alias0="inet 192.168.2.1 netmask 0xffffffff"
ifconfig_dc0_alias1="inet 192.168.2.2 netmask 0xffffffff"

jail_enable="YES"
jail_list="jail1 jail2"

jail_jail1_hostname="jail1.example.jp"
jail_jail1_ip="192.168.2.1"
jail_jail1_rootdir="/var/jail1"
jail_jail1_exec="/bin/sh /etc/rc"
jail_jail1_devfs_enable="YES"
jail_jail1_procfs_enable="YES"

jail_jail2_hostname="jail2.example.jp"
jail_jail2_ip="192.168.2.2"
jail_jail2_rootdir="/var/jail2"
jail_jail2_exec="/bin/sh /etc/rc"
jail_jail2_devfs_enable="YES"
jail_jail2_procfs_enable="YES"

jail環境下でのping

jail環境内から、pingを有効にするためには、

sysctl security.jail.allow_raw_sockets=1
とする。(FreeBSD5.3以降のみ)

raw socketがデフォールトで使えないのは何かセキュリティ上の理由があるのかも しれないので、at your own riskで...

rc.conf と /etc/rc.d/jail で設定するなら、/etc/rc.confに次を追加

jail_allow_raw_sockets="YES"

/etc/rc.d/jailに次を追加

    echo -n ' allow_raw_sockets='
    if checkyesno jail_allow_raw_sockets ; then
        echo -n 'YES'
        ${SYSCTL_W} 1>/dev/null security.jail.allow_raw_sockets=1
    else
        echo -n 'NO'
        ${SYSCTL_W} 1>/dev/null security.jail.allow_raw_sockets=0
    fi

jail環境下でのsendmail配送

jail1.example.jp, jail2.example.jp を jail環境下に作ったホストとするとき、 jail1.example.jp宛てののメールを jail1.example.jpに振り分けるときの設定。

標準の設定だと、RuleSet0を適用する際に < @ jail1 . example . jp . > が $# local に置き換えられてしまいうまく配送できない。

sendmail.mc

define(`confDONT_PROBE_INTERFACES')
FEATURE(access_db, `hash -o -T /etc/mail/access')
access
To:jail1.example.jp	RELAY
To:jail2.example.jp	RELAY
だけでいいのかも。

http proxy

apache の proxy 機能を使ってもよいけれど、ここはすなおに、squidで中継する。

http_port 192.47.37.15:80
icp_port 0

cache_dir ufs /usr/local/squid/cache 100 16 256
cache_effective_user squid
visible_hostname www.example.jp
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_single_host off
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

acl all src 0.0.0.0/0.0.0.0
acl reverse     dst 192.47.37.112/255.255.255.248
acl me  dst 192.47.37.15 127.0.0.1
acl local       src 192.47.37.0/255.255.255.128 127.0.0.1

http_access allow local
http_access allow reverse
http_access deny all

ここで、192.47.37.15は外側のIPアドレス。192.47.37.112/255.255.255.248は jailに割り当てたIPアドレスの範囲

local を定義しているのは、内側からは透過プロクシとして動作させるための準備。 とりあえずはなくてもよい。