VPC Service Controls 基本チュートリアル II - 下り(外向き)違反のトラブルシューティング

1. はじめに

VPC Service Controls(VPC-SC)は Google Cloud の組織レベルのセキュリティ管理で、企業のお客様がデータ引き出しのリスクを軽減できるようにします。VPC Service Controls は、マルチテナント サービスへのゼロトラスト スタイルのアクセスを提供します。クライアントは、インターネットやその他のサービスからマルチテナント サービスに接続する際に、アクセスを承認済み IP、クライアント コンテキスト、デバイス パラメータに制限して、意図的な損失と意図しない損失の両方を低減できます。VPC Service Controls の基本チュートリアル 1 で説明したように、VPC Service Controls を使用して、明示的に指定したサービスのリソースとデータを保護する境界を作成できます。

このチュートリアルの目標は次のとおりです。

  • VPC Service Controls の基本を理解する
  • サービス境界を更新し、ドライラン モードでテストする
  • VPC Service Controls で 2 つのサービスを保護する
  • Cloud Storage のオブジェクトを一覧表示する際の VPC Service Controls の下り(外向き)違反のトラブルシューティング

2. 設定と要件

このチュートリアルでは、次の前提条件を満たす必要があります。

dbec101f41102ca2.png

リソースの設定

  1. 「リソースの設定」の説明に従ってリソースを設定します。VPC Service Controls の基本チュートリアル 1 のセクション
  2. Cloud Storage の管理に必要な権限があることを確認します。
  3. このチュートリアルでは、Cloud コンソールの代わりに CLI を使用します。いずれかの開発環境で、gcloud CLI を設定します。
  • Cloud Shell: gcloud CLI がすでに設定されているオンライン ターミナルを使用するには、Cloud Shell をアクティブにします。

Cloud コンソールの右上にあるアイコンをクリックして Cloud Shell をアクティブにします。セッションが初期化されるまで数秒かかることがあります。詳しくは、Cloud Shell ガイドをご覧ください。

a0ceb29950db4eac.png

費用

Cloud リソースまたは Cloud API を使用するには、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

費用が発生するリソースは、VM インスタンスと Cloud Storage オブジェクトのみです。VM インスタンスの推定費用は、料金計算ツールで確認できます。Cloud Storage の推定費用については、こちらの料金リストをご覧ください。

3. ストレージのバケットとオブジェクトを作成する

前述のように、前のチュートリアルで作成したリソースを再利用します。先に進んで Cloud Storage バケットの作成を続けます。このチュートリアルでは、コンソールの代わりに gcloud CLI を使用します。

  1. Google コンソールで、[ProjectX] を選択します。このプロジェクトでは、ストレージ バケットを作成します。
  2. 次のコマンドを実行して、ProjectX を使用するように Cloud Shell を設定します。
gcloud config set project PROJECT_ID
  1. 開発環境で次のコマンドを実行します。
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. ストレージ オブジェクトを作成して、ProjectZ にある VM インスタンスから読み取れるようにします。ここでは .txt ファイルを作成します。
nano hello.txt 

テキスト ファイルに任意の内容を追加します。

  1. オブジェクトをバケットにアップロードします。
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
  1. オブジェクトを一覧表示して、オブジェクトがバケットにアップロードされたことを確認します。
gcloud storage ls gs://BUCKET_NAME

コンソールに hello.txt ファイルが表示されているはずです。

4. Cloud Storage API を保護する

前の Codelab では、境界と保護された Compute Engine API を作成しました。この Codelab では、ドライラン モードの境界を編集して Cloud Storage を追加します。監査ログで VPC Service Controls 違反を確認することで、境界保護の影響を判断できます。ただし、境界が適用されるまでリソースには引き続きアクセスできます。

  1. Google コンソールで組織を選択します。 VPC Service Controls にアクセスする。組織スコープになっていることを確認します。
  2. Cloud Shell を開き、ドライランの境界「SuperProtection」を更新する次のラボですでに作成済みです。
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
  1. 境界を記述して、Cloud Storage API が更新されたことを確認する
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY 

出力で、制限付きサービスの下に Cloud Storage API がリストされていることがわかります。

Compute Engine API とともに表示されますが、「-vpcAccessibleServices: {}"」ラベルは必要です。

2025ddc01a2e9a81.png

5. Cloud Storage API が保護されていることを確認する

ドライラン モードで、「SuperProtection」がプロジェクト Z で作成された VM インスタンスからストレージ バケットをホストしている ProjectX へのオブジェクトを一覧表示することで、境界で拒否が確認できます。

  1. Cloud コンソールでプロジェクト セレクタに移動し、[ProjectZ] を選択してから [Compute Engine] > [Compute Engine] に移動します。VM インスタンス
  2. [SSH] ボタンをクリックして VM インスタンスに接続し、そのコマンドラインにアクセスします。

5ca02149b78c11f9.png

  1. 先ほどアップロードした hello.txt ファイルのリストを表示します。
gcloud storage ls gs://BUCKET_NAME

Cloud Storage API はドライラン モードで保護されているため、リソースを一覧表示できるはずですが、ProjectZ 監査ログにエラー メッセージが記録されているはずです。

  1. ProjectZ でログ エクスプローラ API に移動し、VPC Service Controls の最後のエラー メッセージを探します。このフィルタを使用して、探しているログを取得できます。
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"
"(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"

このフィルタでは、Cloud Storage に属するドライラン モードで最後の違反が表示されます。ログの表示例を次に示します。ProjectX にあるバケットのコンテンツを一覧表示しようとしたときに、違反が下り(外向き)違反であることを確認できます。

egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTX_ID"
sourceType: "Network"
targetResource: "projects/PROJECTZ_ID"
}
]
resourceNames: [
0: "projects//buckets/BUCKET_NAME"
]
securityPolicyInfo: {
organizationId: "ORGANIZATION_ID"
servicePerimeterName: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
vpcServiceControlsUniqueId: "UNIQUE_ID"
}
methodName: "google.storage.objects.list"
  1. Cloud Storage への API 呼び出しによって VPC Service Controls 違反が発生することが確認されたため、新しい構成で境界を適用します。Cloud Shell を開き、ドライラン境界を適用します。
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
  1. SSH を使用して VM インスタンスに接続し、ストレージ バケットを再度一覧表示して、ドライラン境界が正しく適用されていることを確認します。
gcloud storage ls gs://BUCKET_NAME

この場合、ストレージ オブジェクトのリストではなく、VM CLI に VPC Service Controls 違反が表示されます。

ERROR: (gcloud.storage.ls) User [PROJECT_NUMBER-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:"UNIQUE_ID"

VPC Service Controls を使用して境界外のリソースからのデータの読み取りや境界外のリソースへのデータのコピーを防ぐことで、データの引き出しを阻止することに成功しました。

6. リストの拒否に関するトラブルシューティング。

VM インスタンス CLI から取得した拒否に関するトラブルシューティングを行います。監査ログを確認し、VPC Service Controls の一意の ID を探します。

  1. プロジェクト セレクタに移動し、[ProjectZ] を選択します。
  2. ログ エクスプローラで次のクエリを使用して、監査ログで VPC Service Controls の一意の ID を見つけます。
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"

これにより、すべての VPC Service Controls 監査ログが表示されます。最後のエラーログを探します。VM インスタンスから API 呼び出しが行われたため、プリンシパルは Compute Engine サービス アカウント「PROJECT_NUMBER-compute@developer.gserviceaccount.com"」である必要があります

すでに VPC Service Controls の一意の ID があるので、このフィルタを使用して目的のログを直接取得できます。

protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
  1. [VPC Service Controls] ヘッダーをクリックし、[拒否のトラブルシューティング] を選択します。VPC Service Controls のトラブルシューティングが開きます。

この API はわかりやすい UI に、違反の理由と、これが上り(内向き)違反か下り(外向き)違反か、特に有用な情報を表示します。

この演習では、以下の項目を確認します。

authenticationInfo: {
principalEmail: "PROJECT_ID-compute@developer.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTZ_ID"
sourceType: "Network"
targetResource: "projects/PROJECTX_ID"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"

Compute Engine サービス アカウントが ProjectZ から ProjectX へのストレージ バケットにアクセスできるように下り(外向き)ルールを作成する必要があることは、この情報で十分です。また、ネットワークが同じ境界内にないため、サービスへの VPC 通信を許可し、サービス境界間でデータを共有する必要があります。

  1. Cloud Shell を有効にし、テキスト エディタを使用して下り(外向き)ルールを含む .yaml ファイルを作成します。
nano egresstorage.yaml 
- egressTo:
    operations:
    - serviceName: storage.googleapis.com
      methodSelectors:
      - method: \"*\"
    resources:
    - projects/PROJECTX_ID
 egressFrom:
    identities:
    - serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com
  1. ProjectZ を保護する上り(内向き)ポリシーを更新します。
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY 

VM インスタンスからバケットへのアクセスを再試行します。

  1. Cloud コンソールでプロジェクト セレクタに移動し、[ProjectZ] を選択してから [Compute Engine] > [Compute Engine] に移動します。VM インスタンス
  2. [SSH] ボタンをクリックして VM インスタンスに接続し、そのコマンドラインにアクセスします。
  3. VM CLI を開いたら、ストレージ バケット内のオブジェクトの一覧を表示します。
gcloud storage ls gs://BUCKET_NAME/

次のエラー メッセージが表示されます。

ERROR: (gcloud.storage.ls) User [PROJECT_ID-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): PROJECT_ID-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).
  1. Storage バケット内のオブジェクトを一覧表示するには、Compute Engine サービス アカウントにオブジェクト リーダー権限を付与する必要があります。
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
  1. もう一度、VM インスタンスの CLI から hello.txt ファイルのリストを表示してみましょう。
gcloud storage ls gs://BUCKET_NAME/
.
.
gs://BUCKET_NAME/hello.txt

これで、VPC Service Controls 権限違反なしでオブジェクトを一覧表示できるようになりましたが、ファイルのダウンロードについてはどうでしょうか。やってみましょう。

gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}

次の出力が得られます。

Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER}
 Completed files 1/1 | 54.0B/54.0B  

7. クリーンアップ

サービスが使用されていない場合、VPC Service Controls の使用に対して別途料金はかかりませんが、このラボで使用した設定をクリーンアップすることをおすすめします。VM インスタンスや Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。

  1. VM インスタンスを削除するには、VM インスタンス名の左側にあるチェックボックスをオンにして、[削除] をクリックします。

da0abf0894fe03cd.png

  1. 境界を削除するには、次の操作を行います。
  • Google Cloud コンソールで [セキュリティ] をクリックし、[組織] スコープで [VPC Service Controls] をクリックします。
  • [VPC Service Controls] ページで、削除する境界に対応する表の行にある削除アイコンをクリックします。
  1. アクセスレベルを削除する手順は次のとおりです。
  • Google Cloud コンソールで、フォルダ スコープで [Access Context Manager] ページを開きます。
  • グリッドで、削除するアクセスレベルの行にある削除アイコン、[削除] の順にクリックします。
  1. Storage オブジェクトとバケットを削除する手順は次のとおりです。
  • Google Cloud コンソールで、Cloud Storage の [バケット] ページを開きます。
  • 作成したバケットの横にあるチェックボックスをオンにします。
  • [削除] をクリックします。
  • 表示されたウィンドウで、バケットの削除を確認します。
  • [削除] をクリックします。
  1. プロジェクトをシャットダウンする手順は次のとおりです。
  • Google Cloud コンソールで、[IAM &[Admin Settings] ページ。
  • [IAM と[管理者設定] ページで [シャットダウン] をクリックします。
  • プロジェクト ID を入力し、[シャットダウンする] をクリックします。

8. 完了

この Codelab では、VPC Service Controls のドライランの境界を更新して適用し、トラブルシューティングを行いました。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。