Kubernetes コンテナーの Linux capability 削減の確認

既定の権限を減らし、アプリケーションに必要な Linux capability だけを許可してください。

説明

コンテナーは既定で複数の Linux capability を持つ場合があります。securityContext.capabilities.drop を設定しないと、アプリケーションに不要な権限が残るおそれがあります。add で必要な権限を追加するだけでは既定の権限は削除されないため、ランタイムと適用されたポリシーも併せて実効権限を確認する必要があります。

想定される影響

  • コンテナーに不要なシステム権限が残る場合があります。
  • アプリケーションの脆弱性が悪用されたとき、影響が大きくなるおそれがあります。

対処方法

  • Linux コンテナーでは可能な限り capabilities.drop に ALL を指定し、実際に必要な capability だけを add で許可してください。アプリケーションの起動と正常な動作を試してください。
  • 特権モードは別途解除し、非 root 実行と権限昇格の防止を組み合わせてください。実行中も不要な capability が残っていないことを確認してください。

例

Deployment のコンテナー権限だけを比較する抜粋です。selector などは省略しています。実際のイメージに必要な権限と、低い番号のポートを使う条件は別途確認してください。

変更前

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  template:
    spec:
      containers:
        - name: payment
          image: nginx
          securityContext:
            capabilities:
              add:
                - NET_BIND_SERVICE

NET_BIND_SERVICE を追加していますが、他の既定 capability は削除していません。

変更後

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  template:
    spec:
      containers:
        - name: payment
          image: nginx
          securityContext:
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE

既定 capability をすべて削除してから、NET_BIND_SERVICE だけを再度要求します。この権限も実際に必要な場合だけ維持してください。

参考資料