FreeBSD > jail fulltree 10.2-Release

Top > FreeBSD > jail fulltree 10.2-Release

jail fulltree 10.2-Release



FreeBSD 10.2-Releaseにjail fulltreeを導入した時の備忘的まとめです
今後、このfulltreeを使用して minitree を作成していきます
このリリースから jail.conf を使用します


jail fulltree 10.0-Releaseでできなかった bsdinstall jail で導入しています


mainte 用 jail fulltree の構築


HOST環境での作業

jail環境構築

bsdinstall jailを使用して jail環境を構築します

  • jail fulltree 用ディレクトリを作成します
    zfs でディレクトリを切り分けます
    # mkdir /jail
    # mkdir /jail/mainte
    # zfs create -o mountpoint=/jail/mainte tank0/jail/mainte102
    
  • bsdinstallを使用して インストールします
    # bsdinstall jail /jail/mainte
    
  • Mirror Selection
    一番近い "日本" のミラーサーバを選択
    
  • Distribusion Select
    baseのみインストールするため すべてのチェックを外します
    

jail fulltree の初期設定

  • 設定のため、起動させます
    # mount -t devfs devfs /jail/mainte/dev
    # jail /jail/mainte test.localdomain 192.168.1.102 /bin/tcsh
    

    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.1' > /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 を設定
    最適化のためCPUTYPE CFLAGS COPTFLAGS を設定
    /usr/share/example/etc/make.conf/usr/share/mk/bas.cpu.mkを参考にCPUTYPEをslmに設定しました
    # 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=ftp://ftp3.jp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}
    WRKDIRPREFIX=/tmp
    DISTDIR=/tmp/distfiles
    CPUTYPE=slm
    CFLAGS= -O2 -fno-strict-aliasing -pipe
    COPTFLAGS= -O2 -fno-strict-aliasing -pipe
    
  • Jail環境での作業を終了します
    # exit
    


HOST環境での作業

自動起動設定

  • devfs.rules の設定
    # vi /etc/devfs.rules
    
    [devfsrules_jail_inet=250]
    add include $devfsrules_hide_all
    add path null unhide
    
    [devfsrules_jail_vnet=249]
    add include $devfsrules_hide_all
    add path null unhide
    add path mem unhide
    add path kmem unhide
    
  • jail.conf の設定
    # vi /etc/jail.conf
    
    /* 共通項目 */
    path		    = "/jail/$name";
    $hostname	    = "localhost.com";
    host.hostname	    = "${name}.${hostname}";
    $int_if		    = "re0";
    $bridge_if	    = "bridge0";
    $defaultroute	    = "192.168.1.251";
    $devfs_jail	    = "4"
    $devfs_jail_inet    = "250"
    $devfs_jail_vnet    = "249"
    
    mount.nodevfs;
    devfs_ruleset	    = $devfs_jail;
    securelevel	    = "0";
    allow.raw_sockets   = "0";
    allow.sysvipc	    = "0";
    vnet.interface	    = "epair${jid}b";
    exec.prestart	    = "ifconfig epair${jid} create up > /dev/null 2>&1";
    exec.prestart	   += "ifconfig ${bridge_if} addm epair${jid}a > /dev/null 2>&1";
    exec.start	    = "/sbin/ifconfig epair${jid}b up ${ip4addr}";
    exec.start	   += "/sbin/route add default ${defaultroute}";
    exec.poststart	    = "";
    exec.prestop	    = "";
    exec.stop	    = "";
    exec.poststop	    = "ifconfig epair${jid}a destroy > /dev/null 2>&1";
    /* 共通項目 */
    
    mainte {
    	mount.devfs;
    	devfs_ruleset	   = $devfs_jail;
    	allow.raw_sockets  = "1";
    //	allow.sysvipc	   = "1";
    	jid		   = "250";
    	$ip4addr	   = "192.168.1.250";
    /* inet */
    	ip4.addr	   = ${ip4addr};
    	interface	   = "";
    	exec.prestart	   = "";
    	exec.start	   = "";
    	exec.poststart	   = "";
    	exec.prestop	   = "";
    	exec.stop	   = "";
    	exec.poststop	   = "";
    	vnet.interface	   = "";
    /* inet */
    /* vnet *
    	vnet;
    /* vnet */
    	exec.prestart	  += "/bin/mkdir -p /tmp/${name}/tmp/distfiles";
    	exec.prestart	  += "/sbin/mount -t nullfs /tmp/${name}/tmp ${path}/tmp";
    	exec.start	  += "/bin/sh /etc/rc";
    	exec.poststart	  += "";
    	exec.prestop	  += "";
    	exec.stop	  += "/bin/sh /etc/rc.shutdown";
    	exec.poststop	  += "rm -rf /tmp/${name}";
    	exec.poststop	  += "/sbin/umount ${path}/tmp";
    /* persist */
    //	persist;
    /* depend */
    //	depend
    }
    
  • rc.conf の設定
    rc.conf に jail の設定を追加します
    # vi /etc/rc.conf
    
    # jail
    jail_enable="YES"
    jail_list="mainte"
    
  • 起動・停止
    /usr/sbin/service jail start mainte
    /usr/sbin/service jail stop mainte
    

jail fulltree の整備

  • maintenance 用 jail fulltree を起動します
    # service jail start mainte
    # jexec mainte /bin/tcsh
    

portsnap で ports の更新


JAIL環境での作業

  • portsnap を起動して ports の更新をします
    初回
    # portsnap fetch && portsnap extract && portsnap update
    
    2回目以降
    # portsnap fetch && portsnap update
    

portsの自動メンテナンス

portsnap fetch の代わりに portsnap cron を使ったスクリプトを記述します
portsnap の実行ログを保存します
後で、ログローテーションの対象にするので、ひたすら追記書きさせます
portsnap を cron で流して ports の自動更新をします。

  • portsnap の自動更新スクリプト
    # mkdir /root/update
    # cd /root/update
    # vi 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 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    *     N
    

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

ports 更新の有無を簡単に知る為に、定期的に portversion のコマンド結果をメールで送信します

  • mail コマンドを使ってメールを送信するスクリプト
    # vi portvermail.sh
    
    #!/bin/sh
    #------------------------------------------
    MailTO="root"
    MilTmp=/tmp/pkgversion.txt
    MilHed="mainte pkg version list"
    #------------------------------------------
    echo $MilHed > $MilTmp
    echo "" >> $MilTmp
    /usr/sbin/pkg_version -v >> $MilTmp
    cat $MilTmp | /usr/bin/mail -s "$MilHed" $MailTO
    
  • 実行権の付与
    chmod u+x portvermail.sh
    
  • ports_update_cron.sh へ追加
    echo '/root/update/portvermail.sh' >> ports_update_cron.sh
    

pkg_replace のインストール

ports の更新やインストールに pkg_replace を入れます

  • ports からインストールとハッシュテーブルの再構築
    # cd /usr/ports/ports-mgmt/pkg_replace
    # make install clean
    # rehash
    

portconf のインストール

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

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

ports の脆弱性チェック設定

ports ソフトウェアの脆弱性をチェックします

  • 脆弱性のチェック
    # pkg audit -F
    

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

毎日 pkg audit のチェック結果をメールで報告させます

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

sendmail の設定

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

  • 全拒否の hosts.allow
    # vi /root/update/hosts.allow_deny
    
    ALL : ALL : deny
    
  • sendmail許可の hosts.allow
    # vi /root/update/hosts.allow_mail
    
    sendmail : localhost : allow
    sendmail : 192.168.1.90 : allow
    sendmail : .localdomain : allow
    ALL : ALL : deny
    
  • sendmail 完全停止用の rc.conf
    cp /etc/rc.conf rc.conf_none
    
  • sendmail 起動用の rc.conf
    現在の /etc/rc.confを流用します
    # cp /etc/rc.conf rc.conf_mail
    # sed -i -e "/^sendmail_/d" /root/update/rc.conf_mail
    # echo 'sendmail_enable="NO"' >> /root/update/rc.conf_mail
    
  • メールの転送設定
    echo 'admin@localdomain' > /root/.forward
    
  • メール送信シェルスクリプトの作成
    # vi resend.sh
    
    #!/bin/sh
    cp -p /root/update/rc.conf_mail /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 resend.sh
    
  • portvermail.sh の変更
    メール送信シェルスクリプトの起動を追記します
    echo '/root/update/resend.sh' >> /root/update/portvermail.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 は cron(fetch) のみ jail は install まで行います
    # mkdir /root/update
    # cd /root/update
    # vi freebsd-update_cron.sh
    
    #!/bin/sh
    
    ### HOST用
    /usr/sbin/freebsd-update cron
    #/usr/sbin/freebsd-update install
    
    ### mainte jail用
    /usr/sbin/freebsd-update -b /jail/mainte -d /jail/mainte/var/db/freebsd-update fetch
    /usr/sbin/freebsd-update -b /jail/mainte -d /jail/mainte/var/db/freebsd-update install
    
  • 実行権付与
    chmod u+x 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
    

資料

アーカイブ

関連ページ


名前:
コメント:
最終更新:2016年05月30日 12:09