「毎回パスワードを入力するのが面倒。鍵認証に切り替えたい」
「Permission denied (publickey) と表示されて接続できない」
SSHはLinuxサーバーをリモートで操作するための必須技術です。パスワード認証のままだと、ブルートフォース攻撃(総当たり攻撃)の標的になります。
この記事では、SSHの基本的な接続方法から、鍵認証の設定、configファイルによる接続の効率化、セキュリティ強化まで、実務で必要な知識を網羅します。
SSHとは?
SSH(Secure Shell)は、ネットワーク越しにサーバーへ安全にログインするためのプロトコルです。通信内容がすべて暗号化されるため、パスワードやコマンドが盗聴される心配がありません。以前使われていたtelnetは通信が平文(暗号化なし)だったため、現在はSSHが標準です。
SSHでできることは主に以下の3つです。
・リモートログイン:サーバーにログインしてコマンドを実行する
・ファイル転送:scp や sftp でファイルを送受信する
・ポートフォワーディング:トンネルを作って別のサービスに安全にアクセスする
基本的な接続方法
1. パスワード認証で接続する
最もシンプルな接続方法です。# ユーザー名@ホスト名(またはIPアドレス)で接続 ssh user@192.168.1.100 # ポート番号を指定する場合(デフォルトは22) ssh -p 2222 user@192.168.1.100
The authenticity of host '192.168.1.100' can't be established. ED25519 key fingerprint is SHA256:xxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
2. コマンドを指定して実行する
ログインせずに、リモートサーバーでコマンドを1つだけ実行して結果を受け取ることもできます。# リモートサーバーのディスク使用量を確認 ssh user@192.168.1.100 df -h # リモートサーバーのログを確認 ssh user@192.168.1.100 tail -20 /var/log/messages
SSH鍵認証の設定
鍵認証は、パスワードの代わりに「秘密鍵」と「公開鍵」のペアで認証する方式です。パスワード認証より安全で、設定後はパスワード入力なしで接続できます。1. 鍵ペアを作成する(ssh-keygen)
まず、クライアント側(接続元のPC)で鍵ペアを作成します。# ED25519形式で鍵を作成(現在の推奨) ssh-keygen -t ed25519 -C "your_email@example.com" Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): # Enterでデフォルト Enter passphrase (empty for no passphrase): # パスフレーズを入力(推奨) Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub
・-C:コメント。どの鍵かを識別するためのメモ(省略可)
・パスフレーズ:秘密鍵を保護するパスワード。空にもできるが、セキュリティ上は設定を推奨
※ ED25519に対応していない古い環境では、RSA 4096bitを使います。
# RSA形式(古い環境向け) ssh-keygen -t rsa -b 4096
2. 公開鍵をサーバーに登録する(ssh-copy-id)
作成した公開鍵を、接続先サーバーの ~/.ssh/authorized_keys に登録します。# 公開鍵をサーバーにコピー(最も簡単な方法) ssh-copy-id user@192.168.1.100 # ポート番号を指定する場合 ssh-copy-id -p 2222 user@192.168.1.100
# 手動で公開鍵を登録する場合 cat ~/.ssh/id_ed25519.pub | ssh user@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
3. 鍵認証で接続する
公開鍵の登録が完了すれば、パスワードなしで接続できます。# 鍵認証で接続(パスフレーズのみ求められる) ssh user@192.168.1.100 # 秘密鍵を明示的に指定する場合 ssh -i ~/.ssh/id_ed25519 user@192.168.1.100
【重要】パーミッションの設定
SSH鍵認証が動作するには、ファイルのパーミッションが正しく設定されている必要があります。パーミッションが緩すぎると、SSHは鍵を無視してパスワード認証にフォールバックします。# クライアント側(接続元) chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 # 秘密鍵 chmod 644 ~/.ssh/id_ed25519.pub # 公開鍵 # サーバー側(接続先) chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
~/.ssh/config で接続を効率化する
毎回ユーザー名やIPアドレス、ポート番号を入力するのは面倒です。~/.ssh/config に接続先の情報を書いておけば、短い名前だけで接続できます。1. configファイルの基本的な書き方
# ~/.ssh/config Host web01 HostName 192.168.1.100 User admin Port 22 IdentityFile ~/.ssh/id_ed25519 Host db01 HostName 192.168.1.200 User dbadmin Port 2222 IdentityFile ~/.ssh/id_ed25519
# configに定義した名前で接続 ssh web01 ssh db01 # scpやrsyncでも同じ名前が使える scp backup.tar.gz web01:/tmp/ rsync -av /data/ db01:/backup/
2. 全ホスト共通の設定
Host * で全接続先に共通のデフォルト設定を指定できます。# ~/.ssh/config(先頭に記述) Host * ServerAliveInterval 60 ServerAliveCountMax 3 IdentitiesOnly yes
・ServerAliveCountMax 3:3回応答がなければ切断
・IdentitiesOnly yes:configで指定した鍵だけを使う(余計な鍵を試さない)
セキュリティ強化の設定
1. パスワード認証を無効にする
鍵認証の設定が完了したら、パスワード認証を無効にしてブルートフォース攻撃を防ぎます。※ 必ず鍵認証で接続できることを確認してから実施してください。
# /etc/ssh/sshd_config を編集 sudo vi /etc/ssh/sshd_config # 以下の行を変更 PasswordAuthentication no # sshdを再起動して反映 sudo systemctl restart sshd
2. rootログインを禁止する
rootで直接SSHログインできる状態はセキュリティリスクです。一般ユーザーでログインしてからsudoを使う運用にしましょう。# /etc/ssh/sshd_config PermitRootLogin no # sshdを再起動 sudo systemctl restart sshd
3. SSHのポート番号を変更する
デフォルトのポート22は攻撃者に狙われやすいため、別のポート番号に変更する方法もあります。# /etc/ssh/sshd_config Port 2222 # sshdを再起動 sudo systemctl restart sshd # firewalldを使っている場合はポートも開放 sudo firewall-cmd --permanent --add-port=2222/tcp sudo firewall-cmd --reload
トラブルシュート・エラー対処
「Permission denied (publickey)」が出た時の対処法
鍵認証の設定に問題がある場合に発生します。以下を順番に確認してください。# 1. パーミッションを確認(サーバー側) ls -la ~/.ssh/ # .ssh は 700、authorized_keys は 600 であること # 2. 公開鍵が正しく登録されているか確認 cat ~/.ssh/authorized_keys # 3. -vオプションで詳細ログを出して原因を特定 ssh -v user@192.168.1.100
「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」が出た時の対処法
サーバーを再インストールした場合や、IPアドレスが別のサーバーに変わった場合に表示されます。# known_hostsから該当ホストのエントリを削除 ssh-keygen -R 192.168.1.100 # 再度接続すると、新しい鍵のフィンガープリントが登録される ssh user@192.168.1.100
「Connection timed out」「Connection refused」が出た時の対処法
# Connection timed out: ネットワーク疎通を確認 ping 192.168.1.100 # Connection refused: sshdが起動しているか確認(サーバー側で実行) sudo systemctl status sshd # ファイアウォールでポートが開いているか確認 sudo firewall-cmd --list-all
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| サーバーにSSH接続する | ssh ユーザー名@ホスト名 |
| ポート番号を指定して接続する | ssh -p ポート番号 ユーザー名@ホスト名 |
| SSH鍵ペアを作成する | ssh-keygen -t ed25519 |
| 公開鍵をサーバーに登録する | ssh-copy-id ユーザー名@ホスト名 |
| 秘密鍵を指定して接続する | ssh -i 鍵ファイルパス ユーザー名@ホスト名 |
| 接続の詳細ログを表示する | ssh -v ユーザー名@ホスト名 |
| known_hostsのエントリを削除する | ssh-keygen -R ホスト名 |
| リモートでコマンドを実行する | ssh ユーザー名@ホスト名 コマンド |
SSH接続の「その先」、サーバー構築を体系的に学びませんか?
SSHでサーバーに接続できるようになったら、次はWebサーバーやファイアウォールの構築です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
