外部サービスのトラフィック遮断とパススルーの監視

Istioを使用して、遮断された外部トラフィックとパススルーされた外部トラフィックを監視する方法について説明します。

2019年9月28日 | Neeraj Poddar - Aspen Mesh

外部サービスへのアクセスを理解し、制御し、保護することは、Istioのようなサービスメッシュから得られる重要な利点の1つです。セキュリティと運用上の観点から、ブロックされている外部サービスのトラフィックを監視することが重要です。これは、アプリケーションがアクセスしてはならないサービスと通信しようとしている場合、誤った設定やセキュリティ上の脆弱性を明らかにする可能性があるためです。同様に、現在、すべての外部サービスアクセスを許可するポリシーがある場合、トラフィックを監視することで、アクセスを許可する明示的なIstio設定を段階的に追加し、クラスタのセキュリティを向上させることが有益です。いずれの場合も、テレメトリを介してこのトラフィックの可視性を確保することは非常に役立ちます。アラートやダッシュボードを作成し、セキュリティ体制についてより適切に判断できるようになるためです。これはIstioの運用ユーザーから非常に要望の高かった機能であり、1.3リリースでこのサポートが追加されたことを嬉しく思っています。

これを実装するために、Istioのデフォルトメトリクスは、ブロックされた外部サービスのトラフィックとパススルーされた外部サービスのトラフィックをキャプチャするために、明示的なラベルで拡張されます。このブログでは、これらの拡張されたメトリクスを使用してすべての外部サービストラフィックを監視する方法について説明します。

Istioコントロールプレーンは、BlackHoleClusterとPassthroughという、それぞれすべてのトラフィックをブロックまたは許可する事前定義されたクラスタを使用して、サイドカープロキシを設定します。これらのクラスタを理解するために、Istioサービスメッシュにおける外部サービスと内部サービスの意味から始めましょう。

外部サービスと内部サービス

内部サービスは、プラットフォームの一部であり、メッシュ内にあると見なされるサービスとして定義されます。内部サービスの場合、Istioコントロールプレーンはデフォルトでサイドカーに必要なすべての構成を提供します。たとえば、Kubernetesクラスタでは、IstioはすべてのKubernetesサービスのサイドカーを設定して、すべてのサービスが互いに通信できるというKubernetesのデフォルトの動作を維持します。

外部サービスは、プラットフォームの一部ではないサービス、つまりメッシュ外のサービスです。外部サービスの場合、Istioは2つのオプションを提供します。1つはすべての外部サービスアクセスをブロックする(global.outboundTrafficPolicy.modeREGISTRY_ONLYに設定することで有効化)、もう1つはすべての外部サービスへのアクセスを許可する(global.outboundTrafficPolicy.modeALLOW_ANYに設定することで有効化)です。この設定のデフォルトオプション(Istio 1.3時点)は、すべての外部サービスアクセスを許可することです。このオプションはメッシュ構成を介して設定できます。

ここで、BlackHoleとPassthroughのクラスタが使用されます。

BlackHoleとPassthroughのクラスタとは?

Istio 1.3より前は、メトリクスが報告されていなかったか、報告されていてもこれらのクラスタにトラフィックがヒットしたときに明示的なラベルが設定されていなかったため、メッシュを流れるトラフィックの可視性が不足していました。

次のセクションでは、仮想アウトバウンドリスナーまたは明示的なポート/プロトコルリスナーのいずれかがヒットしたかどうかによってメトリクスとラベルの発行が条件付けられるため、この機能強化を活用する方法について説明します。

拡張されたメトリクスの使用

いずれの場合(BlackHoleまたはPassthrough)でもすべての外部サービストラフィックをキャプチャするには、istio_requests_totalistio_tcp_connections_closed_totalメトリクスを監視する必要があります。呼び出されるEnvoyリスナーの種類、つまりTCPプロキシリスナーまたはHTTPプロキシリスナーに応じて、これらのメトリクスのいずれかがインクリメントされます。

さらに、TCPプロキシリスナーの場合、BlackHoleまたはPassthroughクラスタを介してブロックまたは許可されている外部サービスのIPアドレスを確認するには、destination_ipラベルをistio_tcp_connections_closed_totalメトリクスに追加する必要があります。このシナリオでは、外部サービスのホスト名はキャプチャされません。このラベルはデフォルトでは追加されず、属性生成とPrometheusハンドラのIstio構成を拡張することで簡単に追加できます。多くのサービスでIPアドレスが不安定な場合、時系列の基数爆発には注意する必要があります。

PassthroughClusterメトリクス

このセクションでは、Envoyで呼び出されるリスナーの種類に基づいて発行されるメトリクスとラベルについて説明します。

BlackHoleClusterメトリクス

PassthroughClusterと同様に、このセクションでは、Envoyで呼び出されるリスナーの種類に基づいて発行されるメトリクスとラベルについて説明します。

これらのメトリクスを監視することで、運用者はクラスタ内のアプリケーションによって消費されるすべての外部サービスを簡単に理解できます。

この記事を共有する