授業資料/第06回 の変更点

Top / 授業資料 / 第06回

* OS 全体のアップデート [#x3a16d06]

カーネルからシステム,  アプリケーションに至るまで一般の unix 系 OS では非常に多くのソフトウェアが含まれている.
これらのソフトウェアのセキュリティ上の脆弱性が日々発見および悪用されている昨今,細かいシステムアップデートの仕方を知らないとセキュリティを固めることは不可能である.
順番としてはこれから様々な daemon をインストールする前にこうしたシステム更新について学んでおいた方がよい.

そこで,FreeBSD の場合((残念ながら,unix 全体等で通用する汎用的な仕組みはまだない. なぜなら,セキュリティの問題がこんなに深刻になったのは実はつい近年のことであり,各種 OS が "分派" したのはそれよりも過去だからである. セキュリティ問題が深刻でなかった時代には OS/Software のアップデートやパッチ当てという作業の頻度は今よりも格段に低かったため,場当たり的な方法でもそう問題ではなかった.))のこうしたアップデートについて,ある程度一般的なことを学習する.

** FreeBSD のバージョン [#h37cb8db]

まず FreeBSD のバージョン違いにはどのような意味があるのかざっと知っておこう.

まず,
  uname -v
としてみよう. すると皆の今のマシンの状態では
  FreeBSD 6.2-RELEASE #0: Fri Jan 12 10:40:27 UTC 2007     root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC
などと表示される. この第二項目の "6.2-RELEASE" がバージョンを表している.
ただし,uname コマンドの出力は古かったりウソをついたりする可能性があるので,より正しく /usr/src/sys/conf/newvers.sh の REVISION= という部分と BRANCH= という部分をチェックして確かめておこう((というのも,uname はコンパイルされないと更新されないし,しかも,その出力内容は更新時に管理者によって自由に設定できてしまうのだ.)).
これらのバージョンは,FreeBSD が公式にサポートしているシステム群全体に対してどのような状態であるかを示している.

この "6.2-RELEASE" のうち,最初の数字二つがバージョン番号(revision)で,最初の一つがメジャー,二つ目がマイナー番号などと呼ばれる((一般にメジャーが大きければそちらが,同じならマイナーの大きな方がより新しい)). 
そして,最後のハイフン以降が branch と呼ばれ,そのバージョンの「現在の状況」を表している.
branch にはおおよそ次のようなものがある.

: current | 開発中,最前線にあることを意味する. 最新の機能てんこもりではあるが,変更はしょっちゅうだし,バグも多い. コンパイルできないこともままある. 内容は「入手した日時で」ぜんぜん違う((よって,例えば同じ "7.0-current" と言っても入手した時により内容が違うので,内容の詳細に基づかないと人と話が通じない.)).
: stable | 安定して使える状況であることを意味する. current でさんざん試験された機能が統合され,安定性とセキュリティ確保が目的の保守がされている. 内容は「入手した日時で」違う.
: release | stable の中でも特に安定性とセキュリティのために注意深く試験, 保守されたもので,FreeBSD の利用には一般にこの版が推奨される(もちろん stable 版を常に更新しつつ使ってもよい). 内容は入手日時に関係なく基本的に「固定」されている. 

また,release 版では特に「セキュリティのためだけに最小限の変更を行った」バージョン違いもきちんと記述される.
例えば "6.2-RELEASE-p6" などと表記され,これは 6.2-RELEASE にパッチが 6回適用されたバージョンであることを意味する.
現在はこの数字がいくつになっているべきなのかは, [[FreeBSD Security Information:http://www.freebsd.org/ja/security/]] などをみて,セキュリティ勧告(FreeBSD-SA-* というやつ)がその Release が公開されてからいくつあるかを数えればよい.

これらの branch の違いは(ある程度使ってみても実感できるが)後述のアップデート方法の違いからも推察されるので,よくわからないというものはその部分まで読み進めればよい.

*** 実習 [#jf8e880d]
現状の OS のバージョンをきちんと調べ,記録しておけ.
また,今現在は FreeBSD の release branch の最新のものはいくつであるはずか調べよ([[FreeBSD Security Information:http://www.freebsd.org/ja/security/]] を探して読んでみよということ)

** FreeBSD のシステムアップデートの方法 [#ia20f5c0]

FreeBSD のシステムのアップデートには主に以下のようなものがある.

: 再インストール | 要するに新規インストール. 他に手段がないときの最終手段. アップデートであまりにも変化が大きいときはこの方法が安全ではある. Windows 等と違って FreeBSD では設定ファイルのほとんどがテキストファイルなので, 設定を引き継ぎやすいのがせめてものなぐさめか.
: プログラムソースを更新し,コンパイルしてシステムを入れ替える | ソースからバイナリをその都度作るためかなり汎用性は高いが,時間も手間も結構かかる. 少し前までは発見された(セキュリティ)脆弱性に対応するには事実上この方法しかなかった((面倒なんだこれが)). ソースの更新には "cvsup" を用いるのが一般的. ちなみに,この方法は,コンパイルに使うコマンドから俗に "make world" と言われる((ただし,実際に "make world" としていたのは昔の話. 今は実際には "make buildworld; make buildkernel; make installkernel; make installworld" とする方法が推奨されている.)). なんだかんだ言ってもこの方法を使えないと困ることもあるかと思われる. 詳細は [[ハンドブック:http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/makeworld.html]] を参照すべし.
: sysinstall を用いる | 新しいバージョンのインストールディスクで起動してsysinstall を用いる方法. 隣り合った release 間でしか使えないと思っておいた方がよいが,簡単で楽.
: 特殊なツールを用いる | release バージョン間においては,公式/非公式に特別なアップデートツールが提供されることが多い. これを用いると非常に簡単にアップデートが可能だが,これも適用対象は非常に限定されており汎用性は低い.
: freebsd-update を用いる | これは一種のバイナリアップデートで release 版を,同じ release 版の最新のセキュリティパッチが上がったものに修正してくれるものである.
日々のセキュリティ対策の負荷を大きく下げてくれる嬉しいシステムである. ただし,主に release 版にしか使えない((最近のバージョンは stable 版にも適用可能ということになってはいるが必ずうまく行くわけではないようだ)). ただし,ports 関係までは面倒見てくれないので,ports 関係については自分で考えないといけない(詳しくは後述).

参考のために,いくつかの資料を示しておく.

*** cvsup について [#j874aae0]
FreeBSD でシステムを再構築するために必要なソースを更新するには一般的には cvsupというコマンドが使われる.
入っていなければ ports からサクッとインストールしておく(インストールするのはGUI 不要な "cvsup-without-gui" にしておこう).
例えば,あとは 6.2-Release 内での最新に揃えるためならば /etc/cvsupfile を次のようにする((阪大からはやはり cvsup4.jp.FreeBSD.org が一番近い.これは fastest_cvsup というコマンドで確かめられる. )).
  *default  host=cvsup4.jp.FreeBSD.org
  *default  base=/var/db
  *default  prefix=/usr
  *default  release=cvs delete use-rel-suffix
  
  *default  tag=RELENG_6_2
  src-all
  
  *default tag=.
  ports-all
  doc-all
こうしておいて,
  nohup /usr/local/bin/cvsup -g -L 2 /etc/cvsupfile
などとすれば,(上の場合は)システムソースと,portsソース, ドキュメントまで全て更新される.
ただし,何も工夫しないでこのまま使うと初回時にやたらと時間を喰うことになる(ports の新旧比較に時間がかかるため((これを防ぐには,ftp4.jp.freebsd.org/pub/FreeBSD/ports/ports.tar.gz を直接持ってきて事前に展開しておくか,portsnap を使うのがよい)) ).

*** make world 系について [#qa4ed1c3]
make world の手続きの詳細については [[ハンドブック:http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/makeworld.html]] を見ればよいので,ポイントのみ書いておく.
管理者見習いにとって,システムをコンパイルして入れ替えるこの方法で一番問題になるのは,主に /etc 以下にある設定ファイルの引継ぎだろう((具体的には,mergemaster コマンドが「どうしますか」と全て聞いてくる)).
理想を言えば「何を聞かれているか完全に分かって作業する」ことになるが,どうしても困った場合は,
- 自分で触った記憶のあるファイル … 新旧二つを比べて手で修正することにする
- 自分で触ったことのないファイル … 新しい方を採用

という方針でなんとかなるだろう.
なお,作業所用時間であるが(Pentium 4, 3GHz 程度の古めの PC で),
- 最も時間のかかる buildworld で1時間半程度
- 他はあわせて 1時間弱という程度か

という感じである.

*** freebsd-update について [#m4986be9]
マニュアルを見るとおおよそ4つの使い方があるが,手動で行うならばまず
  freebsd-update fetch
としてバイナリパッチを取得し,取得したパッチが適用されるファイル等を眺めて問題ないと思ったらおもむろに
  freebsd-update install
とするだけである(この後念の為にリブートしておくこと). お気楽だ.  
ちなみに,とらぶった場合は
  freebsd-update rollback
で最も新しく適用されたバイナリパッチがはがされて元に戻ることになっている.

なお,システムライブラリを静的にリンクしているなどの ports/package がある場合は,それらも更新しないと意味がない.

*** 実習 [#l686332a]
cvsup をインストールせよ.
また,[[ハンドブック:http://www.freebsd.org/doc/ja_JP.eucJP/books/handbook/makeworld.html]] をざっと読んで,ソースからコンパイルしてインストールする際の作業の流れを掴んでおけ(いつかやる羽目になるだろうから).

*** FreeBSD システムアップデートの方法の主な構図 [#i09e1e39]
branch とアップデートの方法の関係を大ざっぱな図として以下に示す.
&ref(./freebsd-update-figure.png, 75%, "FreeBSD のシステムアップデートの主な構図");
&br;
これをみると分かるが,release branch に留まっていれば何かと楽である.
ただし,100% この図の通りだというわけではない. 特にアップデートの方法は「優れたツールが開発されて楽になっていく傾向が強い」ので,アップデートが必要なときに調べ直すと嬉しい発見も多いだろう.

*** 実習 [#h3d4e8b7]
freebsd-update を用いて,自分のシステムをアップデートせよ((腕に自信のある者,チャレンジ魂のある者は代りに "make world" (ソース更新 & コンパイル)で行ってもよい.ただし今日中に帰れないと思う…)).
うまく行ったならば,その後バージョンを調べてどうなったか記録せよ.
また,freebsd-update を cron から実行できるように設定せよ(前回の実習を思い出せ).

** ports/packages のアップデート [#haefb5e1]

ports/packages のアップデートは,原理的には ports ソースを更新してから各々のソフトウェアを再インストールすればよい.
とはいえ,これは時間がかかるし,ソフトウェア同士の依存関係に沿って更新が必要なことを考えると負担が大きすぎる((ソースを最新にしておくこと自体は意味があるにしても)).
そこで,ports/packages の状況を管理し,適切にアップデートを補助するツールがいくつかある((結構沢山ある. /usr/ports/ports-mgmt/ 以下は基本的にそうしたツールである))ので,これらを上手に使おう.

以下に,そうした用途に便利なツールを紹介しておく.
使い方としては,基本的には次のようにすればよい.
+ portsnap を cron で用いて常に ports コレクションを最新の状態に
+ portaudit を cron で用いてインストール済みの package/ports の脆弱性の最新情報を知る
+ portupgrade を用いて,脆弱性のみつかった package/ports を更新して安全な最新バージョンに更新する

*** portsnap [#t5bb6102]
ports ソースを更新するためのツール.cvsup よりは早いようだ.
また,portsnap 「以外」のツールでの ports更新を行った際には Index更新のために portsdb -uU としておくことが(念の為にも)必要だが,これは 20分程度かかりかねない処理であり,苦痛である.
しかし,portsdb で更新している限りにおいては Index も一緒に更新されるので(というか持ってくる),portsdb -uU とする必要がないのも利点である.

初回は
  portsnap fetch
  portsnap extract
とする. ただし,/usr/ports 以下は真新しくなってしまうはずなので,重要なデータは置いておかないこと.
(マニュアルを読む限り実質的な差は見いだせないが)二回目以降は
  portsnap fetch
  portsnap update
としておけばよさそうだ.

cron 化には,例えば
  0 4 * * * root portsnap cron
などと /etc/crontab に書いておいて,root 宛に「データが新しくなったぜ」というメールが来たらそのときに
  portsnap update
とすればよいはず.
なお,マニュアルには cron で portsnap update を行うのは良くないと理由付きで書いてあるので注意すべし.
どうしても cron から動かしたかったら portsnap -I update としておけとも書いてある.

*** portupgrade [#r091e252]
既にインストールされている ports/packages をアップグレードするツール. 
これをインストールしておくと,ついでに portinstall や portversion コマンドが使えるようになるし,とにかくインストールしておけ((ただし,インストール後は ports のデータインデックスの整合性を正しくするために念の為に一回は portsdb -uU としておくことを勧める)).
これをインストールしておくと,ついでに portinstall や portversion コマンドが使えるようになるし,とにかくインストールしておこう.
// ただし,X window system をこのツールの対象にいれておくと巨大すぎるうえにトラブリやすいので外しておいた方がよい様に思うし,バックアップファイルも大きくなりそうだ.
これをインストールした後は,port のインストールは
  portinstall ソフト名称
とするだけでよいようになるし,アップグレードも
  portupgrade ソフト名称
だけでよいのでとても楽になる.

*** portaudit [#mfed2af0]
脆弱性報告のあるインストール済み ports/package を見つけてくれるツール.
例えば,
  portaudit -adF
としてみるとよい.

*** 実習 [#gfa0aefd]
portsnap, portupgrade, portaudit のうち,インストールされていないものがあればインストールせよ.
次に cvsup もしくは portsnap を行ない, ports ソースを最新のものにしておけ.
ただし,だいぶ時間がかかるだろうから,コマンドを仕掛けて帰ってよろしい.

** ちなみに,システムも ports も全てをきちんと update すると((/usr/ports/UPDATING に書かれている通りに実行しても fail が多発する上,pkgdb も壊れたりするので,こういうトラブルに対処できないと実行できない. まあ X ぐらい大きくて複雑なシステムを一度に更新しようというのだから無理もない. ちなみに丸二日から三日はかかる…))… [#teb06457]

この時点でシステムは 6.2-Release-p9 に,  X は 7.3 に((6.2-Release リリース時は X は 6.9 である. X のバージョンが 6.9 より大きくなるときに,X のファイル構造が大きく変わったので,このバージョンアップはトラブルが多発する. トラブルの解決の自信が無い者は無理に X のバージョンを上げない方がいいだろう. ただし,脆弱性報告のある ports のいくつかはそのせいで update できない.)), Gnome は 2.20 になる. 
これはこれまでのコマンドを試してみると以下のようになることになる.
>  > uname -v  ← システムのバージョンチェック
> FreeBSD 6.2-RELEASE-p9 #0: Thu Nov 29 04:07:33 UTC 2007     root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC

>  > portaudit -adF  ← ports の脆弱性監査報告を出力させてみる
> 0 problem(s) in your installed packages found.

>  > portupgrade -na -x 'emacs*'   ← ports で update がまだされていないものがあるかチェック.  emcws を使っている関係で emacs がやや古いため,除外している.
> [Updating the pkgdb <format:bdb_btree> in /var/db/pkg ... - 646 packages found (-0 +23) ....................... done]
> ** No need to upgrade 'jbigkit-1.6' (>= jbigkit-1.6). (specify -f to force) [#vaaf0dc6]
> …略…
> --->  ** Upgrade tasks 645: 0 done, 1 ignored, 0 skipped and 0 failed
> …略…
> --->  Packages processed: &color(red){0}; done, 645 ignored, 0 skipped and 0 failed ← &color(red){0}; の部分に要update の ports の数が記される. 0 ならば全部最新ということだ.
> --->  Session ended at: Wed, 05 Dec 2007 20:40:18 +0900 (consumed 00:05:29)  

なお,(X と Gnome のバージョンが上がった関係で)画面はデフォルトで &ref(./After-sm.png); のようになる.

* レポート [#f19a9c5b]
FreeBSD 6.3-Release が公開されたならば((2007.12.23 に公開される予定. まあ予定は遅れるものだが…)),今のシステムをそれにアップデートするにはどうしたらよいか,この資料だけでなくweb で調べるなどして((6.1-Release から 6.2-Release へのアップデートツールなどを探してみれば推測ができよう)),なるべく詳細に調べよ.
また,本日行った作業について報告せよ.