すみやかにセキュリティパッチを適用し、
オペレーティングシステムをアップグレードして、
最新のリリースに保つことは、システム管理における重要な側面です。
これらの処理を行うために FreeBSD には freebsd-update
と呼ばれるユーティリティが用意されています。
このユーティリティを用いると、FreeBSD のセキュリティおよび
eratta アップデートをバイナリによって行うことができます。
手動でパッチもしくは新しいカーネルをコンパイルし、
インストールする必要はありません。
バイナリアップデートは、
セキュリティチームがサポートしているすべてのアーキテクチャとリリースで利用できます。
https://www.FreeBSD.org/ja/security/
には、
サポートが行われているリリースや保守終了予定日の一覧があります。
このユーティリティは、マイナーリリースであったり、
他のリリースブランチへのアップグレードにも対応しています。
新しいリリースにアップデートする前に、
アップデートしようとしているリリースのアナウンスに目を通し、
重要な情報がないかどうかを確認してください。
リリースのアナウンスは https://www.FreeBSD.org/ja/releases/
で確認できます。
もし crontab
の中に
freebsd-update(8) の機能が含まれていたら、
オペレーティングシステムのアップグレード作業を終えるまでは無効にしてください。
この節では、freebsd-update
で使われる設定ファイルの説明、
セキュリティパッチの適応方法のデモンストレーション、
オペレーティングシステムをアップグレードする際に考慮すべき点について説明します。
freebsd-update
のデフォルトの設定ファイルは、
そのままでも用いることができます。
/etc/freebsd-update.conf
の設定をデフォルトからきめ細かく調整して、
アップデートプロセスを制御するユーザもいます。
利用可能なオプションについてはこのファイルのコメントで説明されていますが、
以下の項目については補足が必要でしょう。
# Components of the base system which should be kept updated. Components world kernel
このパラメータは、FreeBSD のどの部分を最新に維持するかを設定します。
デフォルトでは、ベースシステム全体、
そしてカーネルをアップデートします。
src/base
や src/sys
のように、個々の項目を指定することもできます。
この部分についてはデフォルトのままにしておき、
アップデートする項目をユーザがリストに加える形にするのがベストでしょう。
ソースコードとバイナリが同期していないと、
長い年月の間に悲惨な結果がもたらされる可能性があります。
# Paths which start with anything matching an entry in an IgnorePaths # statement will be ignored. IgnorePaths /boot/kernel/linker.hints
/bin
や /sbin
等の特定のディレクトリをアップデートで変更しないように、
これらのパスを追加してください。
このオプションは、ローカルの変更点を freebsd-update
が上書きすることを防ぐ目的にも利用できます。
# Paths which start with anything matching an entry in an UpdateIfUnmodified # statement will only be updated if the contents of the file have not been # modified by the user (unless changes are merged; see below). UpdateIfUnmodified /etc/ /var/ /root/ /.cshrc /.profile
このオプションは、指定したディレクトリにある設定ファイルを、
ローカルで変更されていない場合のみアップデートします。
ユーザがこれらのファイルを変更していると、
変更されたファイルの自動アップデートは行われません。
他に、KeepModifiedMetadata
という別のオプションが存在します。
このオプションは、freebsd-update
がマージ中に変更点を保存するようにします。
# When upgrading to a new FreeBSD release, files which match MergeChanges # will have any local changes merged into the version from the new release. MergeChanges /etc/ /var/named/etc/ /boot/device.hints
freebsd-update
がマージすべきファイルが存在するディレクトリの一覧です。
ファイルのマージのプロセスは、
mergemaster(8) と同様 diff(1) パッチの連続ですが、
選択肢は少なく、マージを承認するか、エディタを起動するか、
freebsd-update
を中断するかどうかを選んでください。
もし、心配な点があれば、
/etc
をバックアップしてからマージを承認してください。
mergemaster
の詳細な情報については、
mergemaster(8) で確認してください。
# Directory in which to store downloaded updates and temporary # files used by FreeBSD Update. # WorkDir /var/db/freebsd-update
ここではすべてのパッチや一次ファイルを置くディレクトリを指定しています。 バージョンをアップグレードするのであれば、 この場所には少なくともギガバイトの空き容量が必要です。
# When upgrading between releases, should the list of Components be # read strictly (StrictComponents yes) or merely as a list of components # which *might* be installed of which FreeBSD Update should figure out # which actually are installed and upgrade those (StrictComponents no)? # StrictComponents no
このオプションを yes
に設定すると、
freebsd-update
は
Components
のリストが完全に正しいと判断し、
このリスト以外の変更点については取り扱いません。
freebsd-update
は、効率的に
Components
リストに属するファイルをアップデートします。
FreeBSD のセキュリティパッチを適用する過程は簡単になりました。
管理者は freebsd-update
を使うことで、
システムを完全にパッチがあたった状態に保つ事ができます。
FreeBSD セキュリティ勧告の詳細については、
FreeBSD セキュリティ勧告
の節で説明されています。
以下のコマンドを実行すると、FreeBSD のセキュリティパッチがダウンロードされ、インストールされます。 最初のコマンドは、未対応のパッチがあるかどうかを調べます。 もし未対応のパッチがある場合には、 パッチが当てられた際に変更されるファイルのリストが作成されます。 2 番目のコマンドはパッチを適用します。
#
freebsd-update fetch
#
freebsd-update install
アップデートによってカーネルにパッチが当たった場合には、 パッチが当たったカーネルで起動するように、 システムを再起動する必要があります。 もし、実行中のバイナリにパッチが当てられた場合には、 パッチの当てられたバージョンのバイナリが使われるように、 影響のあるアプリケーションを再起動する必要があります。
通常、ユーザはシステムを再起動する必要があります。
カーネルアップデートで再起動が必要かどうかを知るには、
freebsd-version -k
と
uname -r
を実行してください。
これら 2 つのコマンドの結果が異なる場合には、
再起動が必要です。
毎日一度アップデートがないかどうかを自動的に確認するように設定するには、
以下のエントリを /etc/crontab
に追加してください。
@daily root freebsd-update cron
パッチが存在すると、
自動的にダウンロードされますが、適用はされません。
root
宛てにメールで、
ダウンロードされたパッチを確認し、
freebsd-update install
とともに手動でインストールする必要のあることが通知されます。
うまく行かなかった場合には、freebsd-update
を以下のように実行すると、最後の変更までロールバックできます。
#
freebsd-update rollback
Uninstalling updates... done.
カーネルまたはカーネルモジュールがアップデートされた場合には、 完了後にもう一度システムを再起動して、 影響のあったバイナリを再起動してください。
freebsd-update
ユーティリティが自動的にアップデートするカーネルは
GENERIC
のみです。
カスタムカーネルをインストールしている場合には、
freebsd-update
によりインストールした後、
カーネルを再構築し、もう一度インストールする必要があります。
デフォルトのカーネルの名前は GENERIC です。
uname(1)
コマンドを使ってインストールされているかどうかを確認できます。
GENERIC
カーネルを、
常に /boot/GENERIC
に置いておいてください。
さまざまな問題を解決する際や、
バージョンをアップグレードする際に助けとなります。
GENERIC
カーネルを用意する方法については、
「FreeBSD 9.X 以降のシステムにおけるカスタムカーネル」
を参照してください。
/etc/freebsd-update.conf
のデフォルトの設定を変更しない限り、
freebsd-update
は、
他の更新と共にカーネルソースをアップデートします。
新しいカスタムカーネルの再構築と再インストールは、
通常通り行うことができます。
freebsd-update
は、
常にカーネルをアップデートするとは限りません。
freebsd-update install
によってカーネルソースが変更されなかった場合には、
カスタムカーネルを再構築する必要はありません。
しかしながら freebsd-update
は、
/usr/src/sys/conf/newvers.sh
を常にアップデートします。
これは、現在のシステムのパッチレベルを
uname -r
が -p
で表示する時にこのファイルが参照されます。
そのため、何も変更されていない場合でも、
カスタムカーネルを再構築することにより、
uname
がシステムの正確なパッチレベルを報告するようになります。
各システムにインストールされているアップデートをすばやく把握できるようになるので、
特に複数のシステムを管理するときに助けとなります。
FreeBSD のマイナーバージョン間のアップグレード、
たとえば、FreeBSD 9.0 から FreeBSD 9.1 へのアップグレードは、
マイナーバージョン アップグレードと呼ばれます。
メジャーバージョン アップグレードは、
FreeBSD 9.X から FreeBSD 10.X へのアップグレードといった、
FreeBSD のメジャーバージョンが変わるようなアップグレードのことです。
どちらもアップグレードも、freebsd-update
にリリース番号のターゲットを指定する事で実行できます。
カスタムカーネルを使っているシステムでは、
アップグレードを行う前に
GENERIC
カーネルが、
/boot/GENERIC
に置かれている事を確認してください。
GENERIC
カーネルを用意する方法については、
「FreeBSD 9.X 以降のシステムにおけるカスタムカーネル」
を参照してください。
以下のコマンドを実行すると、FreeBSD 9.0 のシステムを FreeBSD 9.1 にアップグレードします。
#
freebsd-update -r 9.1-RELEASE upgrade
コマンドを実行すると、freebsd-update
は設定ファイルと現在のシステムを評価し、
アップデートするために必要な情報を収集します。
画面には、どのコンポーネントが認識され、
どのコンポーネントが認識されていないといったリストが表示されます。
たとえば以下のように表示されます。
Looking up update.FreeBSD.org mirrors... 1 mirrors found.
Fetching metadata signature for 9.0-RELEASE from update1.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.
The following components of FreeBSD seem to be installed:
kernel/smp src/base src/bin src/contrib src/crypto src/etc src/games
src/gnu src/include src/krb5 src/lib src/libexec src/release src/rescue
src/sbin src/secure src/share src/sys src/tools src/ubin src/usbin
world/base world/info world/lib32 world/manpages
The following components of FreeBSD do not seem to be installed:
kernel/generic world/catpages world/dict world/doc world/games
world/proflibs
Does this look reasonable (y/n)? y
ここで、freebsd-update
はアップグレードに必要なすべてのファイルをダウンロードします。
何をインストールし、どのように進むかといった質問をされることもあります。
カスタムカーネルを使っていると、 上記のステップで以下のような警告が表示されます。
WARNING: This system is running a "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 つになる場合もあります。
アップグレードはこれで終了です。 もしメジャーアップグレードを行った場合には、 「メジャーバージョンアップグレード後の package のアップグレード」 で説明されているようにすべての ports および package を再構築してください。
freebsd-update
を使う前に、
GENERIC
カーネルが
/boot/GENERIC
に置かれていることを確認してください。
ただ一度だけカスタムカーネルを構築したのであれば、
/boot/kernel.old
は GENERIC
カーネルそのものです。
このディレクトリの名前を
/boot/GENERIC
へと変更してください。
もし、2 回以上カスタムカーネルを構築した後であったり、
カスタムカーネルを構築した回数がわからなければ、
現在のオペレーティングシステムのバージョンの
GENERIC
カーネルを入手してください。
コンピュータへの物理的なアクセスが可能であれば、
インストールメディアから 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
コンフィグレーションファイルは、
とにかく変更してはいけません。
また、特別なオプションを指定しないで構築してください。
freebsd-update
は、
/boot/GENERIC
が存在する事だけを必要とするので、
GENERIC
カーネルで再起動する必要はありません。
一般的に、マイナーバージョンアップグレードの後では、
インストールされているアプリケーションは、問題なく動作するでしょう。
メジャーバージョンが異なるとアプリケーションバイナリーインタフェース
(ABI) が異なるため、
サードパーティ製のアプリケーションの多くは動作しなくなるでしょう。
メジャーバージョンアップグレード後には、
インストールされているすべての packages, ports
をアップグレードする必要があります。
package は、pkg upgrade
を使ってアップグレードできます。
インストールされている ports をアップグレードする場合には、
ports-mgmt/portmaster
といったユーティリティを使ってください。
すべての package の強制的なアップグレードでは、 バージョン番号が上がらない package に対しても、 リポジトリから最新のバージョンで、インストールされている package を置き換えます。 FreeBSD のメージャーバージョンが変わるようなアップグレードでは、 ABI のバージョンも変わるため、 このようなアップグレードが必要になります。 強制的なアップグレードを行うには、以下のように実行してください。
#
pkg-static upgrade -f
インストールされているすべてのアプリケーションを再構築するには、 以下のコマンドを実行してください。
#
portmaster -af
このコマンドを実行すると、
設定を変更するオプションを持つアプリケーションは、
設定変更のスクリーンを表示し、
ユーザからの指示待ちの状態で停止します。
この振る舞いをやめ、デフォルトのオプションを使用するには、
上記のコマンドに -G
を含めてください。
ソフトウェアのアップグレードが終わったら、最後にもう一度
freebsd-update
を実行して、
すべてのアップグレードプロセスのやり残し作業を行い、
アップグレードのプロセスを完了してください。
#
freebsd-update install
GENERIC
カーネルを一時的に読み込んでいたのであれば、8章FreeBSD カーネルのコンフィグレーション に書かれている手順に従って、
新しいカスタムを構築し、インストールしてください。
コンピュータを再起動し、新しい FreeBSD を立ち上げてください。 これでアップグレードのプロセスは完了です。
freebsd-update
を用いて、
インストールされている FreeBSD の状態と、
正しく動作することが分かっている状態とを比較できます。
このコマンドは、現在のシステムのユーティリティ、ライブラリ、
設定ファイルを評価するので、
組み込みの侵入検知システム (IDS)
として使うことができます。
このコマンドは、security/snort
のような本当の IDS
の置き換えになるものではありません。
freebsd-update
はデータをディスクに保存するので、
不正な変更が行われる可能性があります。
kern.securelevel
と、
freebsd-update
のデータを使用しないときに、
読み取りのみの許可属性に設定されているファイルシステムに置くことで、
不正な変更の可能性を低くできますが、
よりよい解決方法は、
DVD
または安全に保存されている外部 USB
ディスクのような安全なディスクとシステムを比較することです。
組み込まれているユーティリティを用いた、別の方法による
IDS 機能については、
FreeBSD バイナリによる検出
の節をご覧ください。
比較を行うには、 結果の出力先のファイル名を指定してください。
#
freebsd-update IDS >> outfile.ids
システムは検査され、リリースファイルの SHA256 ハッシュ値と現在インストールされているファイルのハッシュ値がファイルの一覧と共に、 指定した出力先のファイルに送られます。
これらの行は極めて長いのですが、出力形式は簡単にすぐに解析できます。 たとえば、これらのリリースで異なっているすべてのファイルを知りたいのであれば、 以下のコマンドを実行してください。
#
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
オプションに追加してください。
本文書、および他の文書は https://download.freebsd.org/ftp/doc/ からダウンロードできます。
FreeBSD に関する質問がある場合には、
ドキュメント を読んだ上で
<questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、
<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。