RedHat OpenShift
Déployer des composants SUSE® Security séparés avec RedHat OpenShift
SUSE® Security est compatible avec les plug-ins SDN ovs standard ainsi qu’avec d’autres tels que flannel, weave ou calico. Les exemples ci-dessous supposent qu’un plug-in ovs standard est utilisé. Cela suppose également qu’un registre docker local sera utilisé (voir les instructions à la fin pour créer le secret permettant de tirer dynamiquement depuis neuvector ou Docker Hub).
SUSE® Security prend en charge le déploiement basé sur Helm avec un chart Helm à https://github.com/neuvector/neuvector-helm.. L’Opérateur SUSE® Security peut également être utilisé pour déployer et est basé sur le chart Helm. Pour déployer les dernières versions de conteneurs SUSE® Security en utilisant un Opérateur, veuillez utiliser soit l’Opérateur certifié Red Hat depuis Operator Hub, soit l’opérateur communautaire, comme détaillé dans la section Opérateur.
Pour déployer manuellement, commencez par tirer les conteneurs SUSE® Security appropriés depuis le registre SUSE® Security vers votre registre local. Remarque : l’image du scanner doit être tirée régulièrement pour les mises à jour de la base de données CVE depuis SUSE® Security.
SUSE® Security Images sur Docker Hub
Les images se trouvent sur le SUSE® Security registre Docker Hub. Utilisez le tag de version approprié pour le gestionnaire, le contrôleur, l’Enforcer, et laissez la version comme 'latest' pour le scanner et l’updater. Par exemple :
-
neuvector/manager:5.4.3
-
neuvector/controller:5.4.3
-
neuvector/enforcer:5.4.3
-
neuvector/scanner:latest
-
neuvector/updater:latest
Veuillez vous assurer de mettre à jour les références d’image dans les fichiers yaml appropriés.
Si vous déployez avec le SUSE® Security chart Helm actuel (v1.8.9+), les modifications suivantes doivent être apportées à values.yml :
-
Mettez à jour le registre vers docker.io
-
Mettez à jour les noms/tags d’image vers la version actuelle sur Docker Hub, comme indiqué ci-dessus
-
Laissez les imagePullSecrets vides
Déployer sur OpenShift
docker login docker.io
docker pull docker.io/neuvector/manager:<version>
docker pull docker.io/neuvector/controller:<version>
docker pull docker.io/neuvector/enforcer:<version>
docker pull docker.io/neuvector/scanner
docker pull docker.io/neuvector/updater
docker logout docker.io
Le fichier d’exemple ci-dessous déploiera un gestionnaire, 3 contrôleurs et 2 pods de scanner. Il déploiera un Enforcer sur chaque nœud en tant que daemonset, y compris sur le nœud maître (si planifiable). Voir la section inférieure pour spécifier des nœuds de gestionnaire ou de contrôleur dédiés en utilisant des étiquettes de nœud. Remarque : Il n’est pas recommandé de déployer (mettre à l’échelle) plus d’un gestionnaire derrière un équilibreur de charge en raison de problèmes potentiels liés à l’état des sessions. Si vous prévoyez d’utiliser une revendication PersistentVolume pour stocker la sauvegarde des fichiers de configuration SUSE® Security, veuillez consulter la section générale Sauvegarde/Données Persistantes dans l’aperçu de Déploiement en Production.
Ensuite, définissez la route et autorisez les conteneurs SUSE® Security privilégiés en utilisant les instructions ci-dessous. Par défaut, OpenShift n’autorise pas les conteneurs privilégiés. De plus, par défaut, OpenShift ne planifie pas les pods sur le nœud maître. Voir les instructions à la fin pour activer/désactiver cela.
|
Veuillez consulter la section Intégration d’entreprise pour plus de détails sur l’intégration avec le contrôle d’accès en fonction du rôle (RBAC) d’OpenShift. |
-
Connectez-vous en tant qu’utilisateur normal
oc login -u <user_name> -
Créez un nouveau projet.
Si l’argument --node-selector est utilisé lors de la création d’un projet, cela restreindra le placement des pods, comme pour l’Enforcer SUSE® Security, à des nœuds spécifiques.
oc new-project neuvector -
Poussez les images SUSE® Security vers le registre Docker d’OpenShift.
Pour OpenShift 4.6+, changez docker-registry.default.svc ci-dessous en image-registry.openshift-image-registry.svc dans les commandes ci-dessous
docker login -u <user_name> -p `oc whoami -t` docker-registry.default.svc:5000 docker tag docker.io/neuvector/enforcer:<version> docker-registry.default.svc:5000/neuvector/enforcer:<version> docker tag docker.io/neuvector/controller:<version> docker-registry.default.svc:5000/neuvector/controller:<version> docker tag docker.io/neuvector/manager:<version> docker-registry.default.svc:5000/neuvector/manager:<version> docker tag docker.io/neuvector/scanner docker-registry.default.svc:5000/neuvector/scanner docker tag docker.io/neuvector/updater docker-registry.default.svc:5000/neuvector/updater docker push docker-registry.default.svc:5000/neuvector/enforcer:<version> docker push docker-registry.default.svc:5000/neuvector/controller:<version> docker push docker-registry.default.svc:5000/neuvector/manager:<version> docker push docker-registry.default.svc:5000/neuvector/scanner docker push docker-registry.default.svc:5000/neuvector/updater docker logout docker-registry.default.svc:5000Veuillez consulter la section Mise à jour de la base de données CVE ci-dessous pour des recommandations pour garder la dernière image du scanner mise à jour dans votre registre.
-
Connectez-vous en tant que compte system:admin
oc login -u system:admin -
Créez des comptes de service et accordez l’accès au SCC privilégié
oc create sa controller -n neuvector oc create sa enforcer -n neuvector oc create sa basic -n neuvector oc create sa updater -n neuvector oc create sa scanner -n neuvector oc create sa registry-adapter -n neuvector oc create sa cert-upgrader -n neuvector oc -n neuvector adm policy add-scc-to-user privileged -z enforcerLes informations suivantes seront ajoutées dans les utilisateurs du SCC privilégié :
- system:serviceaccount:neuvector:enforcerAjoutez un nouveau neuvector-scc-controller scc pour le compte de service du contrôleur dans OpenShift, en créant un fichier avec :
allowHostDirVolumePlugin: false allowHostIPC: false allowHostNetwork: false allowHostPID: false allowHostPorts: false allowPrivilegeEscalation: false allowPrivilegedContainer: false allowedCapabilities: null apiVersion: security.openshift.io/v1 defaultAddCapabilities: null fsGroup: type: RunAsAny groups: [] kind: SecurityContextConstraints metadata: name: neuvector-scc-controller priority: null readOnlyRootFilesystem: false requiredDropCapabilities: - ALL runAsUser: type: RunAsAny seLinuxContext: type: RunAsAny supplementalGroups: type: RunAsAny users: [] volumes: - configMap - downwardAPI - emptyDir - persistentVolumeClaim - azureFile - projected - secretPuis appliquez
oc apply -f (filename)Ensuite, exécutez la commande suivante pour lier le compte de service du contrôleur au scc neuvector-scc-controller
oc -n neuvector adm policy add-scc-to-user neuvector-scc-controller -z controllerDans OpenShift 4.6+, utilisez ce qui suit pour vérifier :
oc get rolebinding system:openshift:scc:privileged -n neuvector -o wideNAME ROLE AGE USERS GROUPS SERVICEACCOUNTS system:openshift:scc:privileged ClusterRole/system:openshift:scc:privileged 9m22s neuvector/enforcerExécutez cette commande pour vérifier le service SUSE® Security pour le contrôleur :
oc get rolebinding system:openshift:scc:neuvector-scc-controller -n neuvector -o wideLa sortie ressemblera à
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS System:openshift:scc:neuvector-scc-controller ClusterRole/system:openshift:scc:neuvector-scc-controller 9m22s neuvector/controller -
Créez les ressources personnalisées (CRD) pour les règles de sécurité SUSE® Security. Pour OpenShift 4.6+ (Kubernetes 1.19+) :
oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/crd-k8s-1.19.yaml oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/waf-crd-k8s-1.19.yaml oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/dlp-crd-k8s-1.19.yaml oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/com-crd-k8s-1.19.yaml oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/vul-crd-k8s-1.19.yaml oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/admission-crd-k8s-1.19.yaml oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/5.4.3_group-definition-k8s.yaml -
Ajoutez l’autorisation de lecture pour accéder à l’API Kubernetes et au contrôle d’accès en fonction du rôle (RBAC) d’OpenShift.
Le déploiement standard SUSE® Security 5.2+ utilise des comptes de service à privilèges minimaux au lieu de ceux par défaut. Voir ci-dessous si vous mettez à niveau vers 5.2+ à partir d’une version antérieure à 5.2.
Si vous mettez à niveau vers 5.3.0+, exécutez les commandes suivantes en fonction de votre version actuelle :
-
Version 5.2.0
-
Versions antérieures à 5.2.0
oc delete clusterrole neuvector-binding-nvsecurityrules neuvector-binding-nvadmissioncontrolsecurityrules neuvector-binding-nvdlpsecurityrules neuvector-binding-nvwafsecurityrulesoc delete clusterrolebinding neuvector-binding-app neuvector-binding-rbac neuvector-binding-admission neuvector-binding-customresourcedefinition neuvector-binding-nvsecurityrules neuvector-binding-view neuvector-binding-nvwafsecurityrules neuvector-binding-nvadmissioncontrolsecurityrules neuvector-binding-nvdlpsecurityrules neuvector-binding-co oc delete rolebinding neuvector-admin -n neuvectoroc create clusterrole neuvector-binding-app --verb=get,list,watch,update --resource=nodes,pods,services,namespaces oc create clusterrole neuvector-binding-rbac --verb=get,list,watch --resource=rolebindings.rbac.authorization.k8s.io,roles.rbac.authorization.k8s.io,clusterrolebindings.rbac.authorization.k8s.io,clusterroles.rbac.authorization.k8s.io,imagestreams.image.openshift.io oc adm policy add-cluster-role-to-user neuvector-binding-app system:serviceaccount:neuvector:controller oc adm policy add-cluster-role-to-user neuvector-binding-rbac system:serviceaccount:neuvector:controller oc create clusterrole neuvector-binding-admission --verb=get,list,watch,create,update,delete --resource=validatingwebhookconfigurations,mutatingwebhookconfigurations oc adm policy add-cluster-role-to-user neuvector-binding-admission system:serviceaccount:neuvector:controller oc create clusterrole neuvector-binding-customresourcedefinition --verb=watch,create,get,update --resource=customresourcedefinitions oc adm policy add-cluster-role-to-user neuvector-binding-customresourcedefinition system:serviceaccount:neuvector:controller oc create clusterrole neuvector-binding-nvsecurityrules --verb=get,list,delete --resource=nvsecurityrules,nvclustersecurityrules oc create clusterrole neuvector-binding-nvadmissioncontrolsecurityrules --verb=get,list,delete --resource=nvadmissioncontrolsecurityrules oc create clusterrole neuvector-binding-nvdlpsecurityrules --verb=get,list,delete --resource=nvdlpsecurityrules oc create clusterrole neuvector-binding-nvwafsecurityrules --verb=get,list,delete --resource=nvwafsecurityrules oc adm policy add-cluster-role-to-user neuvector-binding-nvsecurityrules system:serviceaccount:neuvector:controller oc adm policy add-cluster-role-to-user view system:serviceaccount:neuvector:controller --rolebinding-name=neuvector-binding-view oc adm policy add-cluster-role-to-user neuvector-binding-nvwafsecurityrules system:serviceaccount:neuvector:controller oc adm policy add-cluster-role-to-user neuvector-binding-nvadmissioncontrolsecurityrules system:serviceaccount:neuvector:controller oc adm policy add-cluster-role-to-user neuvector-binding-nvdlpsecurityrules system:serviceaccount:neuvector:controller oc create role neuvector-binding-scanner --verb=get,patch,update,watch --resource=deployments -n neuvector oc adm policy add-role-to-user neuvector-binding-scanner system:serviceaccount:neuvector:updater system:serviceaccount:neuvector:controller -n neuvector --role-namespace neuvector oc create clusterrole neuvector-binding-co --verb=get,list --resource=clusteroperators oc adm policy add-cluster-role-to-user neuvector-binding-co system:serviceaccount:neuvector:enforcer system:serviceaccount:neuvector:controller oc create role neuvector-binding-secret --verb=get,list,watch --resource=secrets -n neuvector oc adm policy add-role-to-user neuvector-binding-secret system:serviceaccount:neuvector:controller system:serviceaccount:neuvector:enforcer system:serviceaccount:neuvector:scanner system:serviceaccount:neuvector:registry-adapter -n neuvector --role-namespace neuvector oc create clusterrole neuvector-binding-nvcomplianceprofiles --verb=get,list,delete --resource=nvcomplianceprofiles oc create clusterrolebinding neuvector-binding-nvcomplianceprofiles --clusterrole=neuvector-binding-nvcomplianceprofiles --serviceaccount=neuvector:controller oc create clusterrole neuvector-binding-nvvulnerabilityprofiles --verb=get,list,delete --resource=nvvulnerabilityprofiles oc create clusterrolebinding neuvector-binding-nvvulnerabilityprofiles --clusterrole=neuvector-binding-nvvulnerabilityprofiles --serviceaccount=neuvector:controller oc apply -f https://raw.githubusercontent.com/neuvector/manifests/main/kubernetes/5.4.0/neuvector-roles-k8s.yaml oc create role neuvector-binding-lease --verb=create,get,update --resource=leases -n neuvector oc adm policy add-role-to-user neuvector-binding-cert-upgrader system:serviceaccount:neuvector:cert-upgrader -n neuvector --role-namespace neuvector oc adm policy add-role-to-user neuvector-binding-job-creation system:serviceaccount:neuvector:cert-upgrader -n neuvector --role-namespace neuvector oc adm policy add-role-to-user neuvector-binding-lease system:serviceaccount:neuvector:controller system:serviceaccount:neuvector:cert-upgrader -n neuvector --role-namespace neuvector oc create clusterrole neuvector-binding-nvgroupdefinitions --verb=get,list,delete --resource=nvgroupdefinitions oc create clusterrolebinding neuvector-binding-nvgroupdefinitions --clusterrole=neuvector-binding-nvgroupdefinitions --serviceaccount=neuvector:controller -
-
Exécutez la commande suivante pour vérifier si les comptes de service neuvector/controller, neuvector/enforcer et neuvector/updater ont été ajoutés avec succès.
oc get ClusterRoleBinding neuvector-binding-app neuvector-binding-rbac neuvector-binding-admission neuvector-binding-customresourcedefinition neuvector-binding-nvsecurityrules neuvector-binding-view neuvector-binding-nvwafsecurityrules neuvector-binding-nvadmissioncontrolsecurityrules neuvector-binding-nvdlpsecurityrules neuvector-binding-co -o wideExemple de sortie :
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS neuvector-binding-app ClusterRole/neuvector-binding-app 56d neuvector/controller neuvector-binding-rbac ClusterRole/neuvector-binding-rbac 34d neuvector/controller neuvector-binding-admission ClusterRole/neuvector-binding-admission 72d neuvector/controller neuvector-binding-customresourcedefinition ClusterRole/neuvector-binding-customresourcedefinition 72d neuvector/controller neuvector-binding-nvsecurityrules ClusterRole/neuvector-binding-nvsecurityrules 72d neuvector/controller neuvector-binding-view ClusterRole/view 72d neuvector/controller neuvector-binding-nvwafsecurityrules ClusterRole/neuvector-binding-nvwafsecurityrules 72d neuvector/controller neuvector-binding-nvadmissioncontrolsecurityrules ClusterRole/neuvector-binding-nvadmissioncontrolsecurityrules 72d neuvector/controller neuvector-binding-nvdlpsecurityrules ClusterRole/neuvector-binding-nvdlpsecurityrules 72d neuvector/controller neuvector-binding-co ClusterRole/neuvector-binding-co 72d neuvector/enforcer, neuvector/controllerEt cette commande :
oc get RoleBinding neuvector-binding-scanner neuvector-binding-cert-upgrader neuvector-binding-job-creation neuvector-binding-lease neuvector-binding-secret -n neuvector -o wideExemple de sortie :
NAME ROLE AGE USERS GROUPS SERVICEACCOUNTS neuvector-binding-scanner Role/neuvector-binding-scanner 56m neuvector/controller, neuvector/updater neuvector-binding-cert-upgrader Role/neuvector-binding-cert-upgrader 56m neuvector/cert-upgrader neuvector-binding-job-creation Role/neuvector-binding-job-creation 56m neuvector/controller neuvector-binding-lease Role/neuvector-binding-lease 56m neuvector/controller, neuvector/cert-upgrader neuvector-binding-secret Role/neuvector-binding-secret 56m neuvector/controller, neuvector/enforcer, neuvector/scanner, neuvector/registry-adapter -
(Optionnel) Créez le Maître de Fédération et/ou les Services de Gestion Multi-Cluster à Distance. Si vous prévoyez d’utiliser les fonctions de gestion multi-cluster dans SUSE® Security, un cluster doit avoir le service Maître de Fédération déployé, et chaque cluster distant doit avoir le service Ouvrier de Fédération. Pour plus de flexibilité, vous pouvez choisir de déployer à la fois les services Maître et Ouvrier sur chaque cluster afin que n’importe quel cluster puisse être un maître ou distant.
Services de Gestion Fédérée
apiVersion: v1 kind: Service metadata: name: neuvector-service-controller-fed-master namespace: neuvector spec: ports: - port: 11443 name: fed protocol: TCP type: NodePort selector: app: neuvector-controller-pod --- apiVersion: v1 kind: Service metadata: name: neuvector-service-controller-fed-worker namespace: neuvector spec: ports: - port: 10443 name: fed protocol: TCP type: NodePort selector: app: neuvector-controller-podPuis créez le(s) service(s) approprié(s) :
oc create -f nv_master_worker.yaml -
Créez les services et les pods neuvector en vous basant sur les exemples de yamls ci-dessous.
Remplacez les balises <version> par les références d’images du manager, du contrôleur et de l’Enforcer dans le fichier yaml. Effectuez également toutes les autres modifications nécessaires à votre environnement de déploiement.
oc create -f <compose file>
C’est tout ! Vous devriez pouvoir vous connecter à la console SUSE® Security et vous connecter avec admin:admin, par exemple https://<public-ip>:8443.
Pour voir comment accéder à la console du service neuvector-webui :
oc get services -n neuvector
Si vous avez créé votre propre espace de noms au lieu d’utiliser “neuvector”, remplacez toutes les occurrences de “namespace: neuvector” et d’autres références d’espace de noms par votre espace de noms dans les fichiers yaml d’exemple ci-dessous.
OpenShift 4.6+ avec CRI-O en tant que runtime
Le nom de votre registre OpenShift par défaut a peut-être changé de docker-registry à openshift-image-registry. Vous devrez peut-être changer le registre d’images pour le manager, le contrôleur et l’Enforcer dans le yaml d’exemple.
|
Le type NodePort est utilisé pour les services fed-master et fed-worker au lieu de LoadBalancer. Vous devrez peut-être ajuster pour votre environnement de déploiement. |
Si vous utilisez le runtime CRI-O, consultez cet exemple CRI-O.
Taints et Tolerations du nœud maître
Toutes les informations de taint doivent correspondre pour planifier les Enforcers sur les nœuds. Pour vérifier les informations de taint sur un nœud (par exemple, Maître) :
$ oc get node taintnodename -o yaml
Exemple de sortie :
spec:
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
# there may be an extra info for taint as below
- effect: NoSchedule
key: mykey
value: myvalue
S’il y a des taints supplémentaires comme ci-dessus, ajoutez-les à la section des tolerations du yaml d’exemple :
spec:
template:
spec:
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
# if there is an extra info for taints as above, please add it here. This is required to match all the taint info defined on the taint node. Otherwise, the Enforcer won't deploy on the taint node
- effect: NoSchedule
key: mykey
value: myvalue
Utilisation des étiquettes de nœud pour les nœuds Manager et Controller
Pour contrôler sur quels nœuds le Manager et le Controller sont déployés, étiquetez chaque nœud. Remplacez <nodename> par le nom de nœud approprié.
oc label nodes <nodename> nvcontroller=true
Ajoutez ensuite un nodeSelector au fichier yaml pour les sections de déploiement du Manager et du Controller. Par exemple :
- mountPath: /host/cgroup
name: cgroup-vol
readOnly: true
nodeSelector:
nvcontroller: "true"
restartPolicy: Always
Pour empêcher l’Enforcer d’être déployé sur un nœud contrôleur, s’il s’agit d’un nœud de gestion dédié (sans conteneurs d’application à surveiller), ajoutez une nodeAffinity à la section yaml de l’Enforcer. Par exemple :
app: neuvector-enforcer-pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nvcontroller
operator: NotIn
values: ["true"]
imagePullSecrets:
Mise à jour de la base de données CVE sur les déploiements OpenShift
L’image du scanner la plus récente contient toujours la mise à jour de la base de données CVE la plus récente de SUSE® Security. Pour cette raison, un tag de version n’est pas recommandé lors du tirage de l’image. Cependant, la mise à jour de la base de données CVE nécessite un tirage régulier de la dernière image du scanner afin que le cron job de mise à jour puisse redéployer le(s) scanner(s). Les exemples ci-dessus supposent que SUSE® Security images sont tirées, taguées et poussées vers un registre OpenShift local. Le déploiement se fait alors depuis ce registre au lieu de directement depuis neuvector (ou le SUSE® Security registre hérité sur Docker Hub).
Pour mettre à jour régulièrement la base de données CVE, nous recommandons de créer un script/cron job pour tirer la dernière SUSE® Security image du scanner et effectuer les étapes de tagging et de pushing vers le registre local. Cela garantira que la base de données CVE est mise à jour régulièrement et que les images et conteneurs sont scannés pour de nouvelles vulnérabilités.
Mises à jour progressives
Les outils d’orchestration tels que Kubernetes, RedHat OpenShift et Rancher prennent en charge les mises à jour progressives avec des stratégies configurables. Vous pouvez utiliser cette fonctionnalité pour mettre à jour les SUSE® Security conteneurs. Le plus important sera de s’assurer qu’il y a au moins un Allinone/Controller en cours d’exécution afin que les stratégies, les journaux et les données de connexion ne soient pas perdus. Assurez-vous qu’il y a un minimum de 30 secondes entre les mises à jour des conteneurs afin qu’un nouveau leader puisse être élu et que les données soient synchronisées entre les contrôleurs.
Avant de commencer les mises à jour progressives, veuillez tirer et taguer les SUSE® Security conteneurs de la même manière qu’au début de cette page. Vous pouvez tirer la dernière version sans numéro de version, mais pour déclencher la mise à jour progressive, vous devrez taguer l’image avec une version.
Par exemple, pour le contrôleur (version la plus récente) :
docker pull neuvector/controller
Ensuite, pour taguer/pousser, si la dernière version est 2.0.1, comme à l’étape 3 en haut de cette page :
docker login -u <user_name> -p `oc whoami -t` docker-registry.default.svc:5000
docker tag neuvector/controller docker-registry.default.svc:5000/neuvector/controller:2.0.1
docker push docker-registry.default.svc:5000/neuvector/controller:2.0.1
Vous pouvez maintenant mettre à jour votre fichier yaml avec ces nouvelles versions et ‘apply’, ou utiliser la commande ‘oc set image …’ pour déclencher la mise à jour progressive. Veuillez consulter les exemples de mises à jour progressives de Kubernetes dans cette section Production pour savoir comment lancer et surveiller les mises à jour progressives des SUSE® Security conteneurs.
Les fichiers de déploiement YAML fournis configurent déjà la stratégie de mise à jour progressive. Si vous mettez à jour via le chart Helm SUSE® Security, veuillez récupérer le dernier chart pour configurer correctement les nouvelles fonctionnalités telles que le contrôle d’admission, et supprimer l’ancien rôle de cluster et le lien de rôle de cluster pour SUSE® Security.
Activation de l’API REST
Pour activer l’API REST, le port 10443 doit être configuré comme suit :
apiVersion: v1
kind: Service
metadata:
name: neuvector-service-controller
namespace: neuvector
spec:
ports:
- port: 10443
name: controller
protocol: TCP
type: NodePort
selector:
app: neuvector-controller-pod
Activer/Désactiver la planification sur le nœud maître
Les commandes suivantes peuvent être utilisées pour activer/désactiver la planification sur le nœud maître.
oc adm manage-node nodename --schedulable
oc adm manage-node nodename --schedulable=false
Déploiement OpenShift en mode non privilégié
Les instructions suivantes peuvent être utilisées pour déployer SUSE® Security sans utiliser de conteneurs en mode privilégié. Le contrôleur est déjà en mode non privilégié et le déploiement de l’enforcer doit être modifié, comme le montrent les extraits ci-dessous.
Enforcer :
spec:
template:
metadata:
annotations:
container.apparmor.security.beta.kubernetes.io/neuvector-enforcer-pod: unconfined
# this line below is required to be added if k8s version is pre-v1.19
# container.seccomp.security.alpha.kubernetes.io/neuvector-enforcer-pod: unconfined
spec:
containers:
securityContext:
# openshift
seLinuxOptions:
type: unconfined_t
# the following two lines are required for k8s v1.19+. pls comment out both lines if version is pre-1.19. Otherwise, a validating data error message will show
seccompProfile:
type: Unconfined
capabilities:
add:
- SYS_ADMIN
- NET_ADMIN
- SYS_PTRACE
- IPC_LOCK
- NET_RAW
- SYS_CHROOT
- MKNOD
- AUDIT_WRITE
- SETFCAP
L’exemple suivant est une référence de déploiement complète utilisant le runtime cri-o. Pour d’autres runtimes, veuillez apporter les modifications appropriées aux volumes/montages de volumes pour le crio.sock.
Cliquez ici pour plus de détails
apiVersion: v1
kind: Service
metadata:
name: neuvector-svc-crd-webhook
namespace: neuvector
spec:
ports:
- port: 443
targetPort: 30443
protocol: TCP
name: crd-webhook
type: ClusterIP
selector:
app: neuvector-controller-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-svc-admission-webhook
namespace: neuvector
spec:
ports:
- port: 443
targetPort: 20443
protocol: TCP
name: admission-webhook
type: ClusterIP
selector:
app: neuvector-controller-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-service-webui
namespace: neuvector
spec:
ports:
- port: 8443
name: manager
protocol: TCP
type: ClusterIP
selector:
app: neuvector-manager-pod
---
apiVersion: v1
kind: Service
metadata:
name: neuvector-svc-controller
namespace: neuvector
spec:
ports:
- port: 18300
protocol: "TCP"
name: "cluster-tcp-18300"
- port: 18301
protocol: "TCP"
name: "cluster-tcp-18301"
- port: 18301
protocol: "UDP"
name: "cluster-udp-18301"
clusterIP: None
selector:
app: neuvector-controller-pod
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: neuvector-route-webui
namespace: neuvector
spec:
to:
kind: Service
name: neuvector-service-webui
port:
targetPort: manager
tls:
termination: passthrough
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: neuvector-manager-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-manager-pod
replicas: 1
template:
metadata:
labels:
app: neuvector-manager-pod
spec:
serviceAccountName: basic
serviceAccount: basic
containers:
- name: neuvector-manager-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/manager:<version>
env:
- name: CTRL_SERVER_IP
value: neuvector-svc-controller.neuvector
restartPolicy: Always
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: neuvector-controller-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-controller-pod
minReadySeconds: 60
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
replicas: 3
template:
metadata:
labels:
app: neuvector-controller-pod
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- neuvector-controller-pod
topologyKey: "kubernetes.io/hostname"
serviceAccountName: controller
serviceAccount: controller
containers:
- name: neuvector-controller-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/controller:<version>
securityContext:
runAsUser: 0
readinessProbe:
exec:
command:
- cat
- /tmp/ready
initialDelaySeconds: 5
periodSeconds: 5
env:
- name: CLUSTER_JOIN_ADDR
value: neuvector-svc-controller.neuvector
- name: CLUSTER_ADVERTISED_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: CLUSTER_BIND_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
# - name: CTRL_PERSIST_CONFIG
# value: "1"
volumeMounts:
# - mountPath: /var/neuvector
# name: nv-share
# readOnly: false
- mountPath: /etc/config
name: config-volume
readOnly: true
terminationGracePeriodSeconds: 300
restartPolicy: Always
volumes:
# - name: nv-share
# persistentVolumeClaim:
# claimName: neuvector-data
- name: config-volume
projected:
sources:
- configMap:
name: neuvector-init
optional: true
- secret:
name: neuvector-init
optional: true
- secret:
name: neuvector-secret
optional: true
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: neuvector-enforcer-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-enforcer-pod
updateStrategy:
type: RollingUpdate
template:
metadata:
labels:
app: neuvector-enforcer-pod
annotations:
container.apparmor.security.beta.kubernetes.io/neuvector-enforcer-pod: unconfined
# Add the following for pre-v1.19
# container.seccomp.security.alpha.kubernetes.io/neuvector-enforcer-pod: unconfined
spec:
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/master
- effect: NoSchedule
key: node-role.kubernetes.io/control-plane
hostPID: true
serviceAccountName: enforcer
serviceAccount: enforcer
containers:
- name: neuvector-enforcer-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/enforcer:<version>
securityContext:
# openshift
seLinuxOptions:
type: unconfined_t
# the following two lines are required for k8s v1.19+. pls comment out both lines if version is pre-1.19. Otherwise, a validating data error message will show
seccompProfile:
type: Unconfined
capabilities:
add:
- SYS_ADMIN
- NET_ADMIN
- SYS_PTRACE
- IPC_LOCK
- NET_RAW
- SYS_CHROOT
- MKNOD
- AUDIT_WRITE
- SETFCAP
env:
- name: CLUSTER_JOIN_ADDR
value: neuvector-svc-controller.neuvector
- name: CLUSTER_ADVERTISED_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: CLUSTER_BIND_ADDR
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- mountPath: /lib/modules
name: modules-vol
readOnly: true
# - mountPath: /run/runtime.sock
# name: runtime-sock
# readOnly: true
# - mountPath: /host/proc
# name: proc-vol
# readOnly: true
# - mountPath: /host/cgroup
# name: cgroup-vol
# readOnly: true
- mountPath: /var/nv_debug
name: nv-debug
readOnly: false
terminationGracePeriodSeconds: 1200
restartPolicy: Always
volumes:
- name: modules-vol
hostPath:
path: /lib/modules
# - name: runtime-sock
# hostPath:
# path: /var/run/crio/crio.sock
# - name: proc-vol
# hostPath:
# path: /proc
# - name: cgroup-vol
# hostPath:
# path: /sys/fs/cgroup
- name: nv-debug
hostPath:
path: /var/nv_debug
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: neuvector-scanner-pod
namespace: neuvector
spec:
selector:
matchLabels:
app: neuvector-scanner-pod
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
replicas: 2
template:
metadata:
labels:
app: neuvector-scanner-pod
spec:
serviceAccountName: scanner
serviceAccount: scanner
containers:
- name: neuvector-scanner-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/scanner:<version>
imagePullPolicy: Always
env:
- name: CLUSTER_JOIN_ADDR
value: neuvector-svc-controller.neuvector
restartPolicy: Always
---
apiVersion: batch/v1
kind: CronJob
metadata:
name: neuvector-updater-pod
namespace: neuvector
spec:
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: neuvector-updater-pod
spec:
serviceAccountName: updater
serviceAccount: updater
containers:
- name: neuvector-updater-pod
image: image-registry.openshift-image-registry.svc:5000/neuvector/updater:<version>
imagePullPolicy: Always
command:
- /bin/sh
- -c
- TOKEN=`cat /var/run/secrets/kubernetes.io/serviceaccount/token`; /usr/bin/curl -kv -X PATCH -H "Authorization:Bearer $TOKEN" -H "Content-Type:application/strategic-merge-patch+json" -d '{"spec":{"template":{"metadata":{"annotations":{"kubectl.kubernetes.io/restartedAt":"'`date +%Y-%m-%dT%H:%M:%S%z`'"}}}}}' 'https://kubernetes.default/apis/apps/v1/namespaces/neuvector/deployments/neuvector-scanner-pod'
restartPolicy: Never