【Linux】SSH接続と切断方法

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

スポンサーリンク

SSHとは

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

【通信プロトコルとは】インタフェース、TCP/IP、HDLC、CORBA、HTTP、DNS、SOAP、IPv6、シリアル通信
ネットワークにおける「通信プロトコル」とは?プロトコルとインタフェース、TCP/IP、HDLC、CORBA、HTTP、DNS、SOAP、IPv6、シリアル通信についてまとめました。
スポンサーリンク

LinuxシステムへのSSH接続

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

SSHユーザ認証の手順

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

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

SSHホスト認証の手順

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

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

鍵ペアの生成(ssh-keygenコマンド)

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)はauthorized_keys(鍵チェーン)に登録し、authorized_keysのパーミッションを600に変更する。

authorized_keys・・・接続を許可する公開鍵を登録しておくサーバー側のファイル

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

秘密鍵ファイル(id_rsa)は、リモートアクセスする端末側に移動させる(USBメモリなどを用いて)。
移動させた後、サーバー側からは秘密鍵ファイル(id_rsa)を削除する。
これで、端末からサーバーのSSH接続(リモートアクセス)を公開鍵認証方式でできる。
以下のコマンドで端末からサーバーに対して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入門】Linuxの基礎と試験範囲別の解説
LPICに従って、Linuxの基礎と試験範囲別の解説についてまとめました。
Linux
スポンサーリンク
西住工房

コメント