新サーバの最初の作業:SSH 公開鍵認証を設定する の番外編です。
鍵認証の手順どおりにやったのに「なんか繋がらない」「鍵は作ったけど、どのファイルがどこで読まれているのか分からない」——SSH でつまずくときの原因は、ほぼ次の3つに集約されます。
ssh(クライアント)とsshd(サーバ)を混同している- 鍵ファイルを置く場所・読まれる仕組みを理解していない
~/.sshの権限と所有者が正しくない
この記事は手順書ではなく、**「仕組みを理解して、繋がらないときに自力で原因を切り分けられるようになる」**ことを目的にしています。
コマンド例は Rocky Linux 9 / OpenSSH を前提にしていますが、考え方は他のディストリ・macOS でもほぼ共通です。
1. まず:ssh と sshd は別物
ここが一番の躓きポイントです。名前は似ていますが、役割も・動くマシンも・読むファイルも違います。
ssh | sshd | |
|---|---|---|
| 正体 | クライアント(接続しに行くコマンド) | サーバ(デーモン)(接続を待ち受ける常駐プロセス) |
| 動く場所 | 手元のPC(接続元) | 接続先のサーバ |
| 起動のしかた | 人が ssh ... と打つ都度 | systemd で常駐(sshd.service) |
| 主な設定 | ~/.ssh/config | /etc/ssh/sshd_config |
| 鍵で使うもの | 秘密鍵(id_ed25519) | 公開鍵(authorized_keys) |
flowchart LR
subgraph 手元PC["手元のPC(接続元)"]
A["ssh コマンド<br/>~/.ssh/config<br/>秘密鍵 id_ed25519"]
end
subgraph サーバ["接続先サーバ"]
B["sshd デーモン<br/>/etc/ssh/sshd_config<br/>公開鍵 ~/.ssh/authorized_keys"]
end
A -- "TCP 22番ポート" --> B覚え方は単純で、末尾の d は daemon(常駐サービス)。sshd はサーバ側で待ち受ける番人、ssh は手元から訪ねていく訪問者です。「サーバ側の設定を直したいのに、手元の ~/.ssh/config をいじっていた」という取り違えが本当に多いです。
2. クライアント側(ssh)が読むファイル
手元で ssh user@host と打つと、ssh は次のファイルを順に見ます。すべて接続元PCの ~/.ssh/ にあります。
~/.ssh/ # 手元PC側 ├── config # 接続先ごとの設定(Host エイリアス) ├── id_ed25519 # 秘密鍵(絶対に外に出さない) ├── id_ed25519.pub # 公開鍵(サーバに登録する元データ) └── known_hosts # 接続したサーバの指紋を記録
2-1. ~/.ssh/config — 接続先ごとの設定
毎回 -i や -p を打たなくて済むよう、接続先を名前で定義しておけます。
Host myserver
HostName 192.168.1.10
User alice
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yesこれで ssh myserver だけで繋がります。
| ディレクティブ | 意味 |
|---|---|
HostName | 実際の接続先(IP / FQDN) |
User | ログインユーザ名 |
Port | 接続先ポート(sshd 側と一致させる) |
IdentityFile | 使う秘密鍵を明示 |
IdentitiesOnly yes | 指定した鍵だけを試す(後述のトラブル防止に重要) |
2-2. どの秘密鍵が使われるのか
鍵を指定しないと、ssh は デフォルト名の鍵(id_ed25519 → id_ecdsa → id_rsa …)を順に試し、さらに ssh-agent に登録された鍵も総当たりします。
「鍵をたくさん持っているのに繋がらない」の典型がこれです。SSH サーバには「1接続で試せる認証回数(MaxAuthTries、既定6)」の上限があり、登録済みの鍵を片っ端から試すうちに正しい鍵に辿り着く前に Too many authentication failures で蹴られることがあります。IdentityFile + IdentitiesOnly yes で使う鍵を1つに絞ると回避できます。
2-3. known_hosts — サーバの指紋
初回接続時に出る「The authenticity of host ... can't be established」で yes と答えると、サーバの公開鍵指紋が known_hosts に記録されます。サーバを再インストールすると指紋が変わり、次回 REMOTE HOST IDENTIFICATION HAS CHANGED! の警告が出ます。正当な再構築だと分かっている場合だけ、古い行を削除します。
ssh-keygen -R 192.168.1.103. サーバ側(sshd)が読むファイル
接続を受ける側の設定です。接続先サーバの /etc/ssh/ にあります。
/etc/ssh/
├── sshd_config # サーバ本体の設定
└── sshd_config.d/ # 分割設定(*.conf を読み込む)
└── 50-redhat.conf # ディストリ既定(RHEL系)
3-1. sshd_config と分割ファイルの読み込み順
最近の Rocky / RHEL 系は、sshd_config の冒頭に次の一行があり、sshd_config.d/*.conf を先に読み込みます。
# 冒頭付近
Include /etc/ssh/sshd_config.d/*.confSSH では原則「最初に出てきた設定値が勝ち」です。Include が先頭にあるため、sshd_config.d/ 内のファイル(例: 50-redhat.conf)の値が、sshd_config 本体に後から書いた同じ項目を上書きしてしまうことがあります。「sshd_config を直したのに反映されない」ときは、sshd_config.d/ の中身を必ず確認してください。
3-2. 実際に効いている設定を確認する(最重要コマンド)
ファイルを目で追うより、sshd が解釈した最終的な値を出すのが確実です。
sudo sshd -T | grep -Ei 'port|passwordauthentication|pubkeyauthentication|permitrootlogin|authorizedkeysfile|strictmodes'port 22
permitrootlogin prohibit-password
pubkeyauthentication yes
passwordauthentication no
authorizedkeysfile .ssh/authorized_keys
strictmodes yes| 項目 | 意味 |
|---|---|
pubkeyauthentication yes | 公開鍵認証が有効 |
passwordauthentication | パスワード認証の可否 |
permitrootlogin prohibit-password | root は鍵のみ許可(パスワード不可) |
authorizedkeysfile | 公開鍵を探す場所(既定 .ssh/authorized_keys) |
strictmodes yes | 権限が緩い .ssh を拒否(後述の最重要ポイント) |
3-3. AuthorizedKeysFile — サーバが公開鍵を探す場所
既定値 authorizedkeysfile .ssh/authorized_keys は、ログインしようとするユーザのホームディレクトリからの相対パスです。つまり alice でログインするなら:
/home/alice/.ssh/authorized_keysこのファイルに、手元の公開鍵(id_ed25519.pub の中身)が1行ずつ入っていて、接続時に手元の秘密鍵と照合されます。
4. 公開鍵認証は結局どう照合されるのか
「秘密鍵と公開鍵をどこに置けば、どのサービスがどう読むのか」を一枚にまとめると、こうなります。
sequenceDiagram
participant C as ssh(手元PC)
participant S as sshd(サーバ)
C->>C: ~/.ssh/config を読み、使う秘密鍵を決定
C->>S: 22番ポートへ接続、「この公開鍵で入りたい」と提示
S->>S: /home/ユーザ/.ssh/authorized_keys に<br/>その公開鍵があるか探す
S->>C: あった→「秘密鍵を持ってる証明をして」と乱数を送る
C->>C: 手元の秘密鍵 id_ed25519 で署名
C->>S: 署名を返す
S->>S: authorized_keys の公開鍵で署名を検証
S->>C: 検証OK → ログイン許可ポイントは、秘密鍵はサーバに渡らないことです。サーバへ置くのは公開鍵だけ。秘密鍵は手元から一歩も出ず、「持っていることの証明(署名)」だけがやり取りされます。
| 鍵 | 置く場所 | 読むサービス |
|---|---|---|
秘密鍵 id_ed25519 | 手元PC ~/.ssh/ | ssh(クライアント) |
公開鍵 id_ed25519.pub の中身 | サーバ ~/.ssh/authorized_keys | sshd(サーバ) |
5. 繋がらない原因の筆頭:~/.ssh の権限と所有者
ここが**「鍵は正しいのに弾かれる」の最頻出原因です。sshd は StrictModes yes(既定)のとき、.ssh や鍵ファイルの権限が緩い/所有者が違うと、認証情報を読まずに拒否**します。セキュリティ上わざとそうなっています。
5-1. 正しい権限・所有者の一覧
ユーザ alice の例(所有者は本人、グループ・その他には書き込ませない)。
/home/alice/ # 700 または 750、所有者 alice
└── .ssh/ # 700 (drwx------) 所有者 alice
├── authorized_keys # 600 (-rw-------) 所有者 alice
├── id_ed25519 # 600 (-rw-------) 所有者 alice(手元PC側)
├── id_ed25519.pub # 644 (-rw-r--r--)
└── known_hosts # 644 (-rw-r--r--)
| 対象 | 権限 | コマンド |
|---|---|---|
~/.ssh ディレクトリ | 700 | chmod 700 ~/.ssh |
authorized_keys | 600 | chmod 600 ~/.ssh/authorized_keys |
秘密鍵 id_ed25519 | 600 | chmod 600 ~/.ssh/id_ed25519 |
公開鍵 .pub | 644 | chmod 644 ~/.ssh/id_ed25519.pub |
ホーム /home/alice | 750 以下(他者書込不可) | chmod 750 /home/alice |
意外な盲点がホームディレクトリ自体の権限です。/home/alice が 777 のように他人から書き込める状態だと、.ssh の中身が正しくても sshd は認証を拒否します(横から authorized_keys を差し替えられる余地があるため)。drwx------ や drwxr-x--- が無難です。
5-2. 所有者を正す
root で作業して .ssh を作ってしまった等で所有者がズレていると、これも拒否されます。本人所有に直します。
sudo chown -R alice:alice /home/alice/.ssh5-3. まとめて正す定番コマンド
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/*.pub 2>/dev/null
chown -R "$(id -un):$(id -gn)" ~/.ssh5-4. Rocky / RHEL 系は SELinux のラベルも
権限・所有者が完璧なのに繋がらない場合、SELinux のファイルラベルがずれている可能性があります(バックアップから .ssh を復元した・別の場所から mv した等で起きがち)。正しいラベルへ戻します。
restorecon -Rv ~/.ssh/var/log/audit/audit.log に avc: denied が出ていれば SELinux が原因です。sudo ausearch -m avc -ts recent で直近の拒否を確認できます。
6. 「なんか繋がらない」を切り分ける
仕組みが分かれば、ログを見て原因を特定できます。クライアント側とサーバ側、両方のログを見るのがコツです。
6-1. クライアント側:-v で詳細表示
ssh -v myserver-v(さらに -vv -vvv)で、どの鍵を試したか・どの認証方式で蹴られたかが見えます。
| 出力に出る行 | 読み取れること |
|---|---|
Offering public key: ... | その鍵を提示した |
Authentications that can continue: publickey | サーバは公開鍵を要求している(パスワードは無効) |
Permission denied (publickey) | 公開鍵認証に失敗(鍵 or authorized_keys or 権限) |
Connection timed out | そもそも届いていない(FW / ポート / 経路) |
6-2. サーバ側:sshd のログ
サーバ側では systemd ジャーナルに理由が出ます。
sudo journalctl -u sshd -n 50 --no-pagerAuthentication refused: bad ownership or modes for directory /home/alice/.sshこの bad ownership or modes がまさに 5章の権限・所有者問題のサインです。
6-3. 症状別の早見表
| 症状 | 主な原因 | 見るところ |
|---|---|---|
Connection timed out | 届いていない | ファイアウォール / ポート / 経路(ssh -v で stuck する箇所) |
Connection refused | sshd が起きていない / ポート違い | systemctl status sshd、Port 設定 |
Permission denied (publickey) | 鍵 or 権限 or 所有者 | journalctl -u sshd、~/.ssh の権限 |
| パスワードを聞かれてしまう | 鍵認証が成立せずパスワードにフォールバック | ssh -v の Offering public key、authorized_keys の中身 |
| 設定変更が効かない | sshd_config.d/ が上書き | sudo sshd -T で最終値を確認 |
sshd_config を編集したら、再起動の前に必ず構文チェックを。文法ミスのまま反映すると sshd が起動できず、締め出される恐れがあります。
sudo sshd -t && sudo systemctl reload sshdそして現在のSSHセッションは閉じず、別ターミナルでログインを確認してからログアウトしてください。
まとめ
ssh と sshd を区別する
ssh=手元のクライアント、sshd=サーバの常駐デーモン。直すべき設定がどっち側か常に意識する。
鍵の置き場所を理解する
秘密鍵は手元の ~/.ssh/、公開鍵はサーバの ~/.ssh/authorized_keys。秘密鍵はサーバに渡らない。
権限と所有者を疑う
~/.ssh=700、authorized_keys=600、所有者は本人、ホームは他者書込不可。StrictModes が緩い設定を拒否する。
ログで切り分ける
手元は ssh -v、サーバは journalctl -u sshd。設定の最終値は sudo sshd -T。
「なんとなく鍵を作って authorized_keys にコピーしたら繋がった」で止めず、どのファイルを誰が読んでいるかを一度きちんと把握しておくと、繋がらないときの不安がぐっと減ります。
基本の設定手順は 新サーバの最初の作業:SSH 公開鍵認証を設定する を、初期化直後にうまく繋がらない Kagoya 特有の現象は Kagoyaでサーバを初期化するとSSHが繋がらない問題 もあわせてどうぞ。


