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