サーバいじくり雑記

2014年2月17日

一歩進めたjail.confの書き方

Filed under: FreeBSD — bompopo @ 8:05 午後

さてさて昨日は、今どきのjailの設定は「jail.conf」に書くのです!と雑記しました。
今回は「jail.conf」の書き方を便利な変数機能を使ってもう少し煮詰めてみましょう。
jailの設定で面倒なのはjail用のネットワーク定義や事前事後実行項目です。そういうのをぱぱっとまとめてみましょう。

例として2つの外部用と内部用のサーバをjailすることにします。
public_serverは権限絞った状態のパラメータでem0デバイスのaliasのIPアドレスで起動します。
private_serverは権限をゆるめて、chrootできるようにjail内でdevfsをmountできるようにしたり、SysV等色々なサーバで必要になる権限を有効化しています。

共通の設定のところで、指定のNICに指定のIPアドレスでaliasしたり、stop時に破棄したり、hostnameをjail名そのまま使ったり、ログの設定とか共通化できるところをバシバシ出してます。注目は変数を使える点でして、これにより変則的な共通設定が可能になります。

/* 共通設定 */
allow.nomount;
allow.set_hostname = 0;
allow.sysvipc      = 0;
allow.raw_sockets  = 0;
exec.prestart     += "ifconfig ${nic} inet ${ip4.addr} add";
exec.start        += "/bin/sh /etc/rc";
exec.stop          = "/bin/sh /etc/rc.shutdown";
exec.poststop     += "ifconfig ${nic} inet ${ip4.addr} -alias";
exec.consolelog    = "/var/log/jail_${name}_console.log";
host.hostname      = "${name}";
mount.devfs;
mount.fstab        = "/etc/fstab.${name}";
mount             +=  "procfs /usr/local/jails/${name}/proc procfs rw 0 0";
devfs_ruleset      = "4";
path               = "/usr/local/jails/${name}";


/* public_server
 * 外部公開特定目的サーバ
*/
public_server {
        $nic = "em0";
        ip4.addr += "192.168.0.1/32";
}


/* private_server
 * 内部公開多目的サーバ
*/
private_server {
        $nic = "em1";
        ip4.addr += "172.16.0.1/32";
        devfs_ruleset = "50";
        allow.mount = 1;
        allow.mount.devfs = 1;
        allow.raw_sockets  = 1;
        allow.socket_af = 1;
        allow.sysvipc = 1;
        enforce_statfs = 1;
}

次は「devfs.rules」を少し工夫してみます。iscsiターゲットサーバ用のzvolやdhcpd用にbpfデバイスをunhideして権限変更するルールを作り、それをincludeしました。includeすることができるので共通の設定項目を関数のように外に出せます(しかしincludeできるのは1段階のみで、多段のincludeはサポートされていません)。

[devfsrules_unhide_bpf=20]
add path 'bpf*' unhide

[devfsrules_unhide_zvol=30]
add path 'zvol'            unhide mode 0550 group operator
add path "zvol/storage*"   unhide mode 0550 group operator
add path "zvol/storage*/*" unhide mode 0660 group operator

[devfsrules_privateserver_jail=40]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add include $devfsrules_unhide_bpf    # for dhcpd
add include $devfsrules_unhide_zvol   # for iscsi target
add path zfs unhide

さて、さらっと前述しましたが、private_serverはdevfsをmountできるように設定しました。そこで少し心配になるのはjail内部でdevfsをmountしたらhideしたデバイスがみえちゃうんじゃ?というところ。
まぁ安心してください。jail作るときに指定したルール以上のものはどうやってもunhideできないようになってます。この例でいうと40番のルールでjailを作った場合、そのjail内でdevfsをmountしても標準のものに加えてbpfとzvol以外のデバイスは見えません。安心だ!!

jailネットワーク周りの設定を「jail.conf」に書くことができるようになったことで、今まで「rc.conf」に書いていてなんか雑な設定ファイルになっていた人もスッキリすることができます。
もちろん前述したalias使う方法じゃなくてvnet使う方法も同じような感じで記述が可能です。

※この例の記述方法だとipアドレス複数割り当てる場合に問題が発生しますが、そこは工夫次第でなんとかなります

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す