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 を管理するコマンドとして、現時点では portsnap と subversion がありますが、ここでは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をリブートします。
関連項目