「多少なりともまともなセキュリティエンジニアの唱えるべき呪文とは:『セキュリティというのは
製品ではなくプロセスなんだ』ということ。単に、強い暗号方式をシステムに組み込むだけじゃすまない。
システム全体の設計にあたって、暗号方式を含むあらゆるセキュリティ手段がいっしょに働くよう
設計するということだ」
-- Bruce Schneier, "Applied Cryptography"著者.
暗号の使用
Index
なぜ暗号つきで出荷するのでしょう ?
OpenSSH
疑似乱数生成器 (PRNG): ARC4, ...
暗号技術的ハッシュ関数: MD5, SHA1, ...
暗号変換 (Cryptographic Transforms): DES, Blowfish, ...
暗号化ハードウェアのサポート
国際暗号学者求む
追加読み物
なぜ暗号つきで出荷するのでしょう ?
それは一言で、出荷できるから です。
OpenBSD プロジェクトは、カナダが本拠地です。
カナダ輸出規制一覧は、
暗号ソフトの輸出に 特に制限をつけていないし、
自由に手に入る暗号ソフトの輸出が自由である ことについては、
もっとはっきり明記してあります。
暗号関連法規を検討する研究は、
Marc Plumb が行っています。
おかげで OpenBSD プロジェクトは、オペレーティングシステムの随所に
暗号を仕込んであります。私たちとしては、使用する暗号はすべて
自由に入手できてライセンスも適切でなくては ダメです。
いぢわるな特許つきの暗号は、直接使用できません。
さらに その暗号ソフトが、まともな輸出ライセンスを持った国からのもので
あることが必要です。どこの国の法律も破りたくないからです。
いま 私たちが使用している暗号ソフトコンポーネントは、
アルゼンチン、 オーストラリア、カナダ、ドイツ、ギリシャ、ノルウェー、スウェーデン
で書かれたものです。
OpenBSD のリリースやスナップショットをつくるときには、リリース用バイナリは
フリーな国でつくります。ユーザに提供されるソースやバイナリが、ケチの
つかないものであるのを確実にするためです。過去のリリース用バイナリは、
カナダ、スウェーデン、ドイツで作られています。
OpenBSD は Kerberos V 込みで出荷されています。私たちの使用するコードベースは、
輸出規制のない Heimdal リリースでスウェーデンからのものです。私たちの X11
ソースも、Kerberos を使用するように拡張されています。
OpenBSD は、IPsec スタックつきで出荷された初のオペレーティングシステムでした。
IPsec は、1997 年の OpenBSD 2.1 リリース以来含まれています。
私たちの、完全準拠のカーネル内 IPsec スタックは、多数のカードに基づく
ハードウェアアクセラレーションつきだし、私たち独自のフリーの ISAKMP デーモンと
いっしょにVPNCの
IPsec 準拠試験のためのマシンのひとつでも使用されています。
今日、暗号はオペレーティングシステムのセキュリティを高める方法としてだいじです。
OpenBSD で使用される暗号は、いくつかの側面に分類できます。
以下に説明しましょう。
OpenSSH
2.6 リリースをもって、OpenBSD には
OpenSSHが含まれます。完全にフリーで
特許のしがらみもないバージョンの ssh です。
OpenSSH は ssh バージョン 1 と相互運用できて、
さらにいろいろ追加機能を持っていました。
-
制限つき (つまり特許のこと、
ssl(8)
を参照) のコンポーネントはすべて、ソースコードから直接取り除かれました。
ライセンスや特許つきコンポーネントは、外部ライブラリを使用します。
-
ssh プロトコル 1.5をサポートするようにアップグレード。
-
Kerberos 認証とチケット引きわたし (ticket passing) の機能を追加。
-
skey(1)
による、使い捨て (one-time) パスワード認証のサポート。
おおまかに言って、私たちは ssh のフリーライセンス版リリースを持ってきて、それを OpenBSD 化した、というわけです。
それから一年ほど後に、私たちは OpenSSH を拡張して SSH 2 プロトコルも扱えるようにしました。
現在、1.3、1.5、2.0 という、主要な SSH プロトコルすべてに対応しています。
疑似乱数生成ソフト
疑似乱数生成 (PRNG) ソフトは、アプリケーションに一連の数字をわたします。
この数字は、システムのセキュリティ上、いくつか重要な特徴を持っています;
- 外部の存在には、それ以前の出力結果がわかっている場合でも、
次の出力を予想することが不可能でなくてはならない。
- 発生された数字は、くり返しパターンを持っていてはならない。
つまり PRNG は、きわめて長いサイクルを持っていなくてはならない。
PRNG はふつう、同じ初期値から始めれば同じ出力シーケンスが出てくる
アルゴリズムにすぎない場合が多いのです。マルチユーザの
オペレーティングシステムでは、PRNG にランダムなデータでシードを与えるための
ソースがたくさんあります。OpenBSD カーネルは、マウスのインタラプトタイミングや
ネットワークデータのインタラプト応答時間、キーボードの打鍵間隔や、ディスク IO 情報を
使用して、エントロピープールを満たそうとします。乱数は、カーネルルーチン用に
提供されていて、デバイス経由でユーザ領域のプログラムに輸出されます。いまのところ、
以下のようなところで乱数が使用されています:
- bind(2) の動的 sin_port 割り当て
- プロセスのPID
- IP データグラムの ID
- RPC トランザクション ID (XID)
- NFS RPC トランザクション ID (XID)
- DNS クエリーID
- Inode 生成数、getfh(2) と fsirand(8)を参照
- traceroute(8)のタイミング摂動 (Timing perturbance)
- mktemp(3) と mkstemp(3)について、もっと強力な一時名称
- スプーフィング攻撃からの防御のために、
TCP ISS 値に乱数性を付加
- IPsec esp_old パケットに、ランダムなパディング
- 各種パスワードアルゴリズムの、「ソルト」生成用
- にせものの S/Key チャレンジ生成
- isakmpd(8)
では、鍵の交換に liveness 証明を与えるために使用
暗号技術的ハッシュ関数
ハッシュ関数は、入力データを圧縮して、一定サイズのストリングにします。暗号技術的ハッシュ
関数においては、次のようなものを見つけることは不可能か非常に困難となります:
- 二つの入力が同じ出力を生み出すこと (collision resistant)、
- 同じ出力結果を持つ入力二つが異なっていること
(2nd preimage resistant).
OpenBSD では、MD5、SHA1、RIPEMD-160 が暗号技術的ハッシュ関数として使用されています。
たとえば以下のような場面で:
暗号変換
暗号変換は、データの暗号化と復号に使用されます。これらは、
データ暗号化用には暗号キーを使用し、データ復号用には
復号キーを使用します。暗号変換のセキュリティは、
キーとなる材料にのみ依存するはずです。
OpenBSD は、DES、3DES、Blowfish、Cast などの暗号変換方式を、カーネルやユーザ
領域のプログラム用に提供しており、これはいろいろな場所で使用されています。たとえば:
- libc では
Blowfish
パスワードの生成に。これについては、USENIX 論文
も参照のこと。
- IPsec(4)
では、
ネットワーク層の機密性提供のため。
- isakmpd(8)
では、IPsec の鍵となるものが相談されるときのやりとりを保護するために利用
- AFS ではネットワークを通過するメッセージ保護に使用され、
リモートファイルシステムへのアクセスの機密性を提供
- libssl では、アプリケーションがデファクト標準化している、暗号的に
高セキュリティの SSL プロトコル上で通信できるようにするため
暗号化ハードウェアのサポート
OpenBSD は 2.7 より、アクセラレータや乱数生成器など、一部の暗号化ハードウェア
のサポートをはじめました。
-
IPsec crypto dequeue
私たちはIPsec スタックに手を入れて、暗号関数が外部で処理されるようにしました。
ほとんどの単純なソフトウェアによる IPsec スタックは、各パケットの処理ごとに
暗号処理を必要としました。これはパフォーマンスが同期化するということになります。
ハードウェアをきちんと高速に使用するためには、この二つのコンポーネントを分離しなければ
ならないのです――私たちがやったように。実は、これをやることで、ソフトだけの
場合にもちょっと速度が向上します。
-
Hifn 7751
たとえば、
Soekris VPN1201 や VPN1211
(購入)
あるいは
PowerCrypt のような、
Hifn 7751 を使用したカードは、対称暗号アクセラレータとして使用可能です。
トンネルの両側に Hifn 7751 をひとつずつ使用したときの目下のパフォーマンスは、
3DES/SHA1 ESPで 64Mbit/秒、P3/550 CPUを使用した場合にくらべて 600% 近い
性能向上です。いくつか問題を解決するために、さらに改良が加えられていますが、
2000 年 4 月 13 日時点では、コードは安定したと判断されます。
このチップをサポートするために、私たちは (アメリカで書かれた)
PowerCryptドライバを使用せずに、
自前でドライバを開発しました。私たちのドライバはまた、
IPsec スタックにもきちんとリンクしています。
7751 はいまや業界の標準では遅いと考えられていて、多くのベンダは
もっと高速なチップを持っています (当の Hifn も、もっと高速だけれど高価なチップを
出しています)。3DES SHA1 ESP のピーク性能は 64Mbit/秒くらいです。
2.9 のリリース後、公開鍵アクセラレータ (未サポート) および
乱数生成器 (サポート済) を備えた 7751 の単純化バージョンの、
Hifn 7951 チップのサポートが追加されました。カードは、
Soekris Engineering から寄付されました。
3.0 のリリース後、乱数生成器を備えた 7751 (約 130Mbit/s) の
高速版の、Hifn 7811 チップのサポートが追加されました。カードは、
GTGI から寄付されました。
ipcomp(4)
で使用されている LZS 圧縮アルゴリズムが、3.2 の出荷後にサポートされるようになりました。
3.4 の出荷後、7955 と 7956 チップのサポートが追加されました。さらに、以前の
7951 チップのすべての機能の追加により、これらに AES も追加されました。
Hifn は最初は協業するには気難しい会社でしたが (私たちがアメリカの外で、
彼らの暗号アンロックアルゴリズムをリバースエンジニアリングしたことについて
訴えると脅迫的でした)、より最近では、ボードやサポートを用意してくれたり、
非常に協力的になってきています。
-
Hifn 6500
このデバイスは非対称暗号ユニットです。他の有名な多くの大数関数群と同様、
RSA、DSA および DH アルゴリズムをサポートしています。超高性能
乱数生成器も備えています。私たちはデバイスをひとつと完全なドキュメン
テーション、そしてサンプルコードを入手しています。現在の OpenBSD 3.1 では、
乱数生成器および大数ユニットの作業中です。
-
Hifn 7814/7851/7854
このデバイスはパケットプロセッサおよび非対称暗号ユニットです。
他の多くの大数関数群と同様、RSA、DSA および DH アルゴリズムを
サポートしており、また、乱数生成器も備えています。現時点では、
大数エンジンならびに乱数生成器のみサポートされています
(パケット変換は行いません)。
-
Broadcom BCM5801/BCM5802/BCM5805/BCM5820/BCM5821/BCM5822/5823
(またはベータ段階のチップ Bluesteelnet 5501/5601)
OpenBSD 2.7 リリース直後、これらベンダー提供による初期
リリース部品の試験サポートの追加に成功しました。
特に、テスト用チップの5501です。
これらのデバイスは私たちが今まで見た中で最高性能の対称暗号化を
提供します。
Bluesteelnet は Broadcom に買収されて、本物の部品づくりを開始しています。
かれらの新しい BCM5805 は、似てはいますが、DSAやRSAなどのアルゴリズムを
走らせるために、非対称エンジンを追加してあります。おおまかな性能は、
最低でもHifn の 4 倍程度高速となっていて、このチップがはやめに普及して
くれることを願いたいものです。
Broadcom/Bluesteelnet の人たちは、実につきあいがいのある人たちでした。
チップの完全なドキュメンテーションとサンプルコードもくれたし、試験用の
カードもいっぱいくれました。
2.8 の次のバージョンでは、このドライバは BCM5805 上で乱数を発生する
様にも変更されました。そしてそれらのデータはカーネルのエントロピープール
に送り込まれます。
2.9 のリリース後、BCM5805 の高速版 (64bit、より高速なクロックスピード) と
も言える BCM5820 のためのサポートが追加されました。テストされていませんが、
BCM5821 のためのサポートもまた、3.0 のリリース後に追加されています。
現在の 3.1 では、大数エンジンがサポートされ、RSA/DH/DSA の演算は
アクセラレートされるようになりました。
BCM5801、BCM5802、BCM5821 および BCM5822 のサポートは、OpenBSD 3.2 以前に
追加されました (3.1 に含まれる BCM5821 のサポートは、テストされていない上、
ドキュメントになかった割り込みハンドリングの必要性があり、壊れていました)。
BCM5823 の部分的なサポートが 3.4 に追加されました。このチップは AES
をサポートしていますが、ドライバでのサポートはまだ行われていません。
-
Securealink PCC-ISES
PCC-ISES はオランダ発の新しいチップセットです。見本のハードウェアと
ドキュメンテーションをもらったので、作業が進行中です。現時点では、
ドライバは乱数をカーネルのエントロピープールに送り込めるように
なっています。
-
SafeNet SafeXcel 1141/1741
3.4 のリリース後、これら 2 つのチップのサポートが追加されました(その他の
SafeNet
暗号カード)。DES、Triple-DES、AES、MD5 および SHA-1 の対称暗号演算、
RNG、公開鍵演算 および IPsec パケット処理がサポートされています。
- SafeNet SafeXcel 1840
SafeNet 1840
のドキュメントと暗号チップの見本をもらいました。
少なくとも、これらのデバイスの RNG および対称暗号化機能をサポートするための作業が
始められています。
- SafeNet SafeXcel 2141
SafeNet
のドキュメントと暗号チップの見本をもらいました。
少なくとも、これらのデバイスの対称暗号化機能をサポートするための作業が
始められています。
-
3com 3cr990
3com はこのチップセットの Ethernet コンポーネントをサポートするための
ドライバをくれ、それをもとに私たちは独自の Ethernet ドライバ
を書きました。このドライバは、マイクロコードについてのフリーなライセンスが
得られたら、すぐに統合される予定です。貧弱なドキュメントと共同作業の不足に
より (部分的には、3Com の高い転職率のため)、チップの IPsec の機能はサポート
されていないので…… このため、この装備は、完全に役に立つ試作品以下のもの
でしかないことがわかりました。
- Intel IPsec カード
インテルのネットワーク関連製品に対する態度はいつもそうなのですが、インテルは他の多くの
ベンダーとは正反対に、ドキュメンテーションを提供することを頑として拒否しています。
私たちは、インテル製品の開発に携わっている技術者 5 人ほどと話し合う機会がありました。
彼らはみな、私たちにドキュメンテーションをわたしたがっています。私たちの成果を高く評価
してくれているのです。しかし、彼らの手は経営者によって自由を奪われています。経営者たちは
私たちへのドキュメンテーションの提供が彼ら自身への利益になるということを理解してい
ないのです。インテルのことは忘れましょう。(もしもギガビット Ethernet のハードウェアを
買いたければ、他社製品をお勧めします…理由は同じです。インテルのネットワークハードウェア
用ドライバのほとんどはインテルからのドキュメンテーション提供なしで開発されたものだから
です。)
-
Intel 82802AB/82802AC Firmware Hub RNG
82802 FWH チップ (i810、i820、i840、i850 そして i860 マザーボード上に
あります) は乱数生成機 (RNG) をもっています。高性能 IPsec はもっと高い
乱数エントロピーを必要とします。2000年4月10日をもって、私たちは RNG を
サポートします。暗号チップ上のほかの RNG サポートも追加していきます。
- VIA C3 RNG
最近の VIA C3 CPU は、乱数生成器をその命令として持っています。
3.3 では、カーネルのエントロピープール用に、
カーネル内部でこの乱数生成器を使用しています。
- VIA C3 の AES の命令セット
ステッピング 8 以降の Nehemiah コアの VIA C3 CPU には、
簡単な命令でアクセスすることができる AES の実装が含まれています。
3.4 のカーネルは、IPsec で利用したり、
/dev/crypto でエクスポートされているこれらをサポートしています。
3.5 では性能が大幅に改善され、OpenSSL
は現在では、利用可能な場合にはカーネルに入ることなく、
この新しい命令を直接利用しています。その結果、AES による暗号化を
実行しなければならない OpenSSL 使用アプリケーションでは、その実行速度が
非常に改善されています (AES-128 で 780MB/s を記録しています)。
- OpenSSL
1 年前、私たちは OpenSSL の呼び出しを通じて RSA/DH/DSA の暗号化を自動的に行える
暗号カードをサポートしようという、大いなる計画を持っていました。OpenBSD 3.2 では、
それが動くようになり、そして、そのような機能がサポートされているすべてのカードで、
自動的にハードウェアを使用するようになります。これには、OpenSSH や httpd の SSL
モードも含まれています。そして、アプリケーション側の変更は一切必要ありません。
もしドライバ書きを手伝いたい人がいたら、
是非手伝ってください。
国際暗号研究者募集
もちろん、私たちのプロジェクトは、こうしたシステムの作業をしてくれる
人々を必要としています。もしアメリカ以外の暗号学者で、これまで挙げた
制約条件を満たす人が OpenBSD 組み込み暗号の手助けをしてくれる気があるなら、
ぜひ連絡してください。
追加の資料
OpenBSD チームメンバーは、OpenBSD のセキュリティ関連の変更について、
いろいろ論文を書いています。これら文書の postscript 版が
以下で手に入ります。
www@openbsd.org
$OpenBSD: crypto.html,v 1.50 2006/12/27 16:17:15 saad Exp $