« ちびくろさんぼ | メイン | amazon発 モーツアルトとF-16ファイティングファルコン »

[ FreeBSD ] jail

jailの作り方をメモしておく。
主に、otsune's FreeBSD memo :: thin jailの作り方を参考にした、というか、そのまま。

  1. jail環境用のディレクトリを作る。
    mkdir -p /jail/jailroot
  2. 作成したディレクトリ配下にディレクトリツリーを作成する。
    1. /etc/mtree配下のdistファイルなどを参考に、jail内で動作させるモノが必要とする構成のディレクトリツリーを記述したmtreeファイルを作成する。
    2. 作成したmtreeファイルをmtreeコマンドに喰わせてディレクトリを作成する。
      mtree -deU -f jail.dist -p /jail/jailroot
  3. 最小限のバイナリをjail用ディレクトリ内に配置する。
    1. Manuel Kasper氏のサイトminiBSD - reducing FreeBSDで提供されているmkmini.plというPerlスクリプトをダウンロードする。
      fetch http://neon1.net/misc/minibsd/mkmini.pl
    2. jail環境に必要なファイルの一覧を作成し、任意の名前でファイルに保存する。
      bin/[やbin/testのように実体が同じで名前だけが違うファイルは、コロン区切りで一行にまとめる。
      例)
      bin/csh:/bin/tcsh
      bin/date
      bin/echo
      bin/hostname
      bin/link:bin/ln
      bin/ls
      bin/mkdir
      bin/mv
      bin/pwd:bin/realpath
      bin/rm:bin/unlink
      bin/rmdir
      bin/sh
      sbin/ldconfig
      sbin/nologin:usr/sbin/nologin
      usr/bin/awk
      usr/bin/bunzip2:usr/bin/bzcat:usr/bin/bzip2
      usr/bin/chgrp:usr/sbin/chown
      usr/bin/cmp
      usr/bin/gunzip:usr/bin/gzcat:usr/bin/gzip
      usr/bin/egrep:usr/bin/fgrep:usr/bin/grep
      usr/bin/find
      usr/bin/limits
      usr/bin/nohup
      usr/bin/sed
      usr/bin/tar
      usr/bin/tee
      usr/bin/true
      usr/bin/touch
      usr/bin/uname
      usr/bin/dirname
      usr/bin/nice
      usr/sbin/mtree
      usr/sbin/pw
      usr/sbin/pwd_mkdb
      usr/share/misc/termcap
      libexec/ld-elf.so.1:usr/libexec/ld-elf.so.1
    3. mkmini.plを実行して、jail用ディレクトリ内にバイナリを配置する。
      perl mkmini.pl jail.files / /jail/jailroot
  4. 最小限のライブラリをjail用ディレクトリ内に配置する。
    1. mkmini.pl同様、Manuel Kasper氏のサイトで提供されているmklibs.plというPerlスクリプトをダウンロードする。
      fetch http://neon1.net/misc/minibsd/mklibs.pl
    2. mklibs.plを実行して、jail用ディレクトリ内に必要なライブラリの一覧を作成する。
      perl mklibs.pl /jail/jailroot > jail.libs
    3. mkmini.plに、上で作成したライブラリの一覧を喰わせ、jail用ディレクトリ内にライブラリを配置する。
      perl mkmini.pl jail.libs / /jail/jailroot
  5. 親環境側の/etc配下を整備する。
    1. 親環境側の/etc/hostsを編集し、jailのIPアドレスとホスト名などを追記する。
      例)
      192.168.1.3 jail.example.com
  6. jail側の/etc配下を整備する。
    1. jail側の/etc/hostsを作成し、jail自身のIPアドレスとホスト名などを記述する。
      例)
      192.168.1.3 localhost
      192.168.1.3 jail.example.com
    2. 親環境の/etcから、localtimeなどの必要そうなファイルをコピーする。
      copy -p /etc/localtime /jail/jailroot/etc/
  7. jail側のアカウント情報を整備する。
    1. 親環境の/etcから、master.passwdおよびgroupをコピーする。
      copy -p /etc/master.passwd /jail/jailroot/etc/
      copy -p /etc/group /jail/jailroot/etc/
    2. jail側の/etcにコピーしたmaster.passwdを編集し、最低限必要(と思われる)アカウントのみにする。
      この際に、rootなどのパスワードとログインシェルを無効化し、ログイン不可にしておく。
      例)
      root:*:0:0::0:0:Charlie &:/root:/usr/sbin/nologin
      toor:*:0:0::0:0:Bourne-again Superuser:/root:
      daemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
      operator:*:2:5::0:0:System &:/:/usr/sbin/nologin
      bin:*:3:7::0:0:Binaries Commands and Source:/:/usr/sbin/nologin
      kmem:*:5:65533::0:0:KMem Sandbox:/:/usr/sbin/nologin
      man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/usr/sbin/nologin
      nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
    3. 同様にjail側にコピーしたgroupを編集し、最低限必要(と思われる)グループのみにする。
      この際に、wheelグループ(など)から、不要なアカウントの情報を削除する。
      例)
      wheel:*:0:root
      daemon:*:1:
      kmem:*:2:
      sys:*:3:
      operator:*:5:root
      bin:*:7:
      man:*:9:
      nogroup:*:65533:
      nobody:*:65534:
    4. pwd_mkdbコマンドを実行し、パスワードデータベースを作成・更新する。
      pwd_mkdb -p -d /jail/jailroot/etc /jail/jailroot/etc/master.passwd
  8. jail側の共有ライブラリの検索パスを設定する。
    chroot /jail/jailroot ldconfig /lib /usr/lib /usr/local/lib

対象の配置方法について上記では触れていないが、"jail内でports/packagesからインストールする"などして配置を行う。
ちなみに、先にjailを構築した際には、親環境側にportsを使用してインストールし、その際のログを参照してjail側に配置した。

投稿者 Kobito : 2005年05月08日 02:34

このエントリーのトラックバックURL

トラックバックはご自由にどうぞ。報告は不要です。

http://kobito.dnsalias.com/kobito/mt/mt-application/mt-tb.cgi/24

このエントリーへのコメント

nVBLUJ

投稿者 Fgcpjieg : 2009年07月15日 22:31

コメントしてください

ご感想など残してもらえると励みになります




保存しますか?