コンピュータネットワーク基礎
2003.6.20

Back to index page

1年生のときに使用した 木村 広 著 「Linuxによる情報リテラシー」を持っ てくることをお薦めします.


  1. 本日の作業内容

  2. ネットワークセキュリティ

    コンピュータネットワークを利用する上で,情報の機密を保つことはそれなりの 努力を必要とします.個人情報の漏洩の可能性が常につきまとうために,情報の 暗号化や暗号を利用した認証に関する知識は今後有用になって来ることでしょう. 今週は, 公開鍵暗号方式を実習します.また,公開鍵暗号方式を利用したリモート アクセスであるsshについても実習します.

    • セキュアなリモートログイン

      UNIXの特徴は現在のTCP/IPネットワークとの親和性が良く,Xを始めとするネッ トワーク透過なプロトコルによりリモート操作が快適に行えることにあります. しかし,UNIXの普及した時代は今ほど情報の機密性に関心が払われなかったため, 個人の良識に任せる運用が多くありました.例えば,教科書の12.2にある「リモー トログイン」の手段としてのTELNETは,情報が「平文」で流れるため,パスワー ドなど重要な情報を盗聴される恐れがありますが,昔はネットワークを利用する のは研究者などに限られていたため,これで十分でした.

      今では,どこで誰が情報を傍受しているか分からないため,通信経路を暗号化す ることが必須となりつつあります.そのため,教科書で紹介されているTELNETは 利用せず,SSHを使ってリモート操作を実習します.

      SSH (Secure SHell) とは,Xで利用しているターミナルのようなシェル環境を田 野ホストで利用可能にするもので,TELNETと外見的には似ています.教室ならば, Linuxが起動している他のホストに向けて,

      $ ssh pc3-**

      のようにすれば,接続できます.ただし,コマンドを打つといきなりものすごい 記号の列が表示されてちょっと驚きます.

      The authenticity of host '172.16.xx.xx (172.16.xx.xx)' can't be established.
      RSA key fingerprint is 87:b7:31:8f:5c:70:c5:8c:34:33:0d:c4:1c:05:d3:bb.
      Are you sure you want to continue connecting (yes/no)? 
      

      初めての接続の場合には接続先の公開鍵を知らないために準備が必要になります. まずは,準備として上記のような暗号化のための16バイトの文字列をランダムに 生成させています.これで良ければ,yes と入力します.すると,

      Warning: Permanently added '172.16.xx.xx' (RSA) to the list of known hosts.
      

      のように表示され,以後は登録された接続先として扱われます.つづいて,パス ワードを求められます.すなわち,自分が今操作している目の前の端末と接続し ようとしているホストには同じユーザ名で登録されていることが前提なので,パ スワードのみを聞かれています.ここで,自分のパスワードを入力すると,ログ イン完了です.

      次回以降はそのホストへのSSH接続はパスワード認証だけで可能になります.こ れは,

      $ less ~/.ssh/known_hosts

      としてみれば分かりますが,一度接続したホストに関してはRSA公開鍵が自分の 環境に登録されており,最初の鍵交換の承認ステップが不要となるからです.試 しにもう一度接続してみれば分かるでしょう.

      SSHによるログインでは表面上は分かりませんが,途中の経路が暗号化されてい るため盗聴しても中身は第三者には分かりません.また,デフォルトでXプロト コルを通してくれるので,接続先でXクライアントを起動すると自分の端末に表 示されます.ファイアーウォールの中にあるホストから外にあるホストにSSHで 接続するとXクライアントを利用できますが,TELNETではそれはできません.セ キュリティの面だけでなく,機能としてもSSHの方が優れています.

      SSHは先ほどの画面にもあったようにRSAという暗号化アルゴリズムを利用してい ます.このアルゴリズムは公開されていますが,特許などの関係もあって誰もが 自由に使えるものでもありません.そのため,SSHにはフリーなものとそうでな いものが混在しており,多少混乱しがちです.しかし,WindowsにもSSHクライア ントはあるので,それを利用してUNIXにログインして作業することも可能です.

      RSAについては教科書のp.150にありますから,そちらを参照して下さい.ここで は,簡単な素数の組みを用いて例を試してみます.

      1. p = 11, q = 17 とする

      2. n = 187, z = 160 となる

      3. d = 9 ならば e = 89 が求まる

      4. m (教科書ではP) = 10 < n を試してみる

      5. C を計算してみる (商を5としてみる)

      6. m が逆算できるか試す

    • 暗号技術

      RSAを用いた代表的な公開鍵暗号方式であるPGP (Pretty Good Privacy) は特許 などの絡みがあって自由に利用できないことがあります.そこで,GNUライセンスで 公開されている公開鍵暗号方式のGnuPG (GNU Privacy Guard) を利用して文書の 暗号化や電子署名の自習を行います.

      • 自分の鍵の生成

        $ gpg --gen-key

        とします.初期設定だけやって勝手にコマンドが終了しますが,もう一回同じコ マンドを入力します.

        危険なメモリー使用の警告が今後発せられますが,無視しておいて下さい.

        $ gpg --gen-key

        こんどは対話形式で生成を進めて行くことになります.

        すきな鍵の種類を選択してください:
           (1) DSAとElGamal (既定)
           (2) DSA (署名のみ)
           (4) ElGamal (署名と暗号化)
           (5) RSA (sign only)
        どれにしますか? 
        

        デフォルトの(1)のままで良いでしょう.そのままEnterです.

        DSA鍵対は1024ビットになります。
        新しいELG-E鍵対を生成します。
                     最小の鍵長は  768 ビット
                     既定の鍵長は 1024 ビット
                 最大の推奨鍵長は 2048 ビット
        どの鍵長にしますか? (1024) 
        

        についてもデフォルトのままでよいので,Enterです.

        要求された鍵長は1024ビット 
        鍵の期限を決めてください。
                 0 = 無期限
              <n>  = 有効期限 n 日間
              <n>w = 有効期限 n 週間
              <n>m = 有効期限 n か月間
              <n>y = 有効期限 n 年間
        鍵の有効期間は? (0)
        

        ここもデフォルトのままです.Enterしてください.

        Key does not expire at all
        これでいいですか (y/n)? 
        

        これでよいので,yを入力します.

        あなたの鍵を同定するためにユーザーIDが必要です。
        このソフトは本名、コメント、電子メール・アドレスから
        次の書式でユーザーIDを構成します:
            "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
        
        本名: 
        

        と聞かれるのでローマ字で名前を入れましょう.スペースが入っても構いません.入力を間違 えたときに修正は効かないので,エディタなどに入力しておいて張り付けること をお薦めします.

        電子メール・アドレス: 
        

        ここには自分の電子メールアドレスを入れます.ここでも入力を間違 えたときに修正は効かないので,エディタなどに入力しておいて張り付けること をお薦めします.

        次に聞かれるコメントは不要ですので,何も入力しないでEnterしましょう.

        次のユーザーIDを設定しました:                   
            "NAWATE Masahiko <strike@mag.shimane-u.ac.jp>"
        
        名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? 
        

        もし,間違っている箇所があれば対応するアルファベットを入力して,入れ直し て下さい.OKするためにoを入力すると,

        秘密鍵を保護するためにパスフレーズがいります。                    
        
        パスフレーズを入力: 
        

        となり,パスフレーズを聞かれます.これはパスワードの代わりになるもので, 自分で適当な文章を入力します.アルファベットの利用になるので,好きな英語 の歌詞など適当に長いものが良いでしょう.パスワードの入力と同様に,画面に は何も表示されないので入力には注意が必要です.本来はするべきではないです が,エディタなどに文章を入力しておいてから張り付ける方が確実でしょう.

        パスフレーズはパスワードと同様設定するためには2回入力します.もう一度同 じ作業を行って下さい.

        今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
        とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
        乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。
        ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++.+++++..++++++++++.+++++.+++++++++++++++.++++++++++>++++++++++..............................+++++
        
        十分な長さの乱数が得られません。OSがもっと乱雑さを収集
        できるよう、何かしてください! (あと290バイトいります)
        今から長い乱数を生成します。キーボードを打つとか、マウスを動かす
        とか、ディスクにアクセスするとかの他のことをすると、乱数生成子で
        乱雑さの大きないい乱数を生成しやすくなるので、お勧めします。
        ++++++++++.+++++++++++++++.+++++.+++++.+++++++++++++++..+++++++++++++++.+++++++++++++++.+++++++++++++++.+++++++++++++++++++++++++++++++++++>.+++++........+++++^^^
        gpg: /home/nawate/.gnupg/trustdb.gpg: 信用データベースができました
        公開鍵と秘密鍵を作り、署名しました。
        key marked as ultimately trusted.
        
        pub  1024D/26192995 2003-06-18 NAWATE Masahiko <strike@mag.shimane-u.ac.jp>
             Key fingerprint = 9DB2 B8B1 EE86 A994 40B7  41A8 1EDD 58A3 2619 2995
        sub  ************** 2003-06-18
        
        

        などと表示され,終了すると結果が表示されます.最後の方にある pub が公開鍵で,sub が秘密鍵です.秘密鍵は自分だけが扱 うものですので,人には見せないような配慮が必要です.一方,公開鍵 は積極的に公開しても構いません.

      • 鍵の確認

        作成された鍵はバイナリとして保存されています.場所は,.gnupgディ レクトリです.テキストとして保存するには次のようにします.

        $ gpg -a --export s0140** > public_key.txt

        このコマンドで生成された公開鍵を表示させてみて下さい.

        $ less public_key.txt

        -----BEGIN PGP PUBLIC KEY BLOCK-----
        Version: GnuPG v1.0.7 (GNU/Linux)
        
        mQGiBD7we0IRBAC7GxqyTWDREh3ZkSEX/vYO28+8KiYQf/728K1ArNfAy1U8LVVB
        IjsVzE7PeSnhu/n4nOd+d9C4B4YK+r89fLoh9/lXmxNUVGk+f+osuRM+lkU5j+8v
        Sseta33CTVe9FrQw1Bu8i2J6NdhX7jknl9vXKJR7e82SpR9Wz3n8s/iqHwCgton/
        JD7VjHWOknCUt46DEtgJ6XcD/3yhx1l18KPftfs+AKXJ7wiS6JefViLJfhSmbP3X
        ZSSz2zrp0vltJ1wPCs43PFS8S/jjc4s5r8Nlbtn6LKO96lL/yCzvU2d3blPbegrT
        kmEOYT3Gj3zR4NwiQW1N0ZW7LBNVDSz1UiQ9Uk1a8B3hKSAtIDRs9xVkNYB2P9JN
        UD6wBACCixqB3dhYCkE8GDLwp9Yaati7fUUJLNeyuaH8h+8Epkvw8wMjl4bSXEI0
        piKimZcntkHa6LlJL4fD/Q9WtgYOP/M7fhCRq0bsKCNUrNjBXo56PDHDjzzvuGak
        t6Gwj5HB0tWuTnP7Iw4AlEArMOpICamtJoI7CGXl5h69IQIBgLQsTkFXQVRFIE1h
        c2FoaWtvIDxzdHJpa2VAbWFnLnNoaW1hbmUtdS5hYy5qcD6IWQQTEQIAGQUCPvB7
        QgQLBwMCAxUCAwMWAgECHgECF4AACgkQHt1YoyYZKZX8YACeNW9mxAIxRQ3y/ThH
        gGl/KTySh9IAniN/1ceqzAksJNDdO4JxkULSZcRfuQENBD7we0MQBADQV2WvfZWU
        pNQ37tjkz9NoZZIYTNi5PM6uH/nR+JNSR1f7egvQv3SeY8lAhY4sn+jz2WqCWW2h
        9LPG1/eTERxPhfPI9jnpnRugNrZ7+vsv9kHL9uTZf1Dm2kEhMb1NIaZjHVshN7c9
        MZrLP8QC1B6ImIofdsBo/IiZOvSyGozLLwADBQQAs2+N0w2aoYrDOah9uvXbIMnD
        GYjuRdxHcUERMIm91yMADzrvuj8OKKKyl1ljC0OCKYshz6HU1P0+KSBgylG70AEy
        ipnJ80P7NWJ8/7YmuQcoYNvA3aNdHp5RlcmnNDomLqLExwSqzEVSTXT/jM59ZhbY
        cuBkZQ0a7HCOcuDNWNWIRgQYEQIABgUCPvB7QwAKCRAe3VijJhkplRrPAJ4nzI79
        58Yt3saALeHXDmnIeWlFegCbB6vKzB+RhVYn2DsENLu9/K6KuxE=
        =fig3
        -----END PGP PUBLIC KEY BLOCK-----
        

        のようになることでしょう.

      • 相手の公開鍵登録

        実際にデータをやりとりするには,誰かの公開鍵を知らなければなりません.回 りの人間と鍵の交換を行って下さい.知合いの誰もいないさびしい人は,この機 会に誰かと知合いになって下さい.メールの添付などにより,テキストファイル そのものをやりとりしましょう.必要な範囲は

        -----BEGIN PGP PUBLIC KEY BLOCK-----

        から

        -----END PGP PUBLIC KEY BLOCK-----

        まで,その行を含む全ての部分です.テキストデータをもらったら,それを使う準備をします.コマンドで実行してく ださい.

        $ gpg --import dareka_key.txt

        最後の鍵の名前はもちろん公開してくれた人のファイル名を使用しましょう.う まく登録できたかどうかはコマンドで確認します.

        $ gpg --list-keys

      • データの暗号化

        適当なテキストファイルを作成します.中身は何でも構いませんし,日本語でも 大丈夫です.適当に名前もつけて保存します.例えば,b01**.txtのよ うなものでも良いでしょう.このファイルを暗号化します.

        $ gpg -ea -r s0140**@matsu.shimane-u.ac.jp b01**.txt

        公開鍵をもらった人のメールアドレスを使って上記のコマンドで暗号化します.

        gpg: EE8D7CAB: There is no indication that this key really belongs to the owner
        1024g/EE8D7CAB 2003-06-19 "Hoge Taro <s0140**@matsu.shimane-u.ac.jp>"
                            指紋: xxxx xxxx xxxx xxxx xxxx  xxxx xxxx xxxx xxxx
        
        この鍵は本人のものかどうか確信できま せん。
        今から行うことを *確実に* 理解していない場合には、
        次の質問にはnoと答えてください。
        
        それでもこの鍵を使いますか? 
        

        のように聞かれますので,キー入力で yes と入力します.これで暗号 化が完了しているはずです.新たに b01**.txt.asc というファイルが 作成されていることを確認してください.中身を見ると,暗号化されていること が分かります.この文書はもう自分でも復号できません.秘密鍵を持っている人, すなわち,先ほど登録した人だけが解読できます.では,そのひとにメールを出 して読んでもらいましょう.メールの本文に,暗号化された文章を張り付けて送 信します.

      • 受信メールの内容解読

        相手がうまく暗号化してくれたならば,あなたにメールが届きます.中身は暗号 化されていてそのままでは読めません.自分の秘密鍵を使って解読しましょう. もらったメールの

        -----BEGIN PGP MESSAGE-----

        から

        -----END PGP MESSAGE-----

        までの全ての範囲をなんらかのファイルに保存します.名前も適当で構いません. 例えば,encrypt.txtなどで構わないでしょう.次にコマンド操作です が,以前に学習した「リダイレクト」を使って次のようにします.

        $ gpg < encrypt.txt > encrypt.txt.asc

        次のようにメッセージが表示されます.

        次のユーザーの秘密鍵のロックを解除するには
        パスフレーズがいります: "Hoge Jiro <s0140**@matsu.shimane-u.ac.jp>"
        1024ビットELG-E鍵, ID EE8D7CAB作成日付は2003-06-19 (主鍵ID 9014F6DF)
        
        パスフレーズを入力: 
        

        鍵を作成するときに入力したパスフレーズをもう一度入力します.間違えたら Enterを押して下さい.再び入力画面になります.無事に入力ができたら,

        gpg: 1024-ビットELG-E鍵, ID EE8D7CABで暗号化2003-06-19にできました
              "Hoge Jiro <s0140**@matsu.shimane-u.ac.jp>"
        

        となり,ファイルが作成されています.復号できた文書を読んでみましょう.

      • 電子署名

        秘密の文書をやりとりするのに暗号化を用いましたが,相手が正しくその本人で あるかを確認するために,電子署名が利用されます.すなわち,データの作成者 が自分で秘密鍵を作って暗号化した署名を用意し,受け取った相手がその送り手 の公開鍵を利用して解読できれば本人であることの証明になります.公開鍵で復 元できるのは秘密鍵で暗号化されたデータだけだからです.以下で実習してみま しょう.まずは,署名の作成です.適当な内容のテキストファイルをまた作りま す.署名と言うくらいですから,自分の名前でも入れておけば良いでしょう.メー ルの署名を使うことも可能です.そ のファイルをsig-b01**.txtなどとして保存し,

        $ gpg --clearsign sig-b01**.txt

        と,コマンドを入力すると,

        次のユーザーの秘密鍵のロックを解除するには
        パスフレーズがいります: "Hoge Taro <s0140**@matsu.shimane-u.ac.jp>"
        1024ビットDSA鍵, ID A4BAF845作成日付は2003-06-19
        
        パスフレーズを入力: 
        

        となってパスフレーズの入力を求められるので,入力します.無事に終わるとメッ セージも何も無しでコマンドは終了します.拡張子として .asc が付 与されたファイルが作成されているので,中身を見てみましょう.平文と暗号の 両方が入ったデータとなっているのが分かるでしょうか.これをメールなどの末 尾につけておくと,メールの差出人がまさしく本人であるかの確認ができます.

        以前に実習したように,メールの From: 欄で別人の名を語るのは簡単 な操作で可能ですので,必要な場合にはこのような電子署名をつけることがあり ます.

      • 本人確認

        メールで送られて来た電子署名とその人の公開鍵を使って確認を行います.送ら れて来た電子署名を適当な名前で保存します.たとえば, digital-sign.txtなどとしてみましょう.次にコマンド操作 です.

        $ gpg < digital-sign.txt

        公開鍵を登録している相手ならば,確認ができます.ただし,教室の環境では最 初に説明したようにおまけでメッセージが出てきますので,そちらは無視しましょ う.

        gpg: 2003年06月19日 10時36分24秒 JST のDSA鍵ID A4BAF845による署名
        gpg: 正しい署名: "Hoge Taro <s0140**@matsu.shimane-u.ac.jp>"
        

        これ以降のメッセージは気にしないで,このように「正しい署名」が表示されて いれば,とりあえず成功です.

  3. 小テスト

    授業の終了20分前くらいにAクラスBクラス別の小テストを実施します.アナウ ンスに注意してください.また,提出は電子メールにより行いますので,メール の送信準備は忘れないでいて下さい.

  4. 宿題

    授業の終りに宿題(AクラスBクラス)の説明をしますので,アナウンスに注意してください.


目次ページへ戻る