GCEにSSHできなくなったのでログオンの仕組みを少し調べてみた

発端から。先日、Windowsをアップデートしてwsl2を使い始めているのですが、いつも通りgcloudでsshログオンしようとしたら下記のエラーが発生しましたので、ついでにログオンの仕組みを少し調べてみました。

# gcloud compute  ssh my-instance
root@XX.XX.XX.XXX: Permission denied (publickey).
ERROR: (gcloud.beta.compute.ssh) [/usr/bin/ssh] exited with return code [255].

原因

先に上記のエラーの原因から書きます。 上記のエラーは以下の2点から発生しました。

  • enable-osloginが設定されていなかった

enable-oslogin が設定されていないと、現在のユーザ、または指定したユーザに紐づくssh鍵をメタデータにアップロードして、そのユーザでsshつなぎにいきます。

  • rootユーザでつなぎに行こうとしていた

現状、wsl2はデフォルトのユーザがrootなのでrootでsshつなぎにいったら、sshdにrootのログオンは許可してないよと蹴られてました。

参考

cloud.google.com

追加調査

enable-oslogin 有っても無くても、十分なIAM権限さえあればログオンはできるのですが、どういった動きなのかを追加調査もしました。

VM準備

まずは以下のように、 --metadata=enable-oslogin=TRUE 有る、無しでインスタンス立ち上げます。

gcloud compute instances create i-oslogin \
--zone=asia-northeast1-a \
--machine-type=f1-micro \
--subnet=a-public \
--private-network-ip=192.168.10.10 \
--tags=bastion \
--boot-disk-size=10GB \
--metadata=enable-oslogin=TRUE

gcloud compute instances create i-no-oslogin \
--zone=asia-northeast1-a \
--machine-type=f1-micro \
--subnet=a-public \
--private-network-ip=192.168.10.11 \
--tags=bastion \
--boot-disk-size=10GB 

以下のように確認してみました。

パターン ログオンコマンド 挙動
gcloud compute ssh i-no-oslogin 指定されたユーザでログオン
gcloud compute ssh your-user@i-no-oslogin 指定されたユーザでログオン
gcloud compute ssh i-oslogin IAMユーザでログオン
gcloud compute ssh your-user@i-oslogin IAMユーザでログオン

①、② 指定されたユーザでログオン

③の場合は、通情のSSHと同様、現在のPC側のOSユーザでログインをしようとします。その際にProjectのメタデータに鍵情報がアップロードされ、OSにユーザが追加されログインされます。

ここで最初の話に戻ります。rootで以下のコマンド打ったら、rootでつなぎにいって怒られます。

# gcloud compute ssh i-no-oslogin

別のユーザを指定してつなぎにいけば怒られずログオンできます。

# gcloud compute ssh your-user@i-no-oslogin

この場合、以下のようなメッセージが出ると思います。

Updating project ssh metadata...⠛Updated [https://www.googleapis.com/compute/v1/projects/yusuke-otomo].
Updating project ssh metadata...done.
Waiting for SSH key to propagate.

これはGCEのメタデータにSSH認証鍵が登録されているメッセージになります。 f:id:yomon8:20191128104926p:plain

ここでSSH認証鍵があるユーザが、Linux側にも登録されます。

$ cat /etc/passwd | grep $(whoami)
your-user:x:1003:1004::/home/your-user:/bin/bash

$ cat /etc/group | grep $(whoami)
adm:x:4:your-user
dip:x:30:your-user
video:x:44:your-user
plugdev:x:46:your-user
google-sudoers:x:1000:your-user
your-user:x:1001:

③、④ IAMユーザでログオン

この場合、以下のコマンドで確認できるIAMユーザでログオンしているようです。

$ gcloud compute os-login describe-profile

実際にログオンしてみると、idがローカルのユーザと値が普通と違う。

$ id
uid=321837751(your_user) gid=321837751(your_user) groups=321837751(your_user),4(adm),30(dip),44(video),46(plugdev)

そもそもローカルにユーザ登録されてないです。

$ cat /etc/passwd | grep $(whoami) | wc -l
0

ユーザはここに登録されています。

$ cat /etc/oslogin_passwd.cache
your_user::321837751:321837751::/home/your_user:/bin/bash

このPAMモジュールが使われているみたいです。

$ grep oslogin /etc/pam.d/*
/etc/pam.d/sshd:account    [success=ok ignore=ignore default=die] pam_oslogin_login.so
/etc/pam.d/sshd:account    [success=ok default=ignore] pam_oslogin_admin.so
/etc/pam.d/su:account    [success=bad ignore=ignore] pam_oslogin_login.so

追ってみるとモジュールはこれみたいです。へー、となったところで、とりあえず調査ここまで。

github.com