SSH接続の仕組み徹底解説:sshとsshdの違い・どの鍵ファイルをどこに置くか・.ssh の権限と所有者【番外編】

red padlock on black computer keyboard

新サーバの最初の作業:SSH 公開鍵認証を設定する番外編です。

鍵認証の手順どおりにやったのに「なんか繋がらない」「鍵は作ったけど、どのファイルがどこで読まれているのか分からない」——SSH でつまずくときの原因は、ほぼ次の3つに集約されます。

  1. ssh(クライアント)と sshd(サーバ)を混同している
  2. 鍵ファイルを置く場所・読まれる仕組みを理解していない
  3. ~/.ssh の権限と所有者が正しくない

この記事は手順書ではなく、**「仕組みを理解して、繋がらないときに自力で原因を切り分けられるようになる」**ことを目的にしています。

ノート

コマンド例は Rocky Linux 9 / OpenSSH を前提にしていますが、考え方は他のディストリ・macOS でもほぼ共通です。

1. まず:sshsshd は別物

ここが一番の躓きポイントです。名前は似ていますが、役割も・動くマシンも・読むファイルも違います

sshsshd
正体クライアント(接続しに行くコマンド)サーバ(デーモン)(接続を待ち受ける常駐プロセス)
動く場所手元の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 を打たなくて済むよう、接続先を名前で定義しておけます。

~/.ssh/configssh-config
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_ed25519id_ecdsaid_rsa …)を順に試し、さらに ssh-agent に登録された鍵も総当たりします。

注意

「鍵をたくさん持っているのに繋がらない」の典型がこれです。SSH サーバには「1接続で試せる認証回数(MaxAuthTries、既定6)」の上限があり、登録済みの鍵を片っ端から試すうちに正しい鍵に辿り着く前に Too many authentication failures で蹴られることがあります。IdentityFileIdentitiesOnly yes使う鍵を1つに絞ると回避できます。

2-3. known_hosts — サーバの指紋

初回接続時に出る「The authenticity of host ... can't be established」で yes と答えると、サーバの公開鍵指紋が known_hosts に記録されます。サーバを再インストールすると指紋が変わり、次回 REMOTE HOST IDENTIFICATION HAS CHANGED! の警告が出ます。正当な再構築だと分かっている場合だけ、古い行を削除します。

bash
ssh-keygen -R 192.168.1.10

3. サーバ側(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 を先に読み込みます

/etc/ssh/sshd_configsshd_config
# 冒頭付近
Include /etc/ssh/sshd_config.d/*.conf
やってはいけないこと

SSH では原則「最初に出てきた設定値が勝ち」です。Include が先頭にあるため、sshd_config.d/ 内のファイル(例: 50-redhat.conf)の値が、sshd_config 本体に後から書いた同じ項目を上書きしてしまうことがあります。「sshd_config を直したのに反映されない」ときは、sshd_config.d/ の中身を必ず確認してください。

3-2. 実際に効いている設定を確認する(最重要コマンド)

ファイルを目で追うより、sshd が解釈した最終的な値を出すのが確実です。

bash
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-passwordroot は鍵のみ許可(パスワード不可)
authorizedkeysfile公開鍵を探す場所(既定 .ssh/authorized_keys
strictmodes yes権限が緩い .ssh を拒否(後述の最重要ポイント)

3-3. AuthorizedKeysFile — サーバが公開鍵を探す場所

既定値 authorizedkeysfile .ssh/authorized_keys は、ログインしようとするユーザのホームディレクトリからの相対パスです。つまり alice でログインするなら:

text
/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_keyssshd(サーバ)

5. 繋がらない原因の筆頭:~/.ssh の権限と所有者

ここが**「鍵は正しいのに弾かれる」の最頻出原因です。sshdStrictModes 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 ディレクトリ700chmod 700 ~/.ssh
authorized_keys600chmod 600 ~/.ssh/authorized_keys
秘密鍵 id_ed25519600chmod 600 ~/.ssh/id_ed25519
公開鍵 .pub644chmod 644 ~/.ssh/id_ed25519.pub
ホーム /home/alice750 以下(他者書込不可chmod 750 /home/alice
やってはいけないこと

意外な盲点がホームディレクトリ自体の権限です。/home/alice777 のように他人から書き込める状態だと、.ssh の中身が正しくても sshd は認証を拒否します(横から authorized_keys を差し替えられる余地があるため)。drwx------drwxr-x--- が無難です。

5-2. 所有者を正す

root で作業して .ssh を作ってしまった等で所有者がズレていると、これも拒否されます。本人所有に直します。

bash
sudo chown -R alice:alice /home/alice/.ssh

5-3. まとめて正す定番コマンド

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/*.pub 2>/dev/null
chown -R "$(id -un):$(id -gn)" ~/.ssh

5-4. Rocky / RHEL 系は SELinux のラベルも

権限・所有者が完璧なのに繋がらない場合、SELinux のファイルラベルがずれている可能性があります(バックアップから .ssh を復元した・別の場所から mv した等で起きがち)。正しいラベルへ戻します。

bash
restorecon -Rv ~/.ssh
ノート

/var/log/audit/audit.logavc: denied が出ていれば SELinux が原因です。sudo ausearch -m avc -ts recent で直近の拒否を確認できます。

6. 「なんか繋がらない」を切り分ける

仕組みが分かれば、ログを見て原因を特定できます。クライアント側とサーバ側、両方のログを見るのがコツです。

6-1. クライアント側:-v で詳細表示

bash
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 ジャーナルに理由が出ます。

bash
sudo journalctl -u sshd -n 50 --no-pager
出力
Authentication refused: bad ownership or modes for directory /home/alice/.ssh

この bad ownership or modes がまさに 5章の権限・所有者問題のサインです。

6-3. 症状別の早見表

症状主な原因見るところ
Connection timed out届いていないファイアウォール / ポート / 経路(ssh -v で stuck する箇所)
Connection refusedsshd が起きていない / ポート違いsystemctl status sshdPort 設定
Permission denied (publickey)鍵 or 権限 or 所有者journalctl -u sshd~/.ssh の権限
パスワードを聞かれてしまう鍵認証が成立せずパスワードにフォールバックssh -vOffering public keyauthorized_keys の中身
設定変更が効かないsshd_config.d/ が上書きsudo sshd -T で最終値を確認
注意

sshd_config を編集したら、再起動の前に必ず構文チェックを。文法ミスのまま反映すると sshd が起動できず、締め出される恐れがあります。

bash
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が繋がらない問題 もあわせてどうぞ。