リモートコンピューティングに関して言えば、SSHは、最も人気があり安全なプロトコルの1つです。SSHは、リモートデバイスとの安全な接続を確立する暗号化ネットワークプロトコルです。リモートデバイスに接続すると、ユーザーはリモートシェル上でコマンドを実行できます。SSHは、ネットワーク管理者やシステム管理者の間で最も一般的です。
このチートシート形式のガイドでは、SSHの概要、SSHを使用した一般的な接続方法、およびさまざまなSSH設定について説明します。
SSHの概要
SSHはSecure Shell(セキュアシェル)の略です。Secure Socket Shellと呼ばれることもあります。SSHは、リモートサーバーにアクセスするための最も一般的な方法です。SSHを使用してリモートシステムに接続する場合、既存のアカウントに接続します。接続すると、シェルセッションにアクセスできるようになります。実行されるすべてのコマンドはリモートマシン上で実行され、出力はローカルターミナルに表示されます。
SSH接続はクライアントサーバーモデルに従います。リモートSSH接続を受け入れるには、リモートシステムでSSHデーモンが実行されている必要があります。SSHデーモンは特定のポートを監視し、接続要求を認証し、条件が満たされたときに適切な環境を生成します。
このガイドでは、2台のUbuntuサーバーを構成しました。プライマリサーバーはセカンダリサーバーに接続するように構成されます。セカンダリサーバーはプライマリサーバーからのSSH接続を受け入れるように構成されます。これらのサーバーのIPアドレスは、ガイド全体で使用されます:
-
Primary: 31.171.250.121
-
Secondary: 31.171.250.130
まず、以下の詳細なガイドをご覧ください。UbuntuでSSHを使用してリモートサーバーに接続する方法およびSSH鍵ベースの認証を使用するようにLinuxサーバーを構成する方法。それでは、始めましょう!
SSH認証
SSH認証には主に2つのタイプがあります。従来の方法はパスワードを使用する方法です。これは安全性が低く、強く推奨されません。2番目の方法はSSH鍵です。SSH鍵は非常に強力なセキュリティを提供し、強く推奨されます。
パスワード認証は理解しやすく構成も簡単ですが、悪用されやすいという欠点があります。例えば、自動化されたボットがブルートフォース(総当たり攻撃)を使用してシステムに侵入する可能性があります。SSH鍵は暗号鍵です。各鍵には2つの部分 – 秘密鍵と公開鍵があります。公開鍵はどこにでも自由に共有できます。ただし、秘密鍵は厳重に保護する必要があります。
SSH鍵を認証方法として使用するには、リモートシステムに公開鍵のコピーがインストールされている必要があります。秘密鍵と公開鍵のコピーもローカルシステムにインストールされている必要があります。デフォルトでは、公開鍵は次のファイルにリストされます。一意のユーザーごとに、このファイルの一意のコピーが存在します:
|
1 |
~/.ssh/authorized_keys |
認証プロセスの仕組みは次のとおりです:
-
クライアントシステムはリモートシステムに接続要求を送信します。また、使用するSSH鍵も送信します。
-
リモートシステムは、公開鍵がauthorized_keysにリストされているかどうかを確認します。
-
鍵が存在する場合、ランダムな文字列が生成され、公開鍵を使用して暗号化されます。暗号化されたメッセージは、秘密鍵を使用してのみ復号できます。
-
文字列を受信すると、クライアントはその文字列を復号します。
-
文字列と事前にネゴシエートされたセッションIDを組み合わせて、MD5ハッシュが生成されます。クライアントはMD5ハッシュをリモートシステムに送信します。
-
リモートシステムはランダムな文字列とセッションIDを認識しています。MD5ハッシュが一致すれば、接続が許可されます。
SSH鍵
このガイドでは、SSH鍵が認証の主な焦点となります。そのため、このセクションではSSH鍵の操作方法に焦点を当てます。
-
SSH鍵ペアの生成
デフォルトでは、LinuxシステムにSSH鍵はインストールされていません。ただし、システムには以前に生成/インストールされたSSH鍵が含まれている場合があります。以前のSSH鍵がないと仮定すると、新しいSSHの公開鍵と秘密鍵のペアを生成する必要があります。SSHは、SSH鍵を生成するための多くの暗号アルゴリズム(RSA、DSA、ECDSA、EdDSAなど)をサポートしています。RSAがデフォルトであり、推奨されるアルゴリズムです。
-
通常のRSA鍵ペアの生成
SSH鍵ペアを生成するには、次のコマンドを実行します:
|
1 |
ssh-keygen |
プロンプトは鍵ペアをどこに保存するかを尋ねます。前述のように、これはRSA鍵ペアになります。値が入力されない場合、SSHはデフォルトの場所に保存します。 /home/demo/.ssh/id_rsa.
次のステップはパスフレーズの入力です。パスフレーズを使用することをお勧めします。パスフレーズの長さは任意です。これによりセキュリティ層が追加されます。ただし、SSHではパスフレーズなしで鍵を生成することもできます。パスフレーズなしの鍵が必要な場合は、Enterキーを押してください。
最終的な出力には、以下の鍵情報が表示されます:
-
秘密鍵の場所( /root/.ssh/id_rsa)。これは決して共有してはいけません。
-
公開鍵の場所( /root/.ssh/id_rsa.pub)。誰と共有しても安全です。
-
鍵のフィンガープリント。
-
鍵のランダム画像(ランダムアート)。これは、鍵が侵害された場合に、画像の変化に気づくことでそれを察知できるかもしれないという考えに基づいています。
-
異なるビット数でのRSA鍵ペアの生成
デフォルトでは、SSH鍵は2048ビットです。セキュリティ上、これで十分であると考えられています。ただし、手動で異なるビット数を指定することもできます。ビット値が高いほど、鍵の強度は高くなります。
4096ビットのSSH鍵ペアを生成するには、次のコマンドを実行します。ほとんどのサーバーは4096ビットのSSH鍵をサポートしています。鍵が大きすぎる場合、DDoS保護の目的で受け入れられないことがあります:
|
1 |
ssh-keygen -b 4096 |
すでに鍵ペアを生成しているため、SSHは前の鍵ペアを上書きするかどうかを尋ねます。残りのプロセスは、通常の鍵ペアの生成と同じです。
-
秘密鍵のパスフレーズの変更
秘密鍵 of パスフレーズを変更できます。このプロセスには、現在のパスフレーズを知っている必要があります。パスフレーズを変更するには、次のコマンドを実行します:
|
1 |
ssh-keygen -p |

コマンドを実行すると、秘密鍵の場所を入力するよう求められます。鍵がデフォルトの場所に保存されている場合は、Enterキーを押します。現在のパスフレーズを入力します。承認されると、新しいパスフレーズを指定できます。
-
SSH鍵のフィンガープリントの表示
すべてのSSH鍵ペアは、暗号化フィンガープリントを共有しています。このフィンガープリントは、一意の鍵を識別するために使用できます。これは多くの状況で役立ちます。SSH鍵のフィンガープリントを確認するには、次のコマンドを実行します:
|
1 |
ssh-keygen -l |

鍵の場所を入力します。鍵がデフォルトの場所に保存されている場合は、Enterキーを押します。
公開鍵のコピー
SSH鍵ペアは、リモート接続を保護する準備が整いました。リモートシステムが認証のためにSSH鍵を受け入れるには、公開鍵のコピーが必要です。リモートサーバーに公開鍵のコピーを作成する方法は複数あります。
-
ssh-copy-idの使用
The ssh-copy-id はOpenSSHパッケージの一部として提供されています。これはSSH公開鍵をコピーするデフォルトの方法です。シンプルで使いやすいです。公開鍵のコピーを転送するには、次のコマンドを実行します:
|
1 |
ssh-copy-id <username>@<secondary_server_ip> |

プロセスを完了するには、リモートユーザーアカウントのパスワードが必要です。成功すると、成功メッセージが表示されます。
-
SSH接続の使用
もし ssh-copy-id ユーティリティが利用できないものの、プライマリサーバーがSSHを使用してセカンダリサーバーに接続できる場合は、別の方法を使用して鍵をコピーできます。それは、SSHコマンドを介して公開鍵の内容をリモート側にパイプすることです。リモートシステムにディレクトリ ~/.ssh が存在しない場合、機能しない可能性があることに注意してください:
|
1 |
cat ~/.ssh/id_rsa.pub | ssh <username>@<secondary_server_ip> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" |
-
手動でのコピー
リモート接続が利用できない場合、残された唯一のプロセスは、リモートサーバーに公開鍵を手動で追加することです。まず、公開鍵の内容を取得します:
|
1 |
cat ~/.ssh/id_rsa.pub |
リモートサーバーで、鍵を適切な場所に配置します:
|
1 2 3 |
mkdir -pv ~/.ssh echo <public_key> >> ~/.ssh/authorized_keys |
SSHの使用
公開キーが設定されたので、SSHを使用してリモート接続する準備が整いました。
-
リモートシステムへの接続
最初のステップは、SSHを使用してリモートシステムに接続する方法を学ぶことです。これには、ローカルシステムとリモートシステムの両方がSSHトラフィックを許可している必要があります。リモートシステムに接続するには、以下を入力します。
|
1 |
ssh <secondary_server_ip> |

リモートサーバー上の特定のユーザーに接続するには、代わりに次の構造を使用します。
|
1 |
ssh <username>@<secondary_server_ip> |

サーバーに初めて接続する場合、SSHは警告を表示することがあります。「yes」と入力して接続を続行します。リモートアカウントがパスワードで保護されている場合は、パスワードを入力する必要があります。SSHキーがパスフレーズで保護されている場合は、パスフレーズも入力する必要があります。
-
異なるポートへの接続
デフォルトでは、SSHはポート22で動作します。SSHクライアントは、リモートシステムに接続する際にデフォルトのポート値を使用します。ただし、リモートシステムがSSHトラフィックに対して異なるポートをリッスンしている場合、接続は機能しません。このような状況では、ポート番号を手動で指定する必要があります。特定のポートを指定するには、次の -pフラグを使用します:
|
1 |
ssh -p <port> <username>@<secondary_server_ip> |
常に手動でポートを指定するのは非効率的です。デフォルトのポート値を永続的に変更することができます。そのためには、SSH設定ファイルを開きます。ファイルが存在しない場合、次のコマンドによって作成されます。
|
1 |
nano ~/.ssh/config |
次に、以下の行を追加します。
|
1 2 3 4 5 |
Host <remote_alias> HostName <remote_hostname> Port <port_value> |
-
リモートサーバーでのコマンドの実行
接続が確立されたので、ローカルターミナルで実行するすべてのコマンドはリモートサーバーに送られます。生成された出力はローカルターミナルに送信されます。
実行するコマンドが1つだけの場合は、完全なSSHログインを行わずに実行できます。SSH接続指示の後にコマンドを指定するだけです。
|
1 |
ssh <username>@<secondary_server_ip> <command_to_run> |
-
SSHエージェントへのキーの追加
SSHキーにパスフレーズがある場合、リモートシステムに接続するたびにパスフレーズを入力する必要があります。これを繰り返すのは非効率的です。SSHエージェントに処理を任せることができます。これは、パスフレーズを入力した後に秘密キーを保存する小さなユーティリティです。秘密キーはターミナルセッション中に利用可能になります。SSHエージェントを起動するには、次のコマンドを実行します。
|
1 |
eval $(ssh-agent) |

プログラムはバックグラウンドで実行されています。あとは、秘密キーをエージェントに追加するだけです。次のコマンドを実行します。
|
1 |
ssh-add |

パスフレーズを入力して操作を完了します。
-
SSH認証情報の転送
パスワードなしで、あるサーバーから別のサーバーへ接続するようにSSHを設定することもできます。これは、特に多数のリモートサーバーを扱う場合に非常に効率です。これを実現するには、SSH認証情報を転送する必要があります。SSH認証情報の転送には、ローカルマシン/サーバーからの接続を受け入れるようにリモートサーバーが設定されている必要があります。あとは、次の -Aフラグを使用して最初のサーバーに接続するだけです。これにより、現在のセッションのサーバーに認証情報が転送されます:
|
1 |
ssh -A <username>@<secondary_server_ip> |
リモートサーバーの設定
このセクションでは、サーバーの応答性と接続のセキュリティを向上させるのに役立つ、一般的なサーバー側の設定をいくつか紹介します。
-
パスワード認証の無効化
SSHキーが設定され、SSH接続が期待通りに動作している場合は、パスワード認証を無効にしても安全です。以下の設定により、ユーザーがSSH経由で接続する際にパスワードを求められなくなります。リモートサーバーで、次のファイルを sshd_configファイルを、 root/sudo権限で開きます:
|
1 |
sudo nano /etc/ssh/sshd_config |
次に、以下のエントリを検索します。 PasswordAuthentication。行がコメントアウトされている場合は、コメントを解除します。値をnoに変更します:
|
1 |
PasswordAuthentication no |

ファイルを保存してエディタを閉じます。変更を有効にするには、SSHサービスを再起動します:
|
1 |
sudo service ssh restart |
システムがCentOS/Fedoraの場合は、代わりに次のコマンドを使用します:
|
1 |
sudo service sshd restart |
-
SSHポートの変更
前述のように、SSHはSSHトラフィックの送受信にポート22を使用します。しかし、一部のシステム管理者によると、SSHには別のポートを割り当てる方が良いとされています。これにより、自動化されたボットがポートに殺到するのを防ぐことができます。SSHがリッスンするポートを変更するには、次のファイルを開きます。 sshd_configファイル:
|
1 |
sudo nano /etc/ssh/sshd_config |
Portというエントリを検索します。コメントアウトされている場合は、コメントを解除します。次に、値を別の値に変更します。ポート値は符号なし16ビット整数(0〜65535)です:
|
1 |
Port 1024 |

ファイルを保存してエディタを閉じます。変更を適用するには、SSHデーモンを再起動します:
|
1 |
sudo service ssh restart |
CentOS/Fedoraでは、代わりに次のコマンドを実行します:
|
1 |
sudo service sshd restart |
-
ユーザー制限
どのユーザーアカウントがSSHを使用して接続できるかを設定できます。これには、次のファイルの調整も含まれます。 sshd_configファイル。sudo/root権限でファイルを開きます:
|
1 |
sudo nano /etc/ssh/sshd_config |
AllowUsersというエントリを検索します。許可するユーザーを追加します:
|
1 |
AllowUsers <user_1> <user_2> |

ファイルを保存してエディタを閉じます。変更を有効にするには、SSHデーモンを再起動します:
|
1 |
sudo service ssh restart |
CentOS/Fedoraでは、代わりに次のコマンドを実行します:
|
1 |
sudo service sshd restart |
-
グループ制限
ユーザー制限と同様に、どのユーザーグループがSSHを使用してシステムに接続できるかを決定することもできます。次のファイルを開きます。 sshd_configファイル:
|
1 |
sudo nano /etc/ssh/sshd_config |
AllowGroupsエントリを使用して、SSHを使用できる特定のユーザーグループを追加します:
|
1 |
AllowGroups <user_group> |

ファイルを保存してエディタを閉じます。変更を有効にするには、SSHデーモンを再起動します:
|
1 |
sudo service ssh restart |
CentOS/Fedoraの場合は、代わりに次のコマンドを実行します:
|
1 |
sudo service sshd restart |
ユーザーグループにユーザーが追加または削除された場合は、SSHデーモンを再起動する必要があることに注意してください。そうしないと、グループの変更が有効になりません。
-
rootログインの無効化
sudo権限を持つユーザーにアクセスできる場合は、SSH経由でのrootログインを無効にすることをお勧めします。次のファイルを開きます。 sshd_configファイル:
|
1 |
sudo nano /etc/ssh/sshd_config |
次のエントリの値を変更します。 PermitRootLoginをnoに変更します:
|
1 |
PermitRootLogin no |

ファイルを保存してエディタを閉じます。変更を有効にするには、SSHデーモンを再起動します:
|
1 |
sudo service ssh restart |
CentOS/Fedoraでは、代わりに次のコマンドを実行します:
|
1 |
sudo service sshd restart |
-
Xアプリケーション画面の転送
SSHデーモンは、サーバーからクライアントにXアプリケーションの画面を転送することもできます。ただし、これを機能させるには、リモートシステムにX Window Systemが設定されている必要があります。また、この機能はSSH設定から有効にする必要があります。SSH設定ファイルを開きます:
|
1 |
sudo nano /etc/ssh/sshd_config |
次のディレクティブの値を変更します。 X11Forwardingをyesに変更します:
|
1 |
X11Forwarding yes |

ファイルを保存してエディタを閉じます。変更を有効にするためにSSHデーモンを再起動します:
|
1 |
sudo service ssh restart |
CentOS/Fedoraでは、代わりに次のコマンドを実行します:
|
1 |
sudo service sshd restart |
クライアント設定
このセクションでは、SSHクライアントの一般的な設定をいくつか確認します。
-
サーバー固有の接続情報
ローカルシステムでは、リモート接続の詳細を定義できます。すべての情報は、次の場所にある設定ファイルに保存されます: ~/.ssh/config:
|
1 |
nano ~/.ssh/config |
各リモートシステムブロックは、キーワード「Host」とそれに続くエイリアスによって表されます。システム固有のディレクティブはすべてここに記述します。リモートシステムに接続する際、SSHはこれらを自動的に適用します。設定の詳細な説明については、manページを参照してください:
|
1 |
man ssh_config |

リモート接続のエントリは、次の構造になります:
|
1 2 3 |
Host <remote_hostname> <directive> <value> |
-
接続タイムアウト
何らかのアクションを実行する前に、SSHセッションから切断されてしまうことがあります。クライアントがリモートサーバーにパケットを送信していない場合、一定時間経過後に接続がタイムアウトします。このような状況を避けるために、ローカルクライアントが定期的にパケットを送信して接続を維持するように設定できます。
ローカルの設定ファイルを開きます:
|
1 |
nano ~/.ssh/config |
リモート接続エントリの下に、次のディレクティブを追加します: ServerAliveIntervalに続けて、秒単位のパケット間隔を指定します:
|
1 |
ServerAliveInterval 120 |

ファイルを保存してエディタを閉じます。
-
ホストチェックの無効化
デフォルトでは、新しいサーバーに接続しようとするたびに、SSHクライアントはリモートSSHデーモンのフィンガープリントを報告します。これはホストの信頼性を検証するのに便利な機能です。悪意のある攻撃者がリモートホストを偽装しようとしている場合、それは新しいサーバーとして表示されます。
この機能を無効にすることは、大きなセキュリティリスクになる可能性があります。一般的には、このオプションを有効にしておくことが推奨されます。ただし、特定の状況においては、ホストチェックを無効にすることが便利な場合もあります。設定ファイルを開きます:
|
1 |
nano ~/.ssh/config |
リモートホストセクションの下に、次のディレクティブを追加します:

|
1 2 3 |
StrictHostKeyChecking no UserKnownHostsFile /dev/null |
最初のディレクティブは、known_hostsファイルに保存されている既知のホストのリストに新しいホストを自動的に追加することを無効にします。2番目のディレクティブは、変更に関する警告を表示しないようにするためのものです。ファイルを保存してエディタを閉じます。
-
単一のTCP接続を介したSSHのマルチプレクシング
TCP接続の確立には、かなりの時間がかかる場合があります。同じマシンに対して複数の接続を行う必要がある場合、マルチプレクシング(多重化)は非常に便利な機能です。SSHマルチプレクシングを使用すると、複数のSSHセッションで同じTCP接続を共有できます。これにより、新しいセッションを確立するために必要なワークロードが軽減されます。接続数を制限することも効果的です。
マルチプレクシング接続を手動で設定することも、利用可能な場合は常にSSHにそれを使用させることもできます。ここでは、後者の方法をとるようにSSHを設定します。SSH設定ファイルを開きます:
|
1 |
nano ~/.ssh/config |
ファイルの先頭にワイルドカードのホスト定義を追加します。これにより、次の一連のディレクティブがすべてのリモート接続に適用されるようになります。次のディレクティブを追加します:
|
1 2 3 4 5 |
ControlMaster auto ControlPath ~/.ssh/multiplex/%r@%h:%p ControlPersist 1 |

最初のディレクティブは、利用可能な場合は常に自動的にマルチプレクシングを使用するようSSHに指示します。2番目のディレクティブは、制御ソケットへのパスを設定します。このソケットは、最初のセッションが確立されたときに作成されます。それ以降のセッションはこのソケットに従います。
最後のディレクティブは、SSHに対して最初のマスター接続をバックグラウンドにすることを指示します。また、最後のSSHセッションの1秒後にTCP接続が自動的に終了することも意味します。次に、設定ファイルで宣言したディレクトリを作成します。
|
1 |
mkdir -pv ~/.ssh/multiplex |
最後に、マルチプレクシングが有効になっているはずです。
SSHエスケープコード
接続を確立した後、エスケープコードを使用して接続の動作を制御する方法があります。
-
強制切断
SSHセッションでフリーズしていませんか?SSHセッションは通常、サーバーによって管理されます。サーバーに問題が発生している場合、応答のないSSHセッションでフリーズしてしまうのはストレスが溜まるものです。幸いなことに、OpenSSHはクライアント側から接続状態を管理するための便利なコントロールを提供しています。
Enterキーを数回押します。次に、以下のコマンドを入力します。
|
1 |
~. |
![]()
ここで、 ~ はコントロール文字です。クライアントからこのコマンドを実行すると、接続はすぐに閉じるはずです。
-
SSHバックグラウンドセッション
SSHセッションをバックグラウンドに移行することもできます。バックグラウンドに移行すると、通常のシェルセッションに戻ります。作業が終了したら、再びSSHシェルに戻ることができます。SSHセッションがバックグラウンドにある間にタイムアウトするのを防ぐために、適切なタイムアウト設定が必要であることに注意してください。SSHセッションをバックグラウンドに移行するには、コントロール文字に続けて以下を入力します。 Ctrl + Z:
|
1 |
~<Ctrl + Z> |

それが直近のバックグラウンドタスクであった場合は、次のコマンドを使用して再アクティブ化できます。
|
1 |
fg |
複数のバックグラウンドタスクがある場合は、ジョブリストから確認できます。
|
1 |
jobs |

対象のジョブをフォアグラウンドに戻すには、最初の列からジョブの値を確認します。次に、以下のコマンドを実行します。
|
1 |
fg %<job_value> |
-
ポートフォワーディング設定の変更
コントロールメカニズムを使用すると、ポートフォワーディングルールを動的に変更できます。接続が確立されると、ポートフォワーディングルールを作成または削除できます。これはSSHコマンドラインインターフェースの一部です。
SSHコマンドラインインターフェースにアクセスするには、次のコマンドを実行します。
|
1 |
~C |
![]()
利用可能なオプションを一覧表示するには、次のコマンドを入力します。
|
1 |
-h |
出力が少なすぎる場合は、次のコントロールコマンドを使用して詳細レベルを上げてみてください。
|
1 |
~v |
ここで、もう一度 -h コマンドを実行します。
|
1 |
-h |

出力で説明されているように、シンプルなコマンドでポートフォワーディングを簡単に実装できます。たとえば、トンネルは、コマンドリストの K で示されるkillコマンドを使用して破棄することもできます。
最後に
SSHは非常によく使われるプロトコルです。そのため、SSHを学ぶことは非常に有益です。この包括的なSSHの概要では、ユーザーが日常的にSSHを使用するために知っておくべき最も重要なSSH設定をカバーしています。一度マスターすれば、ほぼすべてのSSHサーバー設定に対応できるようになるはずです。
快適なコンピューティングを!
コメント
コメントはまだありません。最初のコメントを投稿しましょう。