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
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc -n my-namespace get seccompprofile profile1 --output wide
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Active 14s operator/my-namespace/profile1.json
NAME STATUS AGE SECCOMPPROFILE.LOCALHOSTPROFILE profile1 Active 14s operator/my-namespace/profile1.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Affichez le chemin d'accès au profil localhost en exécutant la commande suivante :
oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
$ oc get sp profile1 --output=jsonpath='{.status.localhostProfile}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
operator/my-namespace/profile1.json
operator/my-namespace/profile1.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Appliquer la sortie de
localhostProfile
au fichier patch :Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc -n my-namespace patch deployment myapp --patch-file patch.yaml --type=merge
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
deployment.apps/myapp patched
deployment.apps/myapp patched
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 .
$ oc -n my-namespace get deployment myapp --output=jsonpath='{.spec.template.spec.securityContext}' | jq .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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.21
au profil de l'exempleSeccompProfile
, créez un objetProfileBinding
dans le même espace de noms que le pod et les objetsSeccompProfile
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc label ns my-namespace spo.x-k8s.io/enable-binding=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Supprimer et recréer le pod pour utiliser l'objet
ProfileBinding
:oc delete pods test-pod && oc create -f pod01.yaml
$ oc delete pods test-pod && oc create -f pod01.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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}'
$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seccompProfile}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
{"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
{"localhostProfile":"operator/my-namespace/profile.json","type":"Localhost"}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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=true
en exécutant la commande suivante :oc label ns my-namespace spo.x-k8s.io/enable-recording=true
$ oc label ns my-namespace spo.x-k8s.io/enable-recording=true
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer un objet
ProfileRecording
contenant une variablerecorder: logs
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer une charge de travail à enregistrer :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Confirmez que le pod est dans un état
Running
en entrant la commande suivante :oc -n openshift-security-profiles get pods
$ oc -n openshift-security-profiles get pods
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
NAME READY STATUS RESTARTS AGE my-pod 2/2 Running 0 18s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc -n openshift-security-profiles logs --since=1m --selector name=spod -c log-enricher
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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}"
… 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 Copied! Toggle word wrap Toggle overflow
Vérification
Retirer la gousse :
oc -n openshift-security-profiles delete pod my-pod
$ oc -n openshift-security-profiles delete pod my-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Confirmez que l'opérateur de profils de sécurité rapproche les deux profils seccomp :
oc -n openshift-security-profiles get sp
$ oc -n openshift-security-profiles get sp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME STATUS AGE test-recording-nginx Installed 15s test-recording-redis Installed 15s
NAME STATUS AGE test-recording-nginx Installed 15s test-recording-redis Installed 15s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
ProfileRecording
pour y inclure une variablemergeStrategy: containers
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer la charge de travail :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour enregistrer les profils individuels, supprimez le déploiement en exécutant la commande suivante :
oc delete deployment nginx-deploy
$ oc delete deployment nginx-deploy
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Pour fusionner les profils, supprimez l'enregistrement du profil en exécutant la commande suivante :
oc delete profilerecording test-recording
$ oc delete profilerecording test-recording
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc get sp -lspo.x-k8s.io/recording-id=test-recording
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
NAME STATUS AGE test-recording-nginx-record Installed 17m
NAME STATUS AGE test-recording-nginx-record Installed 17m
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
$ oc get sp test-recording-nginx-record -o yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow