【入門 SSH プロトコル】コマンドでの接続方法やconfigの設定

本記事は以下の書籍を参考にしています。

最もおすすめの書籍

有名な書籍

スポンサーリンク

SSH プロトコルとは

SSH(Secure SHell)プロトコルとは、サーバーにリモート操作するためのプロトコル(ルール)です。操作する内容が暗号化されていることからセキュアという名前がついています。

SSH プロトコル(ルール)は、以下のように OpenSSH というソフトウェアに含まれる「ssh コマンド」と「sshd」で実装されています。

なお、各用語の意味については以下のとおりです。

用語説明
ssh コマンドSSH プロトコルをクライアント側で実装したソフトウェア
サーバーに操作を送信します
sshdSSH プロトコルをサーバー側で実装したソフトウェア
クライアントからの操作を受け付けます

以降では Open SSH の仕組みについて記載します。仕組みは置いといて、とりあえず ssh 接続をしたい方はこちらをどうぞ。

スポンサーリンク

Open SSH の仕組み

OpenSSH は以下のように「暗号化」と「認証」を行います。

それぞれの「公開鍵」や「共通鍵」や「電子署名」の説明については以下の記事をご覧ください

以降では上記の手順について順番に説明を行います。

ssh コマンド

以下の一番最初にある「ssh コマンド」について説明します。

サーバーに接続する ssh コマンドは「ssh <ユーザー名>@ -i <秘密鍵のパス>」です。

具体的な値を入れると以下のとおりです。

ssh hoge-user@192.0.2.1 -i ~/.ssh/id_rsa

サーバーから公開鍵を受け取る

以下のサーバーからクライアントに「公開鍵Bをあげる」にあたります。

  1. サーバーは、公開鍵B(/etc/ssh/ssh_host_ecdsa_key.pub )をクライアントに渡す
  2. クライアントは、受け取った公開鍵Bを ~/.ssh/known_hosts で照合
  3. ~/.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のフィンガープリントを確認可能です。

ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key.pub
256 SHA256:123456789abcdefgh

クライアント側でも、known_hosts に登録されている公開鍵のフィンガープリントを確認可能です。

ssh-keygen -lf ~/.ssh/known_hosts
256 SHA256:123456789abcdefgh 192.0.2.1 (ECDSA)

電子署名による認証

以下のクライアントが「電子署名をあげる」を実施し、「authorized_keys に公開鍵Aがあるかチェックする」部分にあたります。

  1. サーバーは電子署名が公開鍵Aで復号化できることから、クライアントが秘密鍵Aを持つ人とわかる
  2. 電子署名に含まれる公開鍵Aが ~/.ssh/authorized_keys にあるかどうかを確認
  • ~/.ssh/authorized_keys に公開鍵Aがあれば、承認済みの人なので許可
  • ~/.ssh/authorized_keys に公開鍵Aがなければ、承認してない人なので拒否

拒否されると以下のメッセージが表示され、ssh に失敗します。

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

そのため、以下のコマンドで ~/.ssh/authorized_keys にクライアントの公開鍵を登録する必要があります。

cat ~/.ssh/id_rsa.pub | ssh hoge_user@192.0.2.1 'cat >> .ssh/authorized_keys'

電子署名の詳細については以下の記事に記載があります。

スポンサーリンク

ssh コマンドで接続方法

サーバーに公開鍵を登録済みの時

ssh hoge-user@192.0.2.1 -i ~/.ssh/id_rsa

赤線箇所はアクセスするサーバーの情報に置き換えてください。

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-keygen -t rsa
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): <保存場所のパス> Enter passphrase (empty for no passphrase): パスワード Enter same passphrase again: パスワード確認
cat ~/.ssh/id_rsa.pub | ssh hoge_user@192.0.2.1 -i <アクセス可能な秘密鍵のパス> 'cat >> .ssh/authorized_keys'

赤線箇所はアクセスするサーバーの情報に置き換えてください。

(当然ですが、hoge_user@192.0.2.1 にアクセス可能な秘密鍵は必須です。)

ssh span class="marker-under-red">hoge_user@192.0.2.1 -i ~/.ssh/id_rsa
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

ポートフォワーディング

ポートフォワーディングとは、経由元の「IPPort」に来たパケットを、別の経由先「IPPort」に転送することです。

ssh のポートフォワーディングのフォーマットは以下のとおりです。
「ssh -NL <経由元ポート>:<転送先IP>:<転送先ポート> <経由元 IP>」

ssh -NL 8080:localhost:8080 $REMOTE_HOST_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つは同じ意味を持ちます。

ssh ec2-user@192.0.2.1
ssh test

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

参考サイト

SSH2のログインシーケンス クライアント サーバ TCP/22接続 (TTSSH) (OpenSSH) バージョン情報交換 - ppt download
SSH2のログインシーケンス(続き) クライアント サーバ (TTSSH) (OpenSSH) 認証リストの要求 “none”メソッド SSH2_MSG_USERAUTH_REQUEST CheckAuthListFirstが有効なとき (無効なときは、クライアントはユーザ操作による認証失敗により認証リストを得られる)...
SSHの公開鍵認証に関する誤謬と実際 - Chienomi
SSHの公開鍵認証における良くある誤解の話 - Qiita
はじめに 背景 これを知っていたからと言って何かの役に立つかというと、そうでない人の方が多いとは思うのですが、いい加減、SSHの公開鍵認証の説明がデマばかりなので、少しはちゃんとした説明もあった方が良いかもな、ということで記...