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ètre spec en exécutant la commande suivante :

    $ oc -n openshift-security-profiles patch spod spod --type merge \
        -p '{"spec":{"allowedSyscalls": ["exit", "exit_group", "futex", "nanosleep"]}}'
Important

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 ajoutez baseProfileName: runc-v1.0.0 au champ spec:

    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/metricspour les mesures de la durée d'exécution des contrôleurs
  • metrics.openshift-security-profiles/metrics-spodpour les métriques du démon Operator

Procédure

  1. 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

  2. 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 noms openshift-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

  3. Pour récupérer les métriques d'un autre espace de noms, reliez le site ServiceAccount au site spo-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_.

Tableau 7.1. Mesures disponibles pour le temps d'exécution du contrôleur

Clé métriqueÉtiquettes possiblesTypeObjectif

seccomp_profile_total

operation={delete,update}

Compteur

Nombre d'opérations de profil seccomp.

seccomp_profile_audit_total

node, namespace, pod, container, executable, syscall

Compteur

Nombre d'opérations d'audit du profil seccomp. Nécessite l'activation de l'enrichisseur de journaux.

seccomp_profile_bpf_total

node, mount_namespace, profile

Compteur

Nombre d'opérations bpf du profil seccomp. L'enregistreur bpf doit être activé.

seccomp_profile_error_total

reason={
SeccompNotSupportedOnNode,
InvalidSeccompProfile,
CannotSaveSeccompProfile,
CannotRemoveSeccompProfile,
CannotUpdateSeccompProfile,
CannotUpdateNodeStatus
}

Compteur

Nombre d'erreurs de profil seccomp.

selinux_profile_total

operation={delete,update}

Compteur

Nombre d'opérations de profil SELinux.

selinux_profile_audit_total

node, namespace, pod, container, executable, scontext,tcontext

Compteur

Nombre d'opérations d'audit du profil SELinux. Nécessite l'activation de l'enrichisseur de journaux.

selinux_profile_error_total

reason={
CannotSaveSelinuxPolicy,
CannotUpdatePolicyStatus,
CannotRemoveSelinuxPolicy,
CannotContactSelinuxd,
CannotWritePolicyFile,
CannotGetPolicyStatus
}

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.

Important

L'enrichisseur de journaux doit avoir le droit de lire les processus de l'hôte.

Procédure

  1. 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

    Note

    L'opérateur de profils de sécurité redéploiera automatiquement le jeu de démons spod.

  2. 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

  1. 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
  2. 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
  3. 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

  1. Définissez la configuration du webhook recording.spo.io pour enregistrer uniquement les pods étiquetés avec spo-record=true en créant le fichier patch suivant :

    spec:
      webhookOptions:
        - name: recording.spo.io
          objectSelector:
            matchExpressions:
              - key: spo-record
                operator: In
                values:
                  - "true"
  2. 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
  3. Pour visualiser l'objet MutatingWebhookConfiguration résultant, exécutez la commande suivante :

    $ oc get MutatingWebhookConfiguration \
        spo-mutating-webhook-configuration -oyaml