できない.dev

SSH で「Permission denied (publickey)」が出て接続できない

鍵は作ったのに publickey で蹴られるのは、サーバー側が公開鍵を見つけられていないか、パーミッションが緩くて採用を拒否しているかのどちらかである。
ユーザー名・鍵の対応・authorized_keys の権限を順に切り分ける。

公開:

要約

Permission denied (publickey). は「公開鍵認証だけが許可されていて、その公開鍵認証に失敗した」という意味である。
パスワードを聞かれずに即座に蹴られるため設定が丸ごと無視されたように見えるが、実際にはサーバーが鍵を受け付けなかっただけである。

原因は大きく 2 つしかない。
サーバー側が該当ユーザーの authorized_keys に手元の公開鍵を見つけられていないか、見つけたが権限が緩いので採用を拒否したかである。
切り分けは ssh -v の出力から始める。

$ ssh -v user@example.com
debug1: Offering public key: /home/me/.ssh/id_ed25519 ED25519 SHA256:xxxx
debug1: Authentications that can continue: publickey
Permission denied (publickey).

Offering public key が 1 行も出ていなければ手元の問題、出ているのに蹴られていればサーバー側の問題である。

よくある原因

  1. ユーザー名の間違い: SSH は接続先ユーザーのホーム配下の authorized_keys しか見ない。ubuntu@ で作ったサーバーに root@ で入ろうとすれば、鍵が正しくても該当する公開鍵は見つからない。
  2. 鍵が試されていない: 既定のファイル名(id_ed25519id_rsa など)以外に置いた鍵は、-iIdentityFile で指定しない限り提示されない。
  3. 登録した中身が違う: authorized_keys に貼るのは .pub の中身である。
    秘密鍵を貼っている、またはコピー時に折り返されて複数行になっていると一致しない。
  4. パーミッションが緩い: sshd(8)(新しいタブで開く) は、authorized_keys~/.ssh・ホームディレクトリが他ユーザーから書き込み可能な場合、StrictModesno でない限りその鍵を使わせない。
    第三者に書き換えられる場所の鍵を信用しない、という設計である。
  5. サーバー側で無効: sshd_configPubkeyAuthentication no、あるいは AllowUsers / AllowGroups で対象ユーザーが除外されている。

解決策

1. どの鍵が提示されたかを見る

ssh -v user@example.com 2>&1 | grep -E "Offering|Authentications|Server accepts"

提示すらされていないなら鍵の指定が届いていない。
提示されて蹴られているならサーバー側を見る。

2. 公開鍵を正しく登録する

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@example.com

手作業で貼る場合は、.pub の中身を 1 行のまま 追記する。

cat ~/.ssh/id_ed25519.pub | ssh user@example.com 'cat >> ~/.ssh/authorized_keys'

3. パーミッションを直す

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod go-w ~

ホームディレクトリが drwxrwxr-x のようにグループ書き込み可になっていると、それだけで弾かれる。

4. 使う鍵を接続先ごとに固定する

# ~/.ssh/config
Host example
  HostName example.com
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes

IdentitiesOnly yes を付けると、エージェントに載っている無関係な鍵を先に試して回数制限に達する事故を防げる(ssh_config(5)(新しいタブで開く))。

この記事は役立ちましたか?