1.

【GCP/GCE】SSHでPermission denied (publickey).

この記事の要点
  • GCE(Compute Engine)の VM に SSH したとき、サーバー側が公開鍵での認証を受け入れなかったことを示すエラー
  • GCE はメタデータに登録した公開鍵の末尾のユーザー名で Linux ユーザーを作る。接続時のユーザー名と一致しないと失敗する
  • Windows で鍵を作ると、コメント(ユーザー名部分)に日本語の PC ユーザー名が入り、うまく登録されないことがある → ssh-keygen -C ユーザー名 でローマ字を指定する
  • OS Login が有効だとメタデータの鍵は使われない。どちらの方式かを先に確認する
  • 迷ったら gcloud compute ssh を使うと、鍵の作成と登録を自動でやってくれる

エラー内容

user@203.0.113.10: Permission denied (publickey).

GCP(Google Cloud)の Compute Engine で作った VM インスタンスに、ターミナルや TeraTerm、PuTTY などの SSH クライアントで接続しようとしたときに表示されます。カッコ内の publickey は「サーバーが受け付ける認証方式は公開鍵認証だけで、その公開鍵認証に失敗した」という意味です。GCE の Linux イメージは初期状態でパスワード認証が無効なので、鍵が合わないと必ずこのエラーになります。

鍵の作成方法と接続方法はこちらのページを参照してください。

原因

GCE では、プロジェクトまたはインスタンスのメタデータに公開鍵を登録すると、VM 内のゲスト環境(エージェント)がその鍵を読み取り、鍵の末尾に書かれたユーザー名で Linux ユーザーを作成して ~/.ssh/authorized_keys に鍵を登録します。コンソールの「SSH 認証鍵」欄に貼り付ける公開鍵は次の形式で、末尾がユーザー名として扱われます。

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... tanaka

この仕組みから、次のような原因が考えられます。

原因確認ポイント
ユーザー名が日本語になっているWindows で ssh-keygen を実行すると、コメントに「PC のユーザー名@コンピューター名」が入る。日本語のユーザー名だと Linux のユーザーとして作成できない
接続時のユーザー名が違うssh ユーザー名@IP のユーザー名が、鍵の末尾のユーザー名と一致しているか。GCE 上に存在しないユーザー名を指定していないか
OS Login が有効メタデータ enable-oslogin が TRUE だと、メタデータの SSH 鍵は無視され、Google アカウントに紐づいた鍵と IAM 権限で認証される
使っている秘密鍵が違う-i で、登録した公開鍵とペアの秘密鍵を指定しているか
秘密鍵のパーミッションが緩いLinux / macOS で秘密鍵が他人から読める権限だと、ssh クライアントが鍵の使用を拒否する(UNPROTECTED PRIVATE KEY FILE の警告)
プロジェクト全体の鍵がブロックされているインスタンスのメタデータ block-project-ssh-keys が TRUE なら、プロジェクトのメタデータに登録した鍵は使われない

対処法

1. ローマ字のユーザー名を指定して鍵を作り直す

鍵の作成時に -C オプションでコメント(= GCE 上のユーザー名)をローマ字で明示します。

ssh-keygen -t ed25519 -f ~/.ssh/gce_key -C tanaka

作成された gce_key.pub の中身(1 行)を、Google Cloud コンソールの「Compute Engine」→ 対象の VM →「編集」→「SSH 認証鍵」に貼り付けて保存します。プロジェクト内のすべての VM で使う場合は「メタデータ」→「SSH 認証鍵」に登録します。

2. 鍵とユーザー名を明示して接続する

chmod 600 ~/.ssh/gce_key
ssh -i ~/.ssh/gce_key tanaka@203.0.113.10

ユーザー名は鍵の末尾に書いたものと同じにします。登録直後は VM 側に反映されるまで数十秒かかることがあります。

3. OS Login を使っている場合

OS Login が有効なプロジェクトでは、メタデータへの鍵登録ではなく、自分の Google アカウントに鍵を登録し、IAM で roles/compute.osLogin(管理者権限が必要なら roles/compute.osAdminLogin)のロールを付与する必要があります。ユーザー名もメールアドレスから自動生成されたもの(例: tanaka_example_com)になります。

gcloud compute os-login ssh-keys add --key-file=$HOME/.ssh/gce_key.pub
gcloud compute os-login describe-profile   # posixAccounts の username を確認

4. gcloud compute ssh を使う

Google Cloud CLI(gcloud)が使えるなら、鍵の作成・登録・ユーザー名の決定をすべて自動で行ってくれる次のコマンドが最も確実です。OS Login の有無にも自動で対応します。

gcloud compute ssh INSTANCE_NAME --zone=asia-northeast1-b

原因を切り分ける方法

  1. OS Login の有効・無効と、登録済みの鍵を確認する
gcloud compute instances describe INSTANCE_NAME --zone=asia-northeast1-b \
  --format="yaml(metadata.items)"
gcloud compute project-info describe --format="yaml(commonInstanceMetadata.items)"
  1. ssh -v で詳細ログを表示し、どの鍵ファイルを試し、サーバーに拒否されたかを確認する(Offering public key の後に拒否されていれば、鍵自体またはユーザー名が合っていない)
  2. それでも分からない場合は、コンソールの「シリアルポート 1(コンソール)」のログで、ゲストエージェントがユーザー作成に失敗していないかを確認する
  3. コンソールの「SSH」ボタン(ブラウザ SSH)で入れる場合は、VM 内で ls -la /home と cat /home/ユーザー名/.ssh/authorized_keys を確認し、ユーザーと鍵が作られているかを見る

関連

Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません