Cloud Run for Anthos でのセキュリティのベスト プラクティス

Cloud Run for Anthos は、Istio for Ingress を利用しています。そのため、ニーズに合うように Istio をカスタマイズして構成できます。これは、Cloud Run for Anthos が、Istio の既知の問題や脆弱性の影響を受けることも意味します。

このページは、既知のベスト プラクティスを使用して Cloud Run for Anthos を構成し、あらゆる既知の問題に対処できるようにすることで、リソースを誤って脆弱性にさらすことを回避するために作成されました。

他のベスト プラクティス ガイドとリソースは、次のとおりです。

既知の脆弱性

AuthorizationPolicies でのパスの構成

セキュリティ脆弱性

説明

Istio の AuthorizationPolicies は、Cloud Run for Anthos サービスへのパスを使うアクセス制御に使用できます。CVE-2021-31920 により、パスベースのアクセス制御を構成すると、パスかく乱攻撃に対して脆弱になる可能性があります。

たとえば、yourservice.com/admin にあるサービスで、パス /admin へのリクエストを許可するように構成されているとします。//admin へのアクセスを明示的に拒否しなければ、AuthorizationPolicy のパスの脆弱性により、不正な形式の //admin パスを使用するリクエストを阻止できません。サービスがそうしたパスの違いを区別しない可能性があり、不正な形式のパスへのリクエストによる意図しないアクセスが許可されます。

背景:

Cloud Run for Anthos で使用されるデフォルトの Istio Ingress ゲートウェイは、Envoy プロキシで RFC 3986に続く normalize_path オプションを使用して、デフォルトの URL パターンを正規化します。

残念ながら、いくつかの既知のリクエスト URL パターンの中には、デフォルト URL パターン正規化標準によって正規化されていないものがあります。この脆弱性を緩和する方法については、次のセクションをご覧ください。

対策:

現在、パス混乱攻撃に対する脆弱性を防ぐために実装できる方法が 2 つあります。

  • 推奨オプション: デフォルトですべてのアクセスを拒否する

    AuthorizationPolicy ポリシーでは、default-deny パターンを使用するように Istio を構成します。全体的には、これによってクラスタのセキュリティに対する構えが改善されます。default-deny の認可パターンを構成すると、サービスへのすべてのリクエストはデフォルトで拒否され、リクエストがアクセスを許可されるすべての条件を明示的に定義できます。

    このパターンを使用すると、特定の条件の許可を間違えた場合に、特定のリクエストが予期せず拒否される可能性があります。その結果、ユーザー エクスペリエンスの低下、サービスの停止、SLO や SLA の不履行の原因となる可能性があります。通常、すべてのアクセスを明示的に定義することに対する代償は、意図しないアクセスによるセキュリティ インシデントよりも優先されます。

    例:

    ターゲットの名前空間で allow-nothing ポリシーを定義することによって、default-deny パターンを使用する AuthorizationPolicy を作成します。たとえば、default 名前空間内のすべてのサービスに対するトラフィックをすべて拒否するには、次のものを作成します。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: allow-nothing
      namespace: default
    spec:
      {}
    

    AuthorizationPolicy タイプポリシーの定義については、HTTP トラフィックに対する Istio 認可をご覧ください。

  • 別の方法: 問題のある URL バリエーションをすべてサービスに明示的に拒否する

    default-deny パターンの実装を回避するには、バックエンド サービスが問題のあるパスをすべて拒否できるようにする必要があります。言語、フレームワーク、およびサービスの実装方法の他の要因に応じて、Istio Ingress ゲートウェイが正規化しないすべての URL パスを明示的に拒否する必要があります。これには以下が含まれます。

    • 複数のスラッシュまたはバックスラッシュ: //\\
    • スラッシュまたはバックスラッシュのエスケープ シーケンス: %2F%2f%5C%5c