SSHの接続方法と鍵認証の設定|ssh-keygenからconfig活用まで

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「LinuxサーバーにSSHで接続したいけど、鍵認証の設定がよくわからない」
「毎回パスワードを入力するのが面倒。鍵認証に切り替えたい」
「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のデバッグログとパーミッション確認で解決できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

初回接続時は「このサーバーを信頼しますか?」という確認が表示されます。yesと入力すると、サーバーの公開鍵が ~/.ssh/known_hosts に保存されます。

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

-t ed25519:鍵の暗号アルゴリズムを指定。ED25519はRSAより短い鍵長で同等以上の強度があり、現在の推奨
-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

「ssh-ed25519 AAAA...」から始まる1行が公開鍵です。次の手順でサーバーに登録します。

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

「Number of key(s) added: 1」と表示されれば登録完了です。

ssh-copy-idが使えない環境では、手動で登録します。

Step 1:サーバーにログインして.sshディレクトリを作成する

# サーバー上で実行する $ ssh user@192.168.1.100 # パスワードでログイン $ mkdir -p ~/.ssh $ chmod 700 ~/.ssh

Step 2:自分のPCで公開鍵の内容を確認してコピーする

# 自分のPCで実行する(別のターミナルで) $ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGxxxxxxxxxxxxxxxxxxxxxyyyyyyy your_email@example.com

Step 3:サーバー上でauthorized_keysに貼り付ける

# サーバー上で実行する $ 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(秘密鍵):-rw------- (600) — 自分だけが読み書きできる状態が正常です
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

configファイルの権限も設定しておきましょう(600が必須)。

chmod 600 ~/.ssh/config

これで、以下のように短い名前だけで接続できます。

# configに定義した名前で接続 ssh web01 ssh db01 # scpやrsyncでも同じ名前が使える scp backup.tar.gz web01:/tmp/ rsync -av /data/ db01:/backup/

configの主な設定項目:
Host:接続に使うエイリアス名
HostName:実際のIPアドレスまたはドメイン名
User:ログインユーザー名
IdentityFile:使用する秘密鍵のパス
Port:SSHポート番号(デフォルト22)

2. 全ホスト共通の設定

Host * で全接続先に共通のデフォルト設定を指定できます。

# ~/.ssh/config(先頭に記述) Host * ServerAliveInterval 60 ServerAliveCountMax 3 IdentitiesOnly yes

ServerAliveInterval 60:60秒ごとにサーバーへ生存確認を送信(無操作タイムアウト防止)
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

-v(verbose)オプションで接続の詳細が表示されます。どの鍵を試しているか、どこで拒否されたかがわかります。さらに詳しくするには -vv や -vvv を使います。

確認チェックリスト:
~/.ssh/の権限が700(drwx------)になっているか
~/.ssh/authorized_keysの権限が600(-rw-------)になっているか
authorized_keysに登録した公開鍵が正確にコピーできているか(改行が入っていないか)
/etc/ssh/sshd_configPubkeyAuthentication 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

ただし、このメッセージは中間者攻撃(MITM)の可能性もあるため、サーバーの変更に心当たりがない場合はサーバー管理者に確認してください。

「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.

鍵ファイルはWindowsのファイルシステムではなく、LinuxのホームディレクトリにあるLinux側のファイルシステム(~/.ssh/)に置いてください。

# ~/.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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。