クラスタ内部からのアクセス制限が必要な Tiller

移行が完了するまで、Tiller 管理エンドポイントへのアクセスと権限を制限してください。

説明

Tiller は Helm 2 のサーバーコンポーネントで、自身のサービスアカウントの権限を使って Kubernetes リソースを管理します。到達可能なエンドポイントに適切な認証がなければ、他のワークロードがその権限で操作を要求できる可能性があります。

Helm 2 は 2020 年 11 月以降、セキュリティ更新を受けていません。Tiller を使わない、サポートされる Helm バージョンに移行してください。

想定される影響

  • 未承認の要求によって、Tiller に与えられた権限の範囲でデプロイや他のリソースが変更される可能性があります。
  • 侵害された Pod が、到達可能な管理エンドポイントを通じて他のワークロードに影響を与える可能性があります。

対処方法

  • リリース情報とデプロイ手順を検証し、Tiller を使わない方式に移行してから Tiller を削除してください。
  • すぐに削除できない場合は、ループバックへのバインドや認証付き TLS 接続でアクセスを制限し、サービスアカウントの権限を最小化してください。
  • 同じ Pod のコンテナーとポート転送の権限も確認してください。ループバックへのバインドだけでは、すべての管理アクセスを遮断できません。

例

以下は過去の Tiller Deployment の待ち受けアドレスを比較した抜粋です。実際のイメージ、selector、サービスアカウントの設定は別途必要です。Tiller の新規導入を勧める例ではありません。

変更前

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tiller-bad-args
  labels:
    app: helm
    name: tiller
spec:
  template:
    metadata:
      labels:
        app: helm
        name: tiller
    spec:
      containers:
        - name: tiller-v2
          image: tiller-image
          args:
            - "--listen=10.7.2.8:44134"

Tiller がこのアドレスを持つ環境では、ループバック以外のインターフェイスから要求を受け付けられます。実際の到達可能性と TLS 認証を確認してください。

変更後

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tiller-deploy
  labels:
    app: helm
    name: tiller
spec:
  template:
    metadata:
      labels:
        app: helm
        name: tiller
    spec:
      containers:
        - name: tiller
          image: tiller-image
          args:
            - "--listen=127.0.0.1:44134"

待ち受けアドレスを 127.0.0.1 に制限しています。同じ Pod 内のプロセスや許可されたポート転送からは到達できるため、権限を制限しながら移行を進めてください。

参考資料