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
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
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
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
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
Appliquer la sortie de
localhostProfile
au fichier patch :spec: template: spec: securityContext: seccompProfile: type: Localhost localhostProfile: operator/my-namespace/profile1.json
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
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
: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
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
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.
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
Créer un objet
ProfileRecording
contenant 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-app
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
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
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
Retirer la gousse :
$ oc -n openshift-security-profiles delete pod my-pod
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
Modifier un objet
ProfileRecording
pour 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-record
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
Pour enregistrer les profils individuels, supprimez le déploiement en exécutant la commande suivante :
$ oc delete deployment nginx-deploy
Pour fusionner les profils, supprimez l'enregistrement du profil en exécutant la commande suivante :
$ oc delete profilerecording test-recording
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
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