はじめに
この実験では、リモートの Linux サーバーに安全に接続するための SSH 公開鍵認証(Public Key Authentication)の設定方法と使用方法を学びます。この手法は、従来のパスワードベースのログインを暗号化された鍵ペアに置き換えることで、セキュリティと利便性の両方を向上させます。ローカルマシンに秘密にしておく「秘密鍵」と、アクセスを許可するためにサーバー側に配置する「公開鍵」を作成します。
プロセスは主に 3 つのステップで構成されます。まず、ssh-keygen コマンドを使用してデモ用ユーザーの新しい RSA 鍵ペアを生成し、パスフレーズを設定してセキュリティ層を追加します。次に、ssh-copy-id ユーティリティを使用して、公開鍵をリモートサーバーの認証済み鍵ファイル(authorized keys file)に安全にコピーします。最後に、SSH 経由でサーバーにログインして設定をテストします。これにより、パスワードの代わりに鍵ペアを使用して認証が行われるようになります。
デモ用ユーザーの作成と RSA 鍵ペアの生成
このステップでは、まず SSH 公開鍵認証を実演するための専用ユーザーアカウントを作成し、次に RSA 暗号鍵ペアを生成します。この方法をとることで、既存のユーザー設定に影響を与えることなく、デモ用のクリーンな環境を確保できます。
デモ用ユーザーの作成
まず、SSH のデモに使用する sshuser という名前の新しいユーザーを作成しましょう。
sudo adduser sshuser
パスワードの設定とユーザー情報の入力を求められます。この実験では、パスワードとして password123 を使用してください。オプションのフィールド(フルネーム、部屋番号など)は、Enter キーを押してスキップして構いません。
Adding user `sshuser' ...
Adding new group `sshuser' (1001) ...
Adding new user `sshuser' (1001) with group `sshuser' ...
Creating home directory `/home/sshuser' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sshuser
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
RSA 鍵ペアの生成
次に、鍵ペアを生成するために sshuser アカウントに切り替えます。これにより、鍵が正しいユーザーのホームディレクトリに作成されるようになります。
sudo su - sshuser
これで sshuser として操作しています。ssh-keygen コマンドを使用して RSA 鍵ペアを生成します。-t フラグは作成する鍵の種類を指定するもので、ここでは rsa を指定します。
ssh-keygen -t rsa
コマンドを実行すると、鍵の保存場所を尋ねられます。デフォルトの場所は、ユーザーのホームディレクトリ内にある .ssh という名前の隠しディレクトリ内の ~/.ssh/id_rsa です。Enter キーを押して、このデフォルトの場所を確定します。
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sshuser/.ssh/id_rsa):
次に、パスフレーズの入力を求められます。パスフレーズは秘密鍵にさらなるセキュリティ層を追加します。この実験では、パスフレーズとして sshkey-password を使用しましょう。2 回入力する必要があります。
注意:パスフレーズを入力しても、画面には文字が表示されません。これは標準的なセキュリティ機能です。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/sshuser/.ssh/id_rsa
Your public key has been saved in /home/sshuser/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:<FINGERPRINT_STRING> sshuser@ubuntu
The key's randomart image is:
+---[RSA 3072]----+
| .. . .o.. |
| . . . o.. |
| . . = . . |
| . B o . |
| S= * . |
| o*B o . |
| .oO=B . . |
| .o+*+oE. . |
| .o*o=o.o. |
+----[SHA256]-----+
鍵が生成されたので、ファイルが正しく作成されたか確認できます。ls -l コマンドを使用して ~/.ssh ディレクトリの内容を表示します。
ls -l ~/.ssh
新しい鍵ファイルを示す、以下のような出力が表示されるはずです。
total 8
-rw------- 1 sshuser sshuser 2610 Jun 30 10:30 id_rsa
-rw-r--r-- 1 sshuser sshuser 575 Jun 30 10:30 id_rsa.pub
ファイルの権限(パーミッション)に注目してください。秘密鍵 id_rsa は所有者のみが読み書きできるようになっていますが、公開鍵 id_rsa.pub は他のユーザーも読み取ることができます。秘密鍵を保護し、決して共有しないようにすることが極めて重要です。
ssh-copy-id を使用したサーバーへの公開鍵のコピー
このステップでは、前のステップで生成した公開鍵を SSH サーバーにコピーします。この操作によって鍵が承認され、パスワードの代わりに対応する秘密鍵を使用してログインできるようになります。ssh-copy-id ユーティリティは、サーバー上の正しい場所に鍵をインストールするプロセスを簡素化するスクリプトです。
この実験では、単一のマシン上でクライアントとサーバーのやり取りをシミュレートします。sshuser アカウントがクライアントと、SSH 接続のターゲットアカウントの両方の役割を果たします。
引き続き sshuser アカウントで操作していることを確認してください。もし labex ユーザーに戻っている場合は、再度切り替えます。
sudo su - sshuser
これで公開鍵をコピーする準備が整いました。ssh-copy-id コマンドは、引数としてリモートユーザーとホストを受け取ります。ここでは sshuser@localhost を使用して、ローカルマシン(サーバーとして動作)上のユーザー sshuser を指定します。
コマンドを実行します。
ssh-copy-id sshuser@localhost
SSH 経由で localhost に接続するのはこれが初めてなので、ホストの真正性を確認するよう求められます。yes と入力して続行します。
The authenticity of host 'localhost (::1)' can't be established.
ED25519 key fingerprint is SHA256:<FINGERPRINT_STRING>.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
次に、ユーティリティが id_rsa.pub 鍵をスキャンし、sshuser アカウントのパスワードを求めます。ユーザー作成時に設定したパスワード password123 を入力してください。
/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
sshuser@localhost's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'sshuser@localhost'"
and check to make sure that only the key(s) you wanted were added.
出力結果から、1 つの鍵が正常に追加されたことが確認できます。ssh-copy-id コマンドは、サーバー上に ~/.ssh ディレクトリが存在しない場合は自動的に作成し、公開鍵を ~/.ssh/authorized_keys ファイルに追記します。
これを確認するために、authorized_keys ファイルの内容を表示してみましょう。id_rsa.pub ファイルと全く同じ鍵が含まれているはずです。
cat ~/.ssh/authorized_keys
出力は長い文字列になりますが、これがあなたの公開鍵です。
ssh-rsa AAAA...[long key string]...== sshuser@ubuntu
公開鍵認証による SSH ログインのテスト
最後のステップでは、新しい設定をテストして、公開鍵認証が正しく機能していることを確認します。作成した鍵ペアを使用して SSH サーバーへのログインを試みます。ユーザーパスワードの代わりに、秘密鍵に設定したパスフレーズの入力を求められるはずです。
引き続き sshuser アカウントで操作していることを確認します。
whoami
出力に sshuser と表示されるはずです。そうでない場合は、sshuser アカウントに切り替えてください。
sudo su - sshuser
では、localhost への SSH 接続を開始しましょう。鍵のコピープロセス中に一度接続しているため、ホスト鍵はすでに受け入れられているはずです。
以下のコマンドを実行して接続します。
ssh sshuser@localhost
秘密鍵のパスフレーズを入力するよう求められます。これはステップ 1 で作成したパスフレーズ(sshkey-password)です。
Enter passphrase for key '/home/sshuser/.ssh/id_rsa':
パスフレーズ sshkey-password を入力し、Enter キーを押します。正しく入力されると、サーバーにログインし、ウェルカムメッセージが表示されます。
Welcome to Ubuntu 22.04.x LTS (GNU/Linux x.x.x-xx-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
Last login: Mon Jun 30 10:45:23 2024 from ::1
sshuser@ubuntu:~$
おめでとうございます!公開鍵認証を使用したログインに成功しました。これで新しい SSH セッションに入りました。ユーザーアカウントのパスワード(password123)ではなく、鍵のパスフレーズのみが求められたことに注目してください。
新しい SSH セッションにいることを確認するために、環境をチェックできます。
echo $SSH_CONNECTION
これにより接続の詳細が表示され、SSH セッション内にいることが確認できます。
SSH セッションを終了して元のターミナルに戻るには、exit と入力して Enter キーを押します。
exit
接続が閉じられたことを確認するメッセージが表示されます。
logout
Connection to localhost closed.
最後に、sshuser アカウントからログアウトして labex ユーザーに戻ります。
exit
これで、専用のデモ用ユーザーを使用して SSH 公開鍵認証の設定とテストが正常に完了しました。
まとめ
この実験では、リモートの Linux サーバーに対して安全なパスワードレス接続を確立するための SSH 公開鍵認証の設定方法と使用方法を学びました。まず、鍵ベースの認証セットアップのためのクリーンな環境を確保するために、専用のデモ用ユーザー(sshuser)を作成しました。次に、ssh-keygen コマンドを使用して新しい RSA 鍵ペアを生成しました。このプロセスにより、安全に保管され追加のセキュリティ層としてパスフレーズで保護された「秘密鍵」と、それに対応する「公開鍵」が作成されました。
その後、ssh-copy-id ユーティリティを使用して、公開鍵をサーバーの認証済み鍵ファイルに安全に転送しました。このコマンドは自動的に鍵を ~/.ssh/authorized_keys ファイルに追加し、鍵ペアによるアクセスを許可しました。最後のステップでは、サーバーへの SSH セッションを開始して接続をテストしました。ユーザーアカウントのパスワードではなく秘密鍵のパスフレーズを使用して正常に認証されたことで、公開鍵認証が正しく機能していることが確認できました。



