7.6. Gestion des profils SELinux
Créer et gérer des profils SELinux et les associer à des charges de travail.
7.6.1. Création de profils SELinux Copier lienLien copié sur presse-papiers!
Utilisez l'objet SelinuxProfile pour créer des profils.
L'objet SelinuxProfile présente plusieurs caractéristiques qui permettent de renforcer la sécurité et d'améliorer la lisibilité :
-
Limite les profils dont il faut hériter à l'espace de noms actuel ou à un profil général. Étant donné que de nombreux profils sont généralement installés sur le système, mais que seul un sous-ensemble doit être utilisé par les charges de travail en cluster, les profils système héritables sont répertoriés dans l'instance
spodà l'adressespec.selinuxOptions.allowedSystemProfiles. - Effectue une validation de base des autorisations, des classes et des étiquettes.
-
Ajoute un nouveau mot-clé
@selfqui décrit le processus utilisant la politique. Cela permet de réutiliser facilement une politique entre les charges de travail et les espaces de noms, car l'utilisation de la politique est basée sur le nom et l'espace de noms. - Ajoute des fonctionnalités pour améliorer le renforcement de la sécurité et la lisibilité par rapport à l'écriture d'un profil directement dans le langage SELinux CIL.
Procédure
Créez une politique qui peut être utilisée avec une charge de travail non privilégiée en créant l'objet
SelinuxProfilesuivant :Copy to Clipboard Copied! Toggle word wrap Toggle overflow Attendez que
selinuxdinstalle la politique en exécutant la commande suivante :oc wait --for=condition=ready -n nginx-deploy selinuxprofile nginx-secure
$ oc wait --for=condition=ready -n nginx-deploy selinuxprofile nginx-secureCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure condition met
selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure condition metCopy to Clipboard Copied! Toggle word wrap Toggle overflow Les politiques sont placées sur un site
emptyDirdans le conteneur appartenant à l'opérateur de profils de sécurité. Les politiques sont sauvegardées au format Common Intermediate Language (CIL) dans/etc/selinux.d/<name>_<namespace>.cil.Accédez au pod en exécutant la commande suivante :
oc -n openshift-security-profiles rsh -c selinuxd ds/spod
$ oc -n openshift-security-profiles rsh -c selinuxd ds/spodCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Vérification
Affichez le contenu du fichier à l'aide de
caten exécutant la commande suivante :cat /etc/selinux.d/nginx-secure_nginx-deploy.cil
$ cat /etc/selinux.d/nginx-secure_nginx-deploy.cilCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Vérifiez qu'une politique a été installée en exécutant la commande suivante :
semodule -l | grep nginx-secure
$ semodule -l | grep nginx-secureCopy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
nginx-secure_nginx-deploy
nginx-secure_nginx-deployCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.2. Appliquer des profils SELinux à un pod Copier lienLien copié sur presse-papiers!
Créer un pod pour appliquer l'un des profils créés.
Pour les profils SELinux, l'espace de noms doit être étiqueté pour autoriser les charges de travail privilégiées.
Procédure
Appliquez l'étiquette
scc.podSecurityLabelSync=falseà l'espace de nomsnginx-deployen exécutant la commande suivante :oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=false
$ oc label ns nginx-deploy security.openshift.io/scc.podSecurityLabelSync=falseCopy to Clipboard Copied! Toggle word wrap Toggle overflow Appliquez l'étiquette
privilegedà l'espace de nomsnginx-deployen exécutant la commande suivante :oc label ns nginx-deploy --overwrite=true pod-security.kubernetes.io/enforce=privileged
$ oc label ns nginx-deploy --overwrite=true pod-security.kubernetes.io/enforce=privilegedCopy to Clipboard Copied! Toggle word wrap Toggle overflow Obtenez la chaîne d'utilisation du profil SELinux en exécutant la commande suivante :
oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -n nginx-deploy -ojsonpath='{.status.usage}'$ oc get selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure -n nginx-deploy -ojsonpath='{.status.usage}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
nginx-secure_nginx-deploy.process%
nginx-secure_nginx-deploy.process%Copy to Clipboard Copied! Toggle word wrap Toggle overflow Appliquer la chaîne de sortie dans le manifeste de charge de travail dans l'attribut
.spec.containers[].securityContext.seLinuxOptions:Copy to Clipboard Copied! Toggle word wrap Toggle overflow ImportantLe site SELinux
typedoit exister avant la création de la charge de travail.
7.6.2.1. Application des politiques de journalisation SELinux Copier lienLien copié sur presse-papiers!
Pour consigner les violations de la politique ou les refus d'AVC, définissez le profil SElinuxProfile sur permissive.
Cette procédure définit les politiques de journalisation. Elle ne définit pas de politiques de mise en œuvre.
Procédure
Ajouter
permissive: trueàSElinuxProfile:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.2.2. 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 module qui utilise une image
quay.io/security-profiles-operator/test-nginx-unprivileged:1.21au profil de l'exempleSelinuxProfile, créez un objetProfileBindingdans le même espace de noms que le module et les objetsSelinuxProfile:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Etiqueter l'espace de noms avec
enable-binding=trueen 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=trueCopy 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.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
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.seLinuxOptions.type}'$ oc get pod test-pod -o jsonpath='{.spec.containers[*].securityContext.seLinuxOptions.type}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Exemple de sortie
profile_nginx-binding.process
profile_nginx-binding.processCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.2.3. Réplication des contrôleurs et des SecurityContextConstraints Copier lienLien copié sur presse-papiers!
Lors du déploiement de politiques SELinux pour les contrôleurs de réplication, tels que les déploiements ou les ensembles de démons, notez que les objets Pod créés par les contrôleurs ne sont pas exécutés avec l'identité de l'utilisateur qui crée la charge de travail. À moins qu'une adresse ServiceAccount ne soit sélectionnée, les pods risquent de revenir à l'utilisation d'une adresse SecurityContextConstraints restreinte (SCC) qui ne permet pas l'utilisation de politiques de sécurité personnalisées.
Procédure
Créez l'objet
RoleBindingsuivant pour permettre l'utilisation des politiques SELinux dans l'espace de nomsnginx-secure:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer l'objet
Role:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer l'objet
ServiceAccount:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Créer l'objet
Deployment:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Le site
.seLinuxOptions.typedoit exister avant la création du déploiement.
NoteLe type SELinux n'est pas spécifié dans la charge de travail et est géré par le SCC. Lorsque les pods sont créés par le déploiement et le site
ReplicaSet, ils s'exécutent avec le profil approprié.
Assurez-vous que votre CCN n'est utilisable que par le bon compte de service. Pour plus d'informations, consultez le site Additional resources.
7.6.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 SELinux, vérifiez que la fonction d'enrichissement de journaux est activée. Voir Additional resources pour plus d'informations.
Un conteneur avec privileged: true security context restraints empêche l'enregistrement basé sur le journal. Les conteneurs privilégiés ne sont pas soumis aux politiques SELinux, et l'enregistrement basé sur les journaux utilise un profil SELinux 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=true
$ oc label ns my-namespace spo.x-k8s.io/enable-recording=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow Créer un objet
ProfileRecordingcontenant 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
Runningen entrant la commande suivante :oc -n openshift-security-profiles get pods
$ oc -n openshift-security-profiles get podsCopy 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 18sCopy 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-enricherCopy 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-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow Confirmez que l'opérateur de profils de sécurité réconcilie les deux profils SELinux :
oc -n openshift-security-profiles get sp
$ oc -n openshift-security-profiles get spCopy 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 15sCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.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: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-deployCopy 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-recordingCopy 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-recordingCopy 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 17mCopy 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 yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
7.6.3.2. À propos de seLinuxContext : RunAsAny Copier lienLien copié sur presse-papiers!
L'enregistrement des politiques SELinux est mis en œuvre avec un webhook qui injecte un type SELinux spécial dans les pods enregistrés. Le type SELinux fait tourner le pod en mode permissive, en enregistrant tous les refus d'AVC dans audit.log. Par défaut, une charge de travail n'est pas autorisée à s'exécuter avec une politique SELinux personnalisée, mais utilise un type généré automatiquement.
Pour enregistrer une charge de travail, celle-ci doit utiliser un compte de service disposant des autorisations nécessaires pour utiliser un SCC permettant au webhook d'injecter le type SELinux permissif. Le SCC privileged contient seLinuxContext: RunAsAny.
En outre, l'espace de noms doit être étiqueté avec pod-security.kubernetes.io/enforce: privileged si votre cluster active l'admission de sécurité des pods, car seul le standard de sécurité des pods privileged autorise l'utilisation d'une politique SELinux personnalisée.