jailで閉じ込められた環境と、それを取り巻くホスト側の環境の役割を 区別して考える
ホスト側で問題になるのが、ホスト側で起動しているサービスが、 jail用に割り当てられたIPアドレスを listenしないようにすること。
namedや、sendmail、sshdなどの 常駐デーモン(inetdから起動されないデーモン)が
しばしば問題になる。
これらのサービスを停止して、jail内だけで起動するようにするのが、
単純で分かりやすい解決法ではあるが、今回の用途にはいまひとつしっくりしない
方法である。
(将来考えが変わるかもしれないが)ホスト側でも、これらのサービスを 起動させたままにする手法を一応検討しておくことにする。
以下の説明では、ホスト側に割り当てられた IPアドレスを hip、 jail側に割り当てられたアドレスをjipとする。
一番、単純な場合だ。
ホスト側では、/etc/ssh/sshd_config に、
ListenAddress hipを追加する。
ホスト側の sendmail.mc に
DAEMON_OPTIONS(`Name=IPv4, Addr=hip, Family=inet')dnlを追加して、sendmail.cf を作成する。
DAEMON_OPTIONS(`Name=IPv4, Addr=127.0.0.1, Family=inet')dnl
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
(named9の場合) /etc/namedb/named.conf に
listen-on hip;を追加する。(注: 動作未確認)
(namedなんかは、どうせきちんとした管理者がいなければ設定できないの だから、無理してそれぞれのjailの中で独立に動かさなくてはいけない 必要性などあまりないんだよなぁ... それこそ集中管理にした方がよいサービスの典型かもしれない)
sendmailも、namedもどちらも、本来の機能としてproxyの性格を備えているので、
特にproxyを考える必要はないだろう。
問題は、sshで、外部から hipに sshでアクセスしてきた場合に、これらを
jail環境の各IPアドレスのサーバーへのアクセスに振り分ける必要がある。
ユーザー名だけでは認証情報が不足しているので、ユーザー名+ホスト名の形で 認証を行うことになる。
ホスト名の部分に勝手なホストを許すと悪用される可能性が出てくるので この部分は特定のホスト名だけを許すように制限する。
問題は、deleateのようなproxyで sshポートを受けるようにすると、 ホストそのものへ sshでアクセスしたい場合には、ホスト上では別のポートで sshdを動かす必要がある(? 逃げ道がある?)ことだ。
(詳細はまだ)
FreeBSD5.xになってjailの設定方法がかなり変わってきているので、
備忘用のメモ。
5.xになってから、dfなどのコマンドで、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を有効にするためには、
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
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 -Taccess/etc/mail/access')
To:jail1.example.jp RELAY To:jail2.example.jp RELAYだけでいいのかも。
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 を定義しているのは、内側からは透過プロクシとして動作させるための準備。 とりあえずはなくてもよい。