Si votre modèle de déploiement GitOps présente des problèmes de sécurité (par exemple, une autorisation mal configurée en raison d'une faute de frappe), cela sera propagé jusqu'à ce qu'il soit découvert lors de l'exécution , où la plupart des événements de sécurité sont analysés ou trouvés.
Et si vous pouviez résoudre les problèmes de sécurité potentiels de votre infrastructure à la source ?
Commençons par les bases.
Git est un système de contrôle de version distribué open source . Il suit les modifications apportées aux fichiers (généralement des fichiers texte tels que le code source) permettant et favorisant un modèle de travail collaboratif . C'est le_ de facto _standard dans les systèmes de contrôle de version de nos jours.
Vous pouvez avoir votre propre référentiel git localement sur votre ordinateur portable, l'héberger sur votre propre serveur ou utiliser un fournisseur tel que GitLab ou GitHub.
Il existe différents « flux » sur la façon de gérer un référentiel (git-flow, github-flow, etc.), mais un exemple de base sur la façon dont git est utilisé ressemble à ceci : les modifications dans les fichiers sont « validées » par les utilisateurs par "forker" le référentiel et effectuer les modifications appropriées dans une "branche".
Ensuite, l'utilisateur crée une demande (soit "demande d'extraction", "demande de fusion" ou simplement "envoi d'un correctif") pour inclure ces modifications dans le référentiel.
Après cela, une discussion a généralement lieu entre le « propriétaire » et l'utilisateur qui crée la demande, et si tout se passe bien, la modification est acceptée et ajoutée au référentiel.
REMARQUE : Si vous souhaitez en savoir plus, voici des informations beaucoup plus détaillées sur le mécanisme de demande d'extraction de git.
Pour voir un exemple concret, parcourez simplement votre référentiel GitLab ou GitHub open source préféré et parcourez l'onglet Pull Request (ou Merge Request) (ou regardez ceci pour un plaisir). Vous pouvez voir les modifications proposées, les commentaires, les étiquettes, qui a proposé les modifications, les outils exécutant des validations par rapport aux modifications proposées, les notifications envoyées aux personnes qui surveillent le référentiel, etc.
Pour le dire simplement, GitOps est juste une méthodologie qui utilise un référentiel git comme source unique de vérité pour vos actifs logiciels afin que vous puissiez tirer parti du modèle de déploiement git (demandes d'extraction, restaurations, approbations, etc.) sur votre logiciel.
Il existe des livres ( The Path to GitOps , GitOps and Kubernetes or GitOps Cloud-native Continuous Deployment ), des livres blancs et plus d'articles de blog que nous ne pouvons en compter , mais laissez-nous élaborer sur l'objectif de GitOps en jetant un coup d'œil sur la façon dont les choses ont évolué dans les dernières années.
Avant le cloud, ajouter un nouveau serveur pour héberger votre application prenait des semaines. Vous deviez demander des autorisations, l'acheter et effectuer de nombreuses tâches manuelles. Ensuite, la virtualisation a rendu les choses beaucoup plus faciles. Vous demandez une machine virtuelle avec quelques spécifications et après quelques minutes, vous y avez accès.
Ensuite, le nuage. Demander des serveurs, du réseau, du stockage et même des bases de données, des files d'attente de messagerie, des conteneurs, des éléments d'apprentissage automatique, sans serveur… n'est qu'un appel API ! Vous le demandez et quelques secondes plus tard, vous l'obtenez, comme ça. Vous n'avez qu'à payer pour ce que vous utilisez. Cela signifie également que l'infrastructure peut être gérée comme du code effectuant des appels d'API… et où stockez-vous votre code ? Dans un référentiel git (ou tout autre système de version de contenu).
Le terme GitOps a été inventé en 2017 par Weaveworks , et en paraphrasant OpenGitOps , un système GitOps est basé sur les principes suivants :
L' essence de la méthodologie GitOps est essentiellement un contrôleur Kubernetes ou des contrôleurs (ou agents) s'exécutant sur votre cluster qui observe les objets Kubernetes s'exécutant dessus (définis par un CustomResource ) comparant l'état actuel à l'état spécifié dans le Git repo . S'il ne correspond pas, il corrige l'application en appliquant les manifestes trouvés dans le référentiel.
REMARQUE : Il existe des approches légèrement différentes de GitOps, par exemple, pousser ou tirer, comment gérer la gestion de la configuration, etc. Ce sont des sujets avancés, mais pour l'instant, restons-en aux bases.
Le schéma suivant montre un système GitOps simplifié :
Être basé sur Git signifie sans friction pour les développeurs. Ils n'ont pas besoin de se soucier d'un nouvel outil avec lequel interagir, mais appliquent plutôt les mêmes pratiques que celles utilisées pour gérer le code dans le référentiel Git.
En parlant d'outils GitOps, il en existe déjà quelques-uns, dont des outils open source comme Flux ou ArgoCD , tous deux incubateurs de projets de la CNCF.
Pour avoir une idée de ce à quoi ressemble une définition d'application via GitOps, voici un exemple d'application simple (stockée dans un référentiel GitHub) gérée par Flux ou ArgoCD.
Avec flux :
--- apiVersion: source.toolkit.fluxcd.io/v1beta2 kind: GitRepository metadata: name: my-example-app namespace: hello-world spec: interval: 30s ref: branch: master url: https://github.com/xxx/my-example-apps.git --- apiVersion: kustomize.toolkit.fluxcd.io/v1beta2 kind: Kustomization metadata: name: my-example-app namespace: hello-world spec: interval: 5m0s path: ./myapp prune: true sourceRef: kind: GitRepository name: my-example-app targetNamespace: hello-world
Avec ArgoCD :
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: my-example-app namespace: hello-world spec: destination: namespace: my-example-app server: https://kubernetes.default.svc project: default source: path: myapp/ repoURL: https://github.com/xxx/my-example-apps.git targetRevision: HEAD syncPolicy: automated: {} syncOptions: - CreateNamespace=true
Les deux référencent le référentiel Git où les manifestes d'application sont stockés (Déploiements), les NameSpaces et quelques détails supplémentaires.
L' infrastructure en tant que code est une méthodologie consistant à traiter les éléments constitutifs de votre infrastructure en tant que code à l'aide de différentes techniques et outils. Cela signifie qu'au lieu de créer manuellement votre infrastructure telle que les machines virtuelles, les conteneurs, les réseaux ou le stockage via l'interface Web de votre fournisseur d'infrastructure préféré, vous les définissez en tant que code, puis ceux-ci sont créés/mis à jour/gérés par les outils que vous choisissez, tels que comme terraform , crossplane ou pulumi , entre autres.
Les avantages sont énormes. Vous pouvez gérer votre infrastructure comme s'il s'agissait de code ( c'est du code maintenant) et tirer parti de vos meilleures pratiques de développement (automatisation, tests, traçabilité, contrôle de version, etc.) pour vos actifs d'infrastructure. En fait, il y a une tendance à utiliser "Infrastructure as Software" comme terme à la place, car c'est bien plus qu'un simple code.
Il existe des tonnes d'informations sur ce sujet, mais la ressource suivante est un bon point de départ.
Comme vous l'avez probablement compris, GitOps utilise Infrastructure as Code comme modèle déclaratif pour définir l'infrastructure. En fait, IaC est l'une des pierres angulaires de GitOps ! Mais c'est beaucoup plus car IaC n'impose pas le reste des principes GitOps.
Il existe de nombreuses définitions du terme "DevOps". Cela dépend à qui vous demandez, mais pour le dire simplement, "DevOps est la combinaison de pratiques et d'outils pour créer et fournir des logiciels réduisant les frictions et à une vitesse élevée".
Les méthodologies DevOps peuvent tirer parti de GitOps car GitOps fournit un cadre qui correspond aux pratiques DevOps, mais ce n'est pas strictement nécessaire.
NoOps a été inventé par Forrester en 2021 et il s'agit d'une approche radicale de la gestion des opérations où l'environnement informatique est abstrait et automatisé au point qu'il n'est pas nécessaire de le gérer manuellement.
GitOps aide à réduire les modifications manuelles en corrigeant celles qui ont l'état souhaité dans le référentiel Git, mais l'application d'un véritable NoOps à l'ensemble de l'environnement informatique est un objectif ambitieux plutôt qu'un véritable objectif à ce jour .
Non. Kubernetes, le modèle de contrôleur et le modèle déclaratif pour définir les objets Kubernetes correspondent parfaitement à une méthodologie GitOps, mais cela ne signifie pas que les méthodologies GitOps ne peuvent pas être appliquées sans Kubernetes. Il y a quelques défis si vous utilisez GitOps en dehors de Kubernetes, comme la gestion de l'idempotence, la suppression/création des actifs, la gestion des secrets, etc. Mais les principes GitOps peuvent être appliqués sans Kubernetes (et en appliquant un peu de créativité).
Parlons maintenant des aspects de sécurité. La plupart des outils de sécurité détectent les vulnérabilités et les problèmes potentiels au moment de l'exécution (trop tard). Afin de les corriger, soit un processus manuel réactif doit être effectué (par exemple, modifier directement un paramètre dans votre objet k8s avec kubectl edit) ou idéalement, le correctif se produira à la source et se propagera tout au long de votre chaîne d'approvisionnement. C'est ce qu'on appelle « Shift Security Left ». De la résolution du problème lorsqu'il est trop tard à sa résolution avant qu'il ne se produise.
Cela ne signifie pas que tous les problèmes de sécurité peuvent être résolus à la source, mais l'ajout d'une couche de sécurité directement à la source peut éviter certains problèmes.
En premier lieu, les recommandations générales de sécurité s'appliquent.
Voyons quelques scénarios où la méthodologie GitOps peut améliorer votre sécurité en général :
Ces avantages sont suffisamment bons pour justifier l'utilisation des méthodologies GitOps pour améliorer votre posture de sécurité et ils sont sortis de la boîte, mais GitOps est une combinaison de quelques autres choses. Nous pouvons faire beaucoup plus. GitHub, GitLab et d'autres fournisseurs de référentiels Git vous permettent d'exécuter des actions ou des pipelines en fonction des modifications que vous effectuez dans votre référentiel Git, y compris par une demande d'extraction, de sorte que les possibilités sont infinies. Quelques exemples :
La méthodologie GitOps apporte quelques améliorations au modèle de déploiement et des avantages de sécurité à la table sans avoir à ajouter un autre outil .
Il améliore la posture de sécurité en ajoutant une couche "décalage à gauche" directement au code source et grâce à la flexibilité du modèle de demande d'extraction, vous pouvez facilement ajouter des contrôles de sécurité supplémentaires sans affecter ni modifier le temps d'exécution.
Également publié ici .