発端から。先日、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のログオンは許可してないよと蹴られてました。
参考
追加調査
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認証鍵が登録されているメッセージになります。
ここで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
追ってみるとモジュールはこれみたいです。へー、となったところで、とりあえず調査ここまで。