VM インスタンスへの安全な接続

Google Compute Engine 上のプロジェクトを開発しているとき、以下に示すさまざまなシナリオで、公衆インターネットからインスタンスにアクセスできないようにしたい場合があります。

  • ウェブサービスの機能が不完全であったり、まだ HTTPS を使うように設定されていなかったりするため、開発途上であり、外部ユーザーに公開する準備が出来ていない。
  • インスタンスは、プロジェクト内の他のインスタンスによってのみ消費されるように設計されたサービスを提供している可能性がある。
  • インスタンスは、企業のオフィスやデータセンターなど、専用の相互接続オプションを通じてのみ到達できる必要がある。

サービスが意図的にインターネットに接続されている場合でも、機密情報を守るため、サービスとの通信を対象のユーザー グループに制限し、SSH や HTTPS などの安全なチャンネルを通じて行うことが重要です。

この記事では、外部 IP アドレスを持つ Compute Engine インスタンスや外部 IP アドレスを持たない Compute Engine インスタンスと安全に通信するためのいくつかの方法を示します。

外部 IP アドレスを持つマシン上のサービスの保護

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

外部 IP アドレスを持つマシン上のサービスの保護

インスタンスに公開 IP アドレスがある場合、公開を意図したサービスとトラフィックのみに到達可能であり、公開されているサービスで転送中の機密情報が保護されることが重要です。

ファイアウォール

防御の最前線は、Compute Engine ファイアウォールを使って、インスタンスに到達できる人を制限することです。ファイアウォール ルールを作成することで、ネットワークやターゲット マシンの特定のポートセットへのすべてのトラフィックを、特定のソース IP アドレスに制限できます。

ファイアウォールはスタンドアロン ソリューションではありません。トラフィックを特定のソース IP に制限しても、ログイン資格情報、リソースやファイルを作成または破棄するコマンド、ログなどの機密情報は保護されません。外部 IP アドレスを持つ Google Compute Engine インスタンスなどの、誰でもアクセスできるマシン上でウェブサービスを稼働させる場合、適切なセキュリティを確保するために、ホストとデプロイされたインスタンスの間のすべての通信を暗号化する必要があります。

また、ファイアウォールは常に適切なソリューションであるとは限りません。たとえば、ローミング ラップトップなど、静的な IP アドレスを持たない開発環境では、ファイアウォールは理想的ではありません。

HTTPS と SSL

本番稼働用のウェブシステムでは、HTTPS/SSL を設定します。HTTPS/SSL を設定するには、HTTPS を終端するインスタンスをセットアップするか、HTTPS 負荷分散を設定します。HTTPS/SSL により当初の複雑さが増え、以下の作業を行う必要があります。

  • ドメイン名を登録します。
  • 認証局から SSL 証明書を取得します。
  • 証明書をロードバランサとその接続されたインスタンスに登録するか、SSL 終端するウェブサーバーやプロキシを、1 つ以上の Compute Engine インスタンス上で設定します。

以前 SSL でサービスを提供するドメインをセットアップしたことがあれば、Google Compute Engine で同じことをするのは単純明快です。その経験がない場合は、ポート転送SOCKS プロキシなどの別のセキュリティ手段を使うほうが簡単かもしれません。

SSH 上のポート転送

gcloud コマンドライン ツールを使って、SSH 接続を介してすべてのトラフィックをリモートホストに転送する、特定のローカルポート上でサーバーを起動できます。

まず、安全な接続を確立する必要があるサービスを提供しているインスタンスとポートをメモします。次に、以下のコマンドを実行します。

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-L" \
    --ssh-flag="2222:localhost:8888"

上記のコマンドで、パラメータは次のように定義されています。

  • example-instance は接続先のインスタンスの名前です。
  • my-project は各自の Google Cloud Platform プロジェクト ID です。
  • us-central1-a は、インスタンスが稼働しているゾーンです。
  • 2222 は、リッスンするローカルポートです。
  • 8888 は接続先のリモートポートです。

これらの設定例を使った場合、ブラウザで http://localhost:2222/ を開くと、作成した SSH トンネル上でリモートホストへの HTTP 接続が行われ、SSH を介して指定したインスタンスに接続された後、同じマシンのポート 8888 に接続されますが、暗号化された安全な SSH 接続が使用されます。

gcloud コマンドは SSH 接続を作成および維持します。このアプローチは、SSH セッションがアクティブな間だけ機能します。gcloud で作成された SSH セッションを終了するとすぐに、http://localhost:2222/ を介したポート転送は終了します。

複数のポート転送ルールを作成する場合は、フラグを繰り返すことで 1 つのコマンドライン上で複数のルールを指定できます。

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-L" \
    --ssh-flag="2222:localhost:8888" \
    --ssh-flag="-L" \
    --ssh-flag="2299:localhost:8000"

また、新たな gcloud コマンドを何度か実行して、個別のトンネルを作成することもできます。既存の接続にポート転送を追加または削除するには、その接続を終了して初めから再確立する必要があることに注意してください。

SSH 上の SOCKS プロキシ

クラウド デプロイの異なる複数のホストに接続するための最も簡単な方法は、Compute Engine ネットワークから直接検索するようにブラウザを変更することです。このアプローチでは、各ホストの IP アドレスを検索したり、各サービスのポートをオープンしたり、各ホスト / ポートペアについて SSH トンネルを作成する代わりに、短いホスト名を使用できます。

ここで使うアプローチは以下のとおりです。

  1. ネットワーク上のいずれかのホストへの単一の SSH トンネルをセットアップし、そのホスト上で SOCKS プロキシを作成します。
  2. その SOCKS プロキシホストを介してすべての検索を行うようにブラウザの設定を変更します。

そのホストを介してすべてのトラフィックをトンネリングすることになるため、そのブラウザやその特定のプロフィールを使って一般にウェブを参照しないことをおすすめします。そうしないと、クラウド サービスの帯域幅が使用されます。一般に、別のブラウザ プロフィールを使用し、必要に応じて切り替えることをおすすめします。

SOCKS プロキシの起動

SOCKS プロキシを起動するには、次のコマンドを実行します。

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-D" \
    --ssh-flag="1080" \
    --ssh-flag="-N"

上記のコマンドで、パラメータは次のように定義されています。

  • example-instance は接続先のインスタンスの名前です。
  • my-project は各自の Google Cloud Platform プロジェクト ID です。
  • us-central1-a は、インスタンスが稼働しているゾーンです。
  • 1080 は、リッスンするローカルポートです。

ここでは、リモートポートを指定する必要がないことに注意してください。SOCKS プロキシは、特定のリモートポートにバインドしないため、SOCKS プロキシを介して行ったすべての接続は、接続先のホストとの相対で解決されます。

SOCKS プロキシを使えば、インスタンスの短縮名を使うことで、プロキシ インスタンスと Compute Engine ネットワークを共有する任意のインスタンスに接続できます。また、特定のインスタンス上の任意のポートに接続できます。

このアプローチは、単純なポート転送による手法よりもはるかに柔軟ですが、プロキシを使用するようにウェブブラウザの設定を変更する必要があります。

次に、プロキシを使用するようにブラウザを設定します。

Chrome での SOCKS プロキシの設定

Chrome はシステム全体のプロキシ設定をデフォルトで使用するため、コマンドライン フラグを使って異なるプロキシを指定する必要があります。Chrome をデフォルトで起動すると、すでに実行中のプロフィールのインスタンスが作成されるため、Chrome の複数のコピー(プロキシを使用しているものとプロキシを使用していないもの)を同時に実行できるようにするには、新しいプロフィールが必要です。

新しいプロフィールを使って Chrome を起動します。存在しない場合は新しいプロフィールが自動的に作成されます。

Linux:

/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Mac OS X:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

localhost のポートは、必ず以前 gcloud コマンドで使用したのと同じ値を設定します(この例では 1080)。

Firefox での SOCKS プロキシの設定

これらの設定を変更する前に、新しい Firefox プロフィールを作成することをおすすめします。そうしないと、すべての Firefox インスタンスに影響があり、そのホストがプロキシとして使われるようになりますが、それは多くの場合望ましい動作ではありません。

別のプロフィールを使って Firefox を実行した後、SOCKS プロキシを設定できます。

  1. [オプション] を開きます。
  2. [詳細設定] > [ネットワーク] > [設定] を順にクリックし、[接続設定] ダイアログを開きます。
  3. オプション [手動でプロキシを設定する] を選択します。
    • [SOCKS ホスト] セクションで、ホストとして「localhost」と入力し、以前 gcloud コマンドを実行したときに選択したポートを入力します。
    • [SOCKS v5] を選択します。
    • [リモート DNS] をチェック ボックスをオンにします。
    • 他のエントリはすべて空白のままにします。
  4. [OK] をクリックして設定ダイアログ ボックスを閉じます。

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

インスタンスに外部 IP アドレスがない場合、必ずネットワーク上の他のインスタンスからか、管理された VPN ゲートウェイを介して到達する必要があります。ネットワーク内のインスタンスを、受信接続(要塞ホスト)またはネットワーク送信(NAT ゲートウェイ)用の信頼できるリレーとしてプロビジョニングできます。そのような接続の設定が不要なより透過的な接続のためには、管理された VPN ゲートウェイ リソースを使用できます。

要塞ホスト

要塞ホストは、プライベート ネットワーク インスタンスを含むネットワークへの、外部に面するエントリ ポイントを提供します。このホストは、要塞化や監査のための単一の場所を提供したり、インターネットからの受信 SSH 通信を有効または無効にするために開始および停止したりできます。

Bastion Architecture

外部 IP アドレスを持たないインスタンスへの SSH アクセスは、最初に要塞ホストに接続することで実現できます。要塞ホストの完全な強化は、本書の範囲外ですが、実施する最初のステップには以下のものが挙げられます。

  • 要塞と通信できるソース IP の CIDR 範囲を制限します。
  • 要塞ホストからのみプライベート インスタンスへの SSH トラフィックを許可するように、ファイアウォール ルールを設定します。

デフォルトでは、インスタンス上の SSH は、認証用に秘密鍵を使用するように設定されます。要塞ホストを使用する場合、まず要塞ホストにログインし、次にターゲット プライベート インスタンスにログインします。この 2 ステップのログインにより(これが、要塞ホストが「ジャンプ サーバー」とも呼ばれる理由です)、ターゲット マシンに到達するための方法として、ターゲット マシンの秘密鍵を要塞ホストに保存する代わりに、ssh-agent 転送を使用する必要があります。これは、要塞とターゲット インスタンスに同じ鍵のペアを使用する場合でも必要です。要塞ホストは、鍵のペアの公開鍵にしか直接アクセスできないためです。

Mac と Linus で ssh-agent を設定する方法

Mac OS X では ssh-agent はすでにデフォルトでインストールされており、ほとんどの Linux オペレーティング システムにも付属しています。まず、ssh-agent がセットアップされ、シェル環境の準備が整っていることを確認します。

eval `ssh-agent -s`

その後、ssh-add コマンドを使って、秘密鍵を ssh-agent に追加できます。

ssh-add PATH-TO-PRIVATE-KEY

秘密鍵がパスフレーズで保護されている場合は、-K フラグを使って OS X のキーチェーンにパスフレーズを追加できます。

ssh-add -K PATH-TO-PRIVATE-KEY

これは、ログイン セッションごとに行うか、シェルログイン init ファイル(.bash_profile など)に追加します。追加された鍵の一覧は、-L フラグで表示できます。

ssh-add -L

鍵が追加された状態で、-A フラグでエージェント転送を有効にし、要塞ホストに接続します。

ssh -A user@BASTION-EXTERNAL-IP

または、インスタンスの IP アドレスを自動的に検索する gcloud コマンドライン ツールを使うこともできます。

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-A"

要塞に接続したら、Compute Engine で提供されるプライベート ネットワーク DNS を使用するインタンス名だけでターゲット インスタンスへの SSH セッションを開始することができます。

ssh example-instance

VPN

Compute Engine VPN では、既存のネットワークを Compute Engine ネットワークに、VPN ゲートウェイ デバイスへの IPsec 接続を介して接続できます。これにより、各自の構内から Compute Engine インスタンスのプライベート IP インターフェースへの、トラフィックの直接ルーティングが可能になります。公衆リンク上を Google に転送される途中のトラフィックは暗号化されます。

VPN を Compute Engine と共に使用するためのセットアップ、設定、使用について詳しくは、Compute Engine VPN をご覧ください。

NAT ゲートウェイを使ったトラフィックの送信

インスタンスに外部 IP アドレスが割り当てられていない場合、他の Cloud Platform サービスを含め、外部サービスに直接接続できません。これらのインスタンスが公衆インターネット上のサービスに到達できるようにするには、ネットワーク上のすべてのインスタンスの代わりにトラフィックをルーティングできる、NAT ゲートウェイ マシンをセットアップして設定できます。1 つのインスタンスの可用性が非常に高いと見なしてはならず、複数のインスタンスのための高スループットのトラフィックをサポートできないことに注意してください。

インタラクティブ シリアル コンソール アクセス

インスタンスに外部 IP アドレスがない場合でも、トラブルシューティングやメンテナンスの目的でインスタンスとやり取りすることが必要な場合があります。要塞ホストをセットアップすることは 1 つの方法ですが、ニーズに見合うよりも多くのセットアップが必要になる可能性があります。外部 IP アドレスを持たないインスタンスをトラブルシューティングする場合は、シリアル コンソール上でインタラクティブ アクセスを有効にすることを検討してください。これにより、SSH を使ってインスタンスのシリアル コンソールを操作し、シリアル コンソールに対してコマンドを実行できます。

詳しくは、シリアル コンソールを使った操作をご覧ください。

Google Cloud Platform のその他の機能を試すには、チュートリアルをご覧ください。

外出先でもリソースをモニタリング

Google Cloud Console アプリを入手して、プロジェクトの管理にお役立てください。

フィードバックを送信...

Compute Engine ドキュメント