7.7. Profils de sécurité avancés Tâches de l'opérateur
Utilisez les tâches avancées pour activer les mesures, configurer les webhooks ou restreindre les appels de service.
7.7.1. Restreindre les appels de service autorisés dans les profils seccomp
Par défaut, l'Opérateur de profils de sécurité ne restreint pas syscalls
dans les profils seccomp
. Vous pouvez définir la liste des syscalls
autorisés dans la configuration de spod
.
Procédure
Pour définir la liste des
allowedSyscalls
, ajustez le paramètrespec
en exécutant la commande suivante :$ oc -n openshift-security-profiles patch spod spod --type merge \ -p '{"spec":{"allowedSyscalls": ["exit", "exit_group", "futex", "nanosleep"]}}'
L'opérateur n'installera que les profils seccomp
, qui ont un sous-ensemble de syscalls
défini dans la liste autorisée. Tous les profils ne respectant pas cet ensemble de règles sont rejetés.
Lorsque la liste des syscalls
autorisés est modifiée dans la configuration de spod
, l'Opérateur identifiera les profils déjà installés qui ne sont pas conformes et les supprimera automatiquement.
7.7.2. Appels système de base pour un runtime de conteneur
Vous pouvez utiliser l'attribut baseProfileName
pour établir le minimum requis syscalls
pour une durée d'exécution donnée afin de démarrer un conteneur.
Procédure
Modifiez l'objet de type
SeccompProfile
et ajoutezbaseProfileName: runc-v1.0.0
au champspec
:apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: namespace: my-namespace name: example-name spec: defaultAction: SCMP_ACT_ERRNO baseProfileName: runc-v1.0.0 syscalls: - action: SCMP_ACT_ALLOW names: - exit_group
7.7.3. Utiliser des indicateurs
L'espace de noms openshift-security-profiles
fournit des points d'extrémité pour les mesures, qui sont sécurisés par le conteneur kube-rbac-proxy. Toutes les mesures sont exposées par le service metrics
dans l'espace de noms openshift-security-profiles
.
L'opérateur de profils de sécurité comprend un rôle de cluster et un lien correspondant spo-metrics-client
pour récupérer les métriques au sein du cluster. Il existe deux chemins d'accès aux métriques :
-
metrics.openshift-security-profiles/metrics
pour les mesures de la durée d'exécution des contrôleurs -
metrics.openshift-security-profiles/metrics-spod
pour les métriques du démon Operator
Procédure
Pour afficher l'état du service de métrologie, exécutez la commande suivante :
$ oc get svc/metrics -n openshift-security-profiles
Exemple de sortie
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE metrics ClusterIP 10.0.0.228 <none> 443/TCP 43s
Pour récupérer les métriques, interrogez le point de terminaison du service à l'aide du jeton par défaut
ServiceAccount
dans l'espace de nomsopenshift-security-profiles
en exécutant la commande suivante :$ oc run --rm -i --restart=Never --image=registry.fedoraproject.org/fedora-minimal:latest \ -n openshift-security-profiles metrics-test -- bash -c \ 'curl -ks -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://metrics.openshift-security-profiles/metrics-spod'
Exemple de sortie
# HELP security_profiles_operator_seccomp_profile_total Counter about seccomp profile operations. # TYPE security_profiles_operator_seccomp_profile_total counter security_profiles_operator_seccomp_profile_total{operation="delete"} 1 security_profiles_operator_seccomp_profile_total{operation="update"} 2
Pour récupérer les métriques d'un autre espace de noms, reliez le site
ServiceAccount
au sitespo-metrics-client
ClusterRoleBinding
en exécutant la commande suivante :$ oc get clusterrolebinding spo-metrics-client -o wide
Exemple de sortie
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS spo-metrics-client ClusterRole/spo-metrics-client 35m openshift-security-profiles/default
7.7.3.1. controller-runtime metrics
Le controller-runtime metrics
et le DaemonSet endpoint metrics-spod
fournissent un ensemble de mesures par défaut. Des mesures supplémentaires sont fournies par le démon, qui sont toujours préfixées par security_profiles_operator_
.
Clé métrique | Étiquettes possibles | Type | Objectif |
---|---|---|---|
|
| Compteur | Nombre d'opérations de profil seccomp. |
|
| Compteur | Nombre d'opérations d'audit du profil seccomp. Nécessite l'activation de l'enrichisseur de journaux. |
|
| Compteur | Nombre d'opérations bpf du profil seccomp. L'enregistreur bpf doit être activé. |
|
| Compteur | Nombre d'erreurs de profil seccomp. |
|
| Compteur | Nombre d'opérations de profil SELinux. |
|
| Compteur | Nombre d'opérations d'audit du profil SELinux. Nécessite l'activation de l'enrichisseur de journaux. |
|
| Compteur | Nombre d'erreurs de profil SELinux. |
7.7.4. Utilisation de l'enrichisseur de billes
L'Opérateur de profils de sécurité contient une fonction d'enrichissement des journaux, qui est désactivée par défaut. Le conteneur d'enrichissement des journaux s'exécute avec les autorisations privileged
pour lire les journaux d'audit du nœud local. L'enrichisseur de journaux s'exécute dans l'espace de noms PID de l'hôte, hostPID
.
L'enrichisseur de journaux doit avoir le droit de lire les processus de l'hôte.
Procédure
Modifiez la configuration de
spod
pour activer l'enrichisseur de journaux en exécutant la commande suivante :$ oc -n openshift-security-profiles patch spod spod \ --type=merge -p '{"spec":{"enableLogEnricher":true}}'
Exemple de sortie
securityprofilesoperatordaemon.security-profiles-operator.x-k8s.io/spod patched
NoteL'opérateur de profils de sécurité redéploiera automatiquement le jeu de démons
spod
.Affichez les journaux d'audit en exécutant la commande suivante :
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
Exemple de sortie
I0623 12:51:04.257814 1854764 deleg.go:130] setup "msg"="starting component: log-enricher" "buildDate"="1980-01-01T00:00:00Z" "compiler"="gc" "gitCommit"="unknown" "gitTreeState"="clean" "goVersion"="go1.16.2" "platform"="linux/amd64" "version"="0.4.0-dev" I0623 12:51:04.257890 1854764 enricher.go:44] log-enricher "msg"="Starting log-enricher on node: 127.0.0.1" I0623 12:51:04.257898 1854764 enricher.go:46] log-enricher "msg"="Connecting to local GRPC server" I0623 12:51:04.258061 1854764 enricher.go:69] log-enricher "msg"="Reading from file /var/log/audit/audit.log" 2021/06/23 12:51:04 Seeked /var/log/audit/audit.log - &{Offset:0 Whence:2}
7.7.4.1. Utiliser l'enrichisseur de logs pour tracer une application
Vous pouvez utiliser l'enrichisseur de journaux de l'opérateur des profils de sécurité pour tracer une application.
Procédure
Pour tracer une application, créez un profil de journalisation
SeccompProfile
:apiVersion: security-profiles-operator.x-k8s.io/v1beta1 kind: SeccompProfile metadata: name: log namespace: default spec: defaultAction: SCMP_ACT_LOG
Créer un objet pod pour utiliser le profil :
apiVersion: v1 kind: Pod metadata: name: log-pod spec: securityContext: seccompProfile: type: Localhost localhostProfile: operator/default/log.json containers: - name: log-container image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
Examinez la sortie de l'enrichisseur de journaux en exécutant la commande suivante :
$ oc -n openshift-security-profiles logs -f ds/spod log-enricher
Exemple 7.1. Exemple de sortie
… I0623 12:59:11.479869 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.205:1061" "type"="seccomp" I0623 12:59:11.487323 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1062" "type"="seccomp" I0623 12:59:11.492157 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=157 "syscallName"="prctl" "timestamp"="1624453150.205:1063" "type"="seccomp" … I0623 12:59:20.258523 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=12 "syscallName"="brk" "timestamp"="1624453150.235:2873" "type"="seccomp" I0623 12:59:20.263349 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=21 "syscallName"="access" "timestamp"="1624453150.235:2874" "type"="seccomp" I0623 12:59:20.354091 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2875" "type"="seccomp" I0623 12:59:20.358844 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=5 "syscallName"="fstat" "timestamp"="1624453150.235:2876" "type"="seccomp" I0623 12:59:20.363510 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=9 "syscallName"="mmap" "timestamp"="1624453150.235:2877" "type"="seccomp" I0623 12:59:20.454127 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=3 "syscallName"="close" "timestamp"="1624453150.235:2878" "type"="seccomp" I0623 12:59:20.458654 1854764 enricher.go:111] log-enricher "msg"="audit" "container"="log-container" "executable"="/usr/sbin/nginx" "namespace"="default" "node"="127.0.0.1" "pid"=1905792 "pod"="log-pod" "syscallID"=257 "syscallName"="openat" "timestamp"="1624453150.235:2879" "type"="seccomp" …
7.7.5. Configuration des webhooks
Les objets de liaison et d'enregistrement de profil peuvent utiliser des webhooks. Les configurations de la liaison de profil et des objets d'enregistrement sont MutatingWebhookConfiguration
CR, gérées par l'opérateur de profils de sécurité.
Pour modifier la configuration du webhook, le CR spod
expose un champ webhookOptions
qui permet de modifier les variables failurePolicy
, namespaceSelector
et objectSelector
. Cela vous permet de configurer les webhooks en mode "soft-fail" ou de les restreindre à un sous-ensemble d'espaces de noms de sorte que même si les webhooks échouent, les autres espaces de noms ou ressources ne sont pas affectés.
Procédure
Définissez la configuration du webhook
recording.spo.io
pour enregistrer uniquement les pods étiquetés avecspo-record=true
en créant le fichier patch suivant :spec: webhookOptions: - name: recording.spo.io objectSelector: matchExpressions: - key: spo-record operator: In values: - "true"
Apportez un correctif à l'instance
spod/spod
en exécutant la commande suivante :$ oc -n openshift-security-profiles patch spod \ spod -p $(cat /tmp/spod-wh.patch) --type=merge
Pour visualiser l'objet
MutatingWebhookConfiguration
résultant, exécutez la commande suivante :$ oc get MutatingWebhookConfiguration \ spo-mutating-webhook-configuration -oyaml