外部 LoadBalancer Service の使用

LoadBalancer Service の実際の公開範囲を確認し、内部サービスへの不要な外部経路を制限してください。

説明

type: LoadBalancer の Service は、クラスター外からアクセスできるエンドポイントを作成できます。インターネットへの公開はクラウドとコントローラーの設定に依存します。内部用サービスを公開すると、意図しないアクセス経路が生じるおそれがあります。

まず外部アクセスの必要性を判断してください。内部通信には ClusterIP または内部専用の LoadBalancer を優先して検討してください。

想定される影響

  • 内部サービスがインターネットや外部ネットワークに直接公開される場合があります。
  • 認証やアクセス制御の弱いサービスが、外部からの探索対象になるおそれがあります。
  • 把握していない公開経路により、セキュリティ管理が難しくなる場合があります。

対処方法

  • 外部公開が不要なサービスには、内部 Service または内部 LoadBalancer を使用してください。
  • 使用するコントローラーに対応する内部専用設定を適用し、実際のロードバランサーとアクセスルールを確認してください。
  • 公開が必要なサービスだけを承認し、管理してください。

例

後の例の annotation は、対応する AWS コントローラー向けです。AWS Load Balancer Controller はこの従来設定をサポートしますが、aws-load-balancer-scheme が優先されます。使用するバージョンの推奨設定と実際の構成を確認してください。

変更前

yaml
apiVersion: v1
kind: Service
metadata:
  name: sample-service-public
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    app: nginx

変更後

yaml
apiVersion: v1
kind: Service
metadata:
  name: sample-service-internal
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: LoadBalancer
  selector:
    app: nginx

補足:

  • 変更前: LoadBalancer を要求します。公開範囲はコントローラーのデフォルトと設定によって決まります。
  • 変更後: 対応する AWS コントローラーに内部 LoadBalancer を要求します。ほかの公開経路とアクセス制御も確認してください。

参考資料