GoogleCloudのVMにSSH接続(OS Login)
IT技術
はじめに
秋になりました。大好きなりんごを丸かじりしようと思い、アゴがはずれる寸前でした。
今日はSSHを利用して、GoogleCloudのCompute Engineに接続する時のお話です。
その際の接続方法について深ぼろうと思います。
対象
- GoogleCloud Linux VMを利用し、複数人で開発を進めている方
やること
- OS Login機能に関すること
やらないこと
- IAMについての詳細
- GoogleCloud VMについての詳細
前提
- IAMが適切に設定されている
- GoogleCloudのLinux VMインスタンスがある
VMへのsshでの接続
まず、VMインスタンスへの接続は以下の2つの方法があります。
- メタデータ マネージド SSH 接続
- OS Login マネージド SSH 接続
さらにそれぞれには以下の3パターンで接続することが可能です。
- Google Cloud コンソールの SSH ボタンを使用して VM に接続
- gcloud compute ssh コマンドを使用して VM に接続
- サードパーティ製ツールでの接続
今回はLinux VMを構築済みの前提で、GoogleおすすめのOS LoginでのSSH 接続について絞って挙動を見ていきます。(Windows VMではできません)
参考: https://cloud.google.com/compute/docs/instances/ssh?hl=ja#os-login
OS Login機能とは
Compute Engine の SSH ログイン時の認証を IAM で管理するための仕組みです。SSH ユーザーを Google アカウントやグループと紐づけて管理できます。ですのでVMにSSHユーザが乱立して管理するのが大変になることを防ぐことができます。
- Google アカウント(グループ)に付与する IAM ロールによって、VM へのログイン可否と、sudo 可否を指定できる
- 無料で使用できる
OS Loginの機能はプロジェクト単位、もしくはVMマシン単位で付与することが可能です。
プロジェクト単位の場合
VM単位の場合
Google Cloud コンソールの SSH ボタンを使用して VM に接続
最初に述べていたように、VMに接続する3パターンで一番手軽な方法です。以下のキャプチャのようにブラウザから接続します。
この仕組みをまずはみていきます。
この場合、以下の挙動になるそうです(公式より)。
- Compute Engine は、ユーザー名を設定し、次の構成でエフェメラル SSH 認証鍵ペアを作成します。
- ユーザー名は、組織の Cloud Identity 管理者または Google Workspace 管理者が設定したユーザー名です。組織がユーザー名を構成していない場合や、プロジェクトが組織に属していない場合、Compute Engine は次の形式で Google アカウントのメールアドレスを使用します。
USERNAME_DOMAIN_SUFFIX
- 公開 SSH 認証鍵は、ブラウザ セッションと Google アカウントに保存されます。
- 秘密 SSH 認証鍵はブラウザ セッションに保存されます。
- SSH 認証鍵の有効期限は 3 分
- Compute Engine が鍵を作成して 3 分後に、SSH 認証鍵では VM に接続できなくなる
- ユーザー名は、組織の Cloud Identity 管理者または Google Workspace 管理者が設定したユーザー名です。組織がユーザー名を構成していない場合や、プロジェクトが組織に属していない場合、Compute Engine は次の形式で Google アカウントのメールアドレスを使用します。
- Compute Engine は、NSS サービス モジュールを使用して、指定されたユーザー名を VM 内の OS Login アカウントに解決します。
- Compute Engine は PAM 構成を使用して IAM 承認を行い、接続に必要な権限を持っていることを確認します。
- Compute Engine がユーザー アカウントから SSH 認証鍵を取得し、SSH 認証済みキーコマンドを使用して VM の OpenSSH に提供します。
- Compute Engine が接続を許可します。
1はなるほど。ですが、2,3,4はちょっとよくわかりません。VMインスタンスの/etcで直近の変更があったファイルを調べてみます。
まずは2番に関係ありそうな./nsswitch.confを見てみます。重要そうなところだけ抜き出します。
特に重要そうなのは、2回目以降ユーザーが SSH 接続を試みると、NSS サービス モジュールでは、上記ファイルを元に./oslogin_passwd.cacheなどからVM 内の OS Login アカウントに解決しそうです。
3番はファイルの中身を簡単に説明すると、以下を設定していそうです。
- 認証(
common-auth
や OS Login)。 - アカウントの有効性確認(
common-account
)。 - セッションの初期化(
pam_limits.so
,pam_env.so
など)
4番目ですが、./ssh/sshd_configに設定されていました。
AuthorizedKeysCommand は、ユーザーの公開鍵の検索に使用するプログラムを指定します。この時検索される公開鍵はGoogle アカウントに保存されているもので、エフェメラル SSH 認証鍵ペアで生成されたものです。
まとめるとブラウザからのSSH接続はエフェメラル(一時的な) SSH 認証鍵ペアを作成し、ブラウザ セッションと Google アカウントに一時的に保存。Google アカウントに保存されている一時的な公開鍵をCompute Engineが取得してIAM の認証を確認した上で、VM の OpenSSH に提供し、接続を許可する仕組みでした。
そのほかの接続
以下の接続方法は上記のエフェメラル SSH 認証鍵ペアを使用せず、永続的な SSH 認証鍵ペアを作成してGoogle アカウントに公開鍵を保存します。
- gcloud compute ssh コマンドを使用して VM に接続
- この場合は自動的に永続的な SSH 認証鍵ペアがローカルで生成され、Google アカウントに公開鍵が保存されます。
- 具体的には
gcloud compute ssh
コマンドを使用することで、自動的に全て設定されます。
- サードパーティ製ツールでの接続
- この場合は手動で永続的な SSH 認証鍵ペアをローカルで生成し、Google アカウントに公開鍵を保存します。
- VSCodeなどでremote-sshで接続する場合はこちらです。
どっちにしても保存した公開鍵は以下のコマンドで確認できます。
gcloud compute os-login describe-profile --format="json"
まとめ
様々なVMへのSSH接続についてみてきました。OS LoginはGoogleおすすめの方法ですので、複数人で開発を進めるときはぜひ導入してみましょう。
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
ライトコードに転職してまだ日は浅いですが、毎日新鮮でワクワクしてます!