【Linux】SSH接続と切断方法

LinuCの試験対策と例題(学習サイト)についてまとめました。

SSHとは

SSHとは、公開鍵暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコルです。

【ConoHa VPS】SSH接続でリモート操作する方法
ConoHa VPSで立てたサーバーをSSH接続でリモート操作する方法についてまとめました。

LinuxシステムへのSSH接続

起動中のLinuxシステム(リモートホスト=接続サーバー)にリモート接続する場合、SSHを用いるのが一般的です。
SSH接続する場合、セキュリティ対策のため公開鍵と秘密鍵を使って通信を暗号化して接続します。
SSH接続される側はsshdというデーモン(常駐プログラム)を起動しておく必要があります。

SSHユーザ認証の手順

ユーザ認証は、SSHクライアントで接続してくるユーザが正当なユーザかどうかをリモートホスト(接続先サーバー)側が確認するものです。SSHユーザ認証の流れは以下のとおりです。

  • 事前準備
    • ① ユーザーがクライアント側の端末鍵ペア(公開鍵と秘密鍵)を作成
    • ② ①で作成した公開鍵リモートホスト側(接続先サーバー)の「~/.ssh/authorized_keys」に登録
  • SSH接続時
    • ① クライアントは接続先サーバーに「ユーザーの公開鍵」を利用できるか問合せ
    • ② リモートホストから「利用できる」と回答があれば、クライアントは「ユーザーの秘密鍵」で署名を作成
    • ③ クライアントはデータと署名を接続先サーバーに送信
    • ④ リモートホストは、受信した「署名」と「~/.ssh/authorized_keysに登録されている公開鍵」を検証し、問題なければ接続を許可

SSHホスト認証の手順

SSHホスト認証は、接続先のリモートホスト(接続先サーバー)が正しいかどうかを確認します。
前述のSSHクライアント認証後、クライアントがリモートホストにログインする際に実施されます。

  • ①クライアントは、リモートホスト(接続先サーバー)にSSH接続をします。
  • ②リモートホスト(接続先サーバー)は、クライアントにサーバーの公開鍵を送信します。
  • ③クライアントは、自身の「~/.ssh/known_hosts」に登録されている公開鍵と、サーバーから送信された公開鍵を比較し、一致していれば正しいリモートホストと判定し、ログインします。

OpenSSH

OpenSSHはLinuxで通常使われるSSHのソフトウェアです。主なファイルは以下のとおり。

主なファイル SSHクライアント SSHサーバー(sshd)
設定ファイル ~/etc/ssh/ssh_config /etc/ssh/sshd_config
秘密鍵 ~/.ssh/id_rsa /etc/ssh/ssh_host_rsa_key
公開鍵 ~/.ssh/id_rsa.pub /etc/ssh/ssh_host_rsa_key.pub
認証鍵リスト ~/.ssh/known_hosts ~/.ssh/authorized_keys

鍵認証の準備① クライアント側で鍵ペアの生成

ssh-keygenコマンドは、SSH接続に必要な鍵ペアを生成します。

ssh-keygen [-t 鍵の種類]

クライアント側の端末で以下のコマンドを実行してRSAで4096ビットの鍵ペア(秘密鍵、公開鍵)を生成します。

$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):   ← 秘密鍵用のパスワードを入力
Enter same passphrase again:  ← 上記パスワードを再度入力
Your identification has been saved in /user/.ssh/id_rsa.  ← 生成された秘密鍵ファイル(.sshに格納される)
Your public key has been saved in /user/.ssh/id_rsa.pub.  ← 生成された公開鍵ファイル(.sshに格納される)
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXX user@example.local  ←フィンガープリント
The key's randomart image is:
+---[RSA 4096]----+
|X...  .+*o       |
|oO.  o.+.        |
|.o. + o o.       |
|.E...o *.o       |
|.  ..o*.S o      |
|   . oo* *       |
|    o . +        |
|     ..o *.      |
|       o*.+.     |
+----[SHA256]-----+

クライアント側端末のユーザーのホームディレクトリの配下に.sshのディレクトリ(パーミッションは700)が生成されます。
そして、.sshディレクトリ内に公開鍵ファイル(id_rsa.pub)と秘密鍵ファイル(id_rsa)が生成されます。

鍵認証の準備② リモートホスト側で公開鍵ファイルの登録

① クライアント側で作成した公開鍵ファイル(id_rsa.pub)は、USBメモリなどを用いて)リモートホスト側(接続先サーバー)内にコピーします。

② 以下のコマンドを実行し、公開鍵ファイル(id_rsa.pub)はauthorized_keys(鍵チェーン)に登録し、authorized_keysのパーミッションを600に変更します。

$ cd ~/.ssh   ←. sshディレクトリへ移動
$ cat id_rsa.pub >> authorized_keys   ← 公開鍵ファイルをauthorized_keysに登録
$ chmod 600 authorized_keys  ←authorized_keysのパーミッションを600に変更

authorized_keysファイルは、接続を許可する公開鍵を登録しておくファイルです。
登録完了後、サーバー側からは公開鍵ファイル(id_rsa.pub)を削除します。

$ rm -f id_rsa.pub

これで、SSH接続(リモートアクセス)をパスワード認証ではなく、安全な鍵認証で行うことができます。

SSH接続(sshコマンド)

ssh [オプション] [ログイン名@]接続先 [接続先で実行するコマンド]
オプション 説明
-p ポート番号 接続に使用するポート番号を指定
-l ユーザー名 接続に使用するユーザー名を指定
-i IDファイル 接続に使用する公開鍵ファイルを指定
-C 全ての通信を圧縮
-c 暗号化の種類 通信暗号化の種類を指定(3des、blowfish、desから選択)
-1 SSHv1のみ使用
-2 SSHv2のみ使用
-4 IPv4のみ使用
-6 IPv6のみ使用
-K GSSAPI認証を許可する
-k GSSAPI認証を許可しない
-A 認証エージェントを転送(1つ目のサーバに接続したときと同じ秘密鍵で2つ目以降のサーバにも接続)
-a 認証エージェントを転送しない
-X X11のポートフォワーディングを有効化(リモートマシンのXアプリケーションを実行可能にする)
-x X11のポートフォワーディングを無効化
-Y 信頼されたX11転送を有効化
-f コマンドを実行する際にSSHをバックグラウンドにする(Xアプリケーションの実行時に使用)
-F 設定ファイルのパス 設定ファイルを指定
-o 設定パラメータ 設定パラメータを指定(設定ファイルに書かれた内容より優先)
-E ログファイルのパス エラーを指定したログファイルに保存
-q エラーメッセージや診断メッセージを非表示(quiet mode)
-v デバッグメッセージを表示(verbose mode)

SSH接続(端末がWindowsの場合)

「ssh ユーザーID@ホスト名 -i 秘密鍵ファイルのフルパス」でssh接続できる。
なお、秘密鍵ファイルはログインユーザフォルダのDocuments配下に置く必要がある。

C:¥> ssh user@example.local -i D:¥Keys¥id_rsa

The authenticity of host ‘host1.alpha.local (192.168.1.100)’ can’t be established.
RSA key fingerprint is SHA256:XXXXXXXXXXXXXXXX. ←サーバーのホスト鍵のフィンガープリント
Are you sure you want to continue connecting (yes/no)? ←サーバー接続時、1度だけ表示される。yesを入力すると次回から表示されない。

SSH接続(端末がLinuxの場合)

 「ssh -i 秘密鍵ファイルのフルパス ユーザーID@ホスト名」でssh接続できる。
なお、秘密鍵のファイル名だけ記述した場合、ユーザーのホームディレクトリ配下の.sshディレクトリから読み込まれる。

[user01@host1 ~]$ ssh -i id_rsa user1@example.local
user01@host1.local's password:   ←秘密鍵のパスワードを入力

SSH接続が正常にできることが確認できたら、/etc/ssh/sshd_configを修正し、セキュリティ対策を行う。

$ sudo vi /etc/ssh/sshd_config
・・・
# Authentication:

#LoginGraceTime 2m
PermitRootLogin no    ←noにする(rootのログインを無効化)
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
・・・
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no    ←noにする(SSH接続のパスワード認証を無効化)

上記のように修正を行い、「/etc/ssh/sshd_config」を保存したら、以下のコマンドでsshdを再起動させて設定を反映させる。

$ sudo service ssh restart

接続先サーバーの確認(~/.ssh/known_hosts)

~/.ssh/known_hosts」とは、sshの接続先サーバーが正しいことを保証するための仕組みです。
クライアントに対してサーバー側が自身の正当性を証明する鍵(秘密鍵、公開鍵)があります。

クライアントがサーバに最初に接続した際、サーバー側のホスト公開鍵をクライアントの「~/.ssh/known_hosts」ファイルに保存します。
「~/.ssh/known_hosts」ファイルには、特定のIPアドレス (とホスト名) をもつサーバーのホスト公開鍵が登録されます。
(ホスト秘密鍵はサーバー側だけで保管されており、外部には持ち出されません)

次にクライアントがサーバにに接続する際、暗号化された通信を介してknown_hostsファイル内に登録されているホスト公開鍵と、サーバーから送信されるホスト公開鍵を照合します。

SSH接続の切断

SSH接続を切断するには、「logout」もしくは「exit」コマンドの実行、もしくはCtrl+Dキー(logoutのショートカットキー)を実行します。

【実行例】MacからラズベリーパイをSSH接続して遠隔操作

MacからラズベリーパイをSSH接続して遠隔操作する方法を以下記事で別途解説しています。

【Mac】RaspberryPi 4をSSH接続して遠隔操作する方法
RaspberryPi4(ラズベリーパイ4)をMacのSSHから接続して操作する方法について紹介します。
【VSCode】ラズベリーパイをRemote-SSHで接続して遠隔操作
VSCode(Visual Studio Code)からラズベリーパイをRemote-SSHで接続して遠隔操作する方法についてまとめました。

関連ページ

【LinuC】試験対策と例題まとめ
LinuCの試験対策と例題(学習サイト)についてまとめました。
LPICの試験対策と例題まとめ
LPICの試験対策と例題(学習サイト)についてまとめました。

コメント