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 :apiVersion: security-profiles-operator.x-k8s.io/v1alpha2 kind: SelinuxProfile metadata: name: nginx-secure namespace: nginx-deploy spec: allow: '@self': tcp_socket: - listen http_cache_port_t: tcp_socket: - name_bind node_t: tcp_socket: - node_bind inherit: - kind: System name: containerAttendez que
selinuxdinstalle la politique en exécutant la commande suivante :$ oc wait --for=condition=ready -n nginx-deploy selinuxprofile nginx-secureExemple de sortie
selinuxprofile.security-profiles-operator.x-k8s.io/nginx-secure condition metLes 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
Vérification
Affichez le contenu du fichier à l'aide de
caten exécutant la commande suivante :$ cat /etc/selinux.d/nginx-secure_nginx-deploy.cilExemple de sortie
(block nginx-secure_nginx-deploy (blockinherit container) (allow process nginx-secure_nginx-deploy.process ( tcp_socket ( listen ))) (allow process http_cache_port_t ( tcp_socket ( name_bind ))) (allow process node_t ( tcp_socket ( node_bind ))) )Vérifiez qu'une politique a été installée en exécutant la commande suivante :
$ semodule -l | grep nginx-secureExemple de sortie
nginx-secure_nginx-deploy
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=falseAppliquez 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=privilegedObtenez 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}'Exemple de sortie
nginx-secure_nginx-deploy.process%Appliquer la chaîne de sortie dans le manifeste de charge de travail dans l'attribut
.spec.containers[].securityContext.seLinuxOptions:apiVersion: v1 kind: Pod metadata: name: nginx-secure namespace: nginx-deploy spec: containers: - image: nginxinc/nginx-unprivileged:1.21 name: nginx securityContext: seLinuxOptions: # NOTE: This uses an appropriate SELinux type type: nginx-secure_nginx-deploy.processImportantLe 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:apiVersion: security-profiles-operator.x-k8s.io/v1alpha2 kind: SelinuxProfile metadata: name: nginx-secure namespace: nginx-deploy spec: permissive: true
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:apiVersion: security-profiles-operator.x-k8s.io/v1alpha1 kind: ProfileBinding metadata: namespace: my-namespace name: nginx-binding spec: profileRef: kind: SelinuxProfile1 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.seLinuxOptions.type}'Exemple de sortie
profile_nginx-binding.process
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:kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: spo-use-seccomp-scc namespace: nginx-secure subjects: - kind: ServiceAccount name: spo-deploy-test roleRef: kind: Role name: spo-use-seccomp-scc apiGroup: rbac.authorization.k8s.ioCréer l'objet
Role:apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: creationTimestamp: null name: spo-use-seccomp-scc namespace: nginx-secure rules: - apiGroups: - security.openshift.io resources: - securitycontextconstraints resourceNames: - privileged verbs: - useCréer l'objet
ServiceAccount:apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: null name: spo-deploy-test namespace: nginx-secureCréer l'objet
Deployment:apiVersion: apps/v1 kind: Deployment metadata: name: selinux-test namespace: nginx-secure metadata: labels: app: selinux-test spec: replicas: 3 selector: matchLabels: app: selinux-test template: metadata: labels: app: selinux-test spec: serviceAccountName: spo-deploy-test securityContext: seLinuxOptions: type: nginx-secure_nginx-secure.process1 containers: - name: nginx-unpriv image: quay.io/security-profiles-operator/test-nginx-unprivileged:1.21 ports: - containerPort: 8080- 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=trueCréer un objet
ProfileRecordingcontenant une variablerecorder: logs:apiVersion: security-profiles-operator.x-k8s.io/v1alpha1 kind: ProfileRecording metadata: name: test-recording spec: kind: SelinuxProfile 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é réconcilie les deux profils SELinux :
$ oc -n openshift-security-profiles get spExemple de sortie
NAME STATUS AGE test-recording-nginx Installed 15s test-recording-redis Installed 15s
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:apiVersion: security-profiles-operator.x-k8s.io/v1alpha1 kind: ProfileRecording metadata: # The name of the Recording is the same as the resulting SelinuxProfile CRD # after reconciliation. name: test-recording spec: kind: SelinuxProfile 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
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.