FreeBSD > jail fulltree 8.2-Release (i386+512M)

jail fulltree 8.2-Release on i386


まだ書きかけです


i386機にjail fulltreeを導入した時のまとめです
今後、このfulltreeを使用して minitree を作成していきます


mainte jail fulltree 8.2-RELEASE
mainte jail fulltree 8.1-RELEASE
otsune's FreeBSD memo :: jailの作り方

以上のサイトを参考にさせていただいております
と、wirednoize様のサーバポリシーのどっぷりな感じです



mainte 用 jail fulltree の構築


HOST環境での作業

base バイナリの構築

ftp サーバよりrelease/baseファイルを取得して、jail環境を構築します

  • base バイナリ展開用ディレクトリを作成します
    # mkdir /tmp/base
    # cd /tmp/base
    
  • CHECKSUM.MD5を利用してbase全ファイル名を検出し、所得します
    日本のミラーサーバは数字なし[ftp]と2-9の番号つき[ftp2]~[ftp9]がありますので、適宜変更してください
    # fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/releases/i386/8.2-RELEASE/base/CHECKSUM.MD5
    # cat CHECKSUM.MD5 | sed 's/^MD5 (//' | sed 's/).*$//' | \
    sed 's/^/ftp:\/\/ftp.jp.freebsd.org\/pub\/FreeBSD\/releases\/i386\/8.2-RELEASE\/base\//'\
    | xargs -L1 fetch
    
    
  • jail fulltree 用ディレクトリを作成します
    zfs でディレクトリを切り分けます
    # zfs create -o mountpoint=/home/mainte82 tank0/jail/mainte82
    
  • base バイナリを展開します
    # setenv DESTDIR "/home/mainte82"
    # chmod u+x install.sh
    # ./install.sh
    # unsetenv DESTDIR
    

jail fulltree の初期設定

  • 設定のため、起動させます
    # mount -t devfs devfs /home/mainte82/dev
    # jail /home/mainte82 test.localdomain 192.168.100.82
    

    JAIL環境での作業

  • 起動時の警告を抑制するため、空の/etc/fstabファイルを作成します
    # touch /etc/fstab
    
  • sendmailの警告を抑制するため/etc/mail/aliases.dbを生成します
    # newaliases
    
  • rc.confの設定をします
    # vi /etc/rc.conf
    
    network_interface=""
    rpcbind_enable="NO"
    inet_enable="NO"
    syslogd_flags="-ss"
    sshd_enable="NO"
    sendmail_enable="NO"
    sendmail_submit_enable="NO"
    sendmail_outbound_enable="NO"
    sendmail_msp_queue_enable="NO"
    
  • resolv.conf の設定をします
    # echo 'nameserver 192.168.1.251' > /etc/resolv.conf
    
  • root のログインシェルを変更します
    jexec を使用して jail fulltree に入るので ログインシェルを無しにします
    # vipw
    
    root::0:0::0:0:Charlie &:/root:/usr/sbin/nologin
    toor:*:0:0::0:0:Bourne-again Superuser:/root:/usr/sbin/nologin
    
    上記2行のみ変更
    
  • タイムゾーンを変更します
    # cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    
  • crontab を編集します
    # vi /etc/crontab
    
    #
    SHELL=/bin/sh
    PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
    HOME=/var/log
    #
    #minute hour    mday    month   wday    who     command
    1       0       *       *       *       root    newsyslog
    
    その他は削除
    
  • newsyslog を編集します
    # vi /etc/newsyslog.conf
    
    # logfilename    [owner:group] mode count size when  flags [/pid_file][sig_num]
    /var/log/all.log               600  7     *    @T00  -
    
    その他は削除
    
  • ログを設定します
    # echo '*.* /var/log/all.log > /etc/syslog.conf
    # touch /var/log/all.log
    # chmod 600 /var/log/all.log
    
  • /etc/hosts.allowをすべて拒否に変更します
    # echo 'ALL : ALL : deny' > /etc/hosts.allow
    
  • /etc/make.confを設定します
    X等のグラフィック関係、IPV6など使用しないものを無効にします
    マルチバイト関数はないとハマル事とのことなので、入れています
    SUPHOST と MASTER_SITE_OVERRIDE は、CVSup サイト一覧 と ftp サイト一覧 から日本のサイトを選択します
    WRKDIRPREFIX と DISTDIR の設定は、/usr/ports ディレクトリをを綺麗にしておくのに必須とのこと
    CPUTYPE CFLAGS COPTFLAGS を効率化のために設定します
    今回はCPUがceleron D 2.53MhzなのでCPUTYPEi686にしましたが、/usr/share/mk/bas.cpu.mkを見てるとpentium4でもいけるのかもしれません
    # vi /etc/make.conf
    
    WITHOUT_X11=yes
    WITHOUT_GUI=yes
    NO_X=true
    WITHOUT_IPV6=yes
    WITH_MBSTRING=yes
    SUPHOST=cvsup3.jp.freebsd.org
    MASTER_SITE_OVERRIDE=ftp3.jp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}
    WRKDIRPREFIX=/tmp
    DISTDIR=/tmp/distfiles
    CPUTYPE=i686
    CFLAGS= -O2 -fno-strict-aliasing -pipe
    COPTFLAGS= -O2 -fno-strict-aliasing -pipe
    
  • Jail環境での作業を終了します
    # exit
    

jail fulltree の稼動


HOST環境での作業

自動起動設定

  • jail共通起動停止シェルスクリプトの設置
    jail共通起動停止シェルスクリプトから最新の common_Njailstp.file.?.?.gz をダウンロードします
    解凍して common_Njailstp.file にファイル名を変更後、/usr/local/etc/rc.d におきます
  • 自動起動用スクリプトの設定
    # vi /usr/local/etc/rc.d/mainte82_jail.sh
    
    #!/bin/sh
    #---------------------------------------
    Jid="82"
    Secu="-1"
    NtwkIF="lo0"
    HsFQDN="mainte82.localdomain"
    IPAdrs="192.168.1.82"
    BDcast="192.168.1.82"
    NTmask="255.255.255.255"
    PsName="mainte82"
    ChRoot="/home/$PsName"
    MTdpnf="$ChRoot/dev
    /tmp/$PsName/tmp $ChRoot/tmp"
    #----------------------------------------------------------------------
    BFsrtJ="/bin/mkdir -p /tmp/$PsName/tmp/distfiles
    /bin/chmod 1777 /tmp/$PsName/tmp
    /sbin/mount -t zfs tank0/ports /home/$PsName/usr/ports"
    AFsrtJ=""
    BFstpJ="jexec Jid /bin/sh /etc/rc.shutdown"
    AFstpJ="/bin/rm -rf /tmp/$PsName"
    Jstcom="/bin/sh /etc/rc"
    #---------------------------------------
    . /usr/local/etc/rc.d/common_Njailstp.file
    jailstartop $1
    
  • 実行権限付与
    chmod u+x /usr/local/etc/rc.d/mainte82_jail.sh
    
  • 起動・停止
    /usr/local/etc/rc.d/mainte82_jaile.sh start
    /usr/local/etc/rc.d/mainte82_jaile.sh stop
    

jail fulltree の整備

  • maintenance 用 jail fulltree を起動します
    # /usr/local/etc/rc.d/mainte82_jail.sh start
    # jexec 82 /bin/tcsh
    

portsnap で ports の更新


JAIL環境での作業

  • portsnap.conf の確認
    普通は変更の必要が無いのでファイルがあるかのみ確認します
    通常ならインストールされています
    # ls /etc/portsnap.conf
    
  • portsnap を起動して ports の更新をします
    自動メンテナンスの設定をしますので、2回目以降のコマンドは手動で更新する場合に使用します
    初回
    # portsnap fetch && portsnap extract && portsnap update
    
    2回目以降
    # portsnap fetch && portsnap update
    

portsの自動メンテナンス

portsnap fetch の代わりに portsnap cron という cron 動作用のコマンドがあり、1秒から3600秒の間でランダムに時間を遅らせる機能を持っているので、それを使ったスクリプトを記述します
portsnap の実行ログを保存します
後で、ログローテーションの対象にするので、ひたすら追記書きさせます
portsnap を cron で流して ports の自動更新をします。

  • portsnap の自動更新スクリプト
    # mkdir /root/update
    # vi /root/update/ports_update_cron.sh
    
    #!/bin/sh
    LogFile="/var/log/ports_update.log"
    echo "### `date` ###" >> $LogFile
    /usr/sbin/portsnap cron >> $LogFile 2>&1
    /usr/sbin/portsnap update >> $LogFile 2>&1
    echo "### `date` ###" >> $LogFile
    
  • portsnap の手動更新スクリプト
    # vi /root/update/port_update.sh
    
    #!/bin/sh
    /usr/sbin/portsnap fetch
    /usr/sbin/portsnap update
    
  • 実行権の付与
    # chmod u+x ports_update.sh ports_update_cron.sh
    
  • crontab の設定
    適当な頻度で ports の自動更新が走るように設定を追記します
    vi /etc/crontab
    
    # portsnap ports_update
    1    9    *    *    1,4 root /root/update/ports_update_cron.sh > /dev/null 2>&1
    
  • ログローテーション設定
    portsnap のログローテーション設定を 追記します
    vi /etc/newsyslog.conf
    
    # logfilename    [owner:group] mode count size when  flags [/pid_file][sig_num]
    /var/log/all.log               600  7     *    @T00  -
    /var/log/ports_update.log      600  7     1    *     
    

ports メンテナンス結果のメール送信

ports 更新の有無を簡単に知る為に、定期的に portversion のコマンド結果をメールで送信します
今の設定ではメールを送れないので、後の「sendmail の設定」も必ず行ってください

  • mail コマンドを使ってメールを送信するスクリプト
    # vi portvermail.sh
    
    #!/bin/sh
    #------------------------------------------
    MailTO="root"
    MilTmp=/tmp/portversion.txt
    MilHed="mainte portversion info"
    #------------------------------------------
    echo $MilHed > $MilTmp
    echo "" >> $MilTmp
    /usr/sbin/pkg_version -v >> $MilTmp
    cat $MilTmp | /usr/bin/mail -s "$MilHed" $MailTO
    
  • 実行権の付与
    chmod u+x /root/update/portvermail.sh
    
  • ports_update_cron.sh へ追加
    ports の自動更新後、上のスクリプトが動くように追加します
    echo '/root/update/portvermail.sh' >> /root/update/ports_update_cron.sh
    

pkg_replace のインストール

ports の更新やインストールに pkg_replace を入れます
portupgrade では、依存パッケージがたくさん入ってしまいますが、pkg_replace なら一切入りません

  • ports からインストール
    # cd /usr/ports/ports-mgmt/pkg_replace
    # make install cleanハッシュテーブルの再構築
    
  • pkg_replace をすぐ使えるようにします。
    rehash
    

portconf のインストール

portをインストールする際の設定をmake install でも同じくするためのツールだそうです

  • pkg_replace コマンドでインストールします。
    # pkg_replace -vcCN ports-mgmt/portconf
    

portaudit のインストール

ports ソフトウェアの脆弱性をチェックします。これに引っかかったアプリケーションは速やかなアップデートが必要となります

  • pkg_replace コマンドでインストールします。
    # pkg_replace -vcCN ports-mgmt/portaudit
    
  • 脆弱性のチェック
    # /usr/local/sbin/portaudit -Fda
    

portaudit 脆弱性チェック結果のメール送信

毎日 portaudit のチェック結果をメールで報告させます
jot コマンドを利用して、1秒から 1800秒の間でランダムに sleep をさせています
今の設定ではメールを送れないので、後の「sendmail の設定」も必ず行ってください

  • mail コマンドを使ってメールを送信するスクリプトを記述します。
    #vi /root/update/portauditmail.sh
    
    #!/bin/sh
    RanDOM=`jot -r 1 1 1800`
    /bin/sleep $RanDOM
    #------------------------------------------
    MailTO="root"
    MilTmp="/tmp/portaudit.txt"
    MilHed="ports vulnerabilities report"
    #------------------------------------------
    echo $MilHed > $MilTmp
    echo "" >> $MilTmp
    /usr/local/sbin/portaudit -Fdav >> $MilTmp
    cat $MilTmp | /usr/bin/mail -s "$MilHed" $MailTO
    
    MailTO には自分の送りたいメールアドレスを指定します
    
  • 実行権の付与
    chmod u+x /root/untidy/portauditmail.sh
    
  • crontab の設定
    適当な頻度で ports の自動更新が走るように設定を追記します
    vi /etc/crontab
    
    # portaudit
    1    5    *    *    *     root  /root/untidy/portauditmail.sh > /dev/null 2>&1
    

sendmail の設定

結果メールを送信する為に sendmail を起動し、送信後に sendmail を止めるスクリプトを作成します

  • 全拒否の hosts.allow
    # vi /root/update/host.allow_deny
    
    ALL : ALL : deny
    
  • sendmail許可の hosts.allow
    # vi /root/update/hosts.allow_mail
    
    sendmail : localhost : allow
    sendmail : 192.168.1.82 : allow
    sendmail : .localdomain : allow
    ALL : ALL : deny'
    
  • sendmail 完全停止用の rc.conf
    cp /etc/rc.conf /root/update/rc.conf_none
    
  • sendmail 起動用の rc.conf
    現在の /etc/rc.confを流用します
    # cp /etc/rc.conf /root/update/rc.conf_no
    # sed -i -e "/^sendmail_/d" /root/update/rc.conf_no
    # echo 'sendmail_enable="NO"' >> /root/update/rc.conf_no
    
  • メールの転送設定
    ローカルのroot宛にメールを出すように設定したので、普段使うアドレスへ転送する設定をします
    echo 'admin@localdomain' > /root/.forward
    
  • メール送信シェルスクリプトの作成
    sendmail は rc.sendmail stop だけで止まるはずですが、まれに動きっぱなしの時があるようなので kill もしています
    # vi /root/update/resend.sh
    
    #!/bin/sh
    cp -p /root/update/rc.conf_no /etc/rc.conf
    cp -p /root/update/hosts.allow_mail /etc/hosts.allow
    sh /etc/rc.sendmail start
    sleep 6
    sh /etc/rc.sendmail stop
    sleep 4
    pkill sendmail
    cp -p /root/update/hosts.allow_deny /etc/hosts.allow
    cp -p /root/update/rc.conf_none /etc/rc.conf
    
  • 実行権付与
    # chmod u+x /root/update/resend.sh
    
  • ports_update_cron.sh の変更
    メール送信シェルスクリプトの起動を追記します
    echo '/root/update/resend.sh' >> /root/update/ports_update_cron.sh
    
  • portauditmail.sh の変更
    メール送信シェルスクリプトの起動を追記します
    echo '/root/update/resend.sh' >> /root/update/portauditmail.sh
    

freebsd-update 自動更新設定

freebsd-updateがディレクトリ指定で updateできるようなのでその機能を利用します

  • Jail環境での作業を終了します
    # exit
    


HOST環境での作業

  • freebsd-updateスクリプトの設定
    freebsd-update fetch の代わりに freebsd-update cron という cron 動作用のコマンドを使用します
    また HOST は fetch のみ jail は install まで行います
    # vi /rootfreebsd-update_cron.sh
    
    #!/bin/sh
    
    ### HOST用
    /usr/sbin/freebsd-update cron
    #/usr/sbin/freebsd-update install
    
    ### mainte jail用
    /usr/sbin/freebsd-update -b /home/mainte82 -d /home/mainte82/var/db/freebsd-update fetch
    /usr/sbin/freebsd-update -b /home/mainte82 -d /home/mainte82/var/db/freebsd-update install
    
  • 実行権付与
    chmod u+x /root/freebsd-update_cron.sh
    
  • crontab の設定
    適当な頻度で freebsd-update が起動するように追記します
    vi /etc/crontab
    
    # freebsd-update
    0      6     *     *   2,4,6  root   /root/freebsd-update_cron.sh > /var/log/freebsd-update.log 2>&1
    
  • freebsd-update の結果をメール送信
    freebsd-update cron が実行されて何らかのアップデートがあった場合、ローカルの root 宛にメールを出してくれる機能が組み込まれているので、特別な作業はありません
  • メールの転送設定
    ローカルのroot宛にメールを出してくれるので、普段使うアドレスへ転送する設定をします
    echo 'admin@localdomain' > /root/.forward
    

資料

アーカイブ

関連ページ


名前:
コメント:
最終更新:2012年08月28日 16:18