このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

SSH実践演習③(SSH公開鍵認証に使用するコマンド)

SSH実践演習では、以下の4部に分けて解説しています。

 SSHを使ったリモートアクセスを実践するために、仮想マシンを2台準備して、SSHクライアントに仮想マシンの「Ubuntu1」を、SSHサーバには仮想マシンの「Ubuntu2」を使用する構成にしています。

 SSH(Secure Shell)による公開鍵認証は、リモートサーバへの安全な接続を確立するために使用される強力な認証方法です。この演習では、SSH公開鍵認証に使用される主要なコマンドについて学びます。公開鍵認証は、クライアントとサーバ間で安全な通信を行うために、事前に鍵ペアを生成し、適切に設定する必要があります。ここでは、SSH公開鍵認証に必要なコマンドの使い方を理解し、実際に設定を行う方法について解説します。

SSH公開鍵認証に使用するコマンドの概要

 SSH公開鍵認証を設定するためには、いくつかの重要なコマンドを使用します。ここでは、SSH公開鍵認証で頻繁に使用されるコマンドについて解説していきます。

ssh-keygenコマンド

 SSHクライアント側で公開鍵と秘密鍵のペアを生成するために使用されるコマンドがssh-keygenです。生成された公開鍵をssh-copy-idコマンドでサーバに送信して、秘密鍵はクライアントの手元に保持するようします。

【構文】
ssh-keygen [オプション]

主なオプションと説明
オプション説明
-t 暗号アルゴリズム鍵の暗号アルゴリズムを指定します。例: rsa, dsa, ecdsa, ed25519
主なオプションと説明

SSHクライアント側で鍵ペアを作成する

SSH公開鍵認証を設定するには、まず鍵ペアを作成する必要があります。以下の手順に従って鍵ペアを生成します。

1.ssh-keygenコマンドを使用して鍵ペアを生成する

SSHクライアントであるUbuntu1で次のコマンドを実行します。

・「ssh-keygen」コマンドを実行します。

 オプションを指定しない場合、RSAで鍵ペアが生成されます。このとき、作成する鍵のパスを尋ねられるので、何も指定しないで「Enter」キーを押し、次にパスフレーズの入力が求められます。セキュリティのために、適切なパスフレーズを設定してください。ここでは例として「pa55word」を指定します。

user01@Ubuntu1:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user01/.ssh/id_rsa): # 作成する鍵のパスを指定します。
Enter passphrase (empty for no passphrase): # パスフレーズを入力
Enter same passphrase again: # 再度パスフレーズを入力
Your identification has been saved in /home/user01/.ssh/id_rsa
Your public key has been saved in /home/user01/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:brNFuOE4fyuad8jxcnZ6NSB7tPQEQspZqXnx+X6uN5M user01@Ubuntu1
The key's randomart image is:
+---[RSA 3072]----+
|         .o.     |
|       . ++ .    |
|        +o + o   |
|        o.o * .  |
|        S..= *   |
|       +.+. o =  |
|      o.*+.. o ..|
|       =*+* o .Eo|
|      oooBo=  .=+|
+----[SHA256]-----+

鍵はランダムに生成されます。

2.生成された鍵ペアの確認

 鍵ペアが生成されると、デフォルトでは~/.sshディレクトリに保存されます。次のコマンドでディレクトリ内を確認します。

・「ls -l .ssh」コマンドを実行します。

user01@Ubuntu1:~$ ls -l .ssh
合計 16
-rw------- 1 user01 user01 2655  9月  1 12:44 id_rsa
-rw-r--r-- 1 user01 user01  568  9月  1 12:44 id_rsa.pub
-rw------- 1 user01 user01  978  9月  1 03:32 known_hosts
-rw-r--r-- 1 user01 user01  142  9月  1 03:32 known_hosts.old

 id_rsaは生成された秘密鍵、id_rsa.pubは生成された公開鍵です。この公開鍵をサーバーに送信し、~/.ssh/authorized_keysファイルに格納する必要があります。

ssh-copy-idコマンド

生成された公開鍵をSSHサーバに送信するために使用するコマンドがssh-copy-idです。

【構文】
ssh-copy-id [ログインユーザー名@]接続ホスト

クライアントの公開鍵をサーバに送信する

次に、生成した公開鍵をSSHサーバであるUbuntu2に送信します。以下のコマンドを実行します。

・「ssh-copy-id 192.168.1.190」コマンドを実行します。

途中、パスワードの入力が求められます。user01のパスワードを入力します。

これにより、Ubuntu1で生成した公開鍵がUbuntu2の~/.ssh/authorized_keysに追加されます。

ser01@Ubuntu1:~$ ssh-copy-id 192.168.1.190
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user01@192.168.1.190's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.1.190'"
and check to make sure that only the key(s) you wanted were added.

SSHサーバに接続する

 公開鍵がサーバに登録されたら、次にSSHコマンドを使用してサーバに接続します。このとき、パスワードではなく、先ほど設定したパスフレーズを入力する必要があります。パスフレーズを入力したら、「ロック解除」ボタンをクリックします。

・「ssh 192.168.1.190」コマンドを実行します。

user01@Ubuntu1:~$ ssh 192.168.1.190
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 6.8.0-40-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/pro

Expanded Security Maintenance for Applications is not enabled.
(省略)
Last login: Sun Sep  1 03:32:33 2024 from 192.168.1.189
user01@Ubuntu2:~$

プロンプトが「user01@Ubuntu2:~$」となっています。

この操作により、公開鍵認証を使用してサーバにアクセスできていることが確認できます。

SSHサーバ側にある~/.ssh/authorized_keysファイルの内容を確認する

 サーバ側で、クライアントの公開鍵が適切に~/.ssh/authorized_keysに格納されていることを確認します。次のコマンドを実行します。

・「ls -l .ssh」コマンドを実行します。

user01@Ubuntu2:~$ ls -l .ssh
合計 4
-rw------- 1 user01 user01 568  9月  1 12:49 authorized_keys

 このファイルには、使用された暗号アルゴリズム(例:ssh-rsa)、公開鍵、公開鍵の所有者に関する情報が記載されています。

・「cat .ssh/authorized_keys」コマンドを実行します。

user01@Ubuntu2:~$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDB5BKMwYhwRcpmwYbRGI/8MzBfF6y
7MD58RtA8hBzzR1Grcn0BO3Lr+Po9/jWOFjIk14+Gz1TuFI03UKdrsrv6mRmbSuF9K/
vlwq4prBKMFwoosIkNTyEmhqNn2YP6Ms8L/9BKJZkrXTHvieq5G150KZPVzvhaU329l
7j4A3bXH3frycyLorybOWTL7eixQjPXBlQfrOu5usgJSjcenJxAh3kUFgIG3OKuJrhu
eb7k9X5gxONgU5HyDGfsUY0leBTI7X7MXETp6d10fkHuVPBtHs2gcBF25plZ7M9aiAS
fdORZAef+Ae0wMEYLDRsvFBMR7QVnq/SHG2ykO1HNRVF20Og9WBKDyiHHKCJehPPO0A
dD1hgiwQtnJ1HUGqX9hpK39Ts7zWDmF/PAMeINsgZKIwUE/uRzODDv0Uxie39ATmvqd
5p1AOJDMViP73uzYO4L5nOvZ/8vDUNMo89zZBVY6oD0/xgUFvKAfbrj9xH+EbG+NiBu
rXN31HnL4TKIeYs= user01@Ubuntu1

Ubuntu2からログアウトする

 サーバ側で、クライアントの公開鍵が適切に~/.ssh/authorized_keysに格納されていることが確認できたので、サーバからログアウトします。

次のコマンドを実行します

・「exit」コマンドを実行します。

user01@Ubuntu2:~$ exit
ログアウト
Connection to 192.168.1.190 closed.
user01@Ubuntu1:~$ 

ssh-agentコマンドとssh-addコマンド

 SSH接続時にパスフレーズの入力を省略するためには、クライアント側で秘密鍵をシェルに格納しておく必要があります。そのために使用されるのがssh-agentコマンドとssh-addコマンドです。

  • ssh-agentコマンド: シェルを起動し、そのシェルに秘密鍵を格納します。
  • ssh-addコマンド: 起動したシェルに秘密鍵を追加します。

【構文】
ssh-agent シェル


【構文】
ssh-add

クライアントの秘密鍵をシェルに格納してSSH接続する

次のコマンドで、クライアントの秘密鍵をシェルに格納し、SSH接続を行います。

 以下のコマンドを実行します。このとき、パスワードではなく、先ほど設定したパスフレーズを入力する必要があります。

  • ssh-agent bash」コマンド
  • ssh-add」コマンド
  • ssh 192.168.1.190」コマンド

これで、再度パスフレーズを入力することなく、SSH接続が可能になります。

user01@Ubuntu1:~$ ssh-agent bash
user01@Ubuntu1:~$ ssh-add
Enter passphrase for /home/user01/.ssh/id_rsa: # パスフレーズを入力
Identity added: /home/user01/.ssh/id_rsa (user01@Ubuntu1)
user01@Ubuntu1:~$ ssh 192.168.1.190
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 6.8.0-40-generic x86_64)
(省略)
Last login: Sun Sep  1 12:52:34 2024 from 192.168.1.189
user01@Ubuntu2:~$ 

SSH接続の切断

確認作業が完了したので、サーバからログアウトします。

・「exit」コマンドを実行します。

user01@Ubuntu2:~$ exit
ログアウト
Connection to 192.168.1.190 closed.

まとめ

 SSH公開鍵認証は、リモートサーバへの安全なアクセスを提供するために非常に有効な手段です。鍵ペアを生成し、サーバに公開鍵を登録することで、パスワードに依存しないセキュリティが確保されます。また、ssh-agentssh-addコマンドを利用することで、さらに利便性が向上します。この演習を通じて、SSH公開鍵認証に関するコマンドの基本的な使い方を理解し、実践的なスキルを身につけることができます。