- http://gihyo.jp/event/01/freebsd/2011/0113
- 発表: 河部展さん
- twitter: @hkawabe
- hkawabe1969@gmail.com
- http://hk-tech.homeip.net/
- 場所: 株式会社Speee セミナールーム
- 日時: 2011-01-13 20:00〜22:40
- 募集が直前だったのにもかかわらず17人ほどが参加。
- ustream配信は機器故障のため行なわれずビデオ録画のみ。後日アップロードされるとのこと。
- 当日の資料も多少手直ししたものが公開されるとのこと。
はじめに
- あっという間に今回の話がきまった。迂闊なことをいうと発表者にされちゃうよ!
- JAILの利用はホスティングやセキュリティ確保のために利用されることがおおい。
- またクラックされた..
- WordPressがやられた..
- Apacheの実行権限が盗られた。
- rm をしかけられたためコンテンツが全滅。
- ckrootkitで調べたところシロだったが何をされたかわからない。
- これはまずい! → JAILで分離しよう!
- 意外とJAILについてちゃんと書かれている記事がない。たいていはちょっと使ってみたところで話が終わっている。
JAILとは
- 仮想化ではないのでパフォーマンスはいいけど、OSがFreeBSDに限定されるので利用者を増やすことにはつながらない。
- ふつうにJAILをつくるとuid/gidがホストとかぶる。/etc/pw.confでminuid,maxuid,mingid,maxgidを設定することで変えることは可能。
- 用語: ホスト環境、JAIL環境。
- JAILでできないこと
- ipv6 ((いまはできるっぽい))
- icmp (raw socketがひらけない)
- bcast (netmask 255.255.255.255に設定するため)
- loopback ((いまのはjailのアドレスに読みかえてくれるっぽい?))
- NFS (デーモンを起動するときにjailアドレスを指定できないので)
- SYSV IPC
- mount/umount (ezjailからはzfsを操作できるらしい)
JAIL環境の構築
- ハンドブックにしたがってJAILをつくるには((http://www.freebsd.org/doc/handbook/jails-build.html)):
- make installworld DESTDIR=... でインスールされて
- make distribution DESTDIR=... で/etcの下が調整される。installworldではまだからっぽの状態。
- この段階でduでみる200MBくらい消費している。これを多いとみるか少ないとみるか...
- devfsもmountしないとps(1)がうごかない。kvmをつかうので。
JAIL環境の複製
- /usr/objをとっておく。必要なだけmake installworld+distributionする。
- cpする。ハードリンクが展開されてしまう問題がある。
- やってみると /rescue の下が膨れ上がった。205MBだったのだ834MBに。
- tarする。chflagsがおちる問題がある。
JAIL環境の設定
- /etc/passwdにはいらないアカウントがあるので削る。
- /etc/pw.confをつくっておくとuid/gidの範囲を指定できる。
- adduser/rmuserはpwコマンドをつかったスクリプト。
- ただし、一部のportsでは決め打ちでuid/gidを指定するものがあるので、そういうのには無力。
- /etc/wall_cmos_clock、/etc/localtimeも設定する。
JAILあれこれ
- JAILにアドレスをつけなくてもよくなっているが、つけないとどうなる? どいういう利用法があるのか?
- [goto] IPv4,IPv6スタックを完全分離する過程でJAILにアドレスをつけなくてもよくなった。それだけっぽい。
- jlsは動いているJAILしか見えない。設定だけして動かしていないものは出てこない。
- ezjail-admin listではみえるよ!
- ホスト環境からcpするとオペミスする原因 (パスを間違えてホスト環境を上書きする可能性)
- ネットワークを介してやるとか
- プロンプトをかえておくとか
- ネットワーク・デーモンはホスト環境・JAIL環境共にbind(2)で明示的にアドレスを制限しないとポートがぶつかってしまう。
- /etc/rc.d/jail start hogehoge でJAIL hogehogeだけを起動できる。
- /etc/rc.d/jail start hogehoge したあとに jail -l -u root hogehoge /bin/shするとおなじ環境がもういっこできてしまう?
- JAILホスト名とJAILアドレスは同じだがJAILIDが違うものが複数できるということ。
- JAILホスト名はFQDNの方がいい。文句をいうデーモンがある。
- sh /etc/shutdownだと/bin/shがのこる。
- jkillとか。
- pkill -j JDIとか。
- killall -j JIDとかもよい。ただ/var/run/jail_HOST_JIDがのこるけど。
「梅」
- handbookどおり
- namedを動かしたいだけで200MBも使うのはムダ。
「竹」
- du | xdu でみると /usr/libとか/usr/shareとかが大きい。
- /usr/includeはいらないだろうし。
- jail-remove.txtというのがある。消してもよいファイルの一覧。
- でも6.x-RELEASEでメンテがおわっている。
- つかいかた: cat jail-remove.txt | xargs rm -rf
- ホスト環境ではやらないように!
- 消せファイルは chflags noschg FILENAME でフラグをおとしてからrm。
- /sbin にあるのハード制御系のコマンドもいらない。
- geom/ifocnfig/zfsなどもいらない。
- /usr/libdataはいらない
- *_p.aはプロファイル用なのでこれもいらない。
- *.aもいらない。
- そもそもgccとかいらない。
- lddで使われているライブラリをさがす。消しすぎてしまったらもどす。の繰り返し。
- 実はifconfigは必要だったり。
- これはとっても時間がかかる作業。
- ディスクは251円/GB。
- 近所のマクドナルドは800円/h。
- ということは1GBを削るのは20分くらいの労働時間に相当する...
- 結局33MBくらいまで減らせた!
- くわしいことはここで: http://hk-tech.homeip.net/pcserver/jail.html
JAILでアプリケーション管理
- 必要なのをpackageにしてftpでインストールするのが簡単。
- portsで入れるなんてありえないよねー ((すみません、うちんところでは個々のJAILでmake+make installしてます))
運用・作業を省力化してくれるコマンド
ezjailかqjailがおすすめ。
- ezjail
- 設定は/usr/local/etc/ezjail.confに書く。
- JAILにつけるアドレスは/etc/rc.confに書く必要がある。ezjailの外でしなければいけない唯一の設定。
- ${ezjail_jaildir}/flavours/ezjail.flavour
- ここにスクリプトを書いておくとcreateのときに実行してくれる。
- zshをinstallするのにつかっている。
- qjail
- いちばんあたらしいやつ。まだportsにはいってない
- "q"はquick。
- なんかよくわからんが、第4世代らしい。
- 100のオーダーのJAILを扱うのを想定している。
- zone(グループみたいなの)があり、zone単位で起動する機能がある。
- qjail create -D 10 -I JAILNAME JAILIP を実行すると、いきなり10個できる。
- ホスト名は JAILNAME-1 〜 JAILNAME-10 という風に振られる。
- アドレスも JAILIP+1 〜 JAILIP+10 という風に。
[goto]ベースシステムにもそのうち何かしら入るとのこと。ezjailを元にしてqjailのように沢山のJAILを管理する機能がついたものになるそう。
そのほか 質疑応答 雑談 など
- jail -m でJAIL環境に接続できる。((jexecとおなじ?))
- JAILは仮想化とはちがって、JAILから外を見えないようにしているだけ。
- まだマージされてないが VPS (Virtual Private System) というもの開発されている
- solaris containerみたいなもの。zfsもあるし、open solarisの人たちをFreeBSDにひっぱりこめないか?
- CentOSをJAILで動かすのはむつかしくない。linux emulatorが実際の差を吸収している。
- unameを実行するとちゃんとcentosという。CentOSのunameコマンドを実行しているだけ。
- もともとはXENよりもお手軽にたくさんの環境をつくりたかったという動機らしい。
- リソース配分機能というのがあったらしいがマージされなかったそうな。
- PC-BSD由来のPBIは便利。portsをベースにしてインストールの仕方を工夫しているらしい。/optの下にインストールされる。そもそも/usr/localの下にインストールするのは *BSD では少数派。Linuxみたいに/usrにぶちこむのは論外。
- /etc/rc.dの下のスクリプトは手で起動しない。環境変数がブート時とは違ってしまうため。service(8)をつかおう。
- nullfsはマウント先(covered)のファイルシステムを隠す。足し算するのはunionfs。unionfsは安定しているはずだが、VFSの仕様に敏感なのでおかしくなるかも。