Rechercher

7.5. Gestion des profils seccomp

download PDF

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

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

    Exemple de sortie

    NAME       STATUS   AGE   SECCOMPPROFILE.LOCALHOSTPROFILE
    profile1   Active   14s   operator/my-namespace/profile1.json

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

    $ oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'

    Exemple de sortie

    operator/my-namespace/profile1.json

  4. Appliquer la sortie de localhostProfile au fichier patch :

    spec:
      template:
        spec:
          securityContext:
            seccompProfile:
              type: Localhost
              localhostProfile: operator/my-namespace/profile1.json
  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

    Exemple de sortie

    deployment.apps/myapp patched

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 .

    Exemple de sortie

    {
      "seccompProfile": {
        "localhostProfile": "operator/my-namespace/profile1.json",
        "type": "localhost"
      }
    }

7.5.2.1. Lier les charges de travail aux profils avec ProfileBindings

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
    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
  3. Supprimer et recréer le pod pour utiliser l'objet ProfileBinding:

    $ oc delete pods test-pod && oc create -f pod01.yaml

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}'

    Exemple de sortie

    {"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}

7.5.3. Enregistrement de profils à partir de charges de travail

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
  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
  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
  4. Confirmez que le pod est dans un état Running en entrant la commande suivante :

    $ oc -n openshift-security-profiles get pods

    Exemple de sortie

    NAME     READY   STATUS    RESTARTS   AGE
    my-pod   2/2     Running   0          18s

  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

    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}"

Vérification

  1. Retirer la gousse :

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

    $ oc -n openshift-security-profiles get sp

    Exemple de sortie

    NAME                   STATUS      AGE
    test-recording-nginx   Installed   15s
    test-recording-redis   Installed   15s

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
  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
  3. Pour enregistrer les profils individuels, supprimez le déploiement en exécutant la commande suivante :

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

    $ oc delete profilerecording test-recording
  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

    Exemple de sortie

    NAME                          STATUS      AGE
    test-recording-nginx-record   Installed   17m

  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

Ressources supplémentaires

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.

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

© 2024 Red Hat, Inc.