SSH Agent Forwardingを用いたSSHの公開鍵認証方式のイメージを掴む
本記事ではこの公開鍵認証方式についてちょっとだけ詳しいイメージの一例を示します。
SSHってなに?
まずざっくりとSSHについて説明します。ご存じの方は読み飛ばしていただいて構いません。
SSH(Secure Shell)とはTelnetという遠隔地にあるサーバなどを操作する通信プロトコルに暗号や認証技術を利用して、安全にリモートコンピュータと通信することができる通信プロトコルです。
SSHの主要な認証方式としてはパスワード認証方式と公開鍵認証方式があります。
- パスワード認証方式
パスワード認証方式はデフォルトの認証方式で、ユーザー名とパスワードでログインする方式です。 - 公開鍵認証方式
公開鍵認証方式は公開鍵と秘密鍵の2つの鍵(キーペア)を使用した接続方式で、パスワード入力なしでログインする事ができます。
用語定義
はじめにこの先出てくる用語について定義します。
- SSHエージェント
メモリ上に保持している秘密鍵を安全に管理するためのバックグラウンドプログラム。 - SSHクライアント
SSHを通じてリモートコンピュータなどに接続するためのソフトウェア。接続の際にパスワード認証方式や公開鍵認証方式によって暗号化された通信チャネルを確立する。 - SSHデーモン
リモートコンピュータ上で動作するバックグラウンドプログラムで、SSHクライアントからの接続要求を受け付けて処理する役割。接続の際にパスワード認証方式や公開鍵認証方式によって暗号化された通信チャネルを確立する。 - authorized_keyファイル
SSH接続を許可するユーザーの公開鍵が一覧で保存されている。リモートコンピュータ上にある各ユーザーのホームディレクトリ内の.sshディレクトリに入っている。
SSH Agent Forwardingってなに?
SSH Agent ForwardingとはリモートコンピュータがローカルPCのSSHエージェント利用できるようにし、これを通じて、複数の接続先のコンピュータで認証を行うことができる機能です。
ローカルPCのSSHエージェントが秘密鍵を保持しているので、秘密鍵がローカルPCを離れることはなく秘密鍵が漏洩するリスクを大幅に減少すさせる事ができます。
公開鍵認証方式のイメージ
事前に公開鍵認証に使う鍵ペアを生成します。秘密鍵はローカルPCのSSHエージェントに登録し、公開鍵は接続するすべてのコンピュータ内のauthorized_keyファイルに登録します。秘密鍵にはパスフレーズを設定しておきます。
まずはローカルPCから目的サーバに対してSSH接続を行うイメージを掴みましょう。
- ローカルPCのSSHクライアントは目的サーバのSSHデーモンに接続要求を行います。
- 接続要求を受け取った目的サーバのSSHデーモンは、自身の持つauthorized_keyファイルに登録されている公開鍵を用いてランダムな文字列に対して暗号化を行います。その結果生成されたチャレンジをローカルPCのSSHクライアントに送信します。
- ローカルPCのSSHクライアントは受け取ったチャレンジを自身のSSHエージェントに転送します。この際ユーザーは、秘密鍵のロックを解除するためにパスフレーズの入力を要求されます。
- ローカルPCのSSHエージェントは自身の持つ秘密鍵を用いて復号しランダムな文字列を求め、これをレスポンスとして自身のSSHクライアントに転送します。
- ローカルPCのSSHクライアントはレスポンスを目的サーバのSSHデーモンに送信します。
- 目的サーバのSSHデーモンは受け取ったレスポンスが2のランダムな文字列と一致することを検証します。検証に成功すれば目的サーバへのアクセスを許可します。
公開鍵によって暗号化されたデータは対応する秘密鍵を持っている人にしか復号できません。上記の例だと秘密鍵を持っているローカルPCのみが復号でき、その他には復号することはできません。秘密鍵を持っている人が一人しかいないということが前提であるため、これによって接続元の身元を検証することができるというわけですね。
このイメージを掴んだところで今度はローカルPCから中継サーバへSSH接続を行った後、さらに中継サーバから目的サーバへSSH接続を行うイメーを掴んでいきましょう。
ローカルPCから中継サーバへSSH接続を行う手順は先程と同じです。目的サーバのところを中継サーバと読み替えて上記の手順6が完了した時点から見ていきます。
- 中継サーバのSSHクライアントは目的サーバのSSHデーモンに接続要求を行います。
- 接続要求を受け取った目的サーバのSSHデーモンは、自身の持つauthorized_keyファイルに登録されている公開鍵を用いてランダムな文字列に対して暗号化を行います。その結果生成されたチャレンジを中継サーバのSSHクライアントに送信します。
- 中継サーバのSSHクライアントは受け取ったチャレンジを自身のSSHデーモンに転送します。
- 中継サーバのSSHデーモンはローカルPCのSSHクライアントにチャレンジを中継します。
- ローカルPCのSSHクライアントは受け取ったチャレンジを自身のSSHエージェントに転送します。この際ユーザーは、パスフレーズの入力を要求されません。
- ローカルPCのSSHエージェントは自身の持つ秘密鍵を用いて復号しランダムな文字列を求め、これをレスポンスとして自身のSSHクライアントに転送します。
- ローカルPCのSSHクライアントはレスポンスを中継サーバのSSHデーモンに送信します。
- 中継サーバのSSHデーモンは受け取ったレスポンスを自身のSSHクライアントに転送します。
- 中継サーバのSSHクライアントは目的サーバのSSHデーモンにレスポンスを中継します。
- 目的サーバのSSHデーモンは受け取ったレスポンスが2のランダムな文字列と一致することを検証します。検証に成功すれば目的サーバへのアクセスを許可します。
この一連の流れは中継サーバが増えても問題ありません。
また、5のパスフレーズが要求されないところですが、SSHエージェントが生きているうちは最初の1回のみパスフレーズを入力するだけで以降のログインは即座に行われます。この例だと、ローカルPCから中継サーバへログインする時点で1度パスフレーズを入力しているので、手順5ではパスフレーズの要求は行われなかったということですね。
最後に
最後まで読んでくださり、ありがとうございました!
この記事が少しでもあなたの役立てば幸いです!
参考文献
Discussion