Linuxサーバーをリモートで管理・運用する上で、Secure Shell (SSH) は欠かせないツールです。ネットワーク経由でも安全にサーバーへアクセスし、コマンドを実行できるSSHは、日々の運用作業の基盤となります。この記事では、SSHを使った基本的なリモート接続方法から、セキュリティを強化するための公開鍵認証について、具体的なコマンド例を交えて解説します。
- SSHコマンドの基本的な使い方
- パスワード認証と公開鍵認証の違い
- 公開鍵認証の仕組みと安全な設定方法
- SSH接続時の主なトラブルと対処法
SSHを使ったリモート接続の最も基本的なコマンドは以下の通りです。
ssh ユーザー名@ホスト名またはIPアドレス
ユーザー名
: 接続先サーバーのユーザー名です。ホスト名またはIPアドレス
: 接続先サーバーのホスト名(例:example.com
)またはIPアドレス(例:192.168.1.100
)を指定します。
初めて接続するサーバーの場合、以下のようなメッセージが表示されます。
The authenticity of host 'example.com (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:*******************************************.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
これは接続先のサーバーの正当性を確認するためのもので、「yes
」と入力してEnterキーを押すと、サーバーのフィンガープリントがクライアントPCの~/.ssh/known_hosts
ファイルに保存されます。
その後、パスワードの入力を求められるので、指定したユーザーのパスワードを入力することで接続が完了します。
SSHには主に2つの認証方式があります。
- パスワード認証: ユーザー名とパスワードを使って認証します。手軽に利用できますが、パスワードの推測や総当たり攻撃(ブルートフォースアタック) に弱いというセキュリティ上のリスクがあります。
- 公開鍵認証: 事前に生成した鍵ペア(秘密鍵と公開鍵)を使って認証します。パスワード認証よりもはるかにセキュアで、総当たり攻撃に強く、サーバー側でパスワードログイン自体を禁止できるため、セキュリティリスクを大幅に低減できます。
実運用では、公開鍵認証の利用が強く推奨されます。
公開鍵認証では、クライアントPCに秘密鍵、接続先サーバーに公開鍵をそれぞれ配置します。
1. 鍵ペアの生成(クライアントPC)
まず、あなたのPCで秘密鍵と公開鍵のペアを生成します。
ssh-keygen
実行すると、鍵の保存場所とパスフレーズ(秘密鍵を保護するためのパスワード)の入力を求められます。特に指定がなければEnterキーを押し続けても構いませんが、パスフレーズを設定することを強くお勧めします。これにより、万が一秘密鍵が漏洩しても、不正利用されるリスクを減らせます。
通常、このコマンドで~/.ssh/id_rsa
(秘密鍵)と~/.ssh/id_rsa.pub
(公開鍵)が生成されます。
2. 公開鍵の設置(サーバー)
生成した公開鍵(id_rsa.pub
)を接続先のサーバーに設置します。最も簡単な方法はssh-copy-id
コマンドを使用することです。
ssh-copy-id ユーザー名@ホスト名またはIPアドレス
このコマンドは、サーバーに接続して公開鍵をサーバーの~/.ssh/authorized_keys
ファイルに自動で追加してくれます。一度パスワード認証でログインする必要があるので、パスワード認証が有効な状態で行います。
ssh-copy-id
がない場合や手動で行う場合は、以下の手順で公開鍵をサーバーに設置します。
-
クライアントPCで公開鍵の内容を表示します。
cat ~/.ssh/id_rsa.pub
-
表示された公開鍵の内容をコピーします。
-
サーバーにログインし、
.ssh
ディレクトリが存在しない場合は作成します。mkdir -p ~/.ssh
-
.ssh
ディレクトリのパーミッションを適切に設定します。所有者以外からのアクセスを禁止するため、700
に設定することが重要です。chmod 700 ~/.ssh
-
コピーした公開鍵の内容を
~/.ssh/authorized_keys
ファイルに追記します。echo "ここにコピーした公開鍵の内容を貼り付ける" >> ~/.ssh/authorized_keys
-
authorized_keys
ファイルのパーミッションを適切に設定します。所有者のみが読み書きできるように600
に設定することが重要です。chmod 600 ~/.ssh/authorized_keys
補足:
authorized_keys
ファイルの所有者がユーザー本人であることを確認してください(ls -l ~/.ssh/authorized_keys
で確認できます)。もし異なる場合はsudo chown ユーザー名:グループ名 ~/.ssh/authorized_keys
などで修正してください。
3. 接続
公開鍵認証の設定が完了すれば、次回以降はパスワードの入力なしで接続できるようになります(鍵生成時にパスフレーズを設定した場合はその入力が必要です)。
ssh ユーザー名@ホスト名またはIPアドレス
【ワンポイント】パスワードログインの禁止
公開鍵認証が機能していることを確認できたら、サーバーのSSH設定ファイル(/etc/ssh/sshd_config
)を編集してパスワード認証を無効にすることで、セキュリティをさらに強化できます。
sudo vi /etc/ssh/sshd_config
以下の行を見つけてコメントアウトを外し、no
に設定します。
#PasswordAuthentication yes ← この行を以下のように変更
PasswordAuthentication no
変更を保存したら、SSHサービスを再起動します。
sudo systemctl restart sshd
この設定は、公開鍵認証で正常にログインできることを確認してから行ってください。 また、重要な設定変更時は、別のSSHセッションを開いたまま作業するか、可能であればローカルのKVM/コンソールから作業するなど、SSHで入れなくなるリスクを避けるための対策をとりましょう。
-
SSH接続がタイムアウトする/接続できない
- サーバーのIPアドレスやホスト名が正しいか再確認しましょう。
- サーバーが起動しているか確認しましょう。
- ファイアウォール(サーバー側、クライアント側、またはネットワーク機器)でSSHのポート(デフォルトは22番)がブロックされていないか確認しましょう。
-
パスワードが認証されない
- 入力しているユーザー名とパスワードが正しいか再確認しましょう。
- Caps Lockがオンになっていないか確認しましょう。
-
秘密鍵のパーミッションエラー
秘密鍵のパーミッションが緩すぎると、以下のようなエラーが表示されることがあります。
Permissions 0644 for '/home/user/.ssh/id_rsa' are too open.
この場合は、秘密鍵のパーミッションを所有者のみが読み書きできる
600
に設定し直します。chmod 600 ~/.ssh/id_rsa
-
サーバー側の公開鍵認証エラー(
Permission denied (publickey).
)サーバーに公開鍵を設置したにもかかわらず、公開鍵認証でログインできない場合、サーバー側の
.ssh
ディレクトリやauthorized_keys
ファイルのパーミッション、または所有者が正しくないことが主な原因です。詳細なエラー理由を確認するには、サーバー側のシステムログを確認するのが有効です。
- Ubuntu/Debian系:
/var/log/auth.log
- CentOS/RHEL系:
/var/log/secure
これらのログファイルにエラーメッセージが出力されている場合があります。
- Ubuntu/Debian系:
-
「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」と表示された場合
サーバーの再構築やIPアドレス変更などで、クライアントPCに保存されているサーバーのフィンガープリントと実際のサーバーのフィンガープリントが一致しない場合にこのエラーが出ます。
その場合は、クライアント側の
~/.ssh/known_hosts
ファイルから、該当するホストの情報を削除します。ssh-keygen -R ホスト名またはIPアドレス
このコマンドを実行すると、該当するホストのknown_hostsエントリが削除され、次回接続時に新しいフィンガープリントを登録し直すことができます。
特定の秘密鍵を使い分けたい場合(-i
オプション)
SSHコマンドの-i
オプションで、使用する秘密鍵ファイルを明示的に指定できます。複数のサーバーで異なる鍵を使っていたり、新しい鍵を試したい場合に便利です。
ssh -i ~/.ssh/your_private_key ユーザー名@ホスト名またはIPアドレス
SSH接続に特定ポートを使う例(-p
オプション)
SSHのデフォルトポートは22番ですが、セキュリティ向上のために他のポート番号に変更して運用することもあります。その場合、接続時に-p
オプションでポート番号を指定します。
ssh -p 12345 ユーザー名@ホスト名またはIPアドレス
SSHは、Linuxサーバーを安全かつ効率的にリモート操作するための基本中の基本です。パスワード認証の仕組みを理解しつつ、より強固なセキュリティを提供する公開鍵認証を積極的に利用することが、安全なサーバー運用への第一歩となります。今回ご紹介した基本的なコマンドやトラブルシューティングの知識をぜひ活用してみてください。
この記事がSSHによるリモート接続について理解を深める一助となれば幸いです。
ご覧いただきありがとうございました。
次回はcrontabで定期実行ジョブを登録する方法について解説します。