Effectuer un audit à l'aide de contraintes

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

Types de mesures d'application

Il existe deux actions d'application : deny et dryrun.

deny est l'action 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 empêcher une opération de cluster donnée de se produire en cas de violation.

dryrun vous permet de surveiller les cas de non-respect de vos règles sans bloquer activement les transactions. Vous pouvez l'utiliser pour tester si 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.

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 violations auditées sont ajoutées aux objets de contrainte et sont également écrites dans les journaux. Les violations refusées par le contrôleur d'admission n'apparaissent pas dans les journaux.

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

Pour voir les cas de non-respect 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 afficher les rapports d'audit dans vos journaux. Pour en savoir plus sur les journaux, consultez la section Afficher les journaux Anthos Config Management.

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 de l'audit comportent "process":"audit" dans les lignes de journal. Vous pouvez donc diriger la sortie vers une autre commande et filtrer 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