Debian-chrootメモ

メリット

  • 立ち上げているサービス(SMTPやHTTPD)が攻撃され、万が一侵入されても、chrootされている仮想ROOT内のみ影響を受けることになり、他のサービスを含めシステム全体にまで影響を与えることがない。
  • システムが小分けにして管理されるため、パスの検索等による待ち時間が短く、結果としてシステム全体が軽快に動作する。

デメリット

  • 各chrootディレクトリ内でaptを実行しないといけなくなる。
  • 複数サービス同士がUNIXドメインソケットを使用する場合は双方のサービスを同じchroot環境に入れておかなければならない(デメリット、というほどのものではないが...)
  • 各chroot環境下にライブラリ、実行ファイルを置かないといけないため、それなりにディスク容量が必要になる。

debootstrap

  • Debianでchroot環境を構築するツール。
    # debootstrap woody ./chroot-dir
    を実行することにより、パッケージがダウンロードされchroot環境が作成される。
  • Debootstrapにより作成された環境は、余計なパッケージも多く含まれているため、
    # chroot /chroot-dir apt-get remove --purge hogehoge
    によりできるだけ削除するのがよいと思われる。 ちなみにインストールは
    # chroot /chroot-dir apt-get install hogehoge
  • ちなみに僕が調べてみた最小構成(依存関係で怒られない状態)は以下のとおり(woodyの場合)
     apt            
     base-files     
     base-passwd    
     bash           
     bsdutils       
     debianutils    
     diff           
     dpkg           
     e2fsprogs      
     fileutils      
     findutils      
     grep           
     gzip           
     hostname       
     libc6          
     libcap1        
     libdb3         
     libncurses5    
     libpam-modules 
     libpam-runtime 
     libpam0g       
     libstdc++2.10- 
     login          
     mawk           
     mount          
     ncurses-base   
     ncurses-bin    
     perl-base      
     sed            
     shellutils     
     slang1         
     sysvinit       
     tar            
     textutils      
     util-linux     

ここまでできた時点で....

  • tarで固めておいて、chroot-base-woody.tar.gzなどと名前を付けておけば、新しいサービスを導入するとき、chroot環境の構築の手間を省くことができるので、非常に便利。

BindMount?

  • PostfixやIMAP等でHomeディレクトリがchroot-jail内から見えないといけない場合、BindMount?をしなければならない。
  • chrootする前に実行する必要あり
# mount --bind /home /chroot-dir/home

procfs

  • procをマウントする必要あり。
# chroot /chroot-dir mount -t proc none /proc

devpts

  • sshによりchrootの領域に直接ログインするのであれば、/dev/ptsをマウントする必要がある。
# chroot /chroot-dir mount -t devpts none /dev/pts

syslogについて

  • woodyのsysklogdはリモートログを収集しようがしまいがudp/514を開いてしまうため、親ルート側のsyslogのポートと競合してしまう。
  • syslog-ngを使用することにより、ポートが開かなくなるため、この問題を回避できる。
  • /chroot-dir/etc/syslog-ng/syslog-ng.confの内容は以下のとおり
     options { long_hostnames(off); sync(0); };
     
     source src { unix-dgram("/dev/log"); internal(); };
     
     destination loghost {
             udp("127.0.0.1" port(514));
     };
     
     log {
           source(src);
           destination(loghost);
     };
  • 親ルート側の/etc/syslog.confでリモートからログを受信するために/etc/init.d/sysklogd内でSYSLOGD="-r"と設定する。(woody/sid双方とも同様)

init-script

  • 上記のことをふまえた上で、起動スクリプトは以下のような感じで。
ROOT=/chroot-dir
case "$1" in
   start)
      mount --bind /home $ROOT/home
      # change working directory
      cd $ROOT
      chroot $ROOT mount -t proc none /proc
      chroot $ROOT /etc/init.d/syslog-ng start
      chroot $ROOT /etc/init.d/postfix start
      ;;
   stop)
.....

esac

興味深い記事

  • How to break out of a chroot() jail
    • work directoryをchroot後の"/"の位置にしてからchrootを実行する
    • 結局、アプリケーションのprivilageをUID=0以外で動作するようにしなければ完全とはいえない

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-05 (木) 13:47:51 (4125d)