前回の続き

前提

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

今回の範囲

本記事では二つ目以降を扱う。
一つ目まではホストOSでの設定作業だったが、今回は実際にflavoursに設定を書き込むことになる。

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

flavoursを作ってみる

設定変更せずezjail-admin installしたなら、flavoursは/usr/jails/flavoursの下にある。
flavoursの下には、設定サンプルとしてexampleというディレクトリがある。

example flavoursをコピーして、“testsv"というflavoursを作る。

$ cd /usr/jails/flavours/
$ ls
example
$ sudo cp -pR ./example ./testsv
$ cd /usr/jails/flavours/
$ ls
example testsv
$

flavourの中身

testsvの下は以下のようなディレクトリ構成で、flavourとして使うファイルがあらかじめ格納される。
※以下、断りのない限り、./etc/rc.conf などと記載した場合には、ホストのではなく、flavourのファイルとする。

./etc:
make.conf
periodic.conf
rc.conf
rc.d

./etc/rc.d:
ezjail.flavour.example

./usr/local/etc:
sudoers

このうち、ezjail.flavour.exampleはjailホスト初回起動時に実行されるスクリプト。
ユーザ追加やpkgの追加はここで行う。

また、rc.confの中を見てみると、sendmailやrpcbindを停止する設定や、syslogdがsocketを掴まないようにする設定が最初から書かれている。

# Pretuned by German Engineers

# No network interfaces in jails
network_interfaces=""

# Prevent rpc
rpcbind_enable="NO"

# Prevent loads of jails doing their cron jobs at the same time
cron_flags="$cron_flags -J 15"

# Prevent syslog to open sockets
syslogd_flags="-ss"

# Prevent sendmail to try to connect to localhost
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

# Bring up sshd, it takes some time and uses some entropy on first startup
# sshd_enable="YES"

flavourの設定

ではtest flavourの設定を始める。
必要に応じてrc.confなどの設定ファイルを書き換えるのと、ezjail.flavour.exampleに、jailホストの初期設定スクリプトを書き込んでいく。
設定ファイルの書き換えには、ホストのファイルを参考にするとよいでしょう。

各種設定ファイルの書き換え

jailホストで動かしたいのはsshdとapache。
よって./etc/rc.confに以下二行を加えた。

apache22_enable="YES"
sshd_enable="YES"

また./usr/local/etc/sudoersに以下を追加。
ここはお好みで。

Defaults env_keep += "HTTP_PROXY FTP_PROXY"
Defaults env_keep += "PKG_PATH PKG_DBDIR PKG_TMPDIR TMPDIR PACKAGEROOT PACKAGESITE PKGDIR FTP_PASSIVE_MODE"
Defaults env_keep += "PORTSDIR PORTS_INDEX PORTS_DBDIR PACKAGES PKGTOOLS_CONF"

apache22の設定は…、これはjailホストが起動してからでいいか。

ezjail.flavour.exampleでのユーザ/グループ追加

ユーザvanilla、グループvanillaを追加する。
uid, gidは10010にし、vanillaはwheelグループに加える。

以下をezjail.flavour.exampleに追加
ユーザ追加スクリプトの詳細はこちら

なお、グループ追加を先にすること。
ユーザ追加のときにグループ指定をするから。

pw groupadd -q -n vanilla -g 10010
echo -n '$6$SALTsalt$gH47I0mRGadJVVlIpeTxVlYw.SjkPOZ7lJoGkqOyhyeUJ7PV5QWuYpIG6D5ggew6RXLpl1eA72TpgX5pGDpr/.' |\
pw useradd -n vanilla -u 10010 -s /bin/sh \
-m -d /home/vanilla -G vanilla -c 'vanilla user' \
-H 0
pw usermod vanilla -G wheel

ezjail.flavour.exampleでのpkg追加

pkg_add -rで必要なpkgを並べる。
./pkgにpkgを置いておく方法もあるのだが、依存関係も考慮して必要なpkgを揃えるのは面倒。
portsの場合は、basejailにportsのディレクトリを作っておく必要がある。今回は触れない。

以下のようにpkgを取得するサーバを指定してからpkg_add。
proxyが必要なら、それも。

#HTTP_PROXY="http://proxyserver:80/"; export HTTP_PROXY
PACKAGEROOT="ftp://ftp2.jp.freebsd.org/"; export PACKAGEROOT

pkg_add -r apache22 sudo bash portaudit portmaster tmux

シェルの変更

ユーザvanillaのシェルをbashに変えておくために以下を追加。

chpass -s /usr/local/bin/bash vanilla

rootパスワードの変更

rootのパスワードも変える。
nologinにすると、あとあとezjail-admin consoleでrootログインすることができなくなる。

echo -n '$6$SALTsalt$gH47I0mRGadJVVlIpeTxVlYw.SjkPOZ7lJoGkqOyhyeUJ7PV5QWuYpIG6D5
ggew6RXLpl1eA72TpgX5pGDpr/.' |\
pw mod user root \
-H 0

これでflavoursの設定は終わり。

flavourでjailホスト作成。

あとは簡単。
jailホストを作成するときに、-fでflavourを指定すればいいだけ。

$ sudo ezjail-admin create -f testsv example01 'em0|192.168.200.1'
/usr/jails/example01/.
/usr/jails/example01/./dev
/usr/jails/example01/./.cshrc
(中略)
/usr/jails/example01/./usr/local/etc/sudoers
18 blocks
$

起動。pkg_add -rのせいで少し時間がかかる。

$ sudo ezjail-admin start example01
Configuring jails:.
Starting jails: example01.
$

consoleに入ってみると、ユーザvanillaやpkgの追加がなされていることが確認できる。
同時にsshdも起動している。
apacheは設定も何もしていないので動いてないけど。

$ sudo ezjail-admin console example01

(中略)

root@example01:~ # finger vanilla
Login: vanilla Name: vanilla user
Directory: /home/vanilla Shell: /usr/local/bin/bash
No Mail.
No Plan.

root@example01:~ # pkg_info
apache22-2.2.25 Version 2.2.x of Apache web server with prefork MPM.
apr-1.4.8.1.5.2 Apache Portability Library
bash-4.2.45 The GNU Project's Bourne Again SHell
db42-4.2.52_5 The Berkeley DB package, revision 4.2
expat-2.1.0 XML 1.0 parser written in C
gdbm-1.10 GNU database manager
gettext-0.18.3 GNU gettext package
libevent-1.4.14b_2 Provides an API to execute callback functions on certain ev
libiconv-1.14_1 A character set conversion library
pcre-8.33 Perl Compatible Regular Expressions library
perl-5.14.4 Practical Extraction and Report Language
portaudit-0.6.1 Checks installed ports against a list of security vulnerabi
portmaster-3.17.1 Manage your ports without external databases or languages
sudo-1.8.7_1 Allow others to run commands as root
tmux-1.8_1 A Terminal Multiplexer
root@example01:~ # service sshd status
sshd is running as pid 2945.
root@example01:~ #

あとは、testsvをさらにコピーし、インストールするpkgを変えればどんどん使い回せる。
もちろん、その時はユーザやパスワードも変えよう。
セキュリティのためにjail使ってるのに、同じユーザ同じパスワードだったら全く意味がないし。

以上、flavoursの作り方。