Kubernetes の OS ディレクトリマウント保護の確認

OS ディレクトリのボリュームソースと書き込み制限を確認し、不要なファイル変更を防いでください。

説明

システムパスにマウントしたボリュームへの書き込みが許可されると、実行ファイルや設定が変更され、コンテナーの動作に影響する可能性があります。ホストのファイルシステムを接続するボリュームであれば、ノードにも影響する可能性があります。

mount_path はコンテナー内のパスです。/bin などのパスだけでホストのディレクトリをマウントしているとは判断できないため、対応するボリュームソースと実際のファイル権限を確認してください。

想定される影響

  • 書き込み可能なシステムファイルや設定が改ざんされ、アプリケーションが正常に動作しなくなる可能性があります。
  • ホストのファイルを共有する場合は、ノードやほかのワークロードにも影響する可能性があります。

対処方法

  • 不要なシステムパスのマウントを削除し、必要なデータだけを最小限のパスで提供してください。
  • 書き込みが不要なら read_only = true を指定してください。入れ子のマウントや別のアクセス経路も保護されるか、別途確認してください。
  • ボリュームソース、ファイル権限、privileged、capabilities を併せて確認してください。

例

ボリュームマウントの部分例です。対応するボリューム定義が省略されているため実際のソースは不明で、そのままではデプロイできません。実際のデプロイにはサポートされるイメージのバージョンを使用してください。

変更前

hcl
resource "kubernetes_pod" "app_pod" {
  metadata {
    name = "terraform-example"
  }

  spec {
    container {
      name  = "app-container"
      image = "nginx:1.7.9"

      volume_mount {
        name       = "system-bin"
        mount_path = "/bin"
      }
    }
  }
}

読み取り専用を指定せずに、コンテナー内の /bin にボリュームをマウントしています。ファイル変更の可否やホストへの影響は、ソースと権限によって異なります。

変更後

hcl
resource "kubernetes_pod" "app_pod" {
  metadata {
    name = "terraform-example"
  }

  spec {
    container {
      name  = "app-container"
      image = "nginx:1.7.9"

      volume_mount {
        name       = "config-volume"
        mount_path = "/etc/config"
        read_only  = true
      }
    }
  }
}

設定用ボリュームを読み取り専用として要求しています。/etc/config というパス自体が安全性を保証するわけではなく、実際のソースと入れ子のマウントも確認する必要があります。

参考資料