このブログ記事ではリモートサーバーとの通信に用いるSSHについて紹介します。

自分のコンピュータを使ってゼロからウェブサーバーを構築することも可能ですが、開発者はAWSやGoogle Cloud、Microsoft Azure、DigitalOceanなどのサービスが提供・管理するリモートサーバーを利用することが一般的です。 リモートサーバーをウェブサイトやウェブアプリケーションのホスティングに使用するためには、安全な通信チャネルを通じてシェルスクリプトをリモートサーバーのコマンドラインで実行し、 結果を受け取る必要があります。そのために、Secure Shell (SSH) を使用します。
SSH
SSHは、TCPやIPの上に構築されたネットワーク通信プロトコルで、コンピュータ間の安全な接続を可能にします。SSHでは、1つの接続内で複数のチャネルを多重化し、 安全なシェルアクセス、ファイル転送、ポートフォワーディングなどをサポートします。これにより、リモートマシンの安全で統合された管理が可能になります。
暗号化
すべてのSSH接続には、暗号化が必要です。このプロセスは、TLSが使用するものと似ており、両者が互いに仕様を交換し、暗号化アルゴリズムに合意し、 公開鍵を交換して共有する秘密情報を暗号化します。この秘密情報は、それぞれの秘密鍵で復号され、対称鍵を生成するために使用されます。 この鍵交換プロセスはディフィー・ヘルマン鍵交換と呼ばれます。(RSAやECDHのような他のバリエーションも存在します) 鍵交換が数学的にどのように行われているか興味がある場合は、 Diffie Hellman -the Mathematics bit- Computerphileをぜひご覧ください。
新しいセッションが作成されるたびに鍵交換が行われ、リクエストとレスポンスが暗号化されます。HTTPSでは、 メッセージの暗号化とサーバーのアイデンティティの確認をCA(認証局)を使って行いますが、 ユーザー認証はウェブアプリケーションに任されています。これは、ウェブサイトやウェブアプリケーションがクライアントのアイデンティティを確認する必要がない場合が多いからです(アプリケーションレベルで設定可能です)。 一方、クライアントはウェブサーバーのアイデンティティを重視します。
しかし、SSH接続をサーバーに確立する場合、サーバーは基本的に非公開であるため、 サーバーのアイデンティティを確認する必要はあまりありません。代わりに、 サーバーはクライアントがサーバーへのアクセス権を購入したか、許可された人物であることを確認する必要があります。 したがって、SSHにはクライアントのアイデンティティを確認するためのユーザー認証レイヤーが含まれています。
ユーザー認証
SSHは、パスワード認証と公開鍵認証の両方をサポートしています。パスワード認証では、ユーザー認証のためにユーザー名とパスワードを設定しますが、 この方法は一般的にあまり安全ではありません。これは、パスワードが人為的なエラーやソーシャルエンジニアリング攻撃にさらされやすいためです。
公開鍵認証では、クライアントが非対称鍵(公開鍵と秘密鍵)を生成し、公開鍵をサーバーに送信します。サーバーはこの公開鍵を保存します。 認証プロセスでは、サーバーがクライアントの公開鍵でデータを暗号化し、クライアントが秘密鍵でそれを復号することでアイデンティティを証明します。 公開鍵認証は、パスワードが関与しないため、人為的なエラーのリスクが低く、より安全とされています。認証に使用される非対称鍵はクライアントのマシンに長期保存され、 公開鍵はサーバーに登録されており、複数のセッションで使用することが可能です。
結論
AWSのEC2を使用して仮想プライベートサーバーを立ち上げる際にSSHという用語に出くわしたであろう多くの人にとって、 上記の説明はSSHが何であり、なぜ頻繁に使用されるのかを理解する助けになるでしょう。SSHは、 あなたのコンピュータとリモートサーバー間の安全な通信を可能にし、SSHキーは安全なユーザー認証のために使用されます。 ただ、実際にウェブサーバーを構築する前に、ネットワーキングや自動化ツールについて学ぶべきことがまだ多くあるので、 それらについては、今後の記事で取り上げていきます。
リソース
- Computerphile. 2018. Secret Key Exchange (Diffie-Hellman) - Computerphile. YouTube.