Controllo con vincoli
Gli oggetti relativi ai vincoli di Policy Controller consentono di applicare i criteri per i cluster Kubernetes. Per verificare i tuoi criteri, puoi aggiungere un'azione di applicazione forzata ai tuoi vincoli. Puoi quindi visualizzare le violazioni negli oggetti e nei log dei vincoli.
Tipi di azioni di applicazione forzata
Le azioni di applicazione delle due norme sono deny
e dryrun
.
deny
è l'azione predefinita per l'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 utilizzarla per verificare se i vincoli funzionano come previsto, prima di abilitare l'applicazione attiva tramite l'azione deny
. Verificare i vincoli in questo modo può impedire interruzioni causate da un vincolo configurato in modo errato.
Aggiunta di 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, applicalo usando kubectl apply -f
:
kubectl apply -f audit.yaml
Visualizzazione dei risultati del controllo
Le violazioni controllate vengono aggiunte agli oggetti Vincolo e scritte anche nei log. Le violazioni che il controller di ammissione rifiuta non vengono visualizzate nei log.
Visualizzazione dei risultati del controllo negli oggetti con vincoli
Per visualizzare 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 rapporti di controllo nei log. Per scoprire di più sui log, consulta Utilizzo degli audit log.
Per visualizzare 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 reindirizzare l'output a un altro comando 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 di controllo della registrazione:
{
"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
- Scopri di più sulla creazione di vincoli
- Utilizzare la libreria dei modelli di vincolo
- Scopri come utilizzare i vincoli anziché i PodSecurityPolicy