sysutils/portsnap

久しぶりの FreeBSD ネタです。

前からちょっと気になっていたのですが、[FreeBSD-Announce] FreeBSD Status Report Jan-Mar 2005 にも登場したのでFreeBSD Portsnap を使ってみました。

最初はこんな感じ。

# cd /usr/ports/sysutils/portsnap
# make install clean
# cd /usr/local/etc/
# cp portsnap.conf.sample portsnap.conf
# rehash
# portsnap fetch && portsnap extract

以降はこんな感じ。これだけで portsCVS ツリーを最新に保つことができるようです。

# portsnap fetch && portsnap update

FreeBSD Portsnap の説明が簡潔すぎて良く分からないのですが、特徴としては以下のように書いてあります(超意訳)。

  1. CVSup は安全じゃない。プロトコルで暗号化も電子署名も使っていないし、通信を邪魔できる攻撃者であれば更新しているツリーに任意のデータを挿入できてしまう。
  2. CVSup は エンド−エンド じゃない。上記に関連して、これは CVSup ミラーを汚染できれば、そのミラーを利用しているユーザに任意のデータ供給が可能であることを意味する。
  3. CVSup は小さな更新を頻繁にするようには設計されていない。CVSup は CVS ツリーの配布には非常に良く、大きな変更がなされたツリー(例えば 1ヶ月以上の間があいた際のツリー)を更新するには非常に効率的である一方、わずかなファイルしか変更されていない場合でもツリーの全てのファイルのリストを送信するため、極めて非効率である。
  4. CVSup は独自のプロトコルを使用している。これはファイアウォールの背後に居るユーザには問題(外部の 5999/tcp への接続許可が必要)であるし、非常に重いサーバ(cvsupd)が必要となる。

3, 4 に関しては確かにそう思います。時間が掛かるし、ipfw/ipfilter/pf のルールで CVSup のためだけに別途ルールを記述しなければならず、ちょっと後ろめたい*1気がしていました。

portsnap はこれらの問題に対して以下のアプローチで解を提供するそうです(超意訳)。

  • プロトコルには HTTP を使用する
  • スナップショットには OpenSSL を用いて電子書名を行う
  • スナップショットの配布のために、より洗練されたデルタ圧縮(Binary diff)を使用する

そうそう、[FreeBSD-Announce] FreeBSD Status Report Jan-Mar 2005 によると INDEX/INDEX-5/INDEX-6 も提供するそうですので、CVSup 後の portsdb -Fu 相当の作業も不要なのは嬉しいですね。


ただ、現時点では以下の点が気になっています。

  1. Colin Percival 氏の個人的なプロジェクトみたいなので、安定的にデータが供給されるのか
  2. CVSup のようなローカルミラーを作れるのだろうか

1. に関しては [FreeBSD-Announce] FreeBSD Status Report Jan-Mar 2005 によると以下のような記述があります(超意訳付 helped by Excite ^^;)。

In early February hardware problems caused both FreeBSD Update and
Portsnap to stop functioning for a few days, but those were resolved
thanks to a server donated by layeredtech.com.
2月初頭に、FreeBSD Update*2、Portsnap 共に ハードウェア障害のため数日間、
機能を停止しましたが、layeredtech.com によって寄贈されたサーバのおかげで
解決されました。

I intend bring Portsnap into the FreeBSD base system before the end of
the month, followed by FreeBSD Update a few months later.
月末までに Portsnap を、その二、三ヶ月後に FreeBSD Update を FreeBSD の
ベースシステムに取り込むように試みます。

FreeBSD のベースシステムに取り込まれてくれると安定してデータ供給がなされることになるでしょうから、実運用環境にあるサーバでも CVSup から Portsnap に切り替えてもよいかな、と思います。できればローカルミラーも作れるようにして欲しいですね。

追記:05/04/24

man portsnap すると以下の記述があります。参考までに抜粋 & 意訳です。

TIPS
     o   マシンの時計がローカルタイムなら、次の行を /etc/crontab に登録する
         ことで ports ツリーの最新のスナップショットを取得し、それを /usr/ports
         に展開する事ができる良い方法です。

               0 3 * * * root /usr/local/sbin/portsnap cron

         もし時計を UTC にしているのなら、snapshots を提供しているサーバの
         負荷が集中しないように、午前 3時以外のランダムな時間を選択して下さい。

     o   多数のマシンを最新の状態に保つために portsnap を使用したければ、
         キャッシュ用 HTTP プロキシをセットアップすると良いでしょう。portsnap は
         更新データのダウンロードに fetch(1) を使用していますので、HTTP_PROXY
         環境変数を設定することで指定されたプロキシから更新データを取得する
         ように指示することができます。大部分のファイルは大半のクライアントに
         とっては不要なので、この方法は portsnap サーバのファイルをミラーリング
         するよりも非常に効率的です。

これが前述の『CVSup のようなローカルミラーを作れるのだろうか』に対する回答なんですね、きっと。

ただ、キャッシュ用の HTTP プロキシを公開ネット上に置くのはどうかなぁ、と思います。いつものように pf でパケットフィルタした上で ACL をきっちり設定した squid を構築すれば良いのでしょうが...


*1:「不必要に外部にアクセスさせてはいけません。apt-get できない? 社内で落として scp で転送しなさい」と社内で教えながら、FreeBSD マシンのためだけに CVSup を許可するルールを記述していたので...

*2:FreeBSD のベースシステムをコンパイルせずに更新する仕組みで、非力なマシンでもセキュリティを簡単に維持することができます。某開発・検証環境で実際に使用しています