Controllo con vincoli

Gli oggetti vincoli di Policy Controller consentono di applicare i criteri per i cluster Kubernetes. Per testare i criteri, puoi aggiungere un'azione per l'applicazione forzata ai tuoi vincoli. Puoi quindi visualizzare le violazioni negli oggetti e nei log con vincolo.

Tipi di provvedimenti

Sono previste tre misure di applicazione: deny, dryrun e warn.

deny è l'azione predefinita di applicazione forzata. Viene attivata automaticamente, anche se non aggiungi un'azione di applicazione forzata nel vincolo. Utilizza deny per impedire che una determinata operazione del cluster si verifichi quando si verifica una violazione.

dryrun consente di monitorare le violazioni delle regole senza bloccare attivamente le transazioni. Puoi utilizzarlo per verificare se i tuoi vincoli funzionano come previsto, prima di abilitare l'applicazione attiva utilizzando l'azione deny. L'esecuzione di test sui vincoli in questo modo può evitare interruzioni causate da un vincolo configurato in modo errato.

warn è simile a dryrun, ma fornisce anche un messaggio immediato sulle violazioni che si verificano al momento dell'ammissione.

Aggiungere azioni di applicazione forzata

Puoi aggiungere enforcementAction: deny o enforcementAction: dryrun a un vincolo.

Il seguente vincolo di esempio, denominato audit.yaml, aggiunge l'azione 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

Crea il vincolo. Ad esempio, utilizza il codice kubectl apply -f:

kubectl apply -f audit.yaml

Visualizzazione dei risultati del controllo

Le violazioni controllate vengono aggiunte agli oggetti Vincolo e vengono scritte anche nei log. Le violazioni che il controller di ammissione rifiuta non vengono visualizzate nei log.

Visualizzazione dei risultati del controllo negli oggetti del vincolo

Per vedere le violazioni di un determinato vincolo, esegui il comando seguente e visualizza i campi spec.status.

kubectl get constraint-kind constraint-name -o yaml

Esempio

Per visualizzare l'output del vincolo da audit.yaml, esegui il comando seguente:

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

L'output visualizzato è simile al seguente:

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

Visualizzazione dei risultati del controllo nei log

Puoi visualizzare i report di controllo nei log. Per scoprire di più sui log, consulta Utilizzo degli audit log.

Per ottenere tutti i log di Policy Controller, esegui questo comando:

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

I risultati del controllo hanno "process":"audit" nelle righe di log, quindi puoi indirizzare l'output a un altro comando e filtrarlo in base a queste righe. Ad esempio, puoi utilizzare jq, che analizza i file JSON e ti consente di impostare un filtro per un tipo di log specifico.

Esempio di risultato del controllo del logging:

{
"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"
}

Passaggi successivi