Red Hat Enterprise Linux における SSH のセキュア化

Red Hat Enterprise LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、リモート Linux システムを管理するための基本スキルである SSH 接続の設定とセキュア化について実践的に学びます。まず、SSH を使用してリモートシステムにアクセスする方法を学び、クライアント・サーバーアーキテクチャと基本的な接続コマンドを理解します。これには、SSH クライアントのインストール確認、リモートホストへの接続、ホストの真正性確認プロンプトへの対応、リモートシステムへのログインとログアウトが含まれます。

この基礎の上に、パスワードなし認証のための SSH キーペアの生成と利用、ssh-agent を使用したキーの効率的な管理、一般的な SSH 接続の問題のトラブルシューティングといった高度なトピックを掘り下げます。最後に、効率向上のための SSH クライアント設定のカスタマイズ方法や、root ログインおよびパスワード認証を無効化して OpenSSH サーバーのセキュリティを強化し、堅牢で安全なリモートアクセスを確保する方法を学びます。

SSH を使用したリモートシステムへのアクセス

このステップでは、SSH (Secure Shell) を使用してリモートシステムにアクセスする方法を学びます。SSH は、安全でないネットワーク上でネットワークサービスを安全に運用するための暗号化ネットワークプロトコルです。クライアント・サーバーアーキテクチャを使用し、SSH クライアントと SSH サーバーを接続することで、安全でないネットワーク上に安全なチャネルを提供します。

注意: この実験環境では、セキュリティ上の理由から root ログイン制限などの一部のセキュリティ機能が既に設定されている場合があります。これは正常な動作であり、ベストプラクティスの実践例を示しています。

リモートシステムに接続する前に、OpenSSH クライアントおよびサーバーパッケージをインストールし、SSH サービスを開始して実験環境を準備します。SSH はクライアント・サーバーアーキテクチャを採用しており、クライアント (ssh) が接続を開始し、サーバー (sshd) がそれを受け入れます。また、後で SSH 設定ファイルを編集するために使用する nano もインストールします。

以下のコマンドを実行して必要なパッケージをインストールします。-y フラグは、パッケージインストールのプロンプトに自動的に同意します。

sudo dnf install -y openssh-clients openssh-server nano

SSH サービスを開始し、起動時に自動的に開始されるように設定します。

sudo systemctl start sshd
sudo systemctl enable sshd

SSH サービスが実行されていることを確認します。

sudo systemctl status sshd

出力に Active: active (running) と表示されるはずです。q を押してステータス表示を終了します。

まず、SSH を使用してローカルシステムに接続します。これは、同じマシンに接続する場合でも SSH のクライアント・サーバーアーキテクチャが機能することを示しています。ssh コマンドを使用して localhost に接続します。

ssh の基本構文は以下の通りです。 ssh [username]@[hostname_or_IP]

ユーザー名を指定しない場合、SSH は現在のローカルユーザー名でログインを試みます。この場合、ローカルユーザー名は labex です。

現在のユーザー名を使用して localhost への接続を試みます。

ssh localhost

初めて接続する場合、SSH はホストの真正性を確認するよう求めます。これは中間者攻撃を防ぐためのセキュリティ対策です。yes と入力して Enter を押します。

The authenticity of host 'localhost (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:h5k1mmPFylpxUCsKx+Mf8rN4wOrk9TmyRfzTvGWRm7A.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
labex@localhost's password:

labex ユーザーのパスワードを求められます。labex と入力して Enter を押します。

labex@localhost's password:
Last login: Mon Jun  9 01:34:39 2025 from 47.251.66.143
[labex@host ~]$

これで SSH を介して localhost にログインできました。プロンプトが [labex@localhost ~]$ と表示され、SSH 経由で接続されていることがわかります。

SSH セッションからログアウトするには、exit コマンドを使用します。

exit
logout
Connection to localhost closed.
[labex@host ~]$

次に、root ユーザーとして localhost への接続を試みます。この環境では、セキュリティ上の理由から root ログインがデフォルトで無効になっている可能性があることに注意してください。

ssh root@localhost

root パスワードを求められます。ただし、root ログインが無効になっている場合は「Permission denied」というメッセージが表示されることがあります。

root@localhost's password:
Permission denied, please try again.
root@localhost's password:
Permission denied, please try again.
root@localhost's password:

root ログインが無効になっている場合、これは想定通りの動作であり、セキュリティのベストプラクティスを示しています。Ctrl+C を押して接続試行をキャンセルできます。

SSH は、対話型シェルを開かずにリモートシステム上で単一のコマンドを実行するためにも使用できます。これは、簡単な確認や自動化に便利です。

labex ユーザーとして localhost 上で hostname コマンドを実行してみましょう。

ssh labex@localhost hostname

labex ユーザーのパスワードを求められます。labex と入力して Enter を押します。

labex@localhost's password:
6846375f1c0e35fea6cb03e6
[labex@host ~]$

hostname コマンドが SSH 経由で実行され、その出力がローカルターミナルに表示されました。対話型シェルには入りませんでした。

最後に、SSH が既知のホストをどのように管理するかを確認します。新しい SSH サーバーに接続すると、その公開鍵のフィンガープリントが ~/.ssh/known_hosts ファイルに追加されます。このファイルは、将来の接続時に SSH クライアントがサーバーの身元を確認するのに役立ちます。

~/.ssh/known_hosts ファイルの内容を表示できます。

cat ~/.ssh/known_hosts
localhost ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHvl7dcZkvMNOr3cjKjlR2/JgFbGpURThT/bHnLZN6gG
localhost ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCynhy3601o9ZSGZoY0KB/QSonk5ykod2Tb7sCAqVn4ZgTCwd96BhPjJLPNQ6ldNASo1e7EzfT4BUjG5T0ZDRhgaI65qmDwITWipTWUfmYT5XoScyf6NDhcRxYiJwztFEkOvLcPhelS6UXj5Z7HdmYH4Nc5wiF00Wah3Jc0/2CfQsFZCXTn/7Kp8KKbBbPqPzr2R3WIULEacOxx9HKVv+2TvYg/OHZz40hTsr1c68DD7h5PMBNe21YB3HLRRk2LQEC7v7BFD+DCek9GNR66JBjbLDljtwWCaPCY0UntBjjvJ3W2LhX5RDZQHV/iaUSj2tEXnvPt9KSqGfBS91D12dBXyOmWVnTpvvI17BdDkEeefas2Uz4d7Bv/PDxZR6IKkaIGQ/ZnRhSEhBNvfqlBGqkOhRr6jQJK+rQMnsZCT6OEgW7osWzkw5Bs1wY/RNToeQqrRMclqffO9plFI688N2iT86+nxrvBVZg4yMMm2J1lleaBvinXCB8jE6lrtwoAdgk=
localhost ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKYWY8Ty6TrbQS/0fUljBWuUpkyPCS/5P6ZwxhSYsqjRBIprMANI/JQotZqHYq2w3b2X/n8O+J3/WuIB6XMl1f4=

これらのエントリは、クライアントが localhost 用の複数の公開鍵(ED25519、RSA、ECDSA)を記録していることを確認しています。SSH サーバーは互換性のために複数の鍵タイプをサポートしている場合があります。これらのサーバー鍵のいずれかが予期せず変更された場合、SSH は警告を発します。これは重要なセキュリティ機能です。

パスワードなし認証のための SSH キーペアの生成と利用

このステップでは、SSH キーペアを生成し、それを使用してパスワードなし認証を行う方法を学びます。SSH キーベースの認証は、パスワード認証よりも安全で便利な代替手段です。接続するたびにパスワードを入力する代わりに、暗号化されたキーペア(ローカルマシンに秘密のまま保持される秘密鍵と、リモートサーバーに配置される公開鍵)を使用します。

まず、SSH キーペアを生成する必要があります。これには ssh-keygen コマンドを使用します。デフォルトでは、ssh-keygen は RSA キーペアを作成し、秘密鍵を ~/.ssh/id_rsa に、公開鍵を ~/.ssh/id_rsa.pub に保存します。

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

ssh-keygen

いくつかのオプションを求められます。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/labex/.ssh/id_rsa):

Enter を押してデフォルトのファイルパス (/home/labex/.ssh/id_rsa) を受け入れます。

Enter passphrase (empty for no passphrase):

この実験では、Enter を2回押してパスフレーズを空のままにします。実際のシナリオではセキュリティを強化するためにパスフレーズを使用することが推奨されますが、ここでは簡略化とパスワードなし認証を直接示すためにスキップします。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/labex/.ssh/id_rsa
Your public key has been saved in /home/labex/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:QoV7pNBFu1kafGP3VJhpZuIdr1zc+qamJ1C2YAadgNY labex@6846375f1c0e35fea6cb03e6
The key's randomart image is:
+---[RSA 3072]----+
|     . *=o .   +.|
|    . =oE.o . O. |
|     o.++.=..*.+.|
|     .o .O+o+o. =|
|      ..So + o.+ |
|       .  . . +  |
|           .   . |
|            . o o|
|            .=.o |
+----[SHA256]-----+

次に、~/.ssh/ ディレクトリにキーファイルが作成されたことを確認します。

ls -l ~/.ssh/
total 16
-rw------- 1 labex labex 2622 Jun  9 01:37 id_rsa
-rw-r--r-- 1 labex labex  584 Jun  9 01:37 id_rsa.pub
-rw------- 1 labex labex  825 Jun  9 01:35 known_hosts
-rw-r--r-- 1 labex labex   91 Jun  9 01:35 known_hosts.old

id_rsa(秘密鍵)と id_rsa.pub(公開鍵)が表示されるはずです。権限に注目してください。id_rsarw-------(所有者のみ読み取り/書き込み可能)となっており、これはセキュリティ上非常に重要です。以前の known_hosts ファイルのバックアップである known_hosts.old も表示される場合があります。

次に、パスワードなし認証を有効にするために公開鍵をコピーする必要があります。ssh-copy-id コマンドはこの目的のために設計されています。これは公開鍵を ~/.ssh/authorized_keys ファイルに追加し、パスワードなしでログインできるようにします。

ユーザーとホスト名を指定して ssh-copy-id コマンドを実行します。

ssh-copy-id labex@localhost

labex ユーザーのパスワードを求められます。labex と入力して Enter を押します。

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/labex/.ssh/id_rsa.pub"
/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
labex@localhost's password:

Number of key(s) added: 1

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

コマンドの出力により、1つのキーが追加されたことが確認できます。次に、パスワードを入力せずに labex として localhost へのログインを試みます。

ssh labex@localhost

すべてが正しく設定されていれば、パスワードを求められることなく SSH 経由でログインできるはずです。

Last login: Mon Jun  9 01:37:39 2025 from 47.251.66.143
[labex@host ~]$

これで、キーペアを使用したパスワードなし SSH 認証の設定に成功しました!

リモートセッションを終了するには、exit と入力します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

ssh-agent を使用した SSH キーの管理

このステップでは、ssh-agent を使用して SSH キーを管理する方法を学びます。ssh-agent はバックグラウンドで実行され、秘密鍵をメモリ内に保持するプログラムです。これは、秘密鍵がパスフレーズで保護されている場合に特に便利です。キーを使用するたびにパスフレーズを入力する代わりに、キーを ssh-agent に追加する際に一度入力すれば、セッション期間中はエージェントが代わりに認証を処理してくれます。

前のステップではパスフレーズなしでキーを生成しましたが、ここでは ssh-agent の有用性を示すために、パスフレーズ付きの新しいキーを作成します。

まず、パスフレーズ付きの新しい SSH キーペアを生成します。デフォルトの id_rsa キーと区別するために、このキーに id_rsa_passphrase という名前を付けます。

ssh-keygen -f ~/.ssh/id_rsa_passphrase

パスフレーズの入力を求められます。この実験では、パスフレーズとして mypassphrase を使用します。

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): mypassphrase
Enter same passphrase again: mypassphrase
Your identification has been saved in /home/labex/.ssh/id_rsa_passphrase
Your public key has been saved in /home/labex/.ssh/id_rsa_passphrase.pub
The key fingerprint is:
SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg labex@6846375f1c0e35fea6cb03e6
The key's randomart image is:
+---[RSA 3072]----+
|   ...=o+=*. E   |
|    .o.*.=..+ o  |
|     .=.o o. = . |
|  .  .+... .. . .|
| . . . +S.     + |
|  . o ..o . o * .|
|   . .   . . = * |
|             oooo|
|            ..+.o|
+----[SHA256]-----+

注意: パスフレーズを入力せずに誤って Enter を押すと、パスフレーズなしでキーが作成されます。その場合は、ファイルを削除してコマンドを再実行し、プロンプトが表示されたら必ず mypassphrase を入力してください。

次に、この新しい公開鍵を localhost にコピーして、認証に使用できるようにします。

ssh-copy-id -i ~/.ssh/id_rsa_passphrase.pub labex@localhost

デフォルトのキーでパスワードなし認証が既に設定されているため、コマンドはパスワードを求めず、既存の認証を使用する可能性があります。

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/labex/.ssh/id_rsa_passphrase.pub"
/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

Number of key(s) added: 1

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

次に、この新しいキーを使用して localhost への接続を試みます。-i オプションを使用して秘密鍵ファイルを指定する必要があります。

ssh -i ~/.ssh/id_rsa_passphrase labex@localhost

キーにパスフレーズを設定した場合は、入力を求められます。ただし、誤ってパスフレーズなしでキーを作成した場合(出力例のように)、直接ログインされます。

Last login: Mon Jun  9 01:39:25 2025 from 47.251.66.143
[labex@host ~]$

ログインできました。セッションを終了します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

注意: キーにパスフレーズがない場合でも、ssh-agent のデモンストレーションを続けることができます。この場合、パスフレーズは求められませんが、仕組みを理解することは可能です。

まず、現在のシェルセッションで ssh-agent を開始します。eval コマンドは、ssh-agent が出力する環境変数を適切に設定するために使用されます。

eval "$(ssh-agent)"
Agent pid 1024

出力には ssh-agent のプロセス ID (PID) が表示されます。

次に、秘密鍵 (id_rsa_passphrase) を ssh-agent に追加します。

ssh-add ~/.ssh/id_rsa_passphrase

キーにパスフレーズがある場合は入力を求められます。ない場合は、キーが直接追加されます。

Identity added: /home/labex/.ssh/id_rsa_passphrase (labex@6846375f1c0e35fea6cb03e6)

キーが ssh-agent に追加されたので、同じキーを使用して再度 localhost への接続を試みます。

ssh -i ~/.ssh/id_rsa_passphrase labex@localhost

パスフレーズを求められることなく接続できるはずです(エージェントによって管理されているため、キーにパスフレーズがあるかどうかにかかわらず)。

Last login: Mon Jun  9 01:39:49 2025 from 127.0.0.1
[labex@host ~]$

これで ssh-agent を使用して SSH キーを管理することに成功しました。

重要な注意: ssh-agent の環境変数は、それを開始したシェルセッションでのみ有効です。SSH セッション内にいる場合は、ssh-add コマンドを使用するためにローカルシェルに戻る必要があります。

まず SSH セッションを終了します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

次に、現在 ssh-agent にロードされているキーを確認するには、ssh-add -l を使用します。

ssh-add -l

エージェントが実行中でキーがロードされている場合、以下のような出力が表示されます。

3072 SHA256:BuSxVlJb1lsiUFi2I5DAvyL01fJ5d480LT86dgtcHEg /home/labex/.ssh/id_rsa_passphrase (RSA)

ただし、「Could not open a connection to your authentication agent」というエラーメッセージが表示された場合は、現在のセッションでエージェントの環境変数が設定されていないことを意味します。

ssh-agent からすべての ID を削除するには、ssh-add -D を使用します。

ssh-add -D

エージェントにアクセスできる場合、以下のように表示されます。

All identities removed.

ただし、「Could not open a connection to your authentication agent」と表示された場合は、現在のセッションでエージェント環境が利用できないことを意味します。

ここで再度接続を試みると、キーがエージェントから削除されているため、キーにパスフレーズがある場合は入力を求められます。

ssh -i ~/.ssh/id_rsa_passphrase labex@localhost

キーにパスフレーズがある場合、以下のように表示されます。

Enter passphrase for key '/home/labex/.ssh/id_rsa_passphrase':

キーにパスフレーズがない場合は、そのまま接続できます。パスフレーズを求められた場合は、Ctrl+C を押して接続試行をキャンセルしてください。

最後に、ssh-agent プロセスを停止するには、ssh-agent -k を使用します。

ssh-agent -k

SSH_AGENT_PID 環境変数が設定されていない場合、以下のように表示されることがあります。

SSH_AGENT_PID not set, cannot kill agent

これは、エージェントが別のシェルセッションで開始された場合や、環境変数が適切にエクスポートされなかった場合に正常な動作です。

SSH 接続の問題のトラブルシューティング

このステップでは、一般的な SSH 接続の問題をトラブルシューティングする方法を学びます。SSH 接続が失敗した場合、正確な問題を特定するのは難しいことがあります。ssh コマンドは、接続プロセスに関する詳細情報を表示することで問題の診断に役立つ詳細出力オプションを提供します。

ssh コマンドには、-v-vv-vvv という3つの詳細レベルがあります。v が増えるごとに、表示されるデバッグ情報の量が増えます。

まず、接続失敗を実証し、デバッグ出力を確認するために、localhost 上の存在しないポートへの接続を試みます。

まず、-v (verbose) を使用してポート 2222(実行されていないはず)への接続を試みます。

ssh -v -p 2222 labex@localhost

接続が拒否されたことを示す、以下のような出力が表示されます。

OpenSSH_8.7p1, OpenSSL 3.0.1 14 Dec 2021
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf
debug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: /etc/ssh/ssh_config.d/50-redhat.conf line 3: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 2222.
ssh: connect to host localhost port 2222: Connection refused

次に、-vv (more verbose) を使用してみます。

ssh -vv -p 2222 labex@localhost

出力はより詳細になり、追加のデバッグメッセージが提供されます。

OpenSSH_8.7p1, OpenSSL 3.0.1 14 Dec 2021
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf
debug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: /etc/ssh/ssh_config.d/50-redhat.conf line 3: Applying options for *
debug2: resolving "localhost" port 2222
debug2: ssh_connect_direct: entering
debug1: Connecting to localhost [127.0.0.1] port 2222.
debug1: connect to address 127.0.0.1 port 2222: Connection refused
ssh: connect to host localhost port 2222: Connection refused

最後に、-vvv (most verbose) を使用してみます。

ssh -vvv -p 2222 labex@localhost

このレベルでは最大限のデバッグ情報が提供されます。圧倒されるかもしれませんが、複雑な問題には非常に役立ちます。

OpenSSH_8.7p1, OpenSSL 3.0.1 14 Dec 2021
debug3: ssh_connect_internal: entering
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/01-training.conf
debug1: /etc/ssh/ssh_config.d/01-training.conf line 1: Applying options for *
debug1: Reading configuration data /etc/ssh/ssh_config.d/50-redhat.conf
debug1: /etc/ssh/ssh_config.d/50-redhat.conf line 3: Applying options for *
debug2: resolving "localhost" port 2222
debug2: ssh_connect_direct: entering
debug1: Connecting to localhost [127.0.0.1] port 2222.
debug1: connect to address 127.0.0.1 port 2222: Connection refused
ssh: connect to host localhost port 2222: Connection refused

この場合、Connection refused というエラーは、ポート 2222 で SSH サーバーが実行されていないことを明確に示しています。

次に、一般的な問題である「ホスト鍵の変更」をシミュレートします。最初のステップで localhost に接続した際、その公開鍵が ~/.ssh/known_hosts ファイルに追加されました。SSH サーバーの鍵が変更された場合(サーバーの再構築や悪意のある攻撃など)、SSH クライアントはこの不一致を検出し、接続を拒否します。

これをシミュレートするために、localhostknown_hosts エントリを意図的に変更して無効にします。

まず、nano を使用して ~/.ssh/known_hosts ファイルを開きます。

nano ~/.ssh/known_hosts

異なる鍵タイプを持つ複数の行が表示されます。

localhost ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHvl7dcZkvMNOr3cjKjlR2/JgFbGpURThT/bHnLZN6gG
localhost ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCynhy3601o9ZSGZoY0KB/QSonk5ykod2Tb7sCAqVn4ZgTCwd96BhPjJLPNQ6ldNASo1e7EzfT4BUjG5T0ZDRhgaI65qmDwITWipTWUfmYT5XoScyf6NDhcRxYiJwztFEkOvLcPhelS6UXj5Z7HdmYH4Nc5wiF00Wah3Jc0/2CfQsFZCXTn/7Kp8KKbBbPqPzr2R3WIULEacOxx9HKVv+2TvYg/OHZz40hTsr1c68DD7h5PMBNe21YB3HLRRk2LQEC7v7BFD+DCek9GNR66JBjbLDljtwWCaPCY0UntBjjvJ3W2LhX5RDZQHV/iaUSj2tEXnvPt9KSqGfBS91D12dBXyOmWVnTpvvI17BdDkEeefas2Uz4d7Bv/PDxZR6IKkaIGQ/ZnRhSEhBNvfqlBGqkOhRr6jQJK+rQMnsZCT6OEgW7osWzkw5Bs1wY/RNToeQqrRMclqffO9plFI688N2iT86+nxrvBVZg4yMMm2J1lleaBvinXCB8jE6lrtwoAdgk=
localhost ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKYWY8Ty6TrbQS/0fUljBWuUpkyPCS/5P6ZwxhSYsqjRBIprMANI/JQotZqHYq2w3b2X/n8O+J3/WuIB6XMl1f4=

変更する行を1つ選択します。この例では、ED25519 鍵(最初の行)を変更します。長い鍵文字列の数文字を変更します(例:最後の文字を G から A に変更)。行全体やファイルの他の部分を削除しないように注意してください。

例えば、以下のように変更します。 ...ZN6gG...ZN6gA

Ctrl+X を押し、Y で保存を確認し、Enter でファイル名を確定してファイルを保存します。

次に、再度 localhost への接続を試みます。

ssh labex@localhost

ホスト鍵が変更されたという警告が表示されます。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:h5k1mmPFylpxUCsKx+Mf8rN4wOrk9TmyRfzTvGWRm7A.
Please contact your system administrator.
Add correct host key in /home/labex/.ssh/known_hosts to get rid of this message.
Offending key in /home/labex/.ssh/known_hosts:1
ED25519 host key for localhost has changed and you have requested strict checking.
Host key verification failed.

これは重大なセキュリティ警告です。実際のシナリオでこれに遭遇した場合は、なぜホスト鍵が変更されたのかを調査する必要があります。正当な変更(サーバーの再インストールなど)である場合は、known_hosts から古いエントリを削除する必要があります。

これを修正するには、~/.ssh/known_hosts を手動で編集して問題の行を削除するか、ssh-keygen -R を使用して localhost のエントリを削除します。

ssh-keygen -R を使用して誤ったエントリを削除します。

ssh-keygen -R localhost
## Host localhost found: line 1
## Host localhost found: line 2
## Host localhost found: line 3
/home/labex/.ssh/known_hosts updated.
Original contents retained as /home/labex/.ssh/known_hosts.old

次に、再度 localhost への接続を試みます。最初に接続したときと同じように、ホストの真正性を確認するよう求められます。

ssh labex@localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:h5k1mmPFylpxUCsKx+Mf8rN4wOrk9TmyRfzTvGWRm7A.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ED25519) to the list of known hosts.
Last login: Mon Jun  9 01:40:03 2025 from 127.0.0.1
[labex@host ~]$

これで、キーベース認証を使用して再度正常に接続できました。

セッションを終了します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

SSH クライアント設定のカスタマイズ

このステップでは、~/.ssh/config ファイルを使用して SSH クライアント設定をカスタマイズする方法を学びます。このファイルを使用すると、異なるリモートホストに対するエイリアスや特定の接続パラメータを定義でき、SSH コマンドを簡素化して一貫性を高めることができます。

~/.ssh/config ファイルは、SSH 接続を管理するための強力なツールです。ユーザー名、使用する秘密鍵ファイル、ポート番号、さらにはプロキシコマンドなどの高度な設定まで、さまざまなオプションを指定できます。

まず、~/.ssh/config ファイルを作成または開きます。存在しない場合、nano が作成します。

nano ~/.ssh/config

ファイルに以下の設定を追加します。この設定は、labex ユーザーとして localhost に接続するためのエイリアス localhost_labex と、root ユーザーとして接続するためのエイリアス localhost_root を定義します。また、labex ユーザーが前のステップで生成した id_rsa キーを使用するように IdentityFile を明示的に指定しています。

Host localhost_labex
    HostName localhost
    User labex
    IdentityFile ~/.ssh/id_rsa

Host localhost_root
    HostName localhost
    User root

Ctrl+X を押し、Y で保存を確認し、Enter でファイル名を確定してファイルを保存します。

次に、これらの新しいエイリアスを使用して localhost への接続を試みます。

localhost_labex エイリアスを使用して labex として接続します。

ssh localhost_labex

IdentityFile ~/.ssh/id_rsa を設定しており、id_rsa にパスフレーズがないため、パスワードを求められることなくログインできるはずです。

Last login: Mon Jun  9 01:54:16 2025 from 47.251.66.143
[labex@host ~]$

セッションを終了します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

次に、localhost_root エイリアスを使用して root として接続します。

ssh localhost_root

root ユーザーのパスワードを求められます。ただし、この環境では root ログインが無効になっているため、「Permission denied」メッセージが表示されます。

root@localhost's password:
Permission denied, please try again.
root@localhost's password:

Ctrl+C を押して接続試行をキャンセルします。

^C

これは、SSH 設定のエイリアスは機能しているものの、root ログインを無効にするセキュリティポリシーのために接続が失敗することを示しています。

このように、~/.ssh/config ファイルを使用すると、一般的な接続パラメータを事前設定することで SSH コマンドを簡素化できます。

異なるポートを指定する方法を示すために、別のエントリを追加してみましょう。localhost はデフォルトの SSH ポート (22) を使用しますが、この例ではポートが異なる場合の構成方法を示します。

再度 ~/.ssh/config ファイルを開きます。

nano ~/.ssh/config

以下のエントリを追加します。これは、ポートを 2222 に明示的に設定するエイリアス localhost_port_example を作成します。(注意:localhost は実際にはポート 2222 でリッスンしていないため、この接続は失敗しますが、設定方法を示すためのものです。)

Host localhost_labex
    HostName localhost
    User labex
    IdentityFile ~/.ssh/id_rsa

Host localhost_root
    HostName localhost
    User root

Host localhost_port_example
    HostName localhost
    Port 2222
    User labex

ファイルを保存します。

次に、localhost_port_example エイリアスを使用して接続を試みます。

ssh localhost_port_example

localhost がポート 2222 でリッスンしていないため接続は失敗しますが、SSH 設定でカスタムポートを指定する方法がわかります。

ssh: connect to host localhost port 2222: Cannot assign requested address

You can find some explanations for typical errors at this link:
            https://red.ht/support_rhel_ssh

現在の SSH 設定を表示して、定義されているすべてのホストを確認できます。

cat ~/.ssh/config
Host localhost_labex
    HostName localhost
    User labex
    IdentityFile ~/.ssh/id_rsa

Host localhost_root
    HostName localhost
    User root

Host localhost_port_example
    HostName localhost
    Port 2222
    User labex

最後に、localhost_port_example エントリを削除して ~/.ssh/config ファイルを整理します。

~/.ssh/config ファイルを開きます。

nano ~/.ssh/config

Host localhost_port_example ブロックを削除します。ファイルは以下のようになります。

Host localhost_labex
    HostName localhost
    User labex
    IdentityFile ~/.ssh/id_rsa

Host localhost_root
    HostName localhost
    User root

ファイルを保存します。

OpenSSH サーバーのセキュリティ設定の理解

このステップでは、現在のセキュリティ設定を調べることで、OpenSSH サーバーのセキュリティベストプラクティスについて学びます。root ログイン制限とパスワード認証設定が、不正アクセスからサーバーを保護するためにどのように機能するかを理解します。

注意: この実験環境では、現在の SSH セキュリティ設定を調べ、さまざまなセキュリティ設定について理解します。このステップでは、これらのセキュリティ対策を理解し、SSH サーバー設定のベストプラクティスを学ぶことに焦点を当てます。

root ログインセキュリティの理解

root アカウントは完全な管理権限を持っているため、SSH を介した直接の root ログインは一般的に推奨されません。攻撃者が root アカウントへのアクセス権を取得すると、システムを完全に制御されてしまいます。通常のユーザーとしてログインし、sudo を使用して管理タスクを実行する方が安全です。

現在の root ログイン設定を調べ、その有効性をテストしてみましょう。

まず、labex ユーザーとして SSH 経由でログインします。

ssh labex@localhost

前のステップでの SSH キー設定が正しければ、パスワードなしでログインできるはずです。

Last login: Mon Jun  9 01:57:27 2025 from 47.251.66.143
[labex@host ~]$

次に、SSH サーバー設定ファイルを調べて、現在のセキュリティ設定を理解します。

sudo cat /etc/ssh/sshd_config | grep -E "^PermitRootLogin|^#PermitRootLogin"

このコマンドで現在の PermitRootLogin 設定が表示されます。以下のような出力が表示されるはずです。

PermitRootLogin no

この設定は、SSH を介した直接の root ログインが無効になっていることを意味し、これはセキュリティのベストプラクティスです。

root ログインが実際にブロックされているかテストしてみましょう。まず、現在の SSH セッションを終了します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

次に、root として localhost へのログインを試みます。

ssh root@localhost

「Permission denied」メッセージが表示され、直接の root ログインが許可されていないことがわかります(これは環境内で既に設定されている場合があります)。

root@localhost's password:
Permission denied, please try again.
root@localhost's password:
Permission denied, please try again.
root@localhost's password:

これにより、この環境で root ログインが無効になっていることが確認でき、これは望ましいセキュリティ設定です。「Permission denied」メッセージは、セキュリティ対策が効果的に機能していることを示しています。

パスワード認証セキュリティの理解

パスワード認証を無効にすると、ユーザーは SSH キーベースの認証のようなより安全な方法に頼らざるを得なくなります。これにより、サーバーに対するブルートフォース攻撃のリスクが大幅に軽減されます。

現在のパスワード認証設定を調べ、その仕組みを理解しましょう。

labex ユーザーとして SSH 経由でログインします(SSH キーを使用)。

ssh labex@localhost
Last login: Mon Jun  9 01:57:32 2025 from 127.0.0.1
[labex@host ~]$

まず、現在の PasswordAuthentication 設定を確認します。

sudo cat /etc/ssh/sshd_config | grep PasswordAuthentication
PasswordAuthentication yes
## PasswordAuthentication.  Depending on your PAM configuration,
## PAM authentication, then enable this but set PasswordAuthentication

ご覧の通り、現在は PasswordAuthentication yes が設定されており、パスワード認証が有効になっています。これによりユーザーはパスワードで認証できますが、ブルートフォース攻撃に対してサーバーが脆弱になるため、セキュリティリスクも伴います。

出力は以下を示しています。

  • PasswordAuthentication yes - パスワード認証を有効にするアクティブな設定
  • コメントアウトされた行は、PAM 設定に関する追加のコンテキストを提供

この設定は、ユーザーがパスワードと SSH キーの両方を使用して認証できることを意味します。セキュリティを強化するには、パスワード認証を無効にし、SSH キーベースの認証のみに頼ることを推奨します。

現在の SSH セッションを終了します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

次に、パスワード認証が無効になっている間も SSH キーベースの認証が正しく機能することを確認します。

ssh labex@localhost

これは、SSH キーを使用してパスワードプロンプトなしで成功するはずです。

Last login: Mon Jun  9 02:00:22 2025 from 127.0.0.1
[labex@host ~]$

これは、いくつかの重要なセキュリティ概念を示しています。

  1. パスワード認証が有効 (PasswordAuthentication yes) - ユーザーはパスワードと SSH キーの両方でログイン可能
  2. SSH キーベースの認証が正しく機能 - より安全な認証方法が利用可能
  3. サーバーが両方の認証方法を許可 - 便利ですが、ブルートフォース攻撃によるセキュリティリスクが生じる可能性がある
  4. root ログインが無効 - 管理アクセスには適切なユーザー昇格が必要

セキュリティ推奨事項: 本番環境では、ユーザーに SSH キーベースの認証のみを強制することでセキュリティを強化するために、PasswordAuthentication no を設定することを検討してください。

セッションを終了します。

exit
exit
Connection to localhost closed.
[labex@host ~]$

これで、OpenSSH サーバーのセキュリティ設定を調べ、理解できました。サーバーは現在、root ログインが無効(セキュリティベストプラクティスに従う)で、パスワード認証が有効(柔軟性を提供しますが、本番環境では追加のセキュリティ考慮が必要な場合がある)になっています。また、より安全な認証方法として SSH キーベースの認証が正しく機能することも確認しました。

まとめ

この実験では、参加者は SSH を使用してシステムにアクセスする方法を学びました。まず openssh-clients のインストールを確認し、SSH 経由で localhost に接続しました。パスワードを使用した認証を練習し、最初のホスト真正性確認について理解しました。

さらに、パスワードなし認証のための SSH キーペアの生成と利用、ssh-agent を使用したキーの管理、一般的な SSH 接続の問題のトラブルシューティングについても学びました。最後に、SSH クライアント設定のカスタマイズ方法や、root ログインおよびパスワード認証を無効化して OpenSSH サーバーをセキュア化する方法を学び、安全なリモートアクセス手法への理解を深めました。