kube-system 以外の名前空間で hostPath を使用するワークロード

一般的なアプリケーションで hostPath を使うとノード上のファイルへのアクセスが広がるため、必要性と権限を制限してください。

説明

hostPath ボリュームをコンテナーにマウントすると、ノードのファイルシステムに直接アクセスできます。システムエージェントなど、ノードへのアクセスが不可欠な場合を除き、通常のアプリケーションでは用途に合ったストレージを使用してください。

ワークロードを kube-system に移すだけでは、ファイルアクセスは制限されません。リスクは実際のホストパス、コンテナーのマウント設定、ファイル権限によって異なります。

想定される影響

  • ノードの設定、ログ、認証情報がコンテナーから読み取られる可能性があります。
  • 書き込み権限がある場合、ホストファイルの変更が他のワークロードやノードの動作に影響するおそれがあります。
  • ノードごとのファイルの状態に依存し、ワークロードの動作が異なる場合があります。

対処方法

  • アプリケーションデータには適切なストレージの PVC、設定には ConfigMap、機密情報には Secret などを検討してください。
  • 必須のシステムワークロードだけに必要なホストパスを許可し、読み取りだけでよければ readOnly: true を設定してください。
  • 対象ワークロードを作成・変更できる権限も制限してください。名前空間の名前だけをセキュリティ境界としないでください。

例

次の例はボリューム宣言の抜粋です。セレクター、Pod のラベル、volumeMounts などは省略しています。実際の利用では必要な項目とサポートされるイメージを設定してください。

変更前

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  template:
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
      volumes:
        - name: static-page-dir
          hostPath:
            path: /var/local/static
            type: DirectoryOrCreate

一般的なアプリケーションにホストの /var/local/static ディレクトリを提供する構成です。マウントすると、アプリケーションがノード上のファイルに依存します。

変更後

yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
spec:
  template:
    spec:
      containers:
        - name: fluentd-elasticsearch
          image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
      volumes:
        - name: varlog
          hostPath:
            path: /var/log

システムのログ収集器が /var/log にアクセスする用途は妥当な場合があります。ただし、kube-system にあるだけでは保護されません。実際の volumeMounts を読み取り専用にし、ログへのアクセス権限を確認する必要があります。

参考資料