7.5. Gestion des profils seccomp


Créer et gérer des profils seccomp et les lier à des charges de travail.

7.5.1. Création de profils seccomp

Utilisez l'objet SeccompProfile pour créer des profils.

SeccompProfile peuvent restreindre les appels de service dans un conteneur, limitant ainsi l'accès de votre application.

Procédure

  • Créer l'objet SeccompProfile:

    apiVersion: security-profiles-operator.x-k8s.io/v1beta1
    kind: SeccompProfile
    metadata:
      namespace: my-namespace
      name: profile1
    spec:
      defaultAction: SCMP_ACT_LOG
    Copy to Clipboard Toggle word wrap

Le profil seccomp est sauvegardé sur /var/lib/kubelet/seccomp/operator/<namespace>/<name>.json.

Un conteneur init crée le répertoire racine de l'Opérateur de profils de sécurité pour exécuter l'Opérateur sans les privilèges du groupe root ou de l'ID utilisateur. Un lien symbolique est créé à partir du stockage de profil sans racine /var/lib/openshift-security-profiles vers le chemin racine par défaut seccomp à l'intérieur de la racine du kubelet /var/lib/kubelet/seccomp/operator.

7.5.2. Application des profils seccomp à un pod

Créer un pod pour appliquer l'un des profils créés.

Procédure

  1. Créer un objet pod qui définit un securityContext:

    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      securityContext:
        seccompProfile:
          type: Localhost
          localhostProfile: operator/my-namespace/profile1.json
      containers:
        - name: test-container
          image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
    Copy to Clipboard Toggle word wrap
  2. Affichez le chemin d'accès au profil de l'attribut seccompProfile.localhostProfile en exécutant la commande suivante :

    $ oc -n my-namespace get seccompprofile profile1 --output wide
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    NAME       STATUS   AGE   SECCOMPPROFILE.LOCALHOSTPROFILE
    profile1   Active   14s   operator/my-namespace/profile1.json
    Copy to Clipboard Toggle word wrap

  3. Affichez le chemin d'accès au profil localhost en exécutant la commande suivante :

    $ oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    operator/my-namespace/profile1.json
    Copy to Clipboard Toggle word wrap

  4. Appliquer la sortie de localhostProfile au fichier patch :

    spec:
      template:
        spec:
          securityContext:
            seccompProfile:
              type: Localhost
              localhostProfile: operator/my-namespace/profile1.json
    Copy to Clipboard Toggle word wrap
  5. Appliquez le profil à un objet Deployment en exécutant la commande suivante :

    $ oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    deployment.apps/myapp patched
    Copy to Clipboard Toggle word wrap

Vérification

  • Confirmez que le profil a été appliqué correctement en exécutant la commande suivante :

    $ oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    {
      "seccompProfile": {
        "localhostProfile": "operator/my-namespace/profile1.json",
        "type": "localhost"
      }
    }
    Copy to Clipboard Toggle word wrap

Vous pouvez utiliser la ressource ProfileBinding pour lier un profil de sécurité à la ressource SecurityContext d'un conteneur.

Procédure

  1. Pour lier un pod qui utilise une image quay.io/security-profiles-operator/test-nginx-unprivileged:1.21 au profil de l'exemple SeccompProfile, créez un objet ProfileBinding dans le même espace de noms que le pod et les objets SeccompProfile:

    apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
    kind: ProfileBinding
    metadata:
      namespace: my-namespace
      name: nginx-binding
    spec:
      profileRef:
        kind: SeccompProfile 
    1
    
        name: profile 
    2
    
      image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
    Copy to Clipboard Toggle word wrap
    1
    La variable kind: fait référence au nom du profil.
    2
    La variable name: fait référence au nom du profil.
  2. Etiqueter l'espace de noms avec enable-binding=true en exécutant la commande suivante :

    $ oc label ns my-namespace spo.x-k8s.io/enable-binding=true
    Copy to Clipboard Toggle word wrap
  3. Supprimer et recréer le pod pour utiliser l'objet ProfileBinding:

    $ oc delete pods test-pod && oc create -f pod01.yaml
    Copy to Clipboard Toggle word wrap

Vérification

  • Confirmez que le pod hérite de ProfileBinding en exécutant la commande suivante :

    $ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    {"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
    Copy to Clipboard Toggle word wrap

L'opérateur de profils de sécurité peut enregistrer les appels système avec les objets ProfileRecording, ce qui facilite la création de profils de référence pour les applications.

Lors de l'utilisation de l'enrichisseur de journaux pour l'enregistrement des profils seccomp, vérifiez que la fonction d'enrichissement de journaux est activée. Voir Additional resources pour plus d'informations.

Note

Un conteneur avec des restrictions de contexte de sécurité privileged: true empêche l'enregistrement basé sur le journal. Les conteneurs privilégiés ne sont pas soumis aux politiques seccomp, et l'enregistrement basé sur les journaux fait appel à un profil seccomp spécial pour enregistrer les événements.

Procédure

  1. Etiqueter l'espace de noms avec enable-recording=true en exécutant la commande suivante :

    $ oc label ns my-namespace spo.x-k8s.io/enable-recording=true
    Copy to Clipboard Toggle word wrap
  2. Créer un objet ProfileRecording contenant une variable recorder: logs:

    apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
    kind: ProfileRecording
    metadata:
      name: test-recording
    spec:
      kind: SeccompProfile
      recorder: logs
      podSelector:
        matchLabels:
          app: my-app
    Copy to Clipboard Toggle word wrap
  3. Créer une charge de travail à enregistrer :

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      labels:
        app: my-app
    spec:
      containers:
        - name: nginx
          image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
          ports:
            - containerPort: 8080
        - name: redis
          image: quay.io/security-profiles-operator/redis:6.2.1
    Copy to Clipboard Toggle word wrap
  4. Confirmez que le pod est dans un état Running en entrant la commande suivante :

    $ oc -n openshift-security-profiles get pods
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    NAME     READY   STATUS    RESTARTS   AGE
    my-pod   2/2     Running   0          18s
    Copy to Clipboard Toggle word wrap

  5. Confirmez que l'enrichisseur indique qu'il reçoit les journaux d'audit pour ces conteneurs :

    $ oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    …
    I0705 12:08:18.729660 1843190 enricher.go:136] log-enricher "msg"="audit"  "container"="redis" "executable"="/usr/local/bin/redis-server" "namespace"="default" "node"="127.0.0.1" "pid"=1847839 "pod"="my-pod" "syscallID"=232 "syscallName"="epoll_wait" "timestamp"="1625486870.273:187492" "type"="{type}"
    Copy to Clipboard Toggle word wrap

Vérification

  1. Retirer la gousse :

    $ oc -n openshift-security-profiles delete pod my-pod
    Copy to Clipboard Toggle word wrap
  2. Confirmez que l'opérateur de profils de sécurité rapproche les deux profils seccomp :

    $ oc -n openshift-security-profiles get sp
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    NAME                   STATUS      AGE
    test-recording-nginx   Installed   15s
    test-recording-redis   Installed   15s
    Copy to Clipboard Toggle word wrap

7.5.3.1. Fusionner des instances de profil par conteneur

Par défaut, chaque instance de conteneur est enregistrée dans un profil distinct. L'opérateur de profils de sécurité peut fusionner les profils par conteneur en un seul profil. La fusion des profils est utile lors du déploiement d'applications utilisant les objets ReplicaSet ou Deployment.

Procédure

  1. Modifier un objet ProfileRecording pour y inclure une variable mergeStrategy: containers:

    apiVersion: security-profiles-operator.x-k8s.io/v1alpha1
    kind: ProfileRecording
    metadata:
      # The name of the Recording is the same as the resulting SeccompProfile CRD
      # after reconciliation.
      name: test-recording
    spec:
      kind: SeccompProfile
      recorder: logs
      mergeStrategy: containers
      podSelector:
        matchLabels:
          app: sp-record
    Copy to Clipboard Toggle word wrap
  2. Créer la charge de travail :

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deploy
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: sp-record
      template:
        metadata:
          labels:
            app: sp-record
        spec:
          serviceAccountName: spo-record-sa
          containers:
          - name: nginx-record
            image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21
            ports:
            - containerPort: 8080
    Copy to Clipboard Toggle word wrap
  3. Pour enregistrer les profils individuels, supprimez le déploiement en exécutant la commande suivante :

    $ oc delete deployment nginx-deploy
    Copy to Clipboard Toggle word wrap
  4. Pour fusionner les profils, supprimez l'enregistrement du profil en exécutant la commande suivante :

    $ oc delete profilerecording test-recording
    Copy to Clipboard Toggle word wrap
  5. Pour lancer l'opération de fusion et générer le profil de résultats, exécutez la commande suivante :

    $ oc get sp -lspo.x-k8s.io/recording-id=test-recording
    Copy to Clipboard Toggle word wrap

    Exemple de sortie

    NAME                          STATUS      AGE
    test-recording-nginx-record   Installed   17m
    Copy to Clipboard Toggle word wrap

  6. Pour afficher les appels de service utilisés par l'un des conteneurs, exécutez la commande suivante :

    $ oc get sp test-recording-nginx-record -o yaml
    Copy to Clipboard Toggle word wrap

Ressources supplémentaires

Retour au début
Red Hat logoGithubredditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance. Découvrez nos récentes mises à jour.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez le Blog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

Theme

© 2025 Red Hat