高度な方法による VM への接続


概して、SSH 接続の最適な方法はインスタンスへの接続のドキュメントで説明されています。ただし、自分自身で認証情報を管理する、サードパーティのツールを使用する、または別の接続パスを使用してインスタンスに接続する必要がある場合は、次の高度な方法のほうが標準メソッドよりもニーズに合う可能性があります。Compute Engine での SSH 接続の動作についての情報は、SSH 認証鍵の構成やストレージを含め、Linux VM への SSH 接続をご覧ください。

Linux VM への接続では、いくつかの高度な方法を使用できます。

始める前に

公開 SSH 認証鍵をインスタンスに渡す

通常、Compute Engine では、インスタンスに接続するで説明されている方法を使用して接続すると、ユーザーの SSH 認証鍵が作成、管理されます。

ただし、独自の SSH 認証鍵を使用する必要がある場合(たとえば、サードパーティ ツールを使用して接続する場合)、自分用に SSH 認証鍵ペアを生成し、接続する前にインスタンスに SSH 公開鍵ファイルを渡す必要があります。

独自の SSH 認証鍵を生成する方法と、公開 SSH 認証鍵ファイルの確認方法については、新しい SSH 認証鍵を作成するおよび SSH 認証鍵を探すをご覧ください。

インスタンスに SSH 認証鍵を渡すには、次のいずれかの方法を使用します。

  • (推奨)OS Login を有効にします。OS Login では IAM のロールを使用して、Google アカウントまたはマネージド ユーザー アカウントを通して公開 SSH 認証鍵をインスタンスに渡します。手順については、OS Login の設定をご覧ください。

    OS Login を設定する際は、ユーザー アカウントに SSH 認証鍵を追加する手順を完了してください。このステップでは、VM への接続に使用するユーザー アカウントに公開鍵を追加できます。

    この機能を使用するメリットについては、OS Login をご覧ください。

  • (非推奨)プロジェクトまたはインスタンスのメタデータを編集して、SSH 認証鍵を手動で追加および削除します。メタデータでの SSH 認証鍵の管理をご覧ください。この方法は、不要なリスクと複雑さが増すため、上記の OS Login 方法で対処できない場合を除きおすすめしません。手動での鍵管理のリスクをご覧ください。

  • インスタンスがすでにアクセス権を持つ他のユーザー(組織のシステム管理者など)によって管理されている場合、SSH 公開鍵ファイルを渡して手動で構成するよう依頼することもできます。通常、インスタンスへの接続、インスタンスのホーム ディレクトリへの公開鍵ファイルのコピー、ファイルのアクセス許可の変更が必要となりますが、これは組織がインスタンスを管理する方法によって異なります。

サードパーティ製ツールを使用した接続

接続するには、ローカル ワークステーションのオペレーティング システムの手順に沿って操作します。

Linux / macOS

Linux または macOS マシンから SSH を使用して接続するには、ローカル ターミナルで組み込みの ssh コマンドを使用します。

  1. まだ実行していない場合は、使用可能ないずれかのオプションを使用して、公開 SSH 認証鍵をインスタンスに指定します。これを行わずに続行することはできません。

  2. Google Cloud Console で VM インスタンス ページに移動し、接続先のインスタンスの外部 IP アドレスを探します。

    [VM インスタンス] に移動

  3. ローカル ターミナルでは、秘密 SSH 認証鍵ファイル、ユーザー名、接続するインスタンスの外部 IP アドレスとともに、ssh コマンドを使用します。例:

    ssh -i PATH_TO_PRIVATE_KEY USERNAME@EXTERNAL_IP

    次のように置き換えます。

    接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

Windows(PuTTY)

Windows には組み込みの SSH クライアントは含まれていません。そのため、サードパーティのクライアントをダウンロードしてインストールする必要があります。PuTTY を使用して接続する手順は次のとおりです。

PuTTY を使用して Windows からインスタンスに接続するには、次の操作を行います。

  1. まだ実行していない場合は、使用可能ないずれかのオプションを使用して、公開 SSH 認証鍵をインスタンスに指定します。これを行わずに続行することはできません。

  2. Google Cloud Console で VM インスタンス ページに移動し、接続先のインスタンスの外部 IP アドレスを探します。後のステップで使用できるように、外部 IP アドレスを保持します。

    [VM インスタンス] に移動

  3. まだダウンロードしていない場合は、putty.exe をダウンロードします。

  4. putty.exe を起動して PuTTY を開きます。接続構成ウィンドウが開きます。

  5. [Host Name] フィールドに、SSH 認証鍵に関連付けられているユーザー名と、接続するインスタンスの外部 IP アドレスを入力します。形式は次のようにします。

    USERNAME@EXTERNAL_IP

    次のように置き換えます。

    • USERNAME: インスタンスに接続するユーザーのユーザー名。これは、SSH 認証鍵を作成するときに指定したユーザー名である必要があります。
    • EXTERNAL_IP: 接続するインスタンスの外部 IP アドレス。

    たとえば、次のスクリーンショットをご覧ください。

    ユーザー名および IP アドレスの例として jane_doe@203.0.113.2 を使用した [Host Name] フィールドを設定

  6. [Category] メニューで、[Connection] > [SSH] > [Auth] に移動します。

  7. [Private key file for authentication] フィールドで、秘密鍵ファイルの場所を参照します。

    たとえば、次のスクリーンショットをご覧ください。

    秘密鍵ファイルのフィールドでの my-ssh-key.ppk ファイルへのパスの設定。

  8. [Open] をクリックし、インスタンスに接続するターミナルを開きます。

接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

Chrome OS(SSH アプリ)

Chromebook または Chrome がインストールされたオペレーティング システムは、SSH クライアントとして Secure Shell をサポートします。Secure Shell App からインスタンスに接続するには、次のようにします。

  1. まだ実行していない場合は、使用可能ないずれかのオプションを使用して、公開 SSH 認証鍵をインスタンスに指定します。これを行わずに続行することはできません。

  2. Chromebook または Chrome ブラウザに Secure Shell をまだインストールしていない場合は、インストールします。

  3. Google Cloud Console で VM インスタンス ページに移動し、接続先のインスタンスの外部 IP アドレスを探します。後のステップで使用できるように、外部 IP アドレスを保持します。

    [VM インスタンス] に移動

  4. Chrome ブラウザのタブで Secure Shell App を開きます。Chrome アプリにアクセスするには、アドレスバーに「chrome://apps」と入力します。

  5. SSH 認証鍵ペアに関連付けられたユーザー名と、接続するインスタンスの外部 IP アドレスを入力します。形式は次のようにします。

     USERNAME@EXTERNAL_IP
     

    次のように置き換えます。

    • USERNAME: インスタンスに接続するユーザーのユーザー名。これは、SSH 認証鍵を作成するときに指定したユーザー名である必要があります。
    • EXTERNAL_IP: 接続するインスタンスの外部 IP アドレス。
  6. [ID] フィールドで、インスタンスへの接続に使用する秘密 SSH 認証鍵ファイルを選択します。必要に応じて、[インポート] をクリックして、ローカル ワークステーションから秘密鍵ファイルを選択します。

  7. [接続] をクリックして、インスタンスに接続します。

接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

その他の SSH オプション

上記の他に、以下の方法で SSH を使用してインスタンスに接続できます。

外部 IP アドレスを持たないインスタンスへの接続

外部 IP アドレスを持たない分離されたインスタンスがある場合でも、そのインスタンスは Google Cloud VPC ネットワークの内部 IP アドレスを使用して接続できます。たとえば、次の方法を使用して、外部ネットワークから意図的に分離した VM に接続できます。

VPN 接続を介した接続

バーチャル プライベート ネットワーク(VPN)を使用して外部 IP アドレスを持たないインスタンスに接続するには、次の操作を行います。

  • Cloud VPN トンネルを介して VM インスタンスにアクセスできるパソコンを使用する必要があります。

    たとえば、ローカルのオンプレミス ネットワークが Google Cloud VPC と共有する VPN があるとします。そのような状況では、gcloud コマンドライン ツール、SSH(Linux または macOS の場合)、PuTTY などのサードパーティ SSH クライアント(Windows の場合)を使用してインスタンスに接続します。

詳しくは、次のタブをご覧ください。

gcloud

外部 IP アドレスのないインスタンスに接続するには、--internal-ip フラグを指定して gcloud compute ssh コマンドを使用します。

  1. Google Cloud Console で [VM インスタンス] ページに移動し、接続先のインスタンスの内部 IP アドレスを探します。

    [VM インスタンス] に移動

  2. インスタンスに接続します。

    gcloud compute ssh INTERNAL_INSTANCE_NAME \
        --zone=ZONE \
        --internal-ip
    

    次のように置き換えます。

    • INTERNAL_INSTANCE_NAME: 接続するインスタンスの名前。
    • ZONE: インスタンスが存在するゾーンの名前
  3. 接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

Linux / macOS

Linux または macOS ワークステーションから外部 IP アドレスを持たないインスタンスに接続するには、次のようにします。

  1. 前述のいずれかの方法で公開 SSH 認証鍵をインスタンスに渡します。これを行わずに続行することはできません。

  2. ローカルマシンで、SSH 認証鍵管理のために ssh-agent を開始します。

    eval ssh-agent $SHELL
    
  3. ssh-add コマンドを使用して、ローカルのパソコンからエージェントに秘密 SSH 認証鍵を読み込み、すべての SSH コマンドの認証に秘密 SSH 認証鍵が使われるようにします。PRIVATE_KEY は、秘密鍵ファイルのファイル名に置き換えます。

    ssh-add ~/.ssh/PRIVATE_KEY
    
  4. Google Cloud Console で [VM インスタンス] ページに移動し、接続先のインスタンスの内部 IP アドレスを探します。

    [VM インスタンス] に移動

  5. ローカル ターミナルでは、秘密 SSH 認証鍵に関連付けられたユーザー名、接続するインスタンスの内部 IP アドレスとともに、ssh コマンドを使用します。例:

    ssh USERNAME@INTERNAL_INSTANCE_IP_ADDRESS

    次のように置き換えます。

    • USERNAME: インスタンスに接続するユーザーのユーザー名。これは、SSH 認証鍵を作成するときに指定したユーザー名である必要があります。
    • INTERNAL_INSTANCE_IP_ADDRESS: 接続先のインスタンスの内部 IP アドレス。

接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

Windows(PuTTY)

Windows ワークステーションから外部 IP アドレスを持たないインスタンスに接続するには:

  1. まだ実行していない場合は、使用可能ないずれかのオプションを使用して、公開 SSH 認証鍵をインスタンスに指定します。これを行わずに続行することはできません。

  2. Google Cloud Console で [VM インスタンス] ページに移動し、接続先のインスタンスの内部 IP アドレスを探します。

    [VM インスタンス] に移動

  3. 上記の手順で、Windows から PuTTY を使用してインスタンスに接続しますが、次の変更を行います。

    • 手順で外部 IP アドレスを指定するよう指示されている場合は、代わりに、接続するインスタンスの内部アドレスを指定します。

接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

踏み台インスタンスを介した接続

外部 IP アドレスを持たないインスタンスに接続するもう 1 つの方法は、踏み台インスタンスを介して接続することです。踏み台インスタンスを使用して、他のピアリングされた VPC ネットワーク上のインスタンスに接続することもできます。

Linux と macOS から踏み台インスタンスを介してインスタンスに接続するには、gcloud コマンドライン ツールまたは SSH を使用します。Windows から接続するには、PuTTY などのサードパーティの SSH クライアントを使用します。

踏み台インスタンスから他のインスタンスに接続するには、秘密 SSH 認証鍵が必要です。これを管理するには以下のいくつかの方法があります。

  • gcloud コマンドライン ツールをインストールして、ユーザーの秘密鍵を管理するように構成します。
  • SSH クライアントのエージェント転送を有効にして、秘密鍵を踏み台インスタンスに転送します。

詳細な手順は次のとおりです。

gcloud

gcloud コマンドライン ツールを使用すると、秘密 SSH 認証鍵を踏み台インスタンスに転送せずに、外部 IP アドレスを持たないインスタンスに接続できます。これを行うには、gcloud がローカル ワークステーションと踏み台インスタンスの両方にまだインストールされていない場合は、インストールします。

gcloud コマンドライン ツールを使用して、外部 IP アドレスを持たないインスタンスに接続するには:

  1. --scopes compute-rw をコマンドに含めることにより、読み取り / 書き込み Compute Engine API のアクセス スコープを踏み台インスタンスのサービス アカウントに設定します。詳細については、インスタンスのサービス アカウントとアクセス スコープの変更をご覧ください。

  2. OS Login(推奨)またはプロジェクト メタデータを使用して、踏み台インスタンスが公開 SSH 認証鍵にアクセスできるようにするために必要な IAM 権限を付与します。次のいずれかの手順を使用します。

    これで、踏み台インスタンスのサービス アカウントが公開 SSH 認証鍵を適用できるようになりました。

  3. Linux 踏み台インスタンスに接続します。EXTERNAL_INSTANCE_NAME は、内部ネットワークへのアクセスに使用する踏み台インスタンスの名前に置き換えます。

    gcloud compute ssh EXTERNAL_INSTANCE_NAME
    
  4. Linux の踏み台インスタンスから、gcloud compute ssh コマンド--internal-ip フラグとともに使用して、内部 IP アドレスを介してインスタンスに接続します。

    gcloud compute ssh INTERNAL_INSTANCE_NAME --internal-ip
    

    INTERNAL_INSTANCE_NAME は、接続するインスタンスの名前に置き換えます。

接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

Linux / macOS

秘密鍵を踏み台インスタンスに転送する必要がある場合は、鍵を ssh-agent に追加してください。次に、gcloud compute ssh コマンドまたは ssh コマンドを使用して、踏み台インスタンスへの最初の接続を確立し、SSH エージェントに鍵を転送します。このプロセスは、Linux および macOS ワークステーションでのみ機能します。秘密鍵を Windows ワークステーションから踏み台インスタンスに転送する必要がある場合は、代わりに PuTTY の手順を使用します。

Linux または macOS ワークステーションから外部 IP アドレスを持たないインスタンスに接続するには:

  1. 前述のいずれかの方法で公開 SSH 認証鍵を渡します。公開 SSH 認証鍵は、必ず Linux 踏み台インスタンスと外部 IP アドレスを持たないインスタンスの両方に渡してください。

  2. ローカルマシンで、SSH 認証鍵管理のために ssh-agent を開始します。

    eval ssh-agent $SHELL
    
  3. ssh-add コマンドを使用して、ローカルのパソコンからエージェントに秘密 SSH 認証鍵を読み込みます。SSH 認証鍵が追加されると、認証で秘密 SSH 認証鍵ファイルが自動的に使用されます。

    $ ssh-add ~/.ssh/PRIVATE_KEY
    

    PRIVATE_KEY は、秘密鍵ファイルのファイル名に置き換えます。

  4. Google Cloud Console で、[VM インスタンス] ページに移動します。[外部 IP] 列で、Linux 踏み台インスタンスの外部 IP アドレスを探します。[内部 IP] 列で、接続する内部インスタンスの内部 IP アドレスを探します。

    [VM インスタンス] に移動

  5. ssh または gcloud compute ssh を使用して、Linux 踏み台インスタンスに接続します。どちらの場合も、-A 引数を指定して、認証エージェントの転送を可能にします。

    ssh を使用して、Linux 踏み台インスタンスに接続し、秘密鍵を転送します。

    ssh -A USERNAME@BASTION_HOST_EXTERNAL_IP

    次のように置き換えます。

    • USERNAME: SSH 認証鍵に付けられた名前。
    • BASTION_HOST_EXTERNAL_IP: 内部ネットワークへのアクセスに使用する踏み台インスタンスの外部 IP アドレス。

    また、gcloud compute ssh コマンドを使用して踏み台インスタンスに接続し、秘密鍵を転送できます。このオプションにより gcloud コマンドライン ツールを使用して踏み台インスタンスに接続できます。内部 IP アドレスに接続する際には転送された認証情報で通常の ssh を使用することが可能になります。

    gcloud compute ssh --ssh-flag="-A" BASTION_HOST_INSTANCE_NAME
    

    BASTION_HOST_INSTANCE_NAME は、内部ネットワークへのアクセスに使用する踏み台インスタンスの名前に置き換えます。

  6. Linux 踏み台インスタンスから、SSH を使用して外部 IP アドレスを持たないインスタンスに接続します。

    ssh USERNAME@INTERNAL_INSTANCE_IP_ADDRESS

    次のように置き換えます。

    • USERNAME: SSH 認証鍵に付けられた名前。
    • INTERNAL_INSTANCE_IP_ADDRESS: 接続先のインスタンスの内部 IP アドレス。

接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

Windows

Windows ワークステーションから外部 IP アドレスを持たないインスタンスに接続するには:

  1. 前述のいずれかの方法で公開 SSH 認証鍵を渡します。公開 SSH 認証鍵は、必ず Linux 踏み台インスタンスと外部 IP アドレスを持たないインスタンスの両方に渡してください。

  2. Google Cloud Console で、[VM インスタンス] ページに移動します。[外部 IP] 列で、Linux 踏み台インスタンスの外部 IP アドレスを探します。[内部 IP] 列で、接続する内部インスタンスの内部 IP アドレスを探します。

    [VM インスタンス] に移動

  3. PuTTY を使用して Linux 踏み台インスタンスに接続します。[Allow agent forwarding] 設定をオンにして秘密 SSH 認証鍵を踏み台インスタンスに渡します。

    接続しているインスタンスのエージェント転送の許可。

  4. Linux 踏み台インスタンスから、SSH を使用して外部 IP アドレスを持たないインスタンスに接続します。

    ssh USERNAME@INTERNAL_IP_ADDRESS
    

    次のように置き換えます。

    • USERNAME: インスタンスに接続するユーザーのユーザー名。これは、SSH 認証鍵を作成するときに指定したユーザー名である必要があります。
    • INTERNAL_IP_ADDRESS: 接続先のインスタンスの内部 IP アドレス。

    接続後、このターミナルを使用して、インスタンスでコマンドを実行します。完了したら、exit コマンドを実行して、インスタンスから切断します。

IAP を介して接続する

SSH と IAP の TCP 転送機能を使用すると、SSH 接続が HTTPS にラップされます。IAP の TCP 転送機能は、URL をリモート インスタンスに送信します。

  1. VM に接続するユーザーに roles/iap.tunnelResourceAccessor ロールを付与します。

  2. VM に接続します。

    gcloud compute ssh INSTANCE_NAME --zone ZONE
    

    次のように置き換えます。

    • INSTANCE_NAME: 接続するインスタンスの名前。
    • ZONE: インスタンスが存在するゾーンの名前。

コンテキストアウェア ルールの構成方法や VM 上の他の TCP ポートへのアクセス方法などの詳細については、TCP 転送の使用方法をご覧ください。

root ユーザーとしてのインスタンスへの接続

公開イメージや一般的なオペレーティング システムでは SSH を使用した root でのログインはデフォルトで許可されません。SSH を使用してインスタンスに root として接続するには、このような操作を許可するようにインスタンスを構成する必要があります。

/etc/ssh/sshd_config SSH 構成ファイルの PermitRootLogin パラメータを no に設定するのがベスト プラクティスです。このパラメータにより、プロジェクトまたはインスタンスのメタデータで root の SSH 認証鍵を指定しても、root ユーザーとしてインスタンスに接続できなくなります。root 権限が必要なユーザーは、sudo を使用してコマンドを実行することでその権限を取得できます。

root ユーザーとして SSH を使用できるようにインスタンスを構成し、そのインスタンスで root ユーザーの SSH 認証鍵を構成した場合、インスタンス名の前に root@ を指定して gcloud compute ssh コマンドを実行すると、root として接続できます。

gcloud compute ssh \
    --project=PROJECT_ID \
    --zone=ZONE \
    root@INSTANCE_NAME

次のように置き換えます。

  • PROJECT_ID: インスタンスが含まれているプロジェクトの ID
  • ZONE: インスタンスが存在するゾーンの名前
  • INSTANCE_NAME: インスタンスの名前

サービス アカウントとしてインスタンス間を手動で接続する

状況によっては、インスタンスのサービス アカウントの権限でインスタンスに接続して、コマンドを実行したい場合があります。gcloud compute ssh コマンドを使用すると、サービス アカウントの SSH 認証情報を使用して、あるインスタンスから別のインスタンスに接続し、2 つ目のインスタンスでサービス アカウントとしてコマンドを実行できます。

gcloud コマンドライン ツールにより、SSH 認証鍵ペアが自動的に生成され、インスタンス上のサービス アカウントに関連付けられます。サービス アカウントとして別のインスタンスに接続した後は、そのサービス アカウントの IAM 権限を使用して別の gcloud コマンドを実行できます。

たとえば、次のような環境について考えてみましょう。

  • インスタンス A:
    • インスタンス A にはサービス アカウントが関連付けられています。
    • インスタンス A のサービス アカウントには、プロジェクト レベルまたはインスタンス B のリソース用に必要な OS Login ロールが構成されています。
    • サービス アカウントは、インスタンス A に https://www.googleapis.com/auth/cloud-platform プラットフォーム全体のスコープを設定しています。
  • インスタンス B:
    • インスタンス B は、インスタンス A と同じ内部ネットワーク上に存在するか、インスタンス A からの SSH 接続を許可するファイアウォール ルールが設定されているネットワーク上に存在します。
    • プロジェクトまたはインスタンス B で OS Login 機能が有効になっています。
  • 個人ユーザー アカウント:
    • ユーザーのアカウントには、インスタンス A のサービス アカウントに対する roles/iam.serviceAccountUser ロールが設定されています。
    • ユーザーのアカウントはインスタンス A に SSH で接続できます。
    • ユーザーのアカウントはインスタンス B にアクセスできません。サービス アカウントは、インスタンス B との接続に必要な OS Login ロールを持つ唯一のアカウントです。

インスタンス A に接続し、そのサービス アカウントとしてコマンドを実行します。この操作を行うには、サービス アカウントに対する roles/iam.serviceAccountUser ロールが必要です。

  1. roles/iam.serviceAccountUser ロールを持つユーザーとして、インスタンス A に接続します。たとえば、gcloud コマンドライン ツールを使用して SSH 接続を確立できます。

    gcloud compute ssh instance-a --project=PROJECT_ID --zone=ZONE
  2. roles/iam.serviceAccountUser ロールがあれば、SSH を使用してインスタンス A に接続した後、サービス アカウントと同じ権限でコマンドを実行できます。この例では、インスタンス A 上で gcloud ツールを使用して、インスタンス B へのチェーン SSH 接続を作成します。gcloud ツールは、インスタンス B で OS Login の使用が有効になっていること、さらに SSH を使用してインスタンス B に接続するために必要な IAM ロールがサービス アカウントにあることを確認します。

    gcloud compute ssh instance-b --project=PROJECT_ID --zone=ZONE

    出力は次のようになります。

    WARNING: Using OS Login user [sa_113491385848438711199] instead of default user [my-username]
    Linux instance-b 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64
    ⋮
    
  3. これで、インスタンス B にサービス アカウントとして接続し、そのサービス アカウントと同じ権限でコマンドを実行できます。次に例を示します。

    sa_113491385848438711199@instance-b:~$ uname -a
    
    Linux instance-b 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u6 (2018-10-08) x86_64 GNU/Linux
    

次のステップ