Effectuer un audit à l'aide de contraintes

Les objets de contrainte Policy Controller vous permettent d'appliquer des règles à vos clusters Kubernetes. Pour tester vos règles, vous pouvez ajouter une action d'application à vos contraintes. Vous pouvez ensuite afficher les non-respects dans les objets de contrainte et les journaux.

Cette page s'adresse aux administrateurs et opérateurs informatiques qui souhaitent s'assurer que toutes les ressources exécutées sur la plate-forme cloud répondent aux exigences de conformité organisationnelle en fournissant et en maintenant l'automatisation des audits ou des applications, et qui gèrent le cycle de vie de l'infrastructure technologique sous-jacente. Pour en savoir plus sur les rôles courants et les exemples de tâches que nous citons dans le contenu Google Cloud, consultez la section Rôles utilisateur et tâches courantes de l'utilisateur dans GKE Enterprise.

Types d'actions d'application

Il existe trois actions d'application : deny, dryrun et warn.

deny est l'action d'application par défaut. Elle est automatiquement activée, même si vous n'ajoutez pas d'action d'application dans votre contrainte. Utilisez deny pour éviter qu'une opération de cluster donnée ne se produise en cas de non-respect.

dryrun vous permet de surveiller les non-respects de vos règles sans bloquer activement les transactions. Elle vous permet de vérifier que vos contraintes fonctionnent comme prévu, avant d'activer l'application active à l'aide de l'action deny. Tester les contraintes de cette manière peut éviter les perturbations causées par une contrainte mal configurée.

warn est semblable à dryrun, mais fournit également un message immédiat sur les violations qui se produisent au moment de l'admission.

Lorsque vous testez de nouvelles contraintes ou effectuez des actions de migration (comme la mise à niveau des plates-formes), il est recommandé de passer les actions d'application de deny à warn ou dryrun afin de pouvoir vérifier que vos règles fonctionnent comme prévu.

Ajouter des actions d'application

Vous pouvez ajouter enforcementAction: deny ou enforcementAction: dryrun à une contrainte.

L'exemple de contrainte suivant, nommé audit.yaml, ajoute l'action dryrun.

#audit.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  name: user-must-be-3333
spec:
  enforcementAction: dryrun
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    runAsUser:
      rule: MustRunAs
      ranges:
        - min: 3333
          max: 3333

Créez la contrainte. Par exemple, appliquez-le à l'aide de kubectl apply -f :

kubectl apply -f audit.yaml

Afficher les résultats d'audit

Les non-respects contrôlées sont ajoutés aux objets Contraintes et sont également écrits dans les journaux. Les non-respects refusés par le contrôleur d'admission n'apparaissent pas dans les journaux.

Afficher les résultats d'audit dans les objets de contrainte

Pour afficher les non-respects d'une contrainte donnée, exécutez la commande suivante et affichez les champs spec.status.

kubectl get constraint-kind constraint-name -o yaml

Exemple

Pour afficher le résultat de la contrainte de audit.yaml, exécutez la commande suivante :

kubectl get K8sPSPAllowedUsers user-must-be-3333 -o yaml

Le résultat renvoyé ressemble à ceci :

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  creationTimestamp: "2020-05-22T01:34:22Z"
  generation: 1
  name: user-must-be-3333
  resourceVersion: "13351707"
  selfLink: /apis/constraints.gatekeeper.sh/v1beta1/k8spspallowedusers/user-must-be-3333
  uid: 5d0b39a8-9bcc-11ea-bb38-42010a80000c
spec:
  enforcementAction: dryrun
  match:
    kinds:
    - apiGroups:
      - ""
      kinds:
      - Pod
  parameters:
    runAsUser:
      ranges:
      - max: 3333
        min: 3333
      rule: MustRunAs
 status:
  auditTimestamp: "2020-05-22T01:39:05Z"
  byPod:
  - enforced: true
    id: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    observedGeneration: 1
 totalViolations: 5
  violations:
  - enforcementAction: dryrun
    kind: Pod
    message: Container git-sync is attempting to run as disallowed user 65533
    name: git-importer-86564db8cb-5r4gs
    namespace: config-management-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container manager is attempting to run as disallowed user 1000
    name: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    namespace: gatekeeper-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-cckf
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-jnhb
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8
    namespace: kube-system

Afficher les résultats d'audit dans les journaux

Vous pouvez utiliser l'explorateur de journaux pour récupérer, afficher et analyser les données des journaux de Policy Controller.

Pour obtenir tous les journaux Policy Controller, exécutez la commande suivante :

kubectl logs -n gatekeeper-system -l gatekeeper.sh/system=yes

Les résultats d'audit contiennent "process":"audit" dans les lignes de journal. Vous pouvez donc acheminer la sortie vers une autre commande et filtrer les lignes en fonction de ces lignes. Par exemple, vous pouvez utiliser jq, qui analyse les fichiers JSON et vous permet de définir un filtre pour un type de journal spécifique.

Exemple de résultat d'audit à partir de la journalisation :

{
"level":"info",
"ts":1590111401.9769812,
"logger":"controller",
"msg":"Container kube-proxy is attempting to run without a required securityContext/runAsUser",
"process":"audit",
"audit_id":"2020-05-22T01:36:24Z",
"event_type":"violation_audited",
"constraint_kind":"K8sPSPAllowedUsers",
"constraint_name":"user-must-be-3333",
"constraint_namespace":"",
"constraint_action":"dryrun",
"resource_kind":"Pod",
"resource_namespace":"kube-system",
"resource_name":"kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8"
}

Étape suivante