セキュリティと暗号の仕組み

共通科目情報処理(上級)、インターネットの仕組み、2003年02月14日

                                       電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.hlla.is.tsukuba.ac.jp/~yas/ipe/taiiku-kougi-2002/2003-02-14
あるいは、次のページから手繰っていくこともできます。
http://www.hlla.is.tsukuba.ac.jp/~yas/ipe/
http://www.hlla.is.tsukuba.ac.jp/~yas/index-j.html
http://www.ipe.tsukuba.ac.jp/~yshinjo/

■復習

■今日の重要な話

セキュリティ 暗号

■セキュリティ

セキュリティとは、安全や機密を保持すること。

◆サーバ上のファイルのセキュリティ

インターネット用のソフトウェアのセキュリティを守る場合、ネットワークを 流れるデータだけでなく、サーバにたまっているデータにも気を付ける。

個人では、自刎のファイルのモード(ls -l の rwxrwxrwx の表示)に気を付け る。

電子メールなど、たとえ自分でしか読むことができないように設定されている ファイル(モードが 600 (rw-------))であっても、サーバの管理者ならば、見 ようと思えば見える状態になっている。バックアップ(器機の故障に備えてコ ピーを作る)のため。

◆ログ

コンピュータの内部では、様々な操作のログ(log、航海日誌)が取られている。

◆通信路のセキュリティ

インターネットの危険性

インターネットでの通信は、暗号化されていない。 (1つひとつのデータグラムは、はがきと同じ。) 流れるデータを見れば簡単に内容を知ることができる。

インターネットで通信する時には、通信相手に IP アドレスが渡されている。 (電子メールを送る時、WWWでページを見る時など)

電話でいうと、発信者番号(caller ID)が相手に伝わっている状態である。

IP アドレスから、コンピュータの名前(ドメイン名)を調べることができる (逆引)。

普通は、利用者の名前までは、わからない。しかし、ユーザ名とパスワードを 打った時にはログと付き合わせると、利用者が特定可能である場合が多い。

◆防火壁(ファイアウォール(firewall))

防火壁とは、外部のネットワークと内部のネットワークの間に設置し、内部の ネットワークのセキュリティを高めるための仕組み。

インターネットの仕組みの基本:どのコンピュータとコンピュータも通信できる。

防火壁では、そのような本来の仕組みに制限を設け、特定のコンピュータとし か通信できないようにしたり、特定のサービスしかつかえないようにする。

攻撃の対象となるコンピュータの数を減らし、集中的に侵入対策を施すことで、 セキュリティを高める。

防火壁構築は、様々な技術の集合:

パケット・フィルタリング
TCP/IP の特定のサービスを特定の方向について遮断する。
例:ファイアウォールの内側から外側への電子メールの送信は許すが、逆方向 は許さない。
プライベート・アドレスの利用
壁の内側で、プライベート・アドレスと呼ばれる、インターネット上で は決して利用されないことが保証されているIPアドレスを用いる。プライベー ト・アドレスを使うと、インターネットの外から直接攻撃されることはない。 壁の外側をアクセスする時に、「壁の上」で、外でも通じるIPアドレスに付け 変える。
壁の上:壁の内側のコンピュータも壁の外側ののコンピュータも、両方にアクセ スできる場所。

2000年5月1日に、筑波大学の入り口でパケット・フィルタを行うようになった。

壁を越える時には、壁の上で WWW Proxy を動かすことがある。

◆悪意があるプログラムとコンピュータ・ウイルス

コンピュータ・ウイルスは、悪意があるプログラム(malicious program)一種 で、次のような性質を持つもの。

活動

◆トロイの木馬とワーム

トロイの木馬(Trojan Horse)は、他のプログラムに寄生しない。 利用者を騙して実行されるのを待つ。

ワーム(worm)は、他のプログラムに寄生しない。

世の中で「ウイルス」と呼んでいるものの中には、トロイやワームに分類され るものが多い。

◆悪意があるプログラムの場所

◆防御

ローカルで働く悪意があるプログラムによる被害を を防ぐには、ローカルへの侵入を水際で止める。 遠隔は、クライアントではない、第三者ということがある。 −>クロスサイトスクリプティング攻撃

◆バグ、弱点、攻撃

プログラムからバグ(誤り)を全てのバグを取り除くことはできない。 バグの一部は、セキュリティ的な弱点につながる。

危険性

悪意を持つプログラムからの防御 暗合技術を使っても防げないことがある。

技術者や管理者に求められていること。

インターネットから受け取るデータを疑う/確認する。

◆個人で身を守る方法

技術が未熟な現在、各個人は、どうすべきか。 特に、CGI を使う場合は、重要になる。

◆cookie

cookieは、コンピュータ・サイエンスの専門用語。

協調して動作しているプログラムの間で、ある一連の作業を識別するための数 を意味する。

WWW(World Wide Web)では、1回のデータ転送ごとに通信路が切断される ので、通常はWWWのブラウザ(クライアント)とWWWサーバの間では、途 中経過を保持することができない。

途中経過を保存したい時:

WWWで途中経過を保存するためには、cookie が使われる。

サーバは、その情報を利用して、適切なページ(たとえば前回最後に訪れたペー ジ)を表示させるようにすることができる。

◆cookieとプライバシ

現在の cookie の実現では、利用者のプライバシーを犯す危険性が高いという 問題が指摘されている。

普通のWWWサーバでは、要求を送ってきたコンピュータのIPアドレスを記 録しているので、コンピュータ単位でのアクセス状況を記録することはできる が、個人を特定することはできない。

クッキーを利用することにより、コンピュータではなくどの個人がアクセスし てきたかを記録することができる。

クッキーから電子メールのアドレスや氏名まで調べることはできない。 しかし、インターネットをサーフしている間にどこかでそれを打ち込んだが最 後、クッキーと電子メール・アドレスや氏名との対応が記録されてしまう危険 性がある。

参考 Netscape社によるWWWにおけるクッキー実現の案
http://www.netscape.com/newsref/std/cookie_spec.html

JavaScript

JavaScript は、 WWW ページを作る時に使われるスクリプト言語である。 スクリプト言語を使うと、単に変数を設定することに比べて、はるかに高度な 機能が追加できる。

JavaScript は、文法こそ少し Java に似ているが、Java とはまったく別の 言語である。WWW ページの中の Javaアプレットは、 「実行可能なインライン・イメージ」に似ているが、JavaScript の記 述は、「実行可能なインライン・テキスト」に似ている。たとえば、次 の例を考える。

<SCRIPT LANGUAGE="JavaScript">
<!--
for( i=0 ; i<10; i++ )
  document.writeln("<P>hello,world</P>");
//-->
</SCRIPT>

これで、<P>hello,world</P> を 10 回書いた のと同じ効果がある。<!--//->は、JavaScriptを知らないブラウザにはコメント として扱われる決まり文句である。関数定義などは、ヘッダ部分 <HEAD></HEAD>に書くという方法もよく使われる。

JavaScript は、CGI と似ているところもあるが、JavaScript でないとで きないものに、ブラウザの制御がある。たとえば、次の例では、ブラウザ の(戻る)ボタンと同じ動きをさせることができる。

<A HREF="javascript:history.back();">戻る</A>

戻る

ブラウザを制御する仕組みが、悪用される。

JavaScrit は、信頼しているサイトから送られたときだけ有効にする方法がある。 クロスサイト・スクリプティング攻撃に弱い。

■クロスサイトスクリプティング攻撃

Cross Site Scripting 攻撃。

CGI のプログラムをつくる時には、クロスサイトスクリプティング攻撃 (cross-site scripting atack, XSS atack)に気をつける。これは、クライア ントが送られてる文字列の中に<SCRIPT>のようなタグが含まれて いた場合、それをそのままクライアントに送り返すと、 クライアントで JavaScriptなどの ブラウザ上で動作するスクリプト言語が実行されることがある。 自分自身のサイトにあるフォームにはそのような問題がないとしても、 別のサイト(クロスサイト)に仕組まれたフォームからスクリプトが 含まれていることもある。

利用者が信頼していると設定しているホストにクロスサイトスクリプティング 攻撃への脆弱性があると、悪意をもった別のサイトから危険なスクリプトを実 行させることができる。

このような脆弱性があると、そのサイトの信頼性がなくなる。 利用者のクレジットカード番号などが盗まれることになる。

◆基本的な対策

クライアントから送られてきた文字列は、必ず検査してから使う。

「<>」のようなタグがないかどうかを調べる。不用意に同じ文字 列を送り返してはいけない。特に次のような文字は、送り返す時には、必ずエ スケープする。

----------------------------------------------------------------------
画面表示	代りに送りだす文字列
&		&amp;
<		&lt;
>		&gt;
"		&quot;
----------------------------------------------------------------------

■CGIの注意事項

意図していないプログラムを実行しないようにする。

◆他のプログラムの実行(C言語)

他のプログラムを実行する時には、execve() のようなシステムコールを使い、 かつ、限られたプログラムしか実行しないようにすると安全性が高くなる。ク ライアントから送られてきた文字列をsystem() や popen() に渡してプログラ ムを実行する時には、必ず検査する。特にシェルが解釈する特殊な文字 「| & ; && || `」などが含 まれていた場合、意図しないプログラムが実行されることがある。

char *user ;
...
snprintf(cmd,BUFSIZE,"finger %s",user );
f = poepn(cmd,"r");
もし、user に ";""|" が含まれていたら、、、 
f = poepn("finger yas; /bin/sh","r");

◆他のプログラムの実行(Perl言語)

Perl には、バッファ・オーバーフローの問題はない。

perl の open() には、危険性がある。 C 言語のライブラリ関数 popen() と同じ動きをすることがある。

open(FILE, "|cmd")
Perl の危険な関数、式、

◆参考

産業技術総合研究所 グリッド研究センター セキュアプログラミングチーム
http://securit.etl.go.jp/
)

IPA セキュア・プログラミング講座
http://www.ipa.go.jp/security/awareness/vendor/programming/

■暗号

古くから暗号が使われてきた、4つのグループ

暗号技術を甘く見たグループ

◆暗号に関する基本用語と安全性

暗号とは、情報の意味が当事者以外にはわからないように情報を変 換することである。

図? 暗号の考え方

図? 暗号の考え方

平文
元の情報
暗号文
変換された情報
平文、暗号文といっても、文字だけでなく、画像や音声などコンピュータが扱 えるあらゆるデータが想定されている。

暗号化
平文を暗号文に変換すること。暗号化鍵が必要。
復号化
暗号文を平文にもどすこと。復号化鍵が必要。
暗号化や複合化に必要な(短い)データ。
解読
当事者以外の第三者が、暗号文を元にもどすこと、あるいは、復号化鍵を得る こと。
暗号化や複合化の方法(アルゴリズム)は、何種類もある。

◆鍵を使うことの重要性

問: 答え:

暗号化の方法が秘密になっていると、一見、より強そうにみえる。しかし、そ の暗号が、強いのか弱いのか調べる方法がない。攻撃すると、簡単に落ちるか もしれない。暗号化の方法を提供している者が信頼できない時には使えない。

◆長い鍵を使うことの重要性

暗号の安全性は、鍵の安全性によっている。

◆暗号の経済学

暗号の安全は、解読にかかるコストを大きくすることで、解読され た平文から得られる利益を相対的に小さくすることに依存している。

鍵を長くするだけで、安全性が指数関数的に高くなる。 鍵を1ビット長くすると、解読時間が2倍になる。 (「鍵の長さを2倍にすると解読時間が2倍になる」は、誤り)。

図? 指数関数

図? 指数関数

図? 指数関数

図? 指数関数

パスワードは、コンピュータの中では、暗号化の鍵として使われる。 長いパスワードは、破られにくい。1文字(大文字小文字数字記号)増やすと、 総当たりで解読に要する時間が、50倍から100倍近くかかるようになる。

暗号の安全にとって、最近のコンピュータの高速化と低下価格下は、 1つの脅威となっている。

SETI (the Search for Extraterrestrial Intelligence)

◆共通鍵暗号系と公開鍵暗号系

暗号の方法は、大きく2つに分類される

共通鍵暗号系(対称暗号系)
暗号化鍵と復号化鍵が同じ(または片方から片方が簡単に計算できる)。
公開鍵暗号系(非対称暗号系)
暗号化鍵から復号化鍵を容易に類推できない。

◆Caesar暗号

Caesar暗号は、置換暗号(substitution cipher)の1つ。置換暗号では、各 文字あるいは文字群が、それぞれ別の文字あるいは文字群に置換される。

Caesar暗号は、知れている最後の暗号である。 平文アルファベットをN文字ずらした暗号文アルファベットに変える。

N=2 の時の対応表

abcdefghijklmnopqrstuvwxyz
CDEFGHIJKLMNOPQRSTUVWXYZAB
暗号の説明では、平文を小文字で、暗号文を大文字で書く習慣がある。 カルタゴ人以来騙された人はいない。

N=13 で、大文字小文字を保存する方法を、rot13 暗号という。rot13 は、電 子メールやネットワーク・ニュースで「ネタばらし」の部分を書く時に使われ る。

漢字の場合、rot47 という方法がある。nkf -r で、rot13/47 が使える。

◆乱数(random numbers)

数の集合から、無作為抽出で抜き出された数。

真性乱数。ビット列にすると、0と1の発生確率がそれぞれ1/2で、各ビッ トは他の部分と独立(iid(independent and identically distributed)) である。

物理乱数。量子力学の効果を増幅してディジタル化したもの。 平滑化して0,1のバランスをとれば、真性乱数になる。

疑似乱数(pseudo random number)。種(seed)と呼ばれる入力ビットパタンを基 に計算された、種よりも長いランダムに見えるビット・パタン。種が決まれば 出力乱数は一意に決まる。

◆乱数を使った暗号

Caesar暗号では、定数だけずらしていた。定数ではなく、文字の長さの乱数の 列を使い、文字ごとに乱数の数だけだけずらす。

例:

乱数表: 0 18 19 22 22  7  9  4 14  3
 平文: h  e  l  l  o  w  o  r  l  d
        8  5 12 12 15 23 15 18 12  4
暗号文: H  W  E  H  K  D  X  V  Z  G
   : 8 23  5  8 11  4 24 22 26  7
乱数表そのものや、大きな乱数表の中でどこから使い始めるかを鍵にすること ができる。

真性乱数を使うと、解読する方法は数学的に存在しないことが証明されている。

しかし、真性乱数を使うことはコストが大きい。 送信側と受信側で同じ真性乱数を作るのが大変である。

乱数表を記憶する変わりに、疑似乱数を使う方法がある。使う疑似乱数の性質 が悪いと簡単に解読される。

実際には、文字をずらすのではなく、足し算、引き算や、排他的論理和と呼ば れる計算が使われることが多い。

◆転置暗号

Caesar暗号やバーナム暗号では、平文の文字の順序を変えずに、文字を置き換 える。これを置換暗号という。これにたいして、転置暗号(transposition cipher)では、平文の文字の順序を入れ替えるが、文字の置き換えは行わない。 (下の例では、大文字小文字が変わっているが、これは暗号化の説明のために 変えて書いているだけである。)

次は、転置暗号の1つ、コラム転置の例である。キーは、同じ文字を含まない 1個の単語や熟語である。このキーでコラムに番号付けをする。たとえばコラ ム1は、アルファベットで先頭に近い文字の下のコラムとなる。

MEGABUCK
--------
74512836
--------
pleasetr
ansferon
emillion
dollarst
omyswiss
bankacco
untsixtw
otwoabcd
 平文: pleasetransferonemilliondollarstomyswissbankaccountsixtwotwo
暗号文: AFLLSKSOSELAWAIATOOSSCTCLNMOMANTESILYNTWRNNTSOWDPAEDOBUOERIRICXB

◆DES

DES(Data Encryption Standard)は、アメリカ商務省標準局 (NBS, National Bureau of Standard, 現在のNIST, National Institute of Standrds and Technology)が1977年に定めた暗 号標準である。IBM社による提案が元になっている。DESは、 アメリカ政府内で、コンピュータ・データのうち、非機密だが取扱 い注意(unclassified but sensitive)のデータを暗号化するため の標準である。DESを一般の商用にも使うことを推奨している。 たとえば、UNIXのパスワード・ファイルは、DESにより暗号 化されている。

DESは、対称暗号系(慣用暗号系)の1つであり、暗号化と復号 化に同一の鍵(56ビット)を用いる。DESは、転時暗号の一種 である。転時暗号では、平文の文字の順序(コンピュータでは、ビッ ト)を入れ替えるものである。DESでは、64ビットの平文につ いて、鍵をもとにビットの入れ替えを16段繰り返す。

アメリカでは、DESを取り扱うチップ(IC)が多く利用されて いる。アメリカは、暗号に関する製品がソフトウェアも含めて輸出 禁止になっており、DESチップもその制約を受けている。DES 暗号化を行うソフトウェアについては、アメリカ以外で開発された ものが広くインターネット上で配布されている。

DESが作られる時、コンピュータ科学者は、56ビットのキーの長さでは短 すぎると主張した。IBMの提案は、128ビットだった。安全保証局の要求 で、56ビットに減らされた。1988年にアメリカ連邦政府は、1988年 にDESの効果を保証しないと決定した。

DES は、Unix のパスワードのハッシュ関数として使われている。

◆AES

Advanced Encryption Standard。

DES に変わる新しい標準。全世界に対して公募され、ベルギーのJoan Daemen とVincent Rijmenにより開発されたRijndael方式が採用された。鍵の長さは、 128ビット、192ビット、256ビットから選べる。

◆一方向関数(ハッシュ関数)

y=f(x) で、x から y を計算することは簡単だが、y から x 逆を計算するこ とは非常に難しい関数。

暗号やディジタル署名で使われるのは、Collision Proof 性が求められる。

暗号を使えば、一方向関数が作れる(暗号を使わなくても一方向関数を作るこ とはできる)。

one_way_function( x )
{
	return x をキーとして 0 を暗号化したもの ;
}
Unix の /etc/passwd に保存されているものは、DES を25回繰り返して使って 作った一方向関数の結果。パスワードそのものは、保存されてない。

◆メッセージ・ダイジェスト

元データからデータの指紋と呼ぶべきような特徴的な数(普通は元データの長 さによらず固定長)を抽出するもの。

チェックサムや CRC (Cyclic Redundancy Check) にも似ているが、一方向関 数としての Collision Proof 性が求められる。

元データが壊れていないか(誰かに改ざんされていないか)を調べる時には、 メッセージ・ダイジェストを計算して比較する。

◆MD2、MD4、MD5

RSA社の B.Kaliski や R.Rivest らによって提案されたメッセージ・ダイジェ ストのアルゴリズム。任意の長さのデータから128ビットのメッセージ・ダイ ジェストを生成する。

◆公開鍵暗号系

公開鍵暗号系(非対称暗号系)では2つの異なる鍵を用いる。 便宜上、この2つを公開鍵と秘密鍵と呼ぶ。

これらの鍵は、互いに相手の逆関数になっている。

図? 公開鍵暗号を使った暗号通信の手順

図? 公開鍵暗号を使った暗号通信の手順

  1. 受手は、公開鍵と秘密鍵の組を作り、公開鍵を誰でも読めるようにする。
  2. 送手は、受手の公開鍵を暗号化鍵として用いて暗号文を作り、送る。
  3. 送手は、受け取った暗号文を、自分の秘密鍵を復号化鍵として用いて復号化し、 元の平文を得る。

ここで、公開鍵から秘密鍵を計算することは難しい。ある平文を公開鍵で暗号 化してみたところで、秘密鍵を得ることは難しい。

公開鍵暗号の利点は、鍵を管理する手間が掛らないこと。

共通鍵暗号
情報を交換する間で鍵を安全に共有しなければならない。しかも、通信 相手ごとに鍵を変える必要がある。
公開鍵暗号
受手ごとに、1つの暗号化鍵を公開するだけでよい。今までに通信をしたこと がない人からでも、暗号化されたメッセージを受け取ることが可能である。
公開鍵暗号系は、暗号通信だけでなくディジタル署名や利用者認証、電子現金 にも応用される。

◆RSA

Rivest Shamir Adleman。

RSA暗号は、Rivest, Shamir, Adleman の3人によって開発され た公開鍵暗号系である。RSA暗号の安全性は、大きな数を素因数 分解することの難しさに基づく。北米では、RSAは、2000年 に特許が切れた。

◆楕円曲線暗号

Elliptic Curve Cryptosystem。

公開鍵に基づく暗号化の1つの方法。買得の難しさは、楕円曲線上の離散対数 問題を解くのと同程度と言われている。RSA よりも鍵が短くて高速である。

最近(2002年9月)、Sun がソース・コードを OpenSSL プロジェクトに寄進した。

◆認証

認証とは、情報の正当性や完全性を確保する技術である。

利用者認証
アクセスしてきた人が正当か否かを判定する。 しばしばパスワードや暗唱番号が用いられる。
ディジタル署名(メッセージ認証、電子署名)
通常の署名とおなじく、送られてきたメッセージが送信者本人のもので あることを識別、確認すること。

◆認証の例

◆ディジタル署名

ディジタル署名では、通常の署名と同様に、次のような性質が必要である。

ディジタル・データでは完全なコピーが簡単に作れるので、紙上の署名や捺印 よりも難しい。

公開鍵暗号系を使ってディジタル署名を行うことができる。

図? 公開鍵暗号を使ったディジタル署名の手順

図? 公開鍵暗号を使ったディジタル署名の手順

  1. (受手ではなく)送手は、公開鍵と秘密鍵の組を作り、公開鍵を誰でも 読めるようにする。
  2. 送手は、自分の秘密鍵を暗号化鍵として用いて暗号文を作り、送る。
  3. 送手は、受け取った暗号文を、送手の秘密鍵を復号化鍵として用いて復 号化し、元の平文を得る。この時、きちんと平文が得られた場合、その平文は、 その公開鍵の持ち主から送られてきたことがわかる。

メッセージ全体を暗号化する代わりに、メッセージを平文で送り、それにメッ セージを一方向関数(ハッシュ関数)と呼ばれる方法で計算した結果だけを、 秘密鍵で暗号化したものを送る方法もある。一方向関数では、計算結果から元 の値(メッセージ)を計算することが難しい。

ディジタル署名や利用者認証は、公開鍵暗号系ではなく、共通鍵暗号系を用い ても可能である。ただし、この場合、鍵を管理する信用できる管理センターが 必要となる。

◆公開鍵暗号を使った利用者認証

乱数を送って、秘密鍵で暗号化してもらう。

公開鍵で復号化して、元の乱数が得られたら Ok。

毎回違う数を使えば、傍受されていても平気。

利用者認証のために、公開鍵暗号系を用いることができる。銀行の口座を例に、 これを説明する。

  1. 口座を開く時に、顧客は、公開鍵と秘密鍵を生成し、公開鍵を銀行に届 け、秘密鍵を自分で保持する。
  2. 顧客が通信回線を通じて銀行にアクセスしてきた時、銀行は乱数を1つ 生成し、顧客の公開鍵でそれを暗号化し、顧客に送り返す。
  3. 顧客は、送られてきた暗号化された乱数を、保持している秘密鍵で復号 化し、銀行に送り返す。
  4. 銀行は、顧客から返された乱数が正しければ、正当な顧客であると判定 する。
次回の呼び出しでは、別の乱数を用いることで、通信を記録している傍受者に も対応することができる(challenge-response方式)。

単なる暗証番号の場合、通信を傍受されたら終り。

◆鍵の確認

公開鍵で自由に鍵が得られたとしても、鍵か偽物だと、意味はない。

鍵がが本物であるかをどうやって確認するか。

では、その第三者は、信頼できるのか。

■電子現金

電子現金(electronic cash、電子マネー)とは、現金が持っている有用な性 質をディジタル情報を使って実現しようとするもの。

■電子透かしと電子あぶりだし

電子透かしは、暗号化の技術を使って著作権の保護するための技術。 電子あぶりだしは、機密情報がそこに含まれていることまで見えなくする技術。

■通信路の暗号化

◆SSH(Secure Shell)

Unix r系コマンドの置き換え。 トンネリング。暗号化された通信路を作り、その中を他の通信プロトコルを通 す。

◆r系コマンドの弱点

IP spoofing (なりすまし).

rsh のセッションで行われるであろうパケットを偽造する。

IP アドレスでホストを認証すると危ない。

DNS spoofing.

偽のDNSのサーバを立てる。

◆SSHでの解決方法

ホストの認証を、IP アドレスではなく、公開鍵で行う。

サーバは、2つの鍵と64ビットの乱数を送る。 クライアントは、乱数を送り返す。 乱数が一致したら、IP spoofing されていない。

クライアントは、セッション鍵(対称暗号系の鍵)をサーバの2つの公開鍵で 暗号化して送る。

対象暗号の鍵(セッション鍵)を生成し、公開鍵で送る。

これ以降の通信は、セッション鍵で暗号化される。

◆SSHでのユーザの認証

暗号化された通信絽が確立された後は、パスワードを流しても安全。

個人ごとに RSA 公開鍵での認証機能を利用したほうがよい。

◆トンネリング(port forwarding)

SSH で暗号化された通信路の中に一般のアプリケーションの通信を通す。

よくつかわれるもの。

使い方:

ssh -L 10110:remote:110 remote

ローカルのポート番号 10110 に来た要求を、remote の 110 に転送する。

◆SSH1の弱点

SSH1 には、プロトコル上、いくつかの弱点が見つかっている。

SSH2 を使った方がよい。

RSA社が提唱している公開鍵を使ってセッション鍵(秘密鍵)を交換する 方式(PKCS1 1.5 )そのものに、脆弱性がある [1]。

PKCS -- Public-Key Cryptography Standards

[1] Daniel Bleichenbacher, "Chosen ciphertext attacks on RSA encryption standard PKCS #1", Advances in Cryptology, CRYPTO 98. Springer.

サーバ鍵を1時間に1回しか変えない。

SSH 1.5 は、1024 ビットの鍵を使っている。 これを破るには、2 20 + 2 19 回接続でよい。毎 秒、約 400 回。

1個所からの接続に上限を付ける。OpenSSH はそうなっている。 Distributed 攻撃には、弱そう。

OpenSSH
http://www.openssh.com/

◆SSL(Security Session Layer)

Netscape 社によって開発された。主に、WWW (World Widw Web) での暗号通信 に使われている(他にも使える)。

SSL を使っていない時には、そのまま盗聴可能な形でインターネット流れる。

少し前まで、輸出用 WWW ブラウザは、鍵の長さが40ビットに制限されてい た。今は、128ビットまで使える。

◆証明書

X.509 形式(バイナリ)を、テキストに変換したものの例:

Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number: 0 (0x0)
        Signature Algorithm: md5WithRSAEncryption
        Issuer: C=JP, ST=Ibaraki, L=Tsukuba, O=University of Tsukuba, OU=COINS, 
CN=Distributed Systems/Email=yas@is.tsukuba.ac.jp
        Validity
            Not Before: Feb 18 14:42:56 2002 GMT
            Not After : Feb 18 14:42:56 2003 GMT
        Subject: C=JP, ST=Ibaraki, L=Tsukuba, O=University of Tsukuba, OU=COINS,
 CN=Distributed Systems/Email=yas@is.tsukuba.ac.jp
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:d0:94:49:23:dd:29:10:f4:c5:d9:df:07:72:07:
                    91:14:5c:a7:2a:0c:96:51:b5:93:31:a9:09:c0:1d:
                    f0:3f:5b:61:3f:bc:75:14:b8:54:49:f6:e7:db:a6:
                    9f:22:0c:af:23:a4:8a:70:fb:96:56:cc:26:fa:f8:
                    ce:47:32:2a:ea:f6:12:64:96:4a:73:11:52:f7:fa:
                    15:2a:6f:8a:60:f4:77:f5:e9:dc:cc:2f:37:bc:a5:
                    ef:7a:a5:13:48:73:ad:c3:a5:90:15:9b:c8:94:f0:
                    9b:33:39:2f:a4:6e:8d:61:c0:54:3f:5b:5f:4e:a9:
                    30:a6:a3:cd:a0:e8:2b:80:89
                Exponent: 65537 (0x10001)
    Signature Algorithm: md5WithRSAEncryption
        a4:eb:18:03:f4:0a:93:cc:ad:fd:75:5b:60:b0:5c:ec:3f:2e:
        d5:fc:92:cc:41:d4:69:66:5b:5b:19:16:8f:e9:35:78:2d:1d:
        ad:c2:81:79:d8:7f:6d:68:8f:a5:5a:7c:f7:22:1f:69:a6:66:
        28:c6:3a:59:26:c2:57:92:c6:8d:8c:94:75:5e:4c:33:af:17:
        e7:d2:28:9a:06:f8:c6:86:5c:67:8b:e2:f9:fc:c9:d6:b6:f7:
        b3:8b:3d:0f:cd:c3:b5:a9:f8:bd:41:88:27:2e:35:fb:93:fb:
        e9:93:f4:ae:b3:49:1e:b9:db:c5:16:a6:38:b0:7e:ef:ce:a9:
        17:fd
この例は、自分の秘密鍵で自分を公開鍵を署名したものなので、何の証明にも なっていない。

◆認証局の階層

証明書がついていたとして、それが本物であるかをどうやって確認するか。

認証局(CA, Certificate Authority)に、証明書を発行してもらう。(認証局の 秘密鍵でディジタル署名をしてもらう)

その認証局は、信頼できるか?

WWWブラウザには、ルート認証局の証明書が予め含まれている。

末端のWWWサイトは、ルート認証局、または、中間認証局から発行された証 明書を提示する。

◆ハンドシェーク

接続時に、乱数(共通鍵暗号に基づく暗号化の鍵を生成するため)を交換する。 その乱数は、普通、サーバ側が提示した証明書に含まれている公開鍵で暗号化 される。

ハンドシェークで使われる公開鍵暗号系

データを暗号化するために使われる共通鍵暗号系

■実習

◆Tera Term の接続方法

Tera Term (Windows 2000 用のTelnetプログラム)で接続する方法として、次 の2種類があることを確認しなさい(他にもある)。

◆WWW ブラウザの cookie の状態

WWW ブラウザが、cookie をどのように扱う状態になっているかを調べなさい。

◆SSL 暗号化のビット数と証明書

SSL で暗号化されたページを表示してみなさい。暗号化のために、何ビット鍵 が使われているか、調べなさい。そこで使われている証明書を表示して、何が 書かれているかを確認しなさい。

対象

Netscape Netscape 7.01 (Linux)、Linux を起動し、端末で次のように打つ。
/home/s015374/netscape/netscape &

◆認証局

WWW ブラウザで、認証局の証明書を表示しなさい。 Netscape 7.01 (Linux)

◆X.509証明書の生成

openssl コマンド、または、keytool コマンド(Java SDK付属)を使って、 X.509 証明書を生成しなさい。

◆sshにおける公開鍵による認証

ssh-keygen を使って、公開鍵と秘密鍵の組を生成しなさい。 SSH2 では、DSA 、または、RSA を使うとよい。 秘密鍵の方は、パスフレーズを鍵とした対称暗合系で 暗号化されて保護される。パスフレーズは、長く(10-30文字)にする。 (この課題では、Unix のパスワードとは必ず違うものにしなさい。)

生成した鍵の組を使って、ユーザ認証を行わせなさい。それには、クライアン ト側に秘密鍵を起き、サーバ側の~/.ssh/authorized_keys (OpenSSHの場合)に、 公開鍵を設定すればよい。接続時には、秘密鍵を暗号化するために使ったパス レーズを打つ込む。(Unix のパスワードを打つことはない。)

◆ssh-agentの利用

ssh-agent を使って、接続時には、パスフレーズを打たないでログインできる ように設定しなさい。

% ssh-agent tcsh [←]
% printenv SSH_AUTH_SOCK  [←]
% ssh-add -l [←]
% ssh-add [←]
% ssh-add -l [←]
% ssh remote uname -n [←]
% exit [←]
ssh-agent にコマンド(上の例ではtcsh)を与える代りに、csh の環境変数を設 定させるコマンドを出力させ、eval で実行する方法もある。

% eval `ssh-agent` [←]
% printenv SSH_AUTH_SOCK [←]
...

◆SSHによるトンネルの作成

次のプロトコルについて、ssh で接続先のホストに暗号化された通信路を作成 しなさい。 これには、ssh コマンドに対して -L オプションを与えるとよい。

% ssh -L lport:rhost:rport rhost [←]
-L に与えるホスト名としては、localhost (127.0.0.1) もよく 使われる。まったく別のホストでもかまわない。
% ssh -L lport:rhost2:rport rhost1 [←]
ただし、rhost1 と rhost2 の間の通信は、暗号化されないことに注意しなさ い。

◆Tera Termの利用

Tera Term で、公開鍵を使ってログインできるように設定してみなさい。
↑[もどる] ←[2月7日] ・[2月14日] →[2月21日]
Last updated: 2003/02/14 14:27:20
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>