Utiliser des contraintes pour appliquer les règles de sécurité des pods

Cette page vous explique comment utiliser les contraintes du service Policy Controller pour obtenir un grand nombre des protections de la propriété PodSecurityPolicies, avec la possibilité supplémentaire de tester vos stratégies avant de les appliquer. Les exemples de ce document ne couvrent pas toutes les contraintes associées, mais vous expliquent comment démarrer.

Le code source des modèles de contraintes et des contraintes décrits dans ce document est disponible dans le répertoire pod-security-policy du dépôt du projet GateKeeper. Chacun des modèles de contraintes comprend également des tests unitaires.

Avant de commencer

Empêcher les pods d'exécuter des conteneurs privilégiés

Nous vous recommandons d'empêcher les pods d'exécuter des conteneurs privilégiés, car ceux-ci peuvent potentiellement affecter le système d'exploitation hôte sur le nœud ou d'autres charges de travail s'exécutant sur le nœud.

Cette contrainte empêche les pods d'exécuter des conteneurs privilégiés à l'aide du modèle de contrainte K8sPSPPrivilegedContainer :

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

Exiger un système de fichiers racine en lecture seule sur le conteneur

Par défaut, un conteneur peut écrire dans son système de fichiers racine. Outre les problèmes de sécurité, cela peut entraîner des goulots d'étranglement qui affectent les performances en raison de la latence en écriture dans la couche accessible en écriture du conteneur. Vous pouvez imposer un système de fichiers racine en lecture seule sur les conteneurs à l'aide d'une stratégie PodSecurityPolicy ou d'une contrainte.

Cette contrainte utilise le modèle de contrainte K8sPSPReadOnlyRootFilesystem.

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

Restreindre les types de volumes qu'un conteneur peut installer

Par défaut, un conteneur peut installer tout type de volume enregistré auprès de l'API Kubernetes sur le cluster.

Cette contrainte restreint les conteneurs à un ensemble limité de types de volumes à l'aide du modèle de contrainte 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

Auditer les résultats

Vous pouvez tester l'efficacité des contraintes sans perturber les charges de travail actives à l'aide de l'action d'application dryrun. Cela génère des résultats d'audit pour vos stratégies sans les bloquer activement. Pour en savoir plus, consultez la page Auditer à l'aide de contraintes.

Étape suivante