edo1z blog

プログラミングなどに関するブログです

SSH (Secure SHell) の仕組み

SSHとは、ネットワークを介して他のコンピュータに安全にアクセスする仕組み。 telnetは暗号化されてないので盗聴の危険性があるが、sshは暗号化されているので安全。

SSHはRSA暗号方式かDSA暗号方式のどちらかで暗号化した公開鍵と秘密鍵のペアを用いる。公開鍵は暗号化のみ可能であり、秘密鍵は復号のみを行う。暗号化のみ可能で復号ができない為、公開鍵は公開されても問題がない。公開鍵は公にして問題ないことから、複数のリモートコンピュータと接続する場合も、公開鍵・秘密鍵のペアは一つあればよい。

SSHを使って、リモートコンピュータにアクセスしようとする場合、アクセス元のコンピュータで公開鍵・秘密鍵のペアを作成し、公開鍵をリモートコンピュータに渡しておく必要がある。

リモートコンピュータに、公開鍵を渡した後で、ssh接続をしようとすると、

  • sshが、RSA認証プロトコルを使用する旨をリモートコンピュータに伝える。
  • すると、リモートコンピュータが、乱数を生成し、その乱数を渡された公開鍵を基に暗号化し送信してくる。
  • 接続元コンピュータは、受信した暗号を秘密鍵で復号し、復号結果をリモートコンピュータに送信する。
  • リモートコンピュータは受信した内容が生成した乱数と一致すれば、秘密鍵保有者であることが確認されたためアクセスを許す。

秘密鍵が他人に渡った場合あらゆるアクセス権限が渡ってしまうことになる為、秘密鍵作成時にはパスフレーズを登録すべき。これによって、万一他人に秘密鍵が渡っても、パスフレーズがない限りはそれを使用できない。

ただ、SSHで公開鍵・秘密鍵を利用する目的の一つにパスワード入力を不要にするという点があるが、パスフレーズを登録した場合、パスワードの代わりにパスフレーズの入力が必要となる為、その目的に合致しない。そこで、パスフレーズ入力を回避したい場合は、ssh-agentを利用する。macには、キーチェーンという仕組でパスフレーズ入力が回避できる。

#実際の公開鍵・秘密鍵の作成方法
cd ~/.ssh
ssh-keygen -t rsa

#作成した公開鍵をリモートコンピュータに渡す
scp id_rsa.pub ユーザ@リモートコンピュータのホスト:

#リモートコンピュータにログインする
ssh ユーザ@リモートコンピュータのホスト
パスワード入力
ログイン完了
cat id_rsa.pub >> ~/.ssh/authorized_keys
rm id_rsa.pub

また、/etc/hosts.allow、/etc/hosts.denyを編集することで、接続元を制限することができる。hosts.denyはhosts.allowよりも先に見られる。hosts.denyに、ALL:ALLと書くことで、「全てダメ」になる。hosts.allowに下記にように書くことで、記載した対象のみ接続可となる。

ALL : 127.0.0.1
ALL : 192.168.1.1

参考: http://e-words.jp/w/ssh.html http://www.atmarkit.co.jp/flinux/special/ssh/ssh.html http://www.turbolinux.com/support/document/knowledge/152.html SSH-KEYGEN OpenSSH キー (鍵) の管理