Istio における egress トラフィックの安全な制御 パート 2
Istio の Egress トラフィック制御を使用して、egress トラフィックに関連する攻撃を防止します。
Istio における egress トラフィックの安全な制御に関する新しいシリーズのパート 2 へようこそ。 シリーズの最初のパートでは、egress トラフィックに関連する攻撃と、egress トラフィックの安全な制御システムに必要な要件について説明しました。 この記事では、Istio で egress トラフィックを安全に制御する方法と、Istio が攻撃の防止にどのように役立つかを示します。
Istio における egress トラフィックの安全な制御
Istio で egress トラフィックの安全な制御を実装するには、TLS トラフィックを egress ゲートウェイ経由で外部サービスに転送する必要があります。 あるいは、HTTP トラフィックを egress ゲートウェイ経由で転送し、egress ゲートウェイで TLS オリジネーションを実行することもできます。
どちらの方法にも長所と短所があり、状況に応じて選択する必要があります。 選択は主に、アプリケーションが暗号化されていない HTTP リクエストを送信できるかどうか、および組織のセキュリティポリシーで暗号化されていない HTTP リクエストの送信が許可されているかどうかによって異なります。 たとえば、アプリケーションが暗号化をキャンセルできないクライアントライブラリを使用してトラフィックを暗号化している場合、暗号化されていない HTTP トラフィックを送信するオプションは使用できません。 組織のセキュリティポリシーで、**ポッド内**(ポッド外ではトラフィックは Istio によって暗号化されます)で暗号化されていない HTTP リクエストの送信が許可されていない場合も同様です。
アプリケーションが HTTP リクエストを送信し、egress ゲートウェイが TLS オリジネーションを実行する場合、HTTP メソッド、ヘッダー、URL パスなどの HTTP 情報を監視できます。 また、HTTP 情報に基づいてポリシーを定義することもできます。 アプリケーションが TLS オリジネーションを実行する場合、SNI と送信元ポッドのサービスアカウントの TLS トラフィックを監視し、SNI とサービスアカウントに基づいてポリシーを定義できます。
クラスタから外部へのトラフィックが egress ゲートウェイをバイパスできないようにする必要があります。 Istio はこれを強制できないため、追加のセキュリティメカニズム、たとえば Kubernetes ネットワークポリシーまたは L3 ファイアウォールを適用する必要があります。 Kubernetes ネットワークポリシーの構成例を参照してください。 多層防御の概念によれば、同じ目標に適用するセキュリティメカニズムが多いほど効果的です。
また、Istio コントロールプレーンと egress ゲートウェイが侵害されないようにする必要もあります。 クラスタには数百または数千のアプリケーションポッドが存在する可能性がありますが、Istio コントロールプレーンポッドとゲートウェイはわずかです。 コントロールプレーンポッドとゲートウェイの保護は容易(保護するポッドの数が少ない)であり、クラスタのセキュリティにとって最も重要であるため、重点的に取り組む必要があります。 攻撃者がコントロールプレーンまたは egress ゲートウェイを侵害した場合、あらゆるポリシーに違反する可能性があります。
環境に応じて、コントロールプレーンポッドを保護するための複数のツールがある場合があります。 妥当なセキュリティ対策は次のとおりです。
- コントロールプレーンポッドを、アプリケーションノードとは別のノードで実行します。
- コントロールプレーンポッドを、独自の個別の名前空間で実行します。
- Kubernetes RBAC とネットワークポリシーを適用して、コントロールプレーンポッドを保護します。
- アプリケーションポッドよりも綿密にコントロールプレーンポッドを監視します。
egress トラフィックを egress ゲートウェイ経由で転送し、追加のセキュリティメカニズムを適用すると、トラフィックのセキュリティポリシーを安全に監視し、適用できます。
次の図は、Istio のセキュリティアーキテクチャを示しています。Istio の外部で提供されるべき追加のセキュリティメカニズムの一部である L3 ファイアウォールが追加されています。
L3 ファイアウォールは、Istio ingress ゲートウェイ経由の着信トラフィックと Istio egress ゲートウェイ経由の送信トラフィックのみを許可するように簡単に構成できます。 ゲートウェイの Istio プロキシは、メッシュ内の他のすべてのプロキシと同様に、ポリシーを適用し、テレメトリを報告します。
次に、考えられる攻撃を検討し、Istio での egress トラフィックの安全な制御によってそれらをどのように防止できるかを示します。
考えられる攻撃の防止
egress トラフィックの次のセキュリティポリシーについて考えてみます。
- アプリケーション **A** は、`*.ibm.com` にアクセスできます。これには、`*.ibm.com` に一致する URL を持つすべての外部サービスが含まれます。
- アプリケーション **B** は、`mongo1.composedb.com` にアクセスできます。
- すべての egress トラフィックが監視されます。
攻撃者の目標が次のとおりだとします。
- クラスタから `*.ibm.com` にアクセスする。
- クラスタから `*.ibm.com` に、監視されずにアクセスする。 攻撃者は、禁止されたアクセスが検出される可能性を防ぐために、トラフィックが監視されないようにしたいと考えています。
- クラスタから `mongo1.composedb.com` にアクセスする。
ここで、攻撃者がアプリケーション **A** のいずれかのポッドに侵入し、侵害されたポッドを使用して禁止されたアクセスを実行しようとしたとします。 攻撃者は運を試して、簡単な方法で外部サービスにアクセスしようとすることがあります。 簡単な試みには、次のように対応します。
- 当初は、侵害されたアプリケーション **A** が `*.ibm.com` にアクセスするのを防ぐ方法はありません。これは、侵害されたポッドが元のポッドと区別できないためです。
- 幸いなことに、外部サービスへのすべてのアクセスを監視し、疑わしいトラフィックを検出し、攻撃者が `*.ibm.com` への監視されていないアクセスを取得するのを阻止できます。 たとえば、egress トラフィックログに異常検出ツールを適用できます。
- 攻撃者がクラスタから `mongo1.composedb.com` にアクセスするのを阻止するために、Istio はトラフィックの送信元(この場合はアプリケーション **A**)を正しく検出し、上記のセキュリティポリシーに従って `mongo1.composedb.com` にアクセスできないことを確認します。
簡単な方法で目標を達成できなかった場合、悪意のある攻撃者は高度な攻撃に頼ることがあります。
- **コンテナのサイドカープロキシをバイパス**して、サイドカーのポリシー適用とレポートなしに、任意の外部サービスに直接アクセスできるようにします。 この攻撃は、Kubernetes ネットワークポリシーまたは egress ゲートウェイからのみメッシュから egress トラフィックを許可する L3 ファイアウォールによって防止されます。
- **egress ゲートウェイを侵害**して、監視システムに偽情報を送信したり、セキュリティポリシーの適用を無効にしたりするように強制します。 この攻撃は、egress ゲートウェイポッドに特別なセキュリティ対策を適用することで防止されます。
- アプリケーション **B** は `mongo1.composedb.com` にアクセスできるため、**アプリケーション B としてなりすます**。 幸いなことに、この攻撃は Istio の強力な ID サポートによって防止されます。
私たちが見ている限り、すべての禁止されたアクセスは防止されるか、少なくとも監視されており、後で防止できます。 egress トラフィックに関連する他の攻撃や現在の設計のセキュリティホールが見つかった場合は、ご連絡ください。
まとめ
Istio が egress トラフィックに関連する攻撃を防止するための効果的なツールであることをご理解いただけたでしょうか。 このシリーズの次のパートでは、Istio における egress トラフィックの安全な制御と、Kubernetes ネットワークポリシーや従来の egress プロキシ/ファイアウォールなどの代替ソリューションを比較します。