制約を使用して Pod セキュリティを適用する

このページでは、ポリシーを適用する前にポリシーをテストする追加機能とともに、Policy Controller の制約を使用して、PodSecurityPolicies と同じ保護機能の多くを実現する方法について説明します。このドキュメントの例では、関連するすべての制約を説明しているわけではありませんが、使用を開始する方法を説明しています。

このドキュメントで説明する制約と制約のテンプレートのソースコードは、Gatekeeper プロジェクト リポジトリの pod-security-policy ディレクトリで入手できます。各制約テンプレートには単体テストも含まれています。

始める前に

Pod による特権付きコンテナの実行を防ぐ

特権コンテナはノード上のホスト オペレーティング システム、またはノード上で実行されている他のワークロードに影響を与える可能性があるため、Pod では特権付きコンテナを実行しないことをおすすめします。

この制約により、K8sPSPPrivilegedContainer 制約テンプレートを使用すると、Pod が特権コンテナを実行できなくなります。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: psp-privileged-container
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces: ["kube-system"]

コンテナに読み取り専用のルート ファイル システムを要求する

デフォルトでは、コンテナはルート ファイル システムに書き込むことができます。セキュリティ上の問題は別として、この動きはコンテナの書き込み可能レイヤでの書き込みレイテンシが原因で、パフォーマンスのボトルネックを引き起こす可能性があります。PodSecurityPolicy または制約を使用して、コンテナに読み取り専用のルート ファイル システムを要求できます。

この制約は、K8sPSPReadOnlyRootFilesystem 制約テンプレートを使用します。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPReadOnlyRootFilesystem
metadata:
  name: psp-readonlyrootfilesystem
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

コンテナがマウントできるボリュームのタイプを制限する

デフォルトでは、コンテナは Kubernetes API を使用して登録されているすべてのタイプのボリュームをクラスタにマウントできます。

この制約では、K8sPSPVolumeTypes 制約テンプレートを使用して、コンテナを制限付きボリューム タイプに制限します。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPVolumeTypes
metadata:
  name: psp-volume-types
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    volumes:
    # - "*" # * can be used to allow all volume types
    - configMap
    - emptyDir
    - projected
    - secret
    - downwardAPI
    - persistentVolumeClaim
    #- hostPath #required for allowedHostPaths
    - flexVolume #required for allowedFlexVolumes

監査結果

dryrun 適用アクションを使用して、アクティブなワークロードを中断することなく、制約の効果をテストできます。これにより、ブロックすることなくポリシーの監査結果が生成されます。詳細については、制約を使用した監査をご覧ください。

次のステップ