SSH

  1. SSHとは
  2. 通信経路の暗号化
  3. 自己証明
  4. インストール
  5. 起動
  6. 始めての接続
  7. 以後の接続
  8. 接続の自動化
  9. ホストの鍵を再製作する
  10. Unix以外のクライアントについて
  11. 参考

SSHとは

SSHとは... secure shellのことである。(^^;
まあ、そのへんはどうでもいいんで、なにするものかというと、コンピューター間の通信経路を暗号化したり、コンピューターや使用者が本当に名乗っているとおりのものであるかを確かめるために使うものです。

通信経路の暗号化

おそらくここを読むようなかたであれば、皆さん一度ぐらいはtcpdump(BSD系なら)やdlpi(Solarisなら)を使ったことがあると思います。例えば、(私はFreeBSD使いなのでその環境で説明しますが)
tcpdump -s 2048 -x host myhost
とかやって (いやまあ、1500ぐらいでいいんですけど) tcpdumpを起動した状態で、rsh yourhost lsなんてコマンドを発効すると、
17:46:34.531094 yourhost.yourdomain.shell > myhost.mydomain.930: FP 2:141(139)
 ack 20 win 61320 (DF)
                         4500 00b3 e192 4000 3c06 c31d 961d b6dd
                         961d b67c 0202 03a2 7fa1 d402 834d 208c
                         5019 ef88 8f9c 0000 3139 3938 2e6e 6972
                         652e 7a69 700a 4465 736b 746f 700a 4d61
                         696c 626f 780a 4d61 696c 6469 720a 4e49
                         5245 0a61 7334 3030 2e74 6172 2e67 7a0a
                         6269 6e0a 6461 7461 0a6d 6169 6c0a 6f6c
                         730a 7031 3934 312e 6f75 7462 6f78 0a70
                         6170 6572 0a70 686f 746f 0a70 7562 6c69
                         635f 6874 6d6c 0a72 6f6c 612e 6a74 640a
                         7368 696b 692e 6a74 640a 746d 700a 776f
                         726b 0a
ってな感じの出力が得られます。もちろんこのページを読むようなかたは16進出力でも簡単に読める(をい)でしょうが、そうでないかたのためにこいつを翻訳すると、
17:46:34.531094 yourhost.yourdomain.shell > myhost.mydomain.930: FP 2:141(139)
 ack 20 win 61320 (DF)
                 4500 00b3 e192 4000 3c06 c31d 961d b6dd    E...............
                 961d b67c 0202 03a2 7fa1 d402 834d 208c    .............M..
                 5019 ef88 8f9c 0000 3139 3938 2e6e 6972    P.......1998.nir
                 652e 7a69 700a 4465 736b 746f 700a 4d61    e.zip.Desktop.Ma
                 696c 626f 780a 4d61 696c 6469 720a 4e49    ilbox.Maildir.NI
                 5245 0a61 7334 3030 2e74 6172 2e67 7a0a    RE.as400.tar.gz.
                 6269 6e0a 6461 7461 0a6d 6169 6c0a 6f6c    bin.data.mail.ol
                 730a 7031 3934 312e 6f75 7462 6f78 0a70    s.p1941.outbox.p
                 6170 6572 0a70 686f 746f 0a70 7562 6c69    aper.photo.publi
                 635f 6874 6d6c 0a72 6f6c 612e 6a74 640a    c_html.rola.jtd.
                 7368 696b 692e 6a74 640a 746d 700a 776f    shiki.jtd.tmp.wo
                 726b 0a                                    rk..
こうなります。ちなみにこの変換は
こういうひどいperlスクリプトで行なっています。さきほどのrsh yourhost lsの出力は、

1998.nire.zip Desktop Mailbox Maildir NIRE as400.tar.gz bin data mail ols p1941.outbox paper photo public_html rola.jtd shiki.jtd tmp work

ですので、うわお、全部筒抜け、ってのがよくわかりますね。

ここを読まれるようなかたは(<もういいって)イーサネットにも詳しいと思いますのでおわかりでしょうが、基本的に線のつながっている機械のパケットはどの機械からでも全部みることができますので、同じ線に繋がっている機械同士で秘密はない、と思っていただいて結構です。ぶっちゃけていうと、見渡すかぎりのパソコンがネットワークでやっていることは見渡すかぎりのパソコンに筒抜け、ということです。
ということは、よそのunix serverにログインしてrootになって管理作業をやろうなんてことをすると、suの後に入力するrootのパスワードが筒抜けになっていたりしますし、pop3でmail serverからメールをとるときには、アカウント名とパスワードが筒抜けになったりしているということなのです。これはいかんですね。

ではSSHを使うとどうなるのでしょうか。rsh yourhost lsと同じことがssh yourhost lsというコマンドで実現できますが、その結果をtcpdumpでみると(ちなみにさきほどのperlスクリプトとあわせて tcpdump -s 2048 -x -l myhost | tcpdump.plとしています。MACアドレスも見たいときは、tcpdump -e -s 2048 -x -l myhost | tcpdump.pl)

18:04:38.835831 yourhost.yourdomain.ssh > myhost.mydomain.1021: P 576:732(156)
 ack 472 win 61320 (DF) [tos 0x10]
                 4510 00c4 e35f 4000 3c06 c12f 961d b6dd    E...._..........
                 961d b67c 0016 03fd 07e0 9c40 8f9e b454    ...............T
                 5018 ef88 c002 0000 0000 0094 d7ae bb47    P..............G
                 339e c823 0a33 060b e3f3 5743 569f 0772    3....3....WCV..r
                 21f0 28c4 7117 fe68 7dc0 ebee 73b2 fdf6    ....q..h....s...
                 dfdc 0f36 b4af 83fb 7cf0 820f 3dbb 6469    ...6..........di
                 c1d7 2487 1e07 6d8b 19c9 d1c0 0883 71d8    ......m.......q.
                 a61e b82a 1b2b 2ab1 6a84 0444 b409 d33f    ........j..D....
                 3b51 fc38 e79f 30b6 3632 5d88 99d0 eeff    .Q.8..0.62......
                 7953 5c5e e39b 9e51 6808 fb02 f49b 9c01    yS.....Qh.......
                 3f9f ca16 08ca 8e1b 8b89 5344 409b f462    ..........SD...b
                 4309 fe56 12a4 fa02 a2f1 37ed 79e6 8549    C..V......7.y..I
                 86d4 5591                                  ..U.
ってな感じになって、全然みえません。すばらしきかな、SSH。

自己証明

もうひとつの効果は、自分が自分であることの証明ができるということです。(必然的に相手が相手であることも証明できます)

tcpdumpの結果を知ったあとですので、ネットワーク上にパスワードを流すのがいかに危険であるか理解できると思います。じゃあどうすればよいか。対応策の一つがr系のコマンドを使うことです。すなわち、rsh、rlogin、rcpですね。これらのコマンドは、相手側ホストに.rhostsファイルを作成する(/etc/hosts.equiv?よいこは使わないように)ことでパスワードの入力なしでログイン等々ができるものです。
確かにこれでネットワーク上にパスワードが流れることはなくなりますが、r系のコマンドは「なりすまし攻撃」に弱いという弱点があります。「なりすまし攻撃」ってのは、基本的にIPやユーザーアカウントは自己申告制なので嘘をつかれたらわからない、ということを利用しています。.rhostsでmyhost.mydomainの機械のiamiのアカウントのログインを許可していたとして、あなたのmyhost.mydomainの機械が止っている夜のうちにだれかが他の機械を繋いで「この機械はmyhost.mydomainに設定してあるし、もちろんiamiも作ってある」というようなときに、それを信用してしまうということなのです。なんのセキュリティもないですね。

しかし、SSHを使えば、自己の証明ができます。SSHにおいてこれはRSAという暗号化手法を使うことによって実現されています。RSAとは、「秘密鍵と公開鍵というペアの鍵があって、秘密鍵で暗号化したものは対の公開鍵でないと基に戻せないし、公開鍵で暗号化したものは対の秘密鍵でないと基に戻せない。そのうえ秘密鍵や公開鍵からペアの公開鍵や秘密鍵を推測することはできない」という性質を持った暗号なのです。
これが自己の証明にどう使えるというのでしょうか?それは下のような原理で行なうことができます。

  1. 私の秘密鍵で特定の文字列(でもなんでもいいけど)を暗号化
  2. その暗号化した文章と、暗号化前のもとの文章を公表する
  3. ついでに公開鍵も公表する。(公開鍵っていうぐらいだし)
  4. 私が私であることを確認したい人は、暗号化した文章を公開鍵で復号する
  5. それがもとの文章であれば、私は私であることが確認できる
  6. 少なくとも公開鍵を公表したひとが秘密鍵の持ち主であることはまちがいない
理解できましたか?6番が気になるところですが、信用ある機関に公開鍵を登録する等で解決できます。
ホストの秘密鍵と公開鍵はSSHのインストールのときに作成されますし、自分の秘密鍵と公開鍵はssh-keygenコマンドで作成することができます。この二つの公開鍵を相手先ホストの所定のファイルに記録しておくことで、ホストならびにユーザーの認証ができるわけです。
誰かが「わたし」をいつわろうとしても、その人は相手ホストに記録してある公開鍵とペアになる秘密鍵を持っていないわけですから、相手ホストが騙されることはないのです。
また、自分が相手ホストの公開鍵を持っていれば、偽物の相手ホストを見破ることができるわけです。

インストール

じゃあ、SSHを使うにはどうするのか?とりあえずインストールです。自分の機械だけにいれてもしょうがないので相手ホストの機械にもインストールしてください。SSHはftp.cs.hut.fiが一次サイトですが、日本ではリングサーバなどから入手できます。
インストールのしかたは簡単で基本的に
gzip -dc ssh-x.x.xx.tar.gz | tar xvf -  (x.x.xxはバージョン)
cd ssh-x.x.xx
./configure
make
suして
make install
だけです。

起動

まず、デーモンのほうのsshdを起動します。といってもサーバになるほうの機械でrootになってsshdとしてやるだけです。inetdから起動する方法もありますが、直接起動するほうが高速だそうですので省略。
クライアントのほうには、3つのコマンドがあります。slogin、ssh、scpで、それぞれrlogin、rsh、rcpに相当します。順番にログイン、リモートでコマンド実行、ファイルのコピーですね。

始めての接続

ところで、これらのコマンドを使うまえに、自分を証明するための秘密鍵と公開鍵を作らねばなりません。自分のホストが自分のホストであることを証明するための秘密鍵と公開鍵はSSHのインストールのときに作成されています。
自分用の秘密鍵と公開鍵を作るにはssh-keygenコマンドを利用します。これまた実行するだけですけど。実行すると、途中でパスフレーズを聞かれます。このパスフレーズはパスワードみたいなものですが、思いきり長くてOKです。でも推測しにくく忘れにくいものにしましょう。
ssh-keygenを実行することによって、$HOME/.ssh/identity.pubに公開鍵が作成されます。そいつを確認したらsloginです。slogin remotehostで相手ホストにログインしますが、最初のときは「相手のホストの公開鍵をとってきて登録していいですか?」と(英語えで)聞かれますので、yesと答えてやりましょう。そのあとでパスワードを聞かれますので相手ホストのパスワードをいれてください。既に経路は暗号化されていますので、安心してパスワードを打ちこんで結構です。
ログインできたら、自分が自分であることの証明のための公開鍵を登録します。相手ホストの$HOME/.ssh/authorized_keysというファイルに(なかったらつくる)自分の公開鍵をかきこみます。私の公開鍵の場合、
$ cat .ssh/authorized_keys                                 
1024 35 166060208516748548418825351623781496143306213560667559011533806972299049
79162674225129482670591570245001163656730903715841920575061906044459727717406359
72911036891901489371510659309062432267831357097490151628576888077217871784699983
81715142598906438146830995991558313703570247283158046731905585070607134306461 us
er@myhost.mydomain
こんなかんじになります。authorized_keysは公開鍵をいれるファイルですのでパーミッションは644で十分です。
あと、.rhostsファイルは削除してください。もう不要です。

以後の接続

これで準備は完了しました。次回の接続からはパスフレーズを聞かれることになります。え?聞かれませんか?うーん、.rhostsファイルの削除をお忘れでは?
秘密鍵と公開鍵のペアがあれば十分認証が可能なのにどうしてパスフレーズが必要なのか、疑問ではありませんか?これは自分の秘密鍵が変更されていないか確認するために使うのだそうです。注意深いですな。
/etc/sshd_configでRhostsRSAAuthentication yesとなっている場合(デフォルトの状態)、一度サーバ側とクライアント側の両方からFQDN(フルドメイン名)で接続し(もちろん、サーバからクライアントにつなぐときはクライアントがサーバでサーバがクライアントなわけですが)、かつ.rhostsで接続が許可されているとパスワードもパスフレーズもなしで接続が可能です。つまりRhostsとRSAでAuthentication(認証)されているわけです。
このようなことをするともちろんrコマンドでも接続が可能であり、セキュリティ的に弱くなりますが、サーバ側のrコマンドサーバ(rlogindなと)が殺してあるような場合は比較的安全でかなり便利です。
また、.rhostsのかわりに.shostsを使うこともできます。こっちなら r系のコマンドを殺さなくても大丈夫ですね。使いわけもできますし。
セキュリティ的なはなしですが、RhostsRSAAuthenticationが有効になっていて、.shosts (または .rhosts) により接続が許可されているとします。このような状態で誰かが許可されている人物になりすましたとするとどうなるでしょう。このときは、接続先ホストの$HOME/.ssh/known_hostsに保存してある公開鍵と、偽のホストの秘密鍵が一致しませんので、パスワードによる認証が必要となります。

rコマンドをそれはそれで使いたいというかたには、ssh-agentによる接続の自動化があります。

接続の自動化

長いパスフレーズの入力はなかなか面倒なので、これを省略するためにssh-agentというツールとssh-addというツールがあります。ssh-agentが自動でパスフレーズを入力してくれるデーモン、ssh-addがssh-agentにパスフレーズを伝えるツールです。
ssh-agentは.xinitrcあたりに

bashなどsh系の人はi、eval `ssh-agent -s`
csh系の人は、eval `ssh-agent -c`

という行を(.xinitrcでkterm等を起動していうひとはそれより前の行に)いれてやります。この操作により環境変数を設定してやるのです。これでXを立ちあげて、一度だけssh-addを実行してパスフレーズをいれてやれば、以後はそのXを終了するまでパスフレーズの入力が不要になります。

この状態で、いったんXを終了して再びXを起動すると、ssh-agentがいくつも動きますので御注意。このへんはどうにかしてほしいですな。ssh-agentを殺すには、さっきの環境変数が有効なうちにssh-agent -kです。
また、ローカルとリモートの両方の/tmpに自動でディレクトリを作りますが、

drwxrwxrwt   3 root     sys         1024  8月 11日  11:37 tmp/
のようにディレクトリにスティッキィビットが立っていないとうまくいきませんのでこちらも注意が必要です。スティッキィビットを立てるには、rootになってchmod 1777 /tmpです。

ホストの鍵を再製作する

ユーザ鍵はさきほど作成した要領で好きなように更新できますが、ホストの鍵のほうはどうすればいいのでしょうか?
ssh の Makefile をみてみると、
generate-host-key:
        -@if test -f $(install_prefix)$(HOST_KEY_FILE); \
          then echo "You already have a host key in $(install_prefix)$(HOST_KEY_FILE)."; \
          else \
            umask 022; echo "Generating 1024 bit host key."; \
            ./ssh-keygen -b 1024 -f $(install_prefix)$(HOST_KEY_FILE) -N ''; \
          fi
とかいてあります。
従って(デフォルトなら)
  1. rootになって
  2. /etc/ssh_host_key と /etc/ssh_host_key.pub を消去し
  3. ssh-keygen -b 1024 -f /etc/ssh_host_key -N '' を実行
  4. 出力された公開鍵を /etc/ssh_host_key.pub に一行でかく
ことでホスト鍵の更新ができます。
ホスト鍵を更新すると、sshクライアントのほうに警告がでますので、利用者からの問いあわせに答える準備をしておきましょう。(笑)

Unix以外のクライアントについて

1. TeraTermで接続する (Windows)
必要なソフトは
TeraTerm PRO 2.3とそのwebからたどれるsshのTera Term extension modulesです。2種類紹介してあるが、ここではTTSSHを使っいます。もうひとつは日本語版なので問題ないでしょう。
まず、TeraTermPROをインストール。展開して、セットアップするだけです。つぎにttsshを展開、でてきたファイルをTeraTermPROをインストールしたディレクトリに全部いれます。
はっきりいって、あとはttpro.exeのかわりにttssh.exeを実行するだけです。接続先ホストを選べば、接続の選択肢としてtelnet、ssh、otherってのが選べます(otherってのはよくわかりませんが)。
ここでsshを選ぶとさらに選択肢としてplain password、RSA、rhostsなどの認証方式が示されます。(最初の接続のときには認証の選択のまえにknown_hostsに相手先ホストを加えるか?ときかれます。もちろんYESですね。)
認証方式はすきなものを選んでかまいせんが、RSAやrhosts(どうもrhosts+RSA認証らしい)を選ぶには自分でRASキーを作っておくき、相手先には公開鍵を登録しておく必要があります。RSAキーのジェネレータはついていなかったようなので、ホストのssh-keygenを使う必要があるでしょう。認証ではなく暗号化がメインならplain password認証で十分です。

2. その他
unixを使え、unixを。

参考

http://www.rr.iij4u.or.jp/~sada/ssh.html ssh 入門
http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/ssh/ssh-faq.html ssh FAQ


Top index