4.2. セキュアシェルsshのしくみ/How the secure shell works

ssh(secure shell)は、暗号化された通信路を経由してリモートマシンに ログインして、リモートマシン上のシェルを操作するための通信プログラムです。

多くのスーパーコンピューターは、操作するためにsshが必要になります。

Ssh (secure shell) is a communication program through which you can send commands to the shell on a remote computer, through an encrypted communication channel.

Many supercomputers require the use of ssh to operate.

ユーザは手元のローカルマシン上で、リモートマシンを指定してsshコマンドを起動します。 sshコマンドは暗号化された通信のクライアントプログラムです。 sshコマンドは指定されたリモートマシン上の sshサーバープログラムと通信をします。 sshサーバープログラムは、接続してきたユーザを認証した上で、ユーザのために シェルプログラムを起動します。ユーザーがローカルマシン上でタイプした内容は リモートマシン上の シェル に送られ、そこでコマンドとして実行されます (Fig.1)。

The user invokes the ssh command at the local machine, specifying the remote machine. The ssh command is a client program for encrypted communication. The ssh command will communicate with the ssh server program on the remote machine. The ssh server program will first authenticate the client program that contacted the server, then starts a shell program for the client. The key strokes that the user types on the local machine will be sent to the shell program on the remote machine, and it will be executed as a command (Fig. 1).

../../_images/ssh-communication.png

Fig.1 ssh communication

sshの使い方を理解する上で、仕組みをあるていど分かっている必要があるので、 仕組みについて簡単に説明します。初めに暗号アルゴリズムによって得られる 機能を紹介し、そのあとでsshにおいてそれらがどのように組み合わされている のかを説明します。

In order to learn how to use ssh, it helps to understand how it works, at a brief level. So we will quickly explain. At first, functionalities of encryption algorithms are introduced, and after that, how ssh combines those functionailities are explained.

sshの通信では、共通鍵暗号と公開鍵暗号と呼ばれる種類の暗号が使われます。 暗号アルゴリズムは、通信路の暗号化に使われることに加えて、サーバの認証、 ログインしようとするユーザの認証に使われます。

Ssh uses what is called symmetric key cryptography and public key cryptography. Cryptographic algorithms are used for several purposes; encryption of the communication channel, authentication of the server, and authentication of the client.

4.2.1. 対称鍵暗号/symmetric key cryptography

sshは、大半の通信に、対称鍵暗号と呼ばれるタイプの暗号を使います (共通鍵暗号とも呼ばれます)。 対称鍵暗号は、暗号化操作と復号操作のそれぞれで、同じ暗号鍵(暗号化処理に パラメータとして渡すデータで、鍵が異なれば暗号化の結果が異なる)を使う 暗号処理方式です (Fig. 2)。 この後説明する公開鍵暗号に比べて高速な処理が可能であるため、大量データの扱いに 向きます。sshでは、通信を開始する時のやりとりを除いて、対称鍵暗号を用いて 暗号通信をします。

Ssh uses a type of cryptographic algorithm which is called symmetric key cryptography for most of its communication.

In symmetric key cryptography, both the encryption process and decryption process use the same “key” (Fig. 2). In cryptography, a key is some data that is given to the encryption algorithm as a parameter, and when a different key is used, the encryption result will be different. Compared to public key cryptography algorithms that will be explained shortly, symmetric key cryptography can be processed much faster, and is suited for handling large amounts of data. In ssh, symmetric key cryptography is used for all communication except for the initial interaction at the beginning of a communication.

../../_images/symmetric-key-cryptography.png

Fig.2 symmetric key cryptography

対称鍵暗号を用いるためには、送り手と受け手の双方で対称鍵を他人に見えない形で 共有する必要があります。ネットワーク通信以外の手段で事前に鍵を送り届けておくか、 また別の暗号化通信を用いて伝達するか、いずれかの方法が取られます。

sshでは、対称鍵をネットワークで送ります。クライアントで乱数によって対称鍵を 生成した後で、公開鍵暗号を用いて暗号化して伝達します。

To use symmetric key cryptography, both the sender and receiver must obtain the same key data without leaking to anyone else. To achieve that, you can choose to send the key data physically without using network communication, or to send it through some other encrypted communication channel.

Ssh uses the network to send the symmetric key. The symmetric key is generated at the client by a random number generator, and then sent to the server in encrypted form using a public key cryptorgraphy algorithm.

4.2.2. 公開鍵暗号/public key cryptography

公開鍵暗号では、暗号化と復号に異なる暗号鍵を使用します。 暗号化に使う鍵を暗号化鍵、復号に使う鍵を復号鍵と呼びます。 鍵の作成には乱数を使い、暗号化鍵と復号鍵をペアで作成します (Fig. 3)。 できあがった鍵ペアの一方の公開されている鍵の内容から、非公開の鍵を推定する ことは極めて困難になるようにアルゴリズムが工夫されています。

In public key cryptography, different keys are used for encryption and decryption, respectively. The key used for encryption is called the encryption key, and the key used for decryption is called the decryption key. The two keys are created in pairs, using a random numbers (Fig. 3). The algorithm is designed to make it extremely difficult to guess the private key of the pair from the published key.

../../_images/key-pair.png

Fig.3 Key pair

公開鍵暗号アルゴリズムでは、暗号化や復号化に必要な計算量が一般に多いため、 どうしても必要な局面でのみ、使われます。特に、共通鍵で済む用途に対しては 公開鍵暗号は使いません。

The computational cost for encryption and decryption for public key algorithms is generally high, so its use is limited to situations where the function is absolutely necessary. Especially, public key algorithms are not used when symmetric key algorithms are enough.

公開鍵暗号を使う場合には、鍵ペアのうちの一方を公開し、他方を非公開にします。 どちらを公開するのかに応じて、通信内容の秘匿と、通信内容の発信者の証明という 2つの異なる機能を果たします。

When public key cryptography is used, one key of the key pair is made public, and the other is kept private. Depending on the choice of which key to publish, one of two different effects can be achieved; keeping a message confidential, or proving the origin of a message.

暗号化鍵を公開した場合の機能は、通信内容の秘匿になります。 この場合、秘密の情報の受信者が鍵ペアの所有者になります。 受信者は、暗号化鍵を公開します (Fig. 4)。

When the encryption key is published, then the effect will be confidentiality of the transmitted message. The recipient of the message will be the owner of the key pair, and the encryption key will be published (Fig. 4).

秘密の情報の送信者は、公開された暗号化鍵を受信し、その鍵を用いて 秘密の情報を暗号化し、受信者に送ります。受信者は送られてきた暗号データを 非公開の復号鍵で復号できます。復号鍵は非公開なので、他の人は暗号データを 傍受したとしても、復号できません。

The sender of a confidential message will use the published public encryption key to encrypt the secret message, and send it to the receiver. The receiver will decrypt the received message using the concealed decryption key. Since the decryption key is kept private, even if some other person succeeds in capturing the communicated messages on the network, the message cannot be decrypted.

../../_images/publish-enc-key.png

Fig. 4 public key usage where the encryption key is published

これとは逆に、復号鍵を公開する使い方があります。 復号鍵を公開した場合の機能は、通信内容の発信者の証明になります。 この場合は情報の送信者が鍵ペアの所有者になります (Fig. 5)。 送信者は、復号鍵を公開します。送信したい情報は、非公開の暗号化鍵で暗号化します。 それに対する復号鍵は、公開してしまいますから、誰でも復号できます。 しかし、その公開鍵で正しく復号できるような暗号文を作ることができるのは、 非公開の暗号化鍵を持っている鍵ペアの持ち主だけです。そのため、復号して 意味のあるデータが得られれば、そのデータは確かに送信者からのものであると 確信することができます。

On the other hand, there is a usage that publishes the decryption key. The effect that can be achieved by publishing the decryption key is to prove the origin(creator) of a transmitted message. In this case, the sender of the message is the owner of the key pair (Fig. 5). The sender will publish the decryption key. The message to be sent is encrypted with the private encryption key. The corresponding decryption key is published, so anyone will be able to decrypt the encrypted message. However, the only person that could create such a message is limited to the owner of the key pair. Thus, if an encrypted message can be successfully decrypted by the decryption key, one can be sure that the message is indeed from the sender of the message.

../../_images/publish-dec-key.png

Fig. 5 public key usage where the decryption key is published

Note

まず、sshでは、ここで紹介したような「送信元の保証」の仕組みを 直接には使っていません。常に暗号化鍵の方が公開鍵として使われます。

First to note, ssh does not directly use the above described form of confirming the sender of a message. In ssh, the encryption key is always used as the public key.

次に、実際に用いられる処理方式では、メッセージをまるごと暗号化することは、 性能の観点からしません。 メッセージ内容の関数として、固定長の短いデータであるメッセージダイジェストを まず算出し、メッセージダイジェストに対して暗号化します。 このことにより、処理時間の短縮を図ることが一般的です。

Second, in practice, the whole message content is not encrypted for performance reasons. Instead, a message digest, which is a fixed-length, short data that is a function of the message content is computed. Then this message digest is encrypted using the encryption key. In this way, the processing time can be shortened.

4.2.3. sshでの通信開始の流れ/communication initiation in ssh

共通鍵による暗号通信と、公開鍵による暗号化や送信元の証明の機能に基づいて、 以下では、sshでの通信方式の概略を説明します。説明を簡単にするために、 細部は実際のプログラムの動作と異なっていることがあります。正確な動作を 知る必要がある場合は、sshのドキュメントやソースを参照してください。

Based on the functions of symmetric key encryption and public key encryption, the following is an overview of the communication method of ssh. For the sake of simplicity, some details may be different from the actual implementation. If you need a detailed and accurate explanation, refer to the documenatation provided with ssh.

sshでは、ユーザのログイン方式としてパスワードによる認証と公開鍵暗号による 認証があります。公開鍵暗号による認証を使うには、サーバに加えて各ユーザも 自分の鍵ペアを用意しておく必要があります。本ページでは公開鍵暗号による 認証について説明します。

ssh provides two methods for user authentication, password authentication and public key authentication. To use public key authentication, the user must own a key pair in addition to the server. In this page, public key authentication is explained.

sshでは、公開鍵暗号による暗号化をクライアントからサーバへ、それとは逆に サーバーからクライアントへ、双方向に一回ずつ利用します。 その際に、通信相手の認証をクライアントとサーバ、それぞれで行います。

ssh uses public key encryption in two directions; from the client to server and server to client, once for each direction. During this, both sides authenticates the other side of the communication channel.

4.2.3.1. step 1. クライアントからの要求で通信路確立/Client initiates a communication channel

まず、クライアントからサーバに、TCPによる通信路の確立要求を送ります。 サーバがこれを受理すると、通信路が確立します。この通信路自体は暗号化機能を提供 しません(Fig. 6)。

In the beginning, the client sends a TCP connection establishment request to the server. The server will accept this and a communication channel is established. This channel by itself does not provide any encryption features (Fig. 6).

../../_images/tcp-connect.png

Fig. 6 TCP connection handshake (simplified)

4.2.3.2. step 2. サーバからサーバ公開鍵を送信/Server sends server public key

次に通信の両側からそれぞれの相手に対して、サポートしている暗号アルゴリズムの 一覧が送信されます。 ssh のソフトウェアのバージョンによって、実装している アルゴリズムは異なります。

両側で一覧を受信すると、自身でサポートしているアルゴリズムと照らし合わせ、 双方がサポートしている中で、もっともセキュリティ強度の高い暗号アルゴリズムが 選択されます(Fig. 7)。

In the next step, both sides of the communication sends a list of the cryptographic algorithms that it supports. Different ssh versions may support a different set of algorithms.

Upon receiving the list at each side of the communication, the received list is compared with the algorithms that the recipient supports. Within the algorithms that both sides support, the most secure algorithm will be chosen (Fig. 7).

../../_images/algorithm-list-exchange.png

Fig. 7 algorithm list exchange

以下では、暗号アルゴリズムとしてRSA暗号が選ばれた場合の流れを、多少簡略化して 説明します。

The rest of the explanation assumes that the RSA algorithm was selected. Note that some simplifications are applied.

次の段階では、サーバがサーバ公開鍵をクライアントに送信します。

クライアントプログラムは、受信したサーバ公開鍵が、クライアントに登録済み かどうか検索します。ここで見つかれば、今回通信している相手は正当なサーバ であると仮定して先に進みます。見つからなかった場合には、サーバ公開鍵の データを短縮したデータである fingerprint (指紋)データを画面に表示して ユーザに確認を求めます。ユーザは信頼できる経路で入手した正規のfingerprint と比較した上で、確認に応じることが期待されています。現実には確認すること なく受け入れることが多いですが (Fig. 8)。

In the next step, the server will send the server public key to the client.

The client program will search for the received public key in the set of public keys that are registered to the client. If it is found, that means that the server on the other side can be assumed to be the owner of the public key. If the key is not found, a ‘fingerprint’ of the key, which is a shortened form of the key data, is displayed on the screen, and the user will be asked for confirmaiton. The user is expected to compare the fingerprint to the fingerprint data that is officialy distributed by some form of trusted means. In reality, the user typically accepts without confirming (Fig. 8).

../../_images/server-sends-pubkey.png

Fig. 8 Server sends public key

4.2.3.3. step 3. クライアントが通信準備用の共通鍵を作成する/Client generates symmetric key for preparation

クライアントにおいて乱数によって、ssh通信準備の残りの通信のための共通鍵を一つ作成します。 この共通鍵は、サーバから受信したサーバの公開鍵を用いて暗号化し、サーバに送信します。

それを受信したサーバが、サーバ公開鍵を所有する正規のサーバであり、偽のサーバ でなければ、サーバ秘密鍵も合わせて所有しています。その場合に限り、サーバは サーバの秘密鍵を用いて復号し、ssh通信準備用の共通鍵を手にいれます(Fig. 9)。

The client will then randomly generate a symmetric key for the remainder of the setup communication of ssh. This symmetric key will be encrypted with the server public key, and sent to the server.

If the server, which receives that encrypted symmetric key, does happen to be the actual owner of the server public key, and not a fake server, then it will also own the server private key. Only in that case, the server will be able to decrypt and obtain the symmetric key (Fig. 9).

../../_images/client-sends-prep-key.png

Fig. 9 Client sends preparation key

4.2.3.4. step 4. クライアントの公開鍵を送信する/Client sends client public key

次に、クライアントは、クライアント公開鍵を、サーバに送信します。 その際に、ssh通信準備用の共通鍵で暗号化します。クライアント公開鍵は、 人に見られても暗号が破られることにはつながりませんが、ここで暗号化しておくことに より、誰がサーバに接続しようとしているのかを秘匿することができます。

The client will next send the client public key to the server. The client public key will be encrypted with the symmetric key for preparation. Exposing the client public key will not compromise encryption, but hiding the public key in this way will conceal who is connecting to the server.

受信したサーバではクライアント公開鍵の内容が、サーバに登録済みのものであるかを 確認します。未登録のものである場合、この時点でエラーとなり、通信は打ち切られます(Fig. 10)。

The server, will then search for the client public key on the server to check that it is registered to the server. If the key is not found, the client is unknown to the server, and the communication will be terminated as an error (Fig. 10).

../../_images/client-sends-pubkey.png

Fig. 10 Client sends public key

4.2.3.5. step 5. サーバがssh通信本体で使う共通鍵を作成する/Server generates symmetric key for main communication

サーバは、sshセッションの残りの期間で使う共通鍵を、目的別にいくつか乱数で作成します。 例えばクライアントからサーバへ向けてのデータと、サーバからクライアントへ向けて のデータでは別の共通鍵を使います。 そしてそれらをクライアント公開鍵で暗号化し、さらにssh通信準備用の共通鍵で 暗号化した上で、クライアントに送ります。クライアント公開鍵で暗号化して送る ことにより、秘密鍵を持っていない偽のクライアントと通信してしまうことを防ぎます。 さらに準備用の共通鍵で暗号化するのは、暗号強度の強化のためです。

The server will then randomly generate a number of symmetric keys that will be used for the rest of the ssh session, for different purposes. A different key will be used for communication from the client to server versus communication from the server to client. These keys will be encrypted with the client public key and then encrypted with the symmetric key for preparation. Encryption by the client public key will ensure that only the actual owner of the client public key can decrypt these keys. The extra encryption by the preparation symmetric key, is for increased security.

それを受信したクライアントでは、セッション準備用の共通鍵と、クライアント秘密鍵 を用いて、サーバが作成した一連のセッション共通鍵を復号して手に入れます(Fig.11)。

The client, upon receiving that, will first use the symmetric key for preparation followed by the client private key, to decrypt the session symmetric keys (Fig. 11).

../../_images/server-sends-sess-keys.png

Fig. 11 Server sends session keys

4.2.3.6. step 6. 共通鍵を用いてssh通信を行う/Communicate using the symmetric keys

以上の準備を終えたら、残りの通信はセッション対称鍵暗号のみを用いて行います (Fig. 12)。

After the above preparation, the rest of the communication will be done using the session symmetric keys (Fig. 12).

../../_images/session-communication.png

Fig.12 Communication within the session