• トップ
  • ブログ一覧
  • GoogleCloudのVMにSSH接続(OS Login)
  • GoogleCloudのVMにSSH接続(OS Login)

    はじめに

    秋になりました。大好きなりんごを丸かじりしようと思い、アゴがはずれる寸前でした。

    今日はSSHを利用して、GoogleCloudのCompute Engineに接続する時のお話です。

    その際の接続方法について深ぼろうと思います。

    対象

    • GoogleCloud Linux VMを利用し、複数人で開発を進めている方

    やること

    • OS Login機能に関すること

    やらないこと

    • IAMについての詳細
    • GoogleCloud VMについての詳細

    前提

    • IAMが適切に設定されている
    • GoogleCloudのLinux VMインスタンスがある

    VMへのsshでの接続

    まず、VMインスタンスへの接続は以下の2つの方法があります。

    1. メタデータ マネージド SSH 接続
    2. OS Login マネージド SSH 接続

    さらにそれぞれには以下の3パターンで接続することが可能です。

    1. Google Cloud コンソールの SSH ボタンを使用して VM に接続
    2. gcloud compute ssh コマンドを使用して VM に接続
    3. サードパーティ製ツールでの接続

    今回は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パターンで一番手軽な方法です。以下のキャプチャのようにブラウザから接続します。

    この仕組みをまずはみていきます。

    この場合、以下の挙動になるそうです(公式より)。

    1. Compute Engine は、ユーザー名を設定し、次の構成でエフェメラル SSH 認証鍵ペアを作成します。
      • ユーザー名は、組織の Cloud Identity 管理者または Google Workspace 管理者が設定したユーザー名です。組織がユーザー名を構成していない場合や、プロジェクトが組織に属していない場合、Compute Engine は次の形式で Google アカウントのメールアドレスを使用します。USERNAME_DOMAIN_SUFFIX
      • 公開 SSH 認証鍵は、ブラウザ セッションと Google アカウントに保存されます。
      • 秘密 SSH 認証鍵はブラウザ セッションに保存されます。
        • SSH 認証鍵の有効期限は 3 分
        • Compute Engine が鍵を作成して 3 分後に、SSH 認証鍵では VM に接続できなくなる
    2. Compute Engine は、NSS サービス モジュールを使用して、指定されたユーザー名を VM 内の OS Login アカウントに解決します。
    3. Compute Engine は PAM 構成を使用して IAM 承認を行い、接続に必要な権限を持っていることを確認します。
    4. Compute Engine がユーザー アカウントから SSH 認証鍵を取得し、SSH 認証済みキーコマンドを使用して VM の OpenSSH に提供します。
    5. 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おすすめの方法ですので、複数人で開発を進めるときはぜひ導入してみましょう。

     

     

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    けったん(エンジニア)
    けったん(エンジニア)
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background