- とりあえず最速で ssh 接続をしたい方はこちらをどうぞ
- config が知りたい方はこちらをどうぞ
本記事は以下の書籍を参考にしています。
最もおすすめの書籍
有名な書籍
SSH プロトコルとは
SSH(Secure SHell)プロトコルとは、サーバーにリモート操作するためのプロトコル(ルール)です。操作する内容が暗号化されていることからセキュアという名前がついています。
SSH プロトコル(ルール)は、以下のように OpenSSH というソフトウェアに含まれる「ssh コマンド」と「sshd」で実装されています。

なお、各用語の意味については以下のとおりです。
用語 | 説明 |
---|---|
ssh コマンド | SSH プロトコルをクライアント側で実装したソフトウェア サーバーに操作を送信します |
sshd | SSH プロトコルをサーバー側で実装したソフトウェア クライアントからの操作を受け付けます |
以降では Open SSH の仕組みについて記載します。仕組みは置いといて、とりあえず ssh 接続をしたい方はこちらをどうぞ。
Open SSH の仕組み
OpenSSH は以下のように「暗号化」と「認証」を行います。

それぞれの「公開鍵」や「共通鍵」や「電子署名」の説明については以下の記事をご覧ください
以降では上記の手順について順番に説明を行います。
ssh コマンド
以下の一番最初にある「ssh コマンド」について説明します。

サーバーに接続する ssh コマンドは「ssh <ユーザー名>@ -i <秘密鍵のパス>」です。
具体的な値を入れると以下のとおりです。
サーバーから公開鍵を受け取る
以下のサーバーからクライアントに「公開鍵Bをあげる」にあたります。

- サーバーは、公開鍵B(/etc/ssh/ssh_host_ecdsa_key.pub )をクライアントに渡す
- クライアントは、受け取った公開鍵Bを ~/.ssh/known_hosts で照合
- ~/.ssh/known_hosts に無い場合は、初めてアクセスするサーバーなので確認画面を出す
確認画面は以下のとおりです。
The authenticity of host '192.0.2.1 (192.0.2.1)' can't be established. ECDSA key fingerprint is SHA256:123456789abcdefgh. Are you sure you want to continue connecting (yes/no)?
「ホスト名」と「公開鍵のハッシュ値(フィンガープリントと呼びます)」を表示して、「本当に正しいアクセス先か?」をユーザーに確認します。
「yes」を入力すると、~/.ssh/known_hosts に追記し共通鍵を生成後、認証フェーズに入ります。
共通鍵の詳細については以下の記事をご覧ください。
ssh フィンガープリントの確認
サーバー側で以下のコマンドを実行すると、サーバーから送られてくる公開鍵Bのフィンガープリントを確認可能です。
256 SHA256:123456789abcdefgh
クライアント側でも、known_hosts に登録されている公開鍵のフィンガープリントを確認可能です。
256 SHA256:123456789abcdefgh 192.0.2.1 (ECDSA)
電子署名による認証
以下のクライアントが「電子署名をあげる」を実施し、「authorized_keys に公開鍵Aがあるかチェックする」部分にあたります。

- ~/.ssh/authorized_keys に公開鍵Aがあれば、承認済みの人なので許可
- ~/.ssh/authorized_keys に公開鍵Aがなければ、承認してない人なので拒否
拒否されると以下のメッセージが表示され、ssh に失敗します。
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
そのため、以下のコマンドで ~/.ssh/authorized_keys にクライアントの公開鍵を登録する必要があります。
電子署名の詳細については以下の記事に記載があります。
ssh コマンドで接続方法
サーバーに公開鍵を登録済みの時
赤線箇所はアクセスするサーバーの情報に置き換えてください。
The authenticity of host '192.0.2.1 (192.0.2.1)' can't be established. ECDSA key fingerprint is SHA256:123456789abcdefgh. Are you sure you want to continue connecting (yes/no)?
秘密鍵・公開鍵の生成から行う時
赤線箇所はアクセスするサーバーの情報に置き換えてください。
(当然ですが、hoge_user@192.0.2.1 にアクセス可能な秘密鍵は必須です。)
The authenticity of host '192.0.2.1 (192.0.2.1)' can't be established. ECDSA key fingerprint is SHA256:123456789abcdefgh. Are you sure you want to continue connecting (yes/no)?
ポートフォワーディング
ポートフォワーディングとは、経由元の「IP・Port」に来たパケットを、別の経由先「IP・Port」に転送することです。
ssh のポートフォワーディングのフォーマットは以下のとおりです。
「ssh -NL <経由元ポート>:<転送先IP>:<転送先ポート> <経由元 IP>」
代表的な利用用途は、「ローカルのブラウザからリモートホストの localhost にアクセスする時」や「踏み台サーバーから別のサーバーにアクセスする時」です。
ssh config 書き方
~/.ssh/config を利用して ssh コマンドの設定を記載できます。
ServerAliveInterval
ssh が sshd に定期的に応答確認を行うことで、勝手に ssh が切断されるのを防ぎます。
ServerAliveInterval 60
上記では 60 秒ごとに応答確認を行います。
User
ssh コマンドでデフォルトで利用するユーザーを設定します。
User ec2-user
HostName
ssh コマンドでデフォルトで利用するホスト名(IP アドレス)を指定できます。
HostName 192.0.2.1
Host
ssh コマンドで指定する設定のエイリアス名を設定できます。
Host test HostName 192.0.2.1 User ec2-user
これにより以下の2つは同じ意味を持ちます。
ProxyCommand -W オプション
踏み台サーバーを経由して別のサーバーにアクセス
Host private HostName 192.0.2.250 ProxyCommand ssh 192.0.2.1 -W %h:%p
192.0.2.1 を踏み台に、192.0.2.250 へアクセス。 %h はホスト名、%p はポートを表す。
Include
他の設定ファイルの内容を取り込みます。設定ファイルを分けたい場合に使います。
Include conf.d/*
上記は conf.d/* 配下の設定ファイルを全て取り込みます。
AddKeysToAgent, UseKeychain
Mac OS 専用。秘密鍵の指定やパスフレーズをキャッシュし、入力をスキップできます。
AddKeysToAgent yes UseKeychain yes
参考サイト
