セキュリティパッチを適用することは、コンピュータソフトウェア、 特にオペレーティングシステムを管理する上で重要な役割を果たします。 しかしながら、FreeBSD においては、 このプロセスは簡単なものではありませんでした。 ソースコードにパッチを当て、コードからバイナリを再構築し、 バイナリを再びインストールする必要がありました。
現在の FreeBSD では freebsd-update
と呼ばれるユーティリティが追加され、状況は変わりました。
このユーティリティは 2 つの機能を持っています。
第一に、FreeBSD ベースシステムのビルドやインストールを行うことなく、
バイナリによってセキュリティおよび eratta アップデートできます。
第二に、このユーティリティはマイナーおよびメジャーリリースのアップグレードに対応しています。
バイナリアップデートは、 セキュリティチームがサポートしているすべてのアーキテクチャとリリースで利用できます。 新しいリリースにアップデートする前に、 アップデートしようとしているリリースのアナウンスに目を通し、 重要な情報がないかどうかを確認してください。 リリースのアナウンスは http://www.FreeBSD.org/ja/releases/ で確認できます。
もし crontab
の中に
freebsd-update(8) の機能が含まれていたら、
以下の作業を行うまでは無効にしておいてください。
/etc/freebsd-update.conf
の設定をデフォルトからきめ細かく調整して、
アップデートプロセスを制御するユーザもいます。
この作業は良く文書化されていますが、
以下の項目については説明が必要でしょう。
このパラメータは、FreeBSD のどの部分を最新に維持するかを設定します。
デフォルトではソースコード、ベースシステム全体、そしてカーネルをアップデートします。
Components に設定できる項目は、インストール時に選択できるものと同じです。
たとえば、ここで world/games
を追加すると、
game にパッチが当たるようになります。
src/bin
を追加すると、
src/bin
ソースコードのアップデートを許可します。
この部分についてはデフォルトのままにしておき、 アップデートする項目をユーザがリストに加える形にするのがベストでしょう。 ソースコードとバイナリが同期していないと、 悲惨な結果をもたらす可能性があります。
/bin
や
/sbin
等の特定のディレクトリをアップデートで変更しないように、
これらのパスを追加してください。
このオプションは、ローカルの変更点を freebsd-update
が上書きすることを防ぐ目的にも利用できます。
このオプションは、指定したディレクトリにある設定ファイルを、
ローカルで変更されていない場合のみアップデートします。
ユーザがこれらのファイルを変更していると、
これらのファイルの自動アップデートは無効になります。
他に、KeepModifiedMetadata
という別のオプションが存在します。
このオプションは、freebsd-update
がマージ中に変更点を保存するようにします。
freebsd-update
がマージすべきファイルが存在するディレクトリの一覧です。
ファイルのマージのプロセスは、
mergemaster(8) と同様 diff(1) パッチの連続ですが、
選択肢は少なく、マージを承認するか、エディタを起動するか、
freebsd-update
を中断するかどうかを選んでください。
もし、心配な点があれば、
/etc
をバックアップしてからマージを承認してください。
mergemaster
の詳細な情報については、
「mergemaster
」 で確認してください。
ここではすべてのパッチや一次ファイルを置くディレクトリを指定しています。 バージョンをアップグレードするのであれば、 この場所には少なくともギガバイトの空き容量が必要です。
このオプションを yes
に設定すると、
freebsd-update
は
Components
のリストが完全に正しいと判断し、
このリスト以外の変更点については取り扱いません。
freebsd-update
は、効率的に
Components
リストに属するファイルをアップデートします。
以下のコマンドを実行すると、FreeBSD のセキュリティパッチがダウンロードされ、インストールされます。
#
freebsd-update fetch
#
freebsd-update install
アップデートによってカーネルにパッチが当たった場合には、
パッチが当たったカーネルで起動するように、
システムを再起動する必要があります。
もしくは、システムにパッチが当てられ、
毎晩の cron(8) ジョブとして、freebsd-update
を実行するように、
以下のエントリを /etc/crobntab
に追加してください。
このエントリは、毎日一度 freebsd-update
を実行することを意味します。
cron
と共に実行すると、
freebsd-update
はアップデートが存在するときだけ確認します。
パッチが存在すると、
自動的にローカルディスクにダウンロードされますが、適用はされません。
ダウンロードされたパッチを確認し、手動でインストールする必要のあることが、
root
宛てにメールで通知されます。
うまく行かなかった場合には、freebsd-update
を以下のように実行すると、最後の変更までロールバックできます。
#
freebsd-update rollback
カーネルまたはカーネルモジュールがアップデートされた場合には、 完了後にシステムを再起動してください。 この作業によって、FreeBSD がバイナリをメモリに読み込みます。
freebsd-update
ユーティリティが自動的にアップデートするカーネルは
GENERIC
のみです。
カスタムカーネルがインストールされている場合には、
freebsd-update
が他の部分をインストールした後、
カーネルを再構築し、もう一度インストールする必要があります。
しかしながら、GENERIC
カーネルが /boot/GENERIC
に存在する場合には、
現在のシステムで実行されているカーネルでなくとも、
freebsd-update
によりアップデートされます。
GENERIC
カーネルを、常に /boot/GENERIC
に置いておくことは良い考えです。
さまざまな問題を解決する際や、
「メジャーおよびマイナーバージョンのアップグレード」 に説明されているように、
freebsd-update
を用いてバージョンをアップグレードする際に助けとなります。
/etc/freebsd-update.conf
のデフォルトの設定を変更しない限り、
freebsd-update
は、
他の更新と共にカーネルソースをアップデートします。
新しいカスタムカーネルの再構築と再インストールは、
通常通り行うことができます。
freebsd-update
は、
常にカーネルをアップデートするとは限りません。
freebsd-update install
によってカーネルソースが変更されなかった場合には、
カスタムカーネルを再構築する必要はありません。
しかしながら freebsd-update
は、
/usr/src/sys/conf/newvers.sh
を常にアップデートします。
これは、現在のシステムのパッチレベルを
uname -r
が -p
で表示する時にこのファイルが参照されます。
そのため、何も変更されていない場合でも、カスタムカーネルを再構築することにより、
uname(1) がシステムの正確なパッチレベルを報告するようになります。
各システムにインストールされているアップデートをすばやく把握できるようになるので、
特に複数のシステムを管理するときに助けとなります。
FreeBSD のマイナーバージョン間のアップグレード、 たとえば、FreeBSD 9.0 から FreeBSD 9.1 へのアップグレードは、 マイナーバージョン アップグレードと呼ばれます。 通常は、マイナーバージョンのアップグレードを行った後でも、 インストールされているアプリケーションは問題なく動きます。
メジャーバージョン アップグレードは、
FreeBSD 8.X から FreeBSD 9.X へのアップグレードといった、
FreeBSD のメジャーバージョンが変わるようなアップグレードのことです。
メジャーバージョンのアップグレードでは、
古いオブジェクトファイルやライブラリが削除され、
これらに依存する多くのサードパーティ製アプリケーションに影響を与える可能性があります。
インストールされているすべての ports を削除して再インストールするか、
メジャーアップグレード後、
ports-mgmt/portmaster
といったユーティリティを使ってアップグレードすることが推奨されています。
インストールされているアプリケーションのブルートフォース的な再構築は、
以下のコマンドにより行うことができます。
#
portmaster -af
このコマンドは、すべての ports を適切に再インストールしようとします。
BATCH
環境変数を
yes
に設定しておくと、
アップデートプロセスの途中の質問に対し
yes
と答えるようになるので、
ビルドプロセスでの手動操作を省略できます。
カスタムカーネルを使用している場合には、アップグレードのプロセスは、 幾分複雑となります。 アップグレードの手順は FreeBSD のバージョンによって変わります。
GENERIC
カーネルが
/boot/GENERIC
に置かれている必要があります。
もし GENERIC
カーネルがシステムに存在しない場合には、
以下のどれかの方法で用意してください。
ただ一度だけカスタムカーネルを構築したのであれば、
/boot/kernel.old
は GENERIC
カーネルそのものです。
このディレクトリの名前を
/boot/GENERIC
へと変更してください。
コンピュータへの物理的なアクセスが可能であれば、
以下のコマンドを実行することで、
インストールメディアから GENERIC
カーネルをインストールできます。
#
mount /cdrom
#
cd /cdrom/X.Y-RELEASE
/kernels
#
./install.sh GENERIC
ここで
を実際のリリース番号に置き換えてください。
X.Y-RELEASE
GENERIC
は、デフォルトで /boot/GENERIC
にインストールされます。
上記の方法がすべて失敗するのであれば、
GENERIC
カーネルをソースから再構築して、
インストールしてください。
#
cd /usr/src
#
env DESTDIR=/boot/GENERIC make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null
#
mv /boot/GENERIC/boot/kernel/* /boot/GENERIC
#
rm -rf /boot/GENERIC/boot
freebsd-update
は、このカーネルを
GENERIC
カーネルとして扱います。
GENERIC
コンフィグレーションファイルは、
とにかく変更してはいけません。
また、特別なオプションを指定しないで構築してください。
この時点で GENERIC
カーネルで再起動する必要はありません。
ただ一度だけカスタムカーネルを構築したのであれば、
/boot/kernel.old
は GENERIC
カーネルそのものです。
ただ単にこのディレクトリの名前を
/boot/kernel
へと変更してください。
コンピュータへの物理的なアクセスが可能であれば、
以下のコマンドで、インストールメディアから
GENERIC
カーネルをインストールできます。
#
mount /cdrom
#
cd /cdrom/usr/freebsd-dist
#
tar -C/ -xvf kernel.txz boot/kernel/kernel
上記の方法が失敗するのであれば、
GENERIC
カーネルをソースから再構築して、
インストールしてください。
#
cd /usr/src
#
make kernel __MAKE_CONF=/dev/null SRCCONF=/dev/null
freebsd-update
は、このカーネルを
GENERIC
カーネルとして扱います。
GENERIC
コンフィグレーションファイルは、
とにかく変更してはいけません。
また、特別なオプションを指定しないで構築してください。
この時点で GENERIC
カーネルで再起動する必要はありません。
freebsd-update
によるメジャー、またはマイナーバージョンのアップデートでは、
リリースバージョンをターゲットにして実行します。
以下のコマンドは、FreeBSD 9.1 にアップデートします。
#
freebsd-update -r 9.1-RELEASE upgrade
コマンドを実行すると、freebsd-update
は設定ファイルと現在のシステムを評価し、
アップデートするために必要な情報を収集します。
画面には、どのコンポーネントが認識され、
どのコンポーネントが認識されていないといったリストが表示されます。
たとえば以下のように表示されます。
ここで、freebsd-update
はアップグレードに必要なすべてのファイルをダウンロードします。
何をインストールし、どのように進むかといった質問をされることもあります。
カスタムカーネルを使っていると、 上記のステップで以下のような警告が表示されます。
MYKERNEL
" kernel, which is not a
kernel configuration distributed as part of FreeBSD 9.0-RELEASE.
This kernel will not be updated: you MUST update the kernel manually
before running "/usr/sbin/freebsd-update install"この時点ではこの警告を無視してもかまいません。
アップデートされた GENERIC
カーネルは、
アップグレードプロセスの途中で利用されます。
すべてのパッチがローカルシステムへダウンロードされたら、
次にパッチが適用されます。
このプロセスには時間がかかります。
この時間はコンピュータの性能とワークロードに依存します。
その後、設定ファイルがマージされます。
このプロセスでは、ユーザはファイルをマージするか、
画面上にエディタを立ち上げて手動でマージするかを尋ねられます。
プロセスが進むごとに、成功したマージのすべての結果の情報がユーザに示されます。
マージに失敗したり、無視した場合には、プロセスが中断します。
ユーザによっては /etc
のバックアップを取り、
master.passwd
や group
のような重要なファイルを後で手動でマージする方もいます。
すべてのパッチは別のディレクトリでマージされており、 まだ、システムには反映されていません。 すべてのパッチが正しく適用され、 すべての設定ファイルがマージされてプロセスがスムーズに進んだら、 ユーザは以下のコマンドを用いて、 変更点をディスクに反映してください。
#
freebsd-update install
パッチは最初にカーネルとカーネルモジュールに対して当てられます。
ここでコンピュータを再起動する必要があります。
システムがカスタムカーネルを実行している場合には、
nextboot(8) を使って次回の再起動時のカーネルを、
アップデートされた /boot/GENERIC
に設定してください。
#
nextboot -k GENERIC
GENERIC
カーネルで再起動する前に、
カーネルにシステムが適切に起動するために必要なすべてのドライバが含まれていること、
もしアップデートしているコンピュータがリモートでアクセスしているのであれば、
ネットワーク接続に必要なすべてのドライバも含まれていることを確認してください。
特に、これまで実行しているカスタムカーネルが、
カーネルモジュールとして提供されているビルドインの機能を含んでいるのであれば、
これらのモジュールを一時的に /boot/loader.conf
の機能を用いて、
GENERIC
に読み込んでください。
アップグレードプロセスが終わるまでは、
重要ではないサービスを無効にするとともに、
必要のないディスクやネットワークのマウントなども避けることが推奨されています。
アップデートされたカーネルでコンピュータを再起動してください。
#
shutdown -r now
システムがオンラインに戻ったら、以下のコマンドを使って
freebsd-update
を再び実行してください。
アップデートプロセスの状態は保存されているので、
freebsd-update
を実行すると、最初からではなく、
古い共有ライブラリとオブジェクトファイルを削除するプロセスから始まります。
#
freebsd-update install
使用しているライブラリのバージョン番号の付けられ方によって、 3 つのインストールフェーズが 2 つになる場合もあります。
メジャーバージョンアップグレードを行った後では、
すべてのサードパーティ製のソフトウェアを再構築し、
再インストールする必要があります。
この作業が必要なのは、インストールされているソフトウェアが、
アップグレードの際に削除されたライブラリに依存している可能性があるためです。
ports-mgmt/portupgrade
は、このプロセスを自動化します。
#
portmaster -f
この作業の終了後、最後にもう一度
freebsd-update
を実行して、
すべてのアップグレードプロセスのやり残し作業を行い、
アップグレードのプロセスを完了してください。
#
freebsd-update install
GENERIC
カーネルを一時的に読み込んでいたのであれば、
ここで、通常の方法を用いて新しいカスタムを構築し、インストールしてください。
コンピュータを再起動し、新しい FreeBSD を立ち上げてください。 これでアップグレードのプロセスは完了です。
freebsd-update
を用いて、
インストールされている FreeBSD の状態と、
正しく動作することが分かっている状態とを比較できます。
このオプションは、システムのユーティリティ、ライブラリ、
設定ファイルを評価します。
比較を行うには、以下のコマンドを実行してください。
#
freebsd-update IDS >> outfile.ids
コマンドライン名は IDS ですが、
security/snort
のような侵入検知システムの本当の置き換えになるものではありません。
freebsd-update
はデータをディスクに保存するので、
不正な変更が行われる可能性があります。
kern.securelevel
と、
freebsd-update
のデータを使用しないときに、
読み取りのみの許可属性に設定されているファイルシステムに置くことで、
不正な変更の可能性を低くできますが、
よりよい解決方法は、
DVD
または安全に保存されている外部 USB
ディスクのような安全なディスクとシステムを比較することです。
このコマンドを実行すると、システムは検査され、
リリースファイルの sha256(1)
ハッシュ値と現在インストールされているファイルのハッシュ値がファイルの一覧と共に、指定した
outfile.ids
ファイルに送られます。
これらの行は極めて長いのですが、出力形式は簡単にすぐに解析できます。 たとえば、これらのリリースで異なっているすべてのファイルを知りたいのであれば、 以下のコマンドを実行してください。
#
cat outfile.ids | awk '{ print $1 }' | more
/etc/master.passwd
/etc/motd
/etc/passwd
/etc/pf.conf上の表示例では出力は切り捨てられており、
実際にはもっと多くのファイルが存在します。
これらのファイルには、運用中に変更されるファイルがあります。
たとえば、/etc/passwd
はユーザがシステムに追加されると変更されます。
また、カーネルモジュールのようなファイルは、
freebsd-update
によりアップデートされるため、変更されます。
このような特別なファイルやディレクトリを除外するには、
それらを /etc/freebsd-update.conf
の
IDSIgnorePaths
オプションに追加してください。
以前に議論した方法とは別に、 このシステムを入念なアップグレード方法の一部として用いることができます。
本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。
FreeBSD に関する質問がある場合には、
ドキュメント を読んだ上で
<questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、
<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。