[FreeBSD] ezjailを試そう
ezjailで作るjailの基本設定を変えよう
からの続き

以下、「ホスト」とはjailを動かすおおもとのマシンを表す。親。
「Jailホスト」はjail環境で動くホストを表す。子。

ezjailのflavoursとは。

新しいJailは、真っ新(まっさら)のFreeBSDで作られる。ezjailは、Jailホストの面倒な設定作業を簡素化する仕組みがある。これがflavoursである。
flavoursでは、予め設定された内容に従って、ファイルをコピーしたり、パッケージをインストールしたり、スクリプトを実行できる。
たとえば、rc.conf, make.conf, periodic.confやsudoersなどである。

以下より意訳。
http://erdgeist.org/arts/software/ezjail/#Flavours

「flavours」の場所

特に指定をしなければ、ezjail-admin installで/usr/jails/flavoursに格納される。
初期状態では、サンプルとして/usr/jails/flavours/exampleが用意されている。
これを参考に自分用のflavoursを作ればよい。

「flavours」の中身

exampleの中をのぞくと、/usr/jails/flavours/exampleを起点に、以下のファイルがある。

./usr/local/etc/sudoers
./etc/make.conf
./etc/periodic.conf
./etc/rc.conf
./etc/rc.d/ezjail.flavour.example

./etcや./usr/local/etcに必要なファイルを入れておけばよいというわけ。
ところでezjail.flavour.exampleだけは特殊。

「ezjail.flavour.example」とは

jailホストが初めて起動する際に実行されるスクリプト。
ここに初期設定で必要なこと、たとえばユーザ・グループの追加やら、パッケージの追加やら、つらつら書いておけばよい。
(中身を見ればわかるがezjail.flavour.example自体を消す処理も入っている)

jailホストの仕様検討

実際にflavousの作成に入る前に。
同じHW上で複数のサービスを行うため、jailホストを稼働させるまえに何点か考えておかないといけないことがある。
仕様検討というのは仰々しいが、あとあと効いてくるので真面目にやる。
とりあえず以下を決めておけばよいかな、と。

  1. ホストで動かしたいサービス
  2. Jailホストで動かしたいサービス
  3. Jailホストに追加するユーザ/グループ
  4. Jailホストで使用するソフトウェア

一番注意すべきことは、ポートのListenである。
ホストとJailホストには別々のIPアドレスを付与するものの、サーバソフトウェアが個々のIPアドレスを意識するとは限らない。
だからして「動かしたいサービス」はJailホストだけでなく、ホストも含めて考えることが必要だし、それぞれで動かすサーバソフトウェアには、ListenするIPアドレスを明示する必要がある。

以下のように設定した。

  1. ホストで動かしたいサービス
    →sshdのみ。
  2. Jailホストで動かしたいサービス
    →apache, sshd
  3. Jailホストに追加するユーザ/グループ
    →vanilla:vanilla
  4. Jailホストで使用するソフトウェア
    →apache22, sudo, bash, portaudit, portmaster, tmux

このうち、最初の件を除いた残りの三つは、すべてflavoursで設定する。
ではひとつずつ。

ホストで動かしたいサービス

sshdだけで良いとした。
ではホストで動いているサービスはなんだろうか。sockstat -l4でリストできる。

$ sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sendmail 1002 3 tcp4 127.0.0.1:25 *:*
root sshd 992 4 tcp4 *:22 *:*
root syslogd 904 7 udp4 *:514 *:*

sendmailが動いている。これは不要。
sshdは動いてても構わないが、Local Addressが*:22になっている。
これはIPアドレスを意識せず、ポート22に届いたものはすべて自分宛と認識するということ。Jailホストに来た接続もこちらに繋がってしまう。これはまずい。
syslogdも*:514で動いている。これも何らかの対応が必要。

ホストのサービスの調整(sshd)

sshdはsshd_configで以下の行を追加し、ホストのIPアドレスでのみListenするように。

ListenAddress <ホストのIPアドレス>

sshdを再起動するとsockstat -l4の表示が変わる。

$ sudo service sshd restart
Stopping sshd.
Starting sshd.
$ sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sshd 1845 3 tcp4 192.168.154.128:22 *:*
root sendmail 1002 3 tcp4 127.0.0.1:25 *:*
root syslogd 904 7 udp4 *:514 *:*

ホストのサービスの調整(sendmail)

sendmailの停止はこちらを参照。
再起動、あるいはservice sendmail stopでよい。

$ sudo service sendmail stop
Stopping sendmail.
Stopping sendmail_clientmqueue.
$ sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sshd 1845 3 tcp4 192.168.154.128:22 *:*
root syslogd 904 7 udp4 *:514 *:*
$

ホストのサービスの調整(syslogd)

syslogdは、デフォルトだと"-s"オプションで動いているはず。
“-s"は、「リモートマシンからのログを受け取らない」というもの。
これで不自由してないのなら、"-ss"にしてポートすら開けないようにしてもいい。
“-ss"にしないのなら、念のため”-b"オプションでホストのIPアドレスを明示しておくとよい。

SYSLOGD(8) FreeBSD System Manager's Manual SYSLOGD(8)

NAME
syslogd -- log systems messages

-s Operate in secure mode. Do not log messages from remote
machines. If specified twice, no network socket will be opened
at all, which also disables logging to remote machines.

-b :service
Bind to a specific address and/or port. The address can be spec-
ified as a hostname, and the port as a service name. If an IPv6
address is specified, it should be enclosed with `[' and `]'.
The default service is `syslog'.

/etc/rc.confに以下を追記する場合

syslogd_flags="-ss"
$ sudo service syslogd restart
Stopping syslogd.
Starting syslogd.
$ sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root sshd 992 3 tcp4 192.168.154.128:22 *:*
$

以下を追記した場合

syslogd_flags="-b 192.168.154.128"
$ sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root syslogd 1540 6 udp4 192.168.154.128:514 *:*
root sshd 992 3 tcp4 192.168.154.128:22 *:*

ホストのサービスの調整(inetd.conf)

もしホストでinetd.confを動かしているのなら、-aオプションでホストのIPアドレスを与えること。

INETD(8) FreeBSD System Manager's Manual INETD(8)

NAME
inetd -- internet ``super-server''

-a Specify one specific IP address to bind to. Alternatively, a
hostname can be specified, in which case the IPv4 or IPv6 address
which corresponds to that hostname is used. Usually a hostname
is specified when inetd is run inside a jail(8), in which case
the hostname corresponds to that of the jail(8) environment.

inetdのデフォルトオプションは”-wW -C 60″なので、以下のようにして/etc/rc.confに追加

inetd_flags="-wW -C 60 -a <ホストのIPアドレス>"

サンプルrc.conf

# kill sendmail
sendmail_enable="NO"    # Run the sendmail inbound daemon (YES/NO).
sendmail_submit_enable="NO"     # Start a localhost-only MTA for mail submission
sendmail_outbound_enable="NO"   # Dequeue stuck mail (YES/NO).
sendmail_msp_queue_enable="NO"  # Dequeue stuck clientmqueue mail (YES/NO).

# prohibit syslog to open a socket
syslogd_flags="-ss"
# make syslog listen on specific ip address
# syslogd_flags="-b x.x.x.x"

# make inetd listen on specific ip address
# inetd_flags="-wW -C 60 -a x.x.x.x"

意外に長くなったのでここまで。
続きは以下。

ezjailのflavoursを使ってみよう その2