セキュリティ(技術まとめ1)

なわけで、今回の卒研で使いそうなセキュリティ技術を改めてまとめてみる。(まとめておかないとすぐに忘れてしまうのだ)

《SSH》(Secure SHell)

Telnetの問題点として挙げられる「平文通信」「ホスト認証ができない」「ユーザー認証ができない」を解決することを目指したものがSSHである。

サーバホスト認証

ホストコンピュータは,公開暗号符号によるHost-KeyとServer-Keyと呼ぶ2つの鍵を持っている.どちらも公開暗号符号であるから,公開鍵と秘密鍵のペアである.通常Host-Keyは一度作成したらあとはずっとこれを使い続ける.一方Server-Keyは一定時間毎に作り直される.
クライアントコンピュータは,SSHによるサーバホスト認証を行うにあたり,最初にホストコンピュータに対して接続要求を送信する.すると,ホストコンピュータは,Host-KeyとServer-Keyの二つの公開用の鍵を送り返す.この2つの鍵が送り返されると,クライアントコンピュータはあらかじめ登録しているホストコンピュータのHost-Keyと今送られてきたHost-Keyが一致するかどうかを調べる.ここで一致しなければ,相手は正しいホストコンピュータとは認定しない.
Keyが一致すると,クライアントコンピュータでは,このセッションで用いる暗号化のための鍵 Session Keyを作成する.このKeyはSSHを起動する毎にその都度作られる.
そして,この Session Key をホストコンピュータから送られてきた2つの公開鍵を使って二重に暗号化し,出来た暗号をホストコンピュータに送る.これを受け取ったホストコンピュータは,自らが保有しているHost-KeyとServer-keyの秘密鍵を使って,この暗号を復号化する.これで,Session Keyの共有が完了する.
なお,ホスト認証は次の二重の意味でクライアントコンピュータにおいて行われている.1つは,ホストコンピュータから送られてきたHost-Key(公開用)があらかじめ登録しておいた正規のものと一致するかどうかである.ただし,これだけではあらかじめこのHost-Keyを盗聴により取得していた相手がなりすましているかもしれない.しかし,クライアントがこの鍵をつかって暗号化した Session Keyを正しく復号化できるのは,Host-Keyの秘密鍵を持っている正規のホストコンピュータだけである.

ユーザー認証

パスワード認証
通常のUNIXコンピュータがログイン時に行う,ユーザ名とパスワードによる認証である.ただし,この認証はサーバホスト認証で共有したSession Keyを用いて暗号化して行うので,通常の telnet よりはるかに安全である.
RSA暗号による認証
クライアントコンピュータ側では,あらかじめSSHのユーザ認証用に公開鍵暗号用の鍵のペアを作っておく.そして,公開鍵のほうはホストコンピュータに送って登録もしてもらっておく.秘密鍵のほうはクライアントコンピュータ上で大切に保管されるが,通常はそのままの形での保管は危険なので,前もってユーザが決めた長い文字列(Passphrase)を使って暗号化して保管する.
ユーザがホストコンピュータのユーザ認証を受ける際には,ユーザはユーザ名とこのPassphraseを入力する.そして,ユーザ名と公開鍵がホストコンピュータに送られる.これを受け取ったホストコンピュータ側では,受信した公開鍵と予め登録してある公開鍵が同一であることを確かめる.そして乱数を一つ発生させ,この乱数を公開鍵で暗号化してクライアントコンピュータに戻す.この暗号をPassphraseで復号化した秘密鍵を用いて復号化して元の乱数を得,この乱数のダイジェストをMD5を用いたハッシュ関数を用いて作成してホストコンピュータに送信する.ホストコンピュータ側でも独自に同じハッシュ関数で乱数からダイジェストを計算しておき,送られてきたダイジェストと一致すれば,ユーザ認証は完了する.
つまり,予め登録してある公開鍵と対である秘密鍵をこのユーザが持っているかどうかを,乱数を公開鍵で暗号化して送るので,これを正しく復号化できるかどうかを調べることで確かめるのである.

暗号通信

サーバホスト認証とユーザ認証を経た後は,クライアントコンピュータとホストコンピュータ間の通常の通信が行われる.このとき,サーバホスト認証でクライアントからホストに渡されたSession Keyを用いて,秘密鍵暗号方式で通信は全て暗号化される.