SSH(Secure Shell)は、暗号化に対応していないTelnet(テルネット)、rsh(リモートシェル)、rlogin(アールログイン)の代替として利用されています。それぞれ通信プロトコル名やアプリケーション名ですが、一般的には遠隔地のサーバーを操作するために利用します。遠隔地と書きましたが、他のコンピューターという意味なので隣にあってもかまいません。
まずは通信そのものを暗号化します。SSHにはSSH1とSSH2があります。手順はそれぞれ異なりますが、データ通信自体の暗号化には共通鍵方式が用いられます。
SSH1では、 サーバーキー が利用されます。
SSH2では、 Diffie-Hellman鍵共有 (DH鍵共有)を利用して共通鍵を生成します。
SSH1ではサーバーキーを利用しましたが、SSH2では共通鍵の交換がありません。クライアントとサーバーがお互いに生成した公開鍵を交換することで、共通鍵が生成されます。つまり共通鍵がネットワークに流れることがありません。
数学的な話になるので詳細は省きますが、ある数式から解を求めるのは簡単だが、解から数式の要素を求めることは困難であるという 一方向性関数 の性質を利用しています。DH鍵共有では 離散対数的問題 を利用しています。
あくまでも概要なので、詳しい内容は他のサイトも参考にしてください。
ログインの前提として目的のサーバーと接続する必要があります。いくら通信を暗号化できるといっても、接続相手が偽物(なりすまし)だったらどうしますか?パスワード認証であればアカウントを盗難されてしまいます。
そこでホスト認証という仕組みが必要となります。暗号化通信を確立する際に行われ、クライアントはサーバーの ホストキー の公開鍵を一緒に受け取り、公開鍵暗号方式で正当なサーバーかを判断します。
初めての接続であれば、以下の様な表示が出るでしょう。
「ホストの信頼性が不明です。それでも接続しますか?」と表示されます。 RSA key fingerprint is に公開鍵のハッシュ値が表示されているので、前もってサーバー管理者から確認している正規のハッシュ値と比較します。一致していればそのまま接続して問題ありません。不一致であれば、目的外のサーバーに接続されていることが分かります。
とは言え、レンタルサーバーでは事前にハッシュ値を確認するのは難しいでしょう。そのため、警告が出てもそのまま許可してしまうことがほとんどです。もし安全性を重視するならサポートに問い合わせるしかありません。
接続するとパソコン(クライアント)の「known_hosts」というファイルにサーバーの公開鍵が保存されます。これにより次回以降は自動的に認証が行われるため警告が表示されなくなります。目的外のサーバーに接続している場合やサーバーの公開鍵が変わっている場合、警告が表示されます。一般的にはホストキーの変更は滅多に行わなれないため、許可済みのサーバーに接続した際、 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! のような警告が出た場合は注意する必要があります。
このホスト認証が終わるとログイン処理が始まります。