制約のある Google Cloud 環境でアプリケーションを開発する

Google のドキュメントは、サービスまたは機能の開発と運用に役立つよう作成されていますが、組織でセキュリティ制限を適用すると一部のドキュメントが正しく機能しない場合があります。たとえば、お客様の会社で、Cloud Foundation ToolkitGoogle Cloud セキュリティ ブループリントから一部のセキュリティ制限を導入するか、独自のクリエイティブを作成することもできます。

この記事では、セキュリティ制限を適用する組織で発生する可能性のあるアプリケーションのデプロイエラーのトラブルシューティング方法を示します。

セキュリティ制限に関する問題のトラブルシューティング

IT 運用チームまたはセキュリティ チームは、組織のポリシーを使用してセキュリティ制限を有効にできます。これらの制限により、組織のリソースの使用方法が制限されます。

エラーを返す API リクエストを発行すると、API レスポンスがポリシー違反によるものかどうかがわかります。レスポンスでは、違反した制限を説明する必要があります。違反が発生しているかどうかを判断して把握するには、次のトラブルシューティングの手順をご覧ください。

  1. API レスポンスのエラー メッセージを確認します。デプロイ違反となるセキュリティ制限を確認できます。

    次の例は、sql.restrictPublicIp 制限が問題であることを示しています。

    Organization Policy check failure
    The external IP of this instance violates the constraints/sql.restrictPublicIp enforced
    
  2. ポリシー違反を把握したら、制限内で動作するようにリソース デプロイメント構成を更新します。

    前の例では、外部パブリック IP アドレスを制限しているため、内部プライベート IP アドレスを使用するように Cloud SQL インスタンスを構成します。

  3. 制限が適用される理由や対処方法がわからない場合は、セキュリティ チームと連携して、ポリシーが組織の階層のどこに適用されるかを把握し、推奨される回避策をご確認ください。

    Terraform テンプレートなどのデプロイメント テンプレートが組織内で共有されていないか確認します。これらのテンプレートでは、Google Cloud インフラストラクチャの構成方法を説明し、アプリケーションのデプロイメントを制限する必要があります。

セキュリティ制限に関する一般的な問題

Google Cloud でアプリケーションをデプロイするときに、次の例のようなエラーが発生する場合があります。

ERROR: (gcloud.alpha.sql.instances.create) HTTPError 400: Invalid request:
Organization Policy check failure: the external IP of this instance violates the
constraints/sql.restrictPublicIp enforced at the 123456789 project.

この例では、外部パブリック IP アドレスを使用するように Cloud SQL インスタンスを構成することはできません。ご利用の環境に適用されるポリシーからセキュリティ制限が適用されています。

アプリケーションの開発では、次の一般的なセキュリティ制限が有効となり、API エラー レスポンスで詳細に表示されることがあります。

Compute Engine

制限名 導入の理由 推奨される回避策
constraints/compute.disableNestedVirtualization KVM 互換のハイパーバイザが VM 内にインストールされないようにします。この動作により、適切なパッチを適用して管理しなくてもセキュリティ リスクが生じる場合があります。 ハードウェア アクセラレーションによってネストされた仮想化を無効にするように VM を構成します。

Intel Haswell 以降の CPU プラットフォームで動作しているすべての Compute Engine VM に対して、デフォルトで有効になっています。
constraints/compute.requireShieldedVm セキュアブート、vTPM、整合性モニタリングのオプションが有効になっている Shielded ディスク イメージを使用するには、新しい VM インスタンスが必要です。これらのオプションにより、VM が改ざんされず、データへのアクセスまたはデータの変更を回避できます。 VM を作成するときに、シールドされた VM を有効にしないでください。

GKE クラスタを作成するには、シールドされた GKE ノードを有効にする必要があります。

Dataflow は現在、シールドされた VM のワーカーをサポートしていません。
constraints/compute.disableSerialPortAccess セキュリティ ベクトルを削除して VM を操作するか、攻撃を生成するために利用できる診断出力を表示します。 VM を作成するときにシリアルポートへのアクセスを有効にしないでください。
constraints/compute.disableGuestAttributesAccess 悪意のあるアプリによって悪用される可能性がある、基盤となるホストとプラットフォームに関する情報の量を最小限に抑えます。 Compute Engine VM のゲスト属性の読み取りに Compute Engine API を使用しないでください。
constraints/compute.vmExternalIpAccess 外部 IP アドレスを使用してアプリケーションを実行させず、インターネットからアクセスできないようにします。 VM の外部 IP アクセスを無効にします。内部プライベート IP アドレスのみ使用できます。

GKE は、パブリック IP アドレスのない限定公開クラスタを使用できます。

Dataprep と Dataflow は現在、プライベート IP アドレスをサポートしていません。

仮想ネットワークと IP アドレス

制限名 導入の理由 推奨される回避策
constraints/compute.skipDefaultNetworkCreation 会社で管理している Virtual Private Cloud(VPC)のみを作成できるか、ネットワーク トラフィックまたはフィルタリング ルールが適用されているかを確認します。 組織内の既存 VPC にアプリケーションを接続します。デフォルトの自動作成 VPC は、新しいプロジェクトにはデプロイされません。
constraints/compute.restrictXpnProjectLienRemoval 共有 VPC が提供しているネットワーク サービスに他のプロジェクトのリソースが依存している場合に共有 VPC が誤って削除されるのを防ぎます。 共有 VPC を削除しないでください。正しい削除対象リソースを指定しているかを確認してください。
constraints/sql.restrictPublicIp 外部 IP アドレスを使用して Cloud SQL インスタンスを実行させず、インターネットからアクセスできないようにします。 外部パブリック IP アドレスを使用するように Cloud SQL インスタンスを構成しないでください。

代わりに、内部プライベート IP アドレスを使用するように Cloud SQL インスタンスを構成してください。

ID と認証

制限名 導入の理由 推奨される回避策
constraints/iam.disableServiceAccountKeyCreation サービス アカウント キーが公開された場合は、セキュリティ リスクが生じる可能性があるため、エクスポートされないようにしてください。 サービス アカウント キーよりも安全な代替手段を使用して認証を行います。
constraints/storage.uniformBucketLevelAccess Identity and Access Management(IAM)の使用のみを許可することで、誤った権限または矛盾する権限がストレージ バケットに適用されるリスクを最小限に抑えます。 均一なバケットレベルのアクセスを有効にして、Cloud Storage バケットを保護します。
constraints/iam.allowedPolicyMemberDomains Google Cloud リソースへのアクセスを承認済みドメインのみに制限します。 承認済みドメインうち 1 つの範囲内のアカウントを使用します。この制約に関する既知の問題がさらに存在します。

API レスポンス エラーの例

前述の例で Cloud SQL を使用して外部パブリック IP アドレスを制限する場合、ポリシー違反があると API によりエラーが返されます。次のより詳細な例は、どの制限によってリクエストが失敗したのかを示す API レスポンスを示しています。アプリケーションのレスポンスが失敗する原因を理解するために、独自の API レスポンスを調べます。

Google Cloud CLI による Cloud SQL のエラー:

$ gcloud alpha sql instances create mysql-node --project my-sql-project

ERROR: (gcloud.alpha.sql.instances.create) HTTPError 400: Invalid request:
Organization Policy check failure: the external IP of this instance violates the
constraints/sql.restrictPublicIp enforced at the 123456789 project.

Terraform での Cloud SQL の失敗:

$ terraform apply plan.out

[...]
module.mysql-db.google_sql_database_instance.default: Creating...

Error: Error, failed to create instance backend01-db-1c81e0e3: googleapi:
Error 400: Invalid request: Organization Policy check failure: the external IP
of this instance violates the constraints/sql.restrictPublicIp enforced at the
123456789 project., invalid

プロジェクトに適用されている組織のポリシーの一覧表示

プロジェクトは、フォルダレベルまたは組織レベルからポリシーを継承できます。アクセス制限によっては、違反している制限が適用される場所を確認するために、階層の上位レベルでどのポリシーが適用されるのかがわかりません。

プロジェクトに適用されているポリシーや例外を確認するには、gcloud alpha resource-manager org-policies list コマンドを使用して、--project パラメータでプロジェクト ID を指定します。

gcloud alpha resource-manager org-policies list --project <project-id>

適用されたポリシーの詳細を確認するには、gcloud alpha resource-manager org-policies describe コマンドを使用します。記述するポリシーの名前を指定し、--project パラメータを使用してプロジェクト ID を指定します。

gcloud alpha resource-manager org-policies describe <policy-name> --project <project-id>

次のステップ

ポリシーが適用される場所とセキュリティ制限を回避する方法がわからない場合は、IT 運用チームやセキュリティ チームにお問い合わせください。各組織は、環境に合わせてカスタマイズしたポリシーとブループリントを適用します。

組織に適用できるすべての制御の詳細については、組織ポリシーの制限のリストをご覧ください。