/sys/doc/ Documentation archive

NAME
intro - セキュリティの紹介
SYNOPSIS
include "keyring.m";
include "security.m";
DESCRIPTION
これは、コンピュータセキュリティの背景にある基本的事項と、 Inferno においてそれらがどのように利用されているかを説明した ものである。安全な通信を提供するための方法や原理等のより詳細な 解説については、Bruce Schneier による Applied Cryptography (J. Wiley & Sons, Inc. 1996 発行) のようなものをあたられたい。

Inferno は数段階のセキュリティを提供する:

  • 相互認証。これはお互いに通信しようとする二つのユーザ あるいはアプリケーションが、お互いの身元を確認できる ということである。
  • メッセージダイジェスト。これは通信内容が途中で改変されて いないことを保証するための手段である。
  • 暗号化。これは、通信が宛てられた相手だけが、暗号を復号して 通信内容を読むことができるようにして、通信内容の秘密性を 確保する。Inferno は上記全てのセキュリティの段階を、自由に 組み合わせて簡単に利用できるようにしている。

相互認証

認証のためには、以下の要素が必要である。お互いが信頼できる第三者。 ユーザ間の通信内容を保護するためのアルゴリズムあるいは数学的手法。 第三者や侵入者がユーザの一人になりすますことができないことを 保証できる通信プロトコル、あるいはなにか別の通信手段、以上である。

Inferno でユーザ認証をおこなうのに重要な一つの手段は、デジタル 署名の使用である。手紙に署名をするように、デジタル署名は送信者の 身元を確認する。幸いなことに、デジタル署名は手書きの署名よりも 真似することが難しい。

ユーザが相互認証された後でも、他の誰かが通信内容を読むために 「聞いて」いたり、さらにはその内容をユーザが知ることなく変更して しまうかもしれない。そのため、認証は安全の一部を保証するが、 それがすべてというわけではない。

メッセージダイジェスト

メッセージダイジェストは、数学的なハッシュアルゴリズムを使って、 メッセージを、通信内容がわからないような固定長文字列(これを ダイジェストと呼ぶ)に変換する。このハッシュ値をメッセージに 加えることで,メッセージの正当性が確認できる。メッセージの 受信者は、送信者と同じハッシュアルゴリズムを利用して、受け取った メッセージのハッシュ値を計算し、それをメッセージに加えられた ハッシュ値と比較する。二つのハッシュ値が同じであれば、 受信されたメッセージが送り出されたものと同じでなければならない。

Inferno はダイジェストを計算するときにカウンタを含める。これは、 メッセージが正しい順番で到着しており、通信に聞き耳をたてている 他の第三者によって勝手にメッセージをまぎれこまされないように するためである。発信者の身元を確認するため、秘密鍵もダイジェストの 計算に含まれる。

メッセージダイジェストは、通信内容が途中で改変されないことを 保証するためのものである。そのため、誰かが通信内容を読み取る ことには関係しない。

通信内容の暗号化

従来ある暗号化とは、ある通信内容(暗号学で平文と呼ばれる)を なにか別の解読できない文章(暗号文と呼ばれる)に変換することである。 最も明らかな目的は秘密性を提供することである。復号化、つまり 暗号文をもとの平文に戻すことのできるものだけが、通信内容を 解読することができるのである。

通信の暗号化と復号化には、同じ一つの数学的アルゴリズムが使用される。 暗号化アルゴリズムの基本は、鍵と呼ばれるある決められた長さだけ ビットが集まった文字列であり、暗号化と復号化に利用される。 アルゴリズムの性質と鍵の長さによって安全性の度合いが左右される。

暗号では二つのタイプのアルゴリズムが使われている。秘密鍵(対称鍵 とも呼ばれる)と公開鍵のアルゴリズムがそれである。対称鍵の アルゴリズムでは、暗号化と復号化の両方に同じ鍵が使われる。 この鍵は秘密にされていなくてはならず、通信をかわすユーザ同士 だけが知っている。この鍵はしばしば固有鍵あるいは秘密鍵とも 呼ばれる。

公開鍵のアルゴリズムの場合、秘密鍵を通信の暗号化、公開鍵を復号化に 使ってもいいし、その逆でもよい。秘密鍵はある一人のユーザだけの 秘密となる。しかしながら、公開鍵は秘密にしておく必要はなく、その ユーザが通信したい相手の誰にでも配ってよい。

Inferno では、デジタル署名には公開鍵アルゴリズム、暗号化には 対称鍵アルゴリズムを利用している。

ユーザが通信を暗号化するのに、メッセージダイジェストを利用するか しないかは自由である。

Inferno で提供される暗号アルゴリズム

アルゴリズムを選択する際に考慮されるのは、早さ、安全性の度合い、 輸出の際の政治的な規制などである。Inferno で使用されている アルゴリズムは良く知られており、ために厳しく試験されたものである。
一方向ハッシュアルゴリズム
SHA と MD5 は(暗号学の界隈では) 良く知られた一方向ハッシュの アルゴリズムである。MD5 は高速な 128ビットのハッシュである。 SHA は幾分速度の遅い、しかしより安全な 160ビットのハッシュで ある。
ElGamal 公開鍵署名アルゴリズム
ElGamal はデジタル署名の作成に非常に良く使われている 公開鍵のシステムである。これは秘密鍵を通信の署名に 使用し、確認のために公開鍵をつかう。ElGamal における 鍵の利用は、将来必要に応じて、異なる署名アルゴリズムを Inferno に導入するのをより簡単にしてくれるだろう。 同じ鍵を使っていても、暗号化と復号化に、秘密鍵と 公開鍵の両方がつかえるような他のシステムは、変更を 加えるのが困難である。暗号学の分野における着実な発展を 考慮して、新しいアルゴリズムが開発された時に改良しやすい セキュリティ構成とすることを、Inferno の設計目標の一つ とした。
暗号化アルゴリズム
DES (Data Encryption Standard) は、非機密情報のための 標準暗号/復号化アルゴリズムとして、1976 年にアメリカ政府に 採用された。これは広く利用されており、中でも銀行業界での 採用が目立った。DES には DES-ECB と DES-CBC という二つの タイプがある。ECB(Electronic Code Book) と CBC(Chain Block Coding) は ANSI Banking Standard の一部になっている。 CBC は ECB よりも複雑で、脆弱性が少ない。どちらのタイプの DES も鍵の長さは 56ビットである。

RC4 は対称(秘密)鍵の暗号システムで、DES の 10倍程度の速い。

Diffie-Hellman 鍵交換アルゴリズム
Diffie-Hellman とは、通信を暗号化するために、ユーザが共有 しなければならない秘密鍵(共有秘密と呼ばれることもある)を 生成するアルゴリズムである。ユーザはお互いが決まった情報を 交換しなければならない。この情報は公開、つまり暗号化されずに 交換することができる。ユーザはこの情報から、同じ秘密鍵を 生成することができる。しかしながら、このやり取りを傍受した 第三者が、秘密鍵を得ることはできないようになっている。

セキュリティプロトコル

暗号解析とは、いかにして暗号システムを破るかを調べる ことである。機密通信を妨害したり傍受したりすることを アタックと呼ぶ。通常、アタックの目的は秘密鍵を探し当てたり 通信内容を復号化したり、あるいは何らかの方法で通信内容に 勝手に追加したり改変したりすることである。

機密通信にアタックするにあたって、様々な方法や戦略がある。 マン・イン・ザ・ミドルと呼ばれる一つの方法は、通信を傍受して いる誰かが、そのパーティの一人になりすますものである。 リプレイ・アタックとよばれる別の方法では、以前に傍受しておいた 通信内容を再度利用して、何らかの法則をみつけようとするもので ある。

このようなアタックを防ぎ、交信するパーティ間で何がしかの 信頼を築くために、幾つかのプロトコルを導入する必要がある。 Inferno では二つの確立されたプロトコルを使い、鍵の交換と 通信しようとする二つのパーティの実体を相互に認証できるように している。

デジタル署名はあるユーザから送られた通信内容が、本当にその ユーザからのものであり、誰か他のものから送られたものでは ないことを保証するための一つの方法である。署名は、通信内容自体が 暗号化されることを必要としない。これは発信者の実態を保証するために 通信の最後に加えられることができる。ElGamal では署名をするために 秘密鍵あるいは個人鍵を一つ必要とする。ある個人鍵に対応するただ 一つしかなく、これは公開して配布してよい。この公開鍵は個人鍵と ともに署名の生成に使われたり、他のものが署名を確認するために 使われたりする。

署名を作成するには、個人鍵、公開鍵、通信内容の一組に対して ElGamal のアルゴリズムが適用される。そしてその出力が署名となる。

受信者は、署名を確認するために、公開鍵と署名に対して ElGamal の アルゴリズムを適用する。もしその出力が署名とともに送られた通信内容と 同じであれば、署名は正しいということになる。この方法で、ある 通信を受け取ったユーザが、対応する公開鍵をもった誰か通信している ことを確実に保証できるのである。

次の一歩はその公開鍵が誰のものであるかを確認し、それが受信者が 通信したい相手のものであると保証することである。これは、公開鍵の 持ち主を証明する第三者をたてることで行われる。この第三者は 認証局(CA)と呼ばれる。認証局を信頼できるものであるとすれば、 個人鍵の持ち主を検証するのに証明書のコピーがあれば十分であり、 こうして通信を行った相手の署名が確認され、ひいてはそのユーザの 身元も確認されたということになる。

証明書には様々な情報が含まれている。ユーザの公開鍵、ユーザの身元、 Diffie-Hellman のパラメータ、証明書の有効期限、そして CA の署名で ある。CA の公開鍵は CA の署名を検証するため、証明書と共に ユーザに送られる。

Inferno では、ユーザがキーボードを使用できるかどうかによって、 異なる二つの方法で証明書を得ることができる。キーボードを持つ ユーザには、login(6) に書かれている、EKE (Encrypted-Key-Exchange) プロトコルの変形版を、Inferno は提供している。このプロトコルは、 ユーザと CA の間に信頼を確立することと、それらで共有される 秘密 (パスワード) を利用することを前提としている。この 秘密は、何らかの信頼できる方法でもって、最初に CA において 確立される必要がある。つまり、CA にある安全なコンソールで パスワードを入力するとか、途中で開封されることのない手紙や 盗聴されていない電話など、オフラインでもってパスワードを送る などの方法を用いるわけである。その後ユーザは、クライアント マシンのコンソールでパスワードを入力することで、証明書を 取得することができるが、プロトコルがパスワードを漏らす事はない。

セットトップボックスのような、通常キーボードを持たない端末の ユーザやアプリケーションの場合は、パスワードを入力するの難しい。 そのため、Inferno は信頼を確立するための別の手段を 提供している。セットトップボックスが起動されると、それは 秘密鍵と公開鍵のペアを生成し、証明書を得るためにサービス プロバイダの CA を呼び出す。CA は、CA だけが知るランダムなビット 文字列で撹乱された証明書を返す。そして、この文字列をハッシュした 値が、ユーザのスクリーンに表示される。ユーザは CA に電話し、 表示されたものと CA が送ったものとを比較する。もしそれらが 一致して、ユーザが自分の身分を証明できれば、CA はランダム ビット文字列をユーザに伝え、そうして撹乱された証明書を ユーザは復元できる。

認証

Inferno における相互認証には、通信しようとする二つのパーティが、 共に同一の CA からの証明書を取得していることが必要である。 前述のように、CA の公開鍵はもう一方のユーザの証明書を確認する のに利用される。そして証明書は、そのパーティのものである公開鍵が、 ユーザが通信したい相手のものであることを検証するために使われる。

もしユーザがその公開鍵を信用するのであれば、その鍵は他方の パーティから送られた書名をチェックするのに使うことができる。 公開鍵が署名を解くことができれば、署名を送ってきたものが誰 であろうと、彼は対応する秘密鍵をもっており、それはつまり、 公開鍵の持ち主に他ならないわけである。

Inferno は、相互認証のデフォルトプロトコルとして、 station-to-station プロトコルを提供しており、auth(6) に 解説がある。このプロトコルには、交換された確認されたデータから 双方のパーティが同一の鍵を生成できるが、盗聴するものはその鍵を 知ることができないという特長がある。

アプリケーション層でのセキュリティ

アプリケーションは、security-login(2)、security-auth(2)、そして connect (security-ssl(2)) といった、ほんの幾つかのライブラリ ルーチンを使うだけで、以上に説明されたアルゴリズムやプロトコルを 利用することができる。login モジュールは、CA として振舞う サーバとパスワードを共有しているアプリケーションが、証明書を 得られるようにする。証明書を取得した後、二つのアプリケーションは auth を呼び出すことで相互認証された通信路を確立する。Auth は STS プロトコルの全てを実行する。Connect はアプリケーションを SSL (Security Socket Layer) デバイスに接続する。各アプリケーションは このデバイスに書き込むことで、メッセージダイジェストや暗号化 されたメッセージを生成することができる。そして、SSL デバイスから 読み出すことで、メッセージが受信され復号化される。

Inferno はこれらのルーチンを、安全な通信路を簡単に使用できる ようにと提供しているが、アプリケーションはこれらを強制される わけではない。アプリケーションは login や auth で使われている 下位のルーチンを利用することもできる。これらのルーチンを 利用することで、アプリケーションはセキュリティを確保するために 別の方法をとったり、ファイルに署名するといった専用の関数を 作ることができる。

Inferno はまた、セットトップボックスでの利用に合うよう作られた セキュリティルーチンを提供している。たとえばセットトップボックス は、login の代わりに register(8) を利用することができる (security-login(2) 参照)。Register はユーザにパスワードを 入力させることなく、証明書を取得する。

第 8 セクションのコマンドには、サーバを認証局 (CA) あるいは 「signer」として動作させるためのものがある。たとえば CA は 証明書を発行するための鍵やパスワードを必要とする。これらは サーバ上で changelogin(8) と createsignerkey(8) という コマンドを実行することで作成できる。