パッケージメンテナンス

WordPress を動かすために、FreeBSDサーバーを構築し、portsコレクションからApacheやMySQLのパッケージをインストールし、比較的苦労なしでWordPressを動かすことが出来ました。簡単なのは良いのですが、プログラムには不具合やセキュリティーの問題が見つかるものです。OS自体はファイヤーウォールやアクセスコントロールでがっちり防御しているのであまり不安はありません。しかし公開サーバーですから開いたままになっている表玄関があります。このサーバーの場合は、Apacheということになります。Apacheにセキュリティーホールが見つかると、Apacheを動かしているアカウントを乗っ取られる可能性があり、Apacheがアクセス出来る範囲の情報を抜き取られるかもしれませんから、Apacheが発表するセキュリティー情報に気を配る必要があります。ただし、Apacheは制限ユーザーの権限で動作していますので、OSが乗っ取られることは通常ありません。Apacheを通してつながっている PHPやMySQLもありますから、これらのアプリケーションをメンテナンスすることも考えておかないといけません。

/usr/ports

FreeBSDの場合、ports コレクションからインストールしたパッケージを利用するとメンテナンスが非常に簡単です。
/usr/ports の下がportsコレクションを管理する場所になっています。
ports を管理するコマンドとして、現時点では portsnapsubversion がありますが、ここではHTTPポートを使う portsnap を使うことにします。subversion の方が ports を更新するための準備が若干簡単なのですが、svnプロトコルを使用するため、ファイヤーウォールの内側にFreeBSDサーバーを設置する場合、portsサーバーをアクセス出来ない可能性があるためです。

portsnapによる ports管理

portsnap により portsを管理する方法はFreeBSDハンドブックに詳しく紹介されていますので、そちらを参考にします。

まず、現時点の /usr/ports を削除した後、

# portsnap fetch && portsnap extract && portsnap update

を実行します。これで、最新の ports コレクションを入手できます。初回は ports が完成するまで(CPU処理能力に依存しますが)数時間かかる場合があります。
2回目以降は、extract の必要がありませんので、fetch と update のみになります。実行時間は数分から数10分程度です。

# portsnap fetch && portsnap update

ただし、毎回思いついたときに ports の更新を手作業でおこなうよりも、常時稼働マシンであれば cron により深夜自動的に更新させるべきでしょう。 portsnap のオンラインマニュアルにも、そう記述されていますので、cron で自動実行するように設定します。
具体的には、crontab -e というコマンドで、root の crontab に以下の記述を行います。

0       3       *       *       *       /usr/sbin/portsnap cron && /usr/sbin/portsnap update && /usr/local/sbin/portversion -vL=

これは、毎日深夜3時になると、portsコレクションメンテナンスを行うためのコマンドが自動実行され、レポートが届くということです。手動操作による portsnap fetch が portsnap cron コマンドになっているのは、3:00AMになったとたん portsnap サーバーに膨大な数のアクセスが押し寄せるのを防ぐためで、実際のfetch実行までにランダムな遅延を発生させています。更新結果は、root のメールボックスに到着します。

メンテナンスコマンドインストール

ports を最新に更新した後は、インストール済みパッケージのバージョンと比較して、新しくなったパッケージを更新する必要があります。そのためのコマンドは複数ありますが、私は portupgrade コマンドを使っています。portupgrade コマンドはデフォルト状態ではインストールされていませんので、

# pkg install portupgrade

でインストールします。
portupgrade コマンドが入ったら、インストール済みパッケージと最新portsのバージョンを比較するためのコマンド pkg version を発行してメンテナンスが必要なパッケージをリストアップします。

# pkg version -vL=

試してみたところ、以下のようになりました。
ビルド済みのバイナリーと、最新パッケージにはかなりの開きがあるようです。

[Rebuilding the pkgdb <format:bdb_btree> in /var/db/pkg ... - 102 packages found (-0 +102) ....................................................................................................100.. done]
[Updating the portsdb <format:bdb_btree> in /usr/ports ... - 24545 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000..... ..... done]
apache24-2.4.6              <  needs updating (port has 2.4.6_1)
apr-1.4.8.1.5.2             <  needs updating (port has 1.4.8.1.5.3)
autoconf-wrapper-20130530   <  needs updating (port has 20131203)
cmake-2.8.11.2              <  needs updating (port has 2.8.12.1)
cmake-modules-2.8.11.2      <  needs updating (port has 2.8.12.1)
dialog4ports-0.1.5_1        <  needs updating (port has 0.1.5_2)
freetype2-2.4.12_1          <  needs updating (port has 2.5.0.1)
gettext-0.18.3              <  needs updating (port has 0.18.3.1)
help2man-1.43.3             <  needs updating (port has 1.43.3_1)
libSM-1.2.1,1               <  needs updating (port has 1.2.2,1)
libX11-1.6.0,1              <  needs updating (port has 1.6.2,1)
libXaw-1.0.11,2             <  needs updating (port has 1.0.12,2)
libXmu-1.1.1,1              <  needs updating (port has 1.1.2,1)
libXpm-3.5.10               <  needs updating (port has 3.5.11)
libcheck-0.9.10             <  needs updating (port has 0.9.11)
libgcrypt-1.5.2             <  needs updating (port has 1.5.3)
libidn-1.27                 <  needs updating (port has 1.28_1)
libltdl-2.4.2               <  needs updating (port has 2.4.2_2)
libpthread-stubs-0.3_3      <  needs updating (port has 0.3_4)
libtool-2.4.2               <  needs updating (port has 2.4.2_2)
libxcb-1.9.1                <  needs updating (port has 1.9.1_1)
libxml2-2.8.0_2             <  needs updating (port has 2.8.0_3)
m4-1.4.16_1,1               <  needs updating (port has 1.4.17,1)
mysql-client-5.5.33         <  needs updating (port has 5.5.34)
mysql-server-5.5.33         <  needs updating (port has 5.5.34)
perl-5.14.4                 <  needs updating (port has 5.14.4_4)
php5-5.4.17                 <  needs updating (port has 5.4.21)
php5-bz2-5.4.17             <  needs updating (port has 5.4.21)
php5-ctype-5.4.17           <  needs updating (port has 5.4.21)
php5-dom-5.4.17             <  needs updating (port has 5.4.21)
php5-filter-5.4.17          <  needs updating (port has 5.4.21)
php5-gd-5.4.17              <  needs updating (port has 5.4.21)
php5-hash-5.4.17            <  needs updating (port has 5.4.21)
php5-iconv-5.4.17           <  needs updating (port has 5.4.21)
php5-json-5.4.17            <  needs updating (port has 5.4.21)
php5-mbstring-5.4.17        <  needs updating (port has 5.4.21)
php5-mcrypt-5.4.17          <  needs updating (port has 5.4.21)
php5-mysql-5.4.17           <  needs updating (port has 5.4.21)
php5-mysqli-5.4.17          <  needs updating (port has 5.4.21)
php5-openssl-5.4.17         <  needs updating (port has 5.4.21)
php5-pdo-5.4.17             <  needs updating (port has 5.4.21)
php5-pdo_sqlite-5.4.17      <  needs updating (port has 5.4.21)
php5-phar-5.4.17            <  needs updating (port has 5.4.21)
php5-posix-5.4.17           <  needs updating (port has 5.4.21)
php5-session-5.4.17         <  needs updating (port has 5.4.21)
php5-simplexml-5.4.17       <  needs updating (port has 5.4.21)
php5-sqlite3-5.4.17         <  needs updating (port has 5.4.21)
php5-tokenizer-5.4.17       <  needs updating (port has 5.4.21)
php5-xml-5.4.17             <  needs updating (port has 5.4.21)
php5-xmlreader-5.4.17       <  needs updating (port has 5.4.21)
php5-xmlwriter-5.4.17       <  needs updating (port has 5.4.21)
php5-zip-5.4.17             <  needs updating (port has 5.4.21)
php5-zlib-5.4.17            <  needs updating (port has 5.4.21)
phpMyAdmin-4.0.5            <  needs updating (port has 4.0.10_1)
pkgconf-0.9.2_1             <  needs updating (port has 0.9.3)
portupgrade-2.4.11,2        <  needs updating (port has 2.4.11.3,2)
python27-2.7.5_1            <  needs updating (port has 2.7.6_1)
ruby-1.9.3.448,1            <  needs updating (port has 1.9.3.484,1)
sqlite3-3.7.17_1            <  needs updating (port has 3.8.0.2)
xorg-macros-1.17            <  needs updating (port has 1.17.1)

リストを見る限り必ずしもネットワークセキュリティに問題があるように見えませんが、外部から直接見える状態である apache と phpMyAdmin は更新すべきでしょう。

パッケージを更新する

apache と phpMyAdminだけ更新してもいいのですが、全部を一括アップデートするコマンド( portupgrade -a)がありますので、全部更新します。
ただし、今、まさに動いているプログラム(apache, mysql)を止めずに更新するのは危険ですので、これらの更新作業を開始する前に停止させます。

# cd /usr/local/etc/rc.d
# ./apache24 stop
# ./mysql-server stop
# portupgrade -a

この規模の更新になると、作業は数時間から半日かかる場合がありますので気長に待ちます。

しかし、サービス中のプログラムを長時間止めることは困る場合があります。今回の場合、ApacheとMySQLがそれに相当します。こういうケースでは、長時間停止できないパッケージだけ個別に手動更新し、それが終わった後、残りを更新するのが安全です。

更新が終わったら、停止させていたサービスを再起動させるか、OSをリブートします。

 

関連項目