Ingress Controller を介したワークロードの公開

内部用ワークロードを Ingress で外部に公開すると、意図しないアクセス経路が生じるおそれがあります。

説明

Ingress は Service を HTTP・HTTPS リクエストに接続します。コントローラーとロードバランサーの設定によってインターネットまたは内部ネットワークからアクセスできるため、内部用ワークロードが意図せず公開されないことを確認する必要があります。

すべてのサービスに Ingress が必要なわけではありません。外部公開が必要なサービスを選び、それ以外は内部通信に制限してください。

想定される影響

  • 内部サービスがインターネットや外部ネットワークから到達可能になる場合があります。
  • 必要な認証やレート制限などがないと、攻撃対象となる範囲が広がるおそれがあります。
  • 誤ったルーティングにより、意図しないサービスに外部リクエストが届く場合があります。

対処方法

  • 内部ワークロードの公開 Ingress 経路を削除するか、内部専用のコントローラーを使用してください。
  • 公開するサービスとパスを、外部アクセスが必要な範囲に制限してください。
  • 認証、アクセス制御、TLS、レート制限を確認し、実際の外部到達性をテストしてください。

例

最初の例は従来の extensions/v1beta1 形式を残した説明用の抜粋です。この Ingress API は Kubernetes 1.22 以降では提供されないため、現在のデプロイでは対応する networking.k8s.io/v1 形式を使用してください。

変更前

yaml
apiVersion: v1
kind: Service
metadata:
  name: app
spec:
  type: ClusterIP
  ports:
    - port: 3000
      targetPort: 3000
  selector:
    app: app
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-ingress
spec:
  rules:
    - host: app.acme.org
      http:
        paths:
          - backend:
              serviceName: app
              servicePort: 3000

変更後

yaml
apiVersion: v1
kind: Service
metadata:
  name: app
spec:
  type: ClusterIP
  ports:
    - port: 3000
      targetPort: 3000
  selector:
    app: app

補足:

  • 変更前: コントローラーから app Service にリクエストを転送する経路です。インターネットへの公開はコントローラー設定にも依存します。
  • 変更後: 内部の ClusterIP Service だけを残します。ファイルから Ingress を省略しても既存リソースは削除されないため、既存の app-ingress を削除し、ほかの公開経路も確認してください。

参考資料