「毎回パスワードを入力するのが面倒。鍵認証に切り替えたい」
「Permission denied (publickey) と表示されて接続できない」
SSHはLinuxサーバーをリモートで操作するための必須技術です。パスワード認証のままだと、ブルートフォース攻撃(総当たり攻撃)の標的になります。
この記事では、SSHの基本的な接続方法から、ssh-keygenによる鍵認証の設定、~/.ssh/configファイルによる接続の効率化、セキュリティ強化まで、実務で必要な知識を網羅します。
実行環境:Ubuntu 24.04 LTS / Rocky Linux 9.4 / WSL2(Windows)で動作確認済み
この記事のポイント
・ssh-keygen -t ed25519 でED25519鍵ペアを作成し、ssh-copy-idでサーバーへ公開鍵を登録する
・~/.ssh/configにHost定義を書くと短い名前だけで複数サーバーへ接続を効率化できる
・PasswordAuthentication no・PermitRootLogin noでブルートフォース攻撃を防ぐ
・「Permission denied (publickey)」はssh -vのデバッグログとパーミッション確認で解決できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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鍵認証の設定
鍵認証は、パスワードの代わりに「秘密鍵」と「公開鍵」のペアで認証する方式です。仕組みを一言で表すなら「南京錠(公開鍵)と鍵(秘密鍵)」のイメージです。公開鍵はサーバーに預けておき(南京錠をかけておく)、接続時にその南京錠を開けられる秘密鍵を自分のPCが持っているかを検証します。パスワードをネットワーク越しに送らないため、盗聴・総当たり攻撃に強い認証方式です。| 比較項目 | パスワード認証 | 公開鍵認証 |
|---|---|---|
| 利便性 | 毎回入力が必要 | 設定後はパスワード不要 |
| セキュリティ | 総当たり攻撃に弱い | 秘密鍵がないと侵入不可 |
| 自動化 | スクリプト組み込みが難しい | CI/CD・cron連携が容易 |
| 推奨場面 | 初期アクセス時のみ | 本番VPS・クラウド推奨 |
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 The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com
・-C:コメント。どの鍵かを識別するためのメモ(省略可)
・パスフレーズ:秘密鍵を暗号化する追加パスワード。空にすることもできるが、セキュリティ上は設定を推奨。自動化スクリプト専用の鍵はパスフレーズなしが一般的
ED25519に対応していない古い環境では、RSA 4096bitを使います。
# RSA形式(古い環境向け) ssh-keygen -t rsa -b 4096
~/.ssh/に2つのファイルができます。公開鍵の内容を確認しておきましょう。$ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGxxxxxxxxxxxxxxxxxxxxxyyyyyyy your_email@example.com
2. 公開鍵をサーバーに登録する(ssh-copy-id)
作成した公開鍵を、接続先サーバーの ~/.ssh/authorized_keys に登録します。ssh-copy-idコマンドを使えば自動で登録できます。# 公開鍵をサーバーにコピー(最も簡単な方法) ssh-copy-id user@192.168.1.100 # 鍵ファイルを明示する場合 ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.100 # ポート番号を指定する場合 ssh-copy-id -p 2222 user@192.168.1.100
ssh-copy-idが使えない環境では、手動で登録します。
Step 1:サーバーにログインして.sshディレクトリを作成する
# サーバー上で実行する $ ssh user@192.168.1.100 # パスワードでログイン $ mkdir -p ~/.ssh $ chmod 700 ~/.ssh
# 自分のPCで実行する(別のターミナルで) $ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGxxxxxxxxxxxxxxxxxxxxxyyyyyyy your_email@example.com
# サーバー上で実行する $ nano ~/.ssh/authorized_keys # コピーした公開鍵を貼り付けて保存(Ctrl+X → Y → Enter) # 権限を設定する(重要) $ chmod 600 ~/.ssh/authorized_keys
3. 鍵認証で接続する
公開鍵の登録が完了すれば、パスワードなしで接続できます。# 鍵認証で接続(パスフレーズのみ求められる) ssh user@192.168.1.100 # 秘密鍵を明示的に指定する場合 ssh -i ~/.ssh/id_ed25519 user@192.168.1.100
4. ssh-agentでパスフレーズの入力を省略する
パスフレーズを設定した鍵を使う場合、毎回入力するのが手間です。ssh-agentにパスフレーズを一時的に記憶させることで、セッション中は入力を省略できます。# ssh-agentを起動する eval "$(ssh-agent -s)" Agent pid 12345 # 秘密鍵をエージェントに登録する ssh-add ~/.ssh/id_ed25519 Enter passphrase for /home/user/.ssh/id_ed25519: [パスフレーズを1回だけ入力] Identity added: /home/user/.ssh/id_ed25519 (your_email@example.com) # 登録済みの鍵を確認する ssh-add -l 256 SHA256:xxxxxxxxxxxxxxxxxx your_email@example.com (ED25519)
【重要】パーミッションの設定
SSH鍵認証が動作するには、ファイルのパーミッションが正しく設定されている必要があります。パーミッションが緩すぎると、SSHは鍵を無視してパスワード認証にフォールバックします。まず ls -la で現在の状態を確認しましょう。以下のような出力が正常な状態です。
# 鍵ファイルのパーミッションを確認 ls -la ~/.ssh/ # 正常な出力例 drwx------. 2 user user 38 Jun 22 09:00 . drwx------. 5 user user 128 Jun 22 09:00 .. -rw-------. 1 user user 419 Jun 22 09:00 id_ed25519 -rw-r--r--. 1 user user 99 Jun 22 09:00 id_ed25519.pub -rw-------. 1 user user 571 Jun 22 09:00 authorized_keys
・id_ed25519.pub(公開鍵):-rw-r--r-- (644) — 他者も読める状態でOKです
・.ssh ディレクトリ:drwx------ (700) — 自分だけがアクセスできる状態が必須です
パーミッションが正しくない場合は以下で修正してください。
# 自分のPC側(接続元) 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 # GitHubとの接続(参考) Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519
chmod 600 ~/.ssh/config
# configに定義した名前で接続 ssh web01 ssh db01 # scpやrsyncでも同じ名前が使える scp backup.tar.gz web01:/tmp/ rsync -av /data/ db01:/backup/
・Host:接続に使うエイリアス名
・HostName:実際のIPアドレスまたはドメイン名
・User:ログインユーザー名
・IdentityFile:使用する秘密鍵のパス
・Port:SSHポート番号(デフォルト22)
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 # yesをnoに変更 PubkeyAuthentication yes # yesになっていることを確認 # 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
確認チェックリスト:
・
~/.ssh/の権限が700(drwx------)になっているか・
~/.ssh/authorized_keysの権限が600(-rw-------)になっているか・
authorized_keysに登録した公開鍵が正確にコピーできているか(改行が入っていないか)・
/etc/ssh/sshd_configにPubkeyAuthentication yesが設定されているか・接続時に正しい秘密鍵ファイルを使っているか(
-iオプションで明示指定して試す)「WARNING: UNPROTECTED PRIVATE KEY FILE!」が出た場合
秘密鍵ファイルの権限が広すぎる場合に表示されます。chmod 600で修正します。@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open.
# 自分のPCで実行する chmod 600 ~/.ssh/id_ed25519
「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
WSL2環境で「Bad permissions」が出る場合
WSL2でWindowsのファイルシステム(/mnt/c/ など)に鍵ファイルを置いている場合に発生します。# エラーメッセージの例 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0777 for '/mnt/c/Users/user/.ssh/id_ed25519' are too open.
# ~/.ssh/ がLinux側のホームディレクトリにあることを確認 echo $HOME # 表示例: /home/user ← /mnt/c/ 配下でなければOK ls -la ~/.ssh/ # drwx------ (700) であること
| エラー | 主な原因 | 対処法 |
|---|---|---|
| Permission denied (publickey) | 権限設定が間違い / 鍵が未登録 | chmod 700/600の確認・authorized_keys再確認 |
| UNPROTECTED PRIVATE KEY | 秘密鍵の権限が広すぎる | chmod 600 ~/.ssh/id_ed25519 |
| REMOTE HOST IDENTIFICATION HAS CHANGED | サーバーの鍵が変わった | ssh-keygen -R ホスト名でknown_hostsを削除 |
| Connection timed out | ネットワーク疎通なし | pingでIPアドレス確認、ファイアウォール設定確認 |
| Connection refused | sshdが停止している | sudo systemctl status sshdで確認 |
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| サーバーにSSH接続する | ssh ユーザー名@ホスト名 |
| ポート番号を指定して接続する | ssh -p ポート番号 ユーザー名@ホスト名 |
| SSH鍵ペアを作成する | ssh-keygen -t ed25519 |
| 公開鍵をサーバーに登録する | ssh-copy-id ユーザー名@ホスト名 |
| 秘密鍵を指定して接続する | ssh -i 鍵ファイルパス ユーザー名@ホスト名 |
| パスフレーズをエージェントに登録する | ssh-add ~/.ssh/id_ed25519 |
| 鍵ファイルのパーミッションを確認する | ls -la ~/.ssh/ |
| 接続の詳細ログを表示する | ssh -v ユーザー名@ホスト名 |
| known_hostsのエントリを削除する | ssh-keygen -R ホスト名 |
| リモートでコマンドを実行する | ssh ユーザー名@ホスト名 コマンド |
関連記事
この記事と関連性の高い記事をまとめました。あわせて読むことで理解が深まります。・SSHのポート番号を変更する方法|sshd_configの設定からfirewalld・SELinux対応まで
・scpコマンドでLinuxサーバー間のファイル転送を安全に行う方法
SSHの鍵認証、設定できましたか?
鍵認証やsshd_configの設定は、Linuxサーバー運用の基本中の基本です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 次のページへ:yum・dnfコマンドでパッケージを管理する方法|インストールからリポジトリ設定まで
- 前のページへ:CentOS(Linux)にPythonをインストール(Python2_Python3)
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます