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 Copier lienLien copié sur presse-papiers!
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 Copier lienLien copié sur presse-papiers!
Créer un pod pour appliquer l'un des profils créés.
Procédure
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.21Affichez le chemin d'accès au profil de l'attribut
seccompProfile.localhostProfileen exécutant la commande suivante :$ oc -n my-namespace get seccompprofile profile1 --output wideExemple de sortie
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Active 14s operator/my-namespace/profile1.jsonAffichez 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.jsonAppliquer la sortie de
localhostProfileau fichier patch :spec: template: spec: securityContext: seccompProfile: type: Localhost localhostProfile: operator/my-namespace/profile1.jsonAppliquez le profil à un objet
Deploymenten exécutant la commande suivante :$ oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=mergeExemple 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 Copier lienLien copié sur presse-papiers!
Vous pouvez utiliser la ressource ProfileBinding pour lier un profil de sécurité à la ressource SecurityContext d'un conteneur.
Procédure
Pour lier un pod qui utilise une image
quay.io/security-profiles-operator/test-nginx-unprivileged:1.21au profil de l'exempleSeccompProfile, créez un objetProfileBindingdans le même espace de noms que le pod et les objetsSeccompProfile:apiVersion: security-profiles-operator.x-k8s.io/v1alpha1 kind: ProfileBinding metadata: namespace: my-namespace name: nginx-binding spec: profileRef: kind: SeccompProfile1 name: profile2 image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21Etiqueter l'espace de noms avec
enable-binding=trueen exécutant la commande suivante :$ oc label ns my-namespace spo.x-k8s.io/enable-binding=trueSupprimer 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
ProfileBindingen 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 Copier lienLien copié sur presse-papiers!
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.
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
Etiqueter l'espace de noms avec
enable-recording=trueen exécutant la commande suivante :$ oc label ns my-namespace spo.x-k8s.io/enable-recording=trueCréer un objet
ProfileRecordingcontenant une variablerecorder: logs:apiVersion: security-profiles-operator.x-k8s.io/v1alpha1 kind: ProfileRecording metadata: name: test-recording spec: kind: SeccompProfile recorder: logs podSelector: matchLabels: app: my-appCré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.1Confirmez que le pod est dans un état
Runningen entrant la commande suivante :$ oc -n openshift-security-profiles get podsExemple de sortie
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18sConfirmez 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-enricherExemple 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
Retirer la gousse :
$ oc -n openshift-security-profiles delete pod my-podConfirmez que l'opérateur de profils de sécurité rapproche les deux profils seccomp :
$ oc -n openshift-security-profiles get spExemple 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 Copier lienLien copié sur presse-papiers!
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
Modifier un objet
ProfileRecordingpour y inclure une variablemergeStrategy: 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-recordCré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: 8080Pour enregistrer les profils individuels, supprimez le déploiement en exécutant la commande suivante :
$ oc delete deployment nginx-deployPour fusionner les profils, supprimez l'enregistrement du profil en exécutant la commande suivante :
$ oc delete profilerecording test-recordingPour 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-recordingExemple de sortie
NAME STATUS AGE test-recording-nginx-record Installed 17mPour 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