This is a user guide to configure audit logging in a single node local Kubernetes cluster using the JSON log enricher feature. The same steps can be used for multi-node clusters and managed clusters as well. This guide provides step-by-step instructions for configuring audit logging and viewing the generated logs.
Please note this is a user guide. Detailed documentation is available at installation-usage.md.
The use case involves two personas:
- Auditor: Configures the audit logging system and views the generated audit logs
- Cluster Administrator/Support Person: Performs administrative tasks such as exec into pods or nodes, whose activities are being audited
To follow this guide, you'll need a Kubernetes cluster and a few command-line tools. We're using a single-node cluster (hack/local-up-cluster.sh) for demonstration. The process works on any Kubernetes cluster.
- Kubernetes Cluster: The commands in this guide have been tested on Kubernetes v1.34.
- kubectl: The command-line tool for interacting with your cluster. We use the feature kubectl debug: add label for debugger pod for easy cleanup of debug pods, so Kubernetes v1.34 version and above of the client is recommended.
Install the SPO by following the detailed installation instructions at Install Operator.
To configure SPO to store logs on the host, create a JSON patch file.
Create a file named patch-volume-source.json with the following content:
{
"data": {
"json-enricher-log-volume-mount-path": "/tmp/logs",
"json-enricher-log-volume-source.json": "{\"hostPath\": {\"path\": \"/tmp/logs\",\"type\": \"DirectoryOrCreate\"}}"
}
}Apply the patch and restart the operator to activate the changes:
kubectl patch configmap security-profiles-operator-profile -n security-profiles-operator --patch-file patch-volume-source.json
kubectl rollout restart deployment security-profiles-operator -n security-profiles-operatorPatch the SPOD daemon set to enable the JSON Enricher and filter logs for user activity.
kubectl -n security-profiles-operator patch spod spod --type=merge -p '{"spec":{ "enableJsonEnricher":true,"verbosity":0,"jsonEnricherOptions":{"auditLogIntervalSeconds":20,"auditLogPath":"/tmp/logs/audit1.log","auditLogMaxSize":500,"auditLogMaxBackups":2,"auditLogMaxAge":10}, "jsonEnricherFilters":"[{\"priority\":100,\"level\":\"Metadata\",\"matchKeys\":[\"requestUID\"]},{\"priority\":999, \"level\":\"None\",\"matchKeys\":[\"version\"],\"matchValues\":[\"spo/v1_alpha\"]}]"}}'This profile logs specific syscalls related to process creation.
Create a file named sec_comp_profile.yaml:
apiVersion: security-profiles-operator.x-k8s.io/v1beta1
kind: SeccompProfile
metadata:
name: profile1
spec:
defaultAction: SCMP_ACT_ALLOW
syscalls:
- action: SCMP_ACT_LOG
names:
- execve
- clone
- fork
- execveatApply the profile to your cluster:
kubectl apply -f sec_comp_profile.yamlThis will automatically apply the profile to new pods in the default namespace.
Create a file named image_sec_comp.yaml:
apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
kind: ProfileBinding
metadata:
namespace: default
name: all-pod-binding
spec:
profileRef:
kind: SeccompProfile
name: profile1
image: "*"Apply the binding and label the namespace to activate it:
kubectl apply -f image_sec_comp.yaml
kubectl label ns default spo.x-k8s.io/enable-binding=trueCreate a test pod:
kubectl run my-nginx-pod --image=nginx --restart=NeverExec into the pod and run a command:
kubectl exec -it my-nginx-pod -- /bin/sh
# touch demo-file
# exitCheck the logs on the host node at the /tmp/logs/audit1.log path. You should see a JSON entry capturing the command.
To audit kubectl debug sessions, run the following command. The activity will be logged to the same file.
kubectl debug node/127.0.0.1 -it --image=ubuntu -- bash
root@ngopalak-ubuntu:/# touch demonodedebug
root@ngopalak-ubuntu:/# exitUse the requestUID from the SPO log to find the corresponding API server log entry, confirming who initiated the session.
cat /tmp/kube-apiserver-audit.log | grep <requestUID>If you are using the CRI-O runtime, you must configure it to allow Seccomp profiles on privileged containers. Add the following flag to your CRI-O runtime configuration:
--privileged-seccomp-profile=/var/lib/kubelet/seccomp/operator/profile1.jsonYou have successfully configured the JSON log enricher for audit logging on your Kubernetes cluster. The system will now capture and log administrative activities such as pod exec and node debugging sessions.
For detailed documentation and additional configuration options, please refer to the installation-usage.md file.