AvancéDevSecOps personnalisation des pipelines
Découvrez les fonctionnalités avancées de DevSecOps adoption après l'intégration de votre première application ou microservice.
Assurez-vous de consulter le les bases deDevSecOps personnalisation des pipelines. Vous y découvrirez les différents modèles disponibles, les options d'assistance et d'autres informations importantes pour vous aider à démarrer.DevSecOps.
Choix de conception
Pendant que vous intégrez davantage d'applications et de microservices pourDevSecOps, vous pourriez avoir les questions de conception suivantes :
- Ai-je besoin d'une chaîne d'outils par microservice?
- Ai-je besoin d'un pipeline par microservice?
- Dois-je utiliser un partageDevSecOps référentiel pour l’inventaire et les problèmes ou ai-je besoin de référentiels distincts ?
Les informations et les meilleures pratiques suivantes sont destinées à vous aider à faire ces choix de conception.
Remarques sur les chaînes d'outils et les pipelines
La plupart des applications sont constituées de plusieurs microservices avec des référentiels source différents. Généralement, une seule chaîne d'outils est utilisée pour héberger des microservices qui sont regroupés de manière logique. En général, utilisez une chaîne d'outils et un pipeline, ou le moins de pipelines possible, mais plusieurs déclencheurs. Dans chaque pipeline, vous pouvez dupliquer et configurer autant de déclencheurs que nécessaire, jusqu'à 1024 déclencheurs par pipeline. Cette stratégie permet d'appliquer des processus, des scripts et des fichiers de configuration communs. Pour plus d'informations, voir Configuration de plusieurs applications sur une chaîne d'outils d'EC.
Cette approche présente les avantages suivants :
- L'utilisation de moins de pipelines permet d'éviter les doublons et de réduire les erreurs. Les mises à jour sont également plus faciles à gérer, par exemple, lorsqu'une propriété d'environnement ou un secret est ajouté, édité ou supprimé.
- L'intégration d'un service est plus rapide avec cette approche. Ajoutez une intégration Git pour votre microservice, dupliquez les Git et les déclencheurs manuels et modifiez-les si nécessaire. Ensuite, assurez-vous que votre fichier
.pipeline-config.yamlet vos scripts sont implémentés pour votre microservice.
Cette approche présente les inconvénients suivants:
- Une édition peut avoir un impact sur chaque équipe qui utilise le même pipeline.
- L'accès utilisateur est géré à l'aide d' Identity and Access Management(IAM) et est défini au niveau de la chaîne d'outils et non au niveau du pipeline. Par conséquent, si vous utilisez une chaîne d'outils unique pour plusieurs services, chaque membre de l'équipe peut afficher les pipelines d'autres équipes. En fonction de l'accès de l'utilisateur dans IAM, il peut être en mesure d'éditer, de supprimer ou de déclencher un pipeline.
Remarques sur la facturation
Le service Continuous Delivery détermine la facturation en fonction du nombre d'utilisateurs autorisés par instance de CD et du nombre de groupes de ressources que vous utilisez pour vos chaînes d'outils. Les utilisateurs qui ont accès à vos référentiels sont également considérés comme des utilisateurs autorisés. Pour plus d'informations, voir Utilisateurs autorisés. Pour réduire les coûts, vous devez soit organiser toutes vos chaînes d'outils dans le même groupe de ressources, soit configurer la facturation consolidée Continuous Delivery dans une hiérarchie de comptes d'entreprise. Pour plus d'informations, voir Facturation consolidée.
DevSecOps considérations sur les référentiels
Si vous créez une application composée de plusieurs microservices, la plupartDevSecOps les référentiels - à l'exception du référentiel de preuves - peuvent être partagés entre les microservices.
Pour plus d'informations, voir commentDevSecOps les pipelines utilisent des référentiels.
Remarques sur le référentiel de configuration partagé
LeDevSecOps les exemples d'applications sont livrés avec un fichier .pipeline-config.yaml fichier de configuration et les scripts correspondants. Lors de l'intégration de plusieurs microservices, une bonne pratique consiste à séparer les référentiels de code source deDevSecOps fichiers de configuration et scripts. Stockez-les dans un référentiel de configuration commun distinct et dédié qui peut être utilisé par vos pipelines d'EC, de CD ou de CC.
Il s'agit des éléments suivants:
- Un référentiel Git dédié pour héberger une bibliothèque de scripts communs et un ou plusieurs fichiers.pipeline-config.yaml.
- Un seul fichier.pipeline-config.yaml commun à tous les services. Si elle est trop complexe ou impossible, utilisez des fichierspipeline-config.yaml différents.
- Personnalisation par dossier. Implémentez le ou les fichiers.pipeline-config.yaml pour qu'ils pointent vers des dossiers de scripts différents dans votre référentiel de configuration. Organisez vos scripts dans des dossiers CI, CD et CC distincts, ou en fonction du langage de service (Go, Python, NodeJS), du service, du nom de l'application ou de tout autre élément adapté à vos besoins.
Modifiez votre ou vos pipelines pour utiliser ce référentiel de configuration partagé en définissant la valeur de la propriété de pipeline pipeline-config-repo (ou, en option, pipeline-config-branch ) sur le référentiel
de configuration partagé URL.
Remarques sur le référentiel d'inventaire
Un référentiel d'inventaire unique peut être partagé entre de nombreux pipelines et chaînes d'outils. Plusieurs chaînes d'outils d'EC, pipelines et déclencheurs peuvent contribuer au même référentiel d'inventaire. Les pipelines d'EC envoient des mises à jour au référentiel d'inventaire, généralement lors de la phase d'édition. Le référentiel d'inventaire est ensuite utilisé comme entrée source pour le pipeline CD. En général, il est recommandé de regrouper les référentiels d'inventaire dans la même chaîne d'outils afin de réduire le nombre de demandes de changement qui sont éventuellement créées.
L'utilisation d'un référentiel d'inventaire partagé est une décision architecturale qui doit être prise avant que vous ne commenciez à intégrer des microservices car cette décision affecte le nombre de demandes de changement qui sont créées lors de l'exécution d'un pipeline. Par exemple, disons que vous souhaitez intégrer 10 microservices pourDevSecOps. Vous pouvez avoir 10 chaînes d'outils CD différentes, avec 10 référentiels d'inventaire différents, ce qui entraîne 10 demandes de modification différentes à chaque exécution d'un pipeline CD. Il est plus facile de gérer ces 10 microservices différents s'ils partagent un référentiel d'inventaire commun et une chaîne d'outils CD commune. Il n'en résulte qu'une seule demande de changement, même si vous mettez à jour plusieurs microservices car ils partagent tous le référentiel d'inventaire et la chaîne d'outils.
Remarques sur les référentiels de problèmes
Votre référentiel de problèmes est l'endroit où tous les problèmes de vulnérabilité de vos microservices sont suivis. Si vous décidez d'utiliser un référentiel d'inventaire partagé, vous pouvez également utiliser un référentiel de problèmes partagés.
La définition de incident-assigness et de incident-labels au niveau du pipeline ou du déclencheur permet d'affecter automatiquement issus à l'équipe appropriée. Pour plus d'informations, voir Paramètres de déploiement continu.
Remarques sur IBM Cloud Object Storage
Si vous utilisez un référentiel d'inventaire partagé, vous pouvez également utiliser une instance partagée de IBM Cloud® Object Storage. Procédez comme suit :
- Créez une instance de IBM Cloud Object Storage à utiliser dans les chaînes d'outils et les pipelines.
- Configurez des pipelines et des déclencheurs, le cas échéant, pour utiliser le compartiment IBM Cloud Object Storage en définissant la propriété d'environnement
cos-bucket-name.
Tous les microservices au sein des mêmes pipelines CI, CD et CC partagent un seul seau Object Storage, quel que soit l'environnement de déploiement. Le seau Object Storage fonctionne de la même manière que le dépôt de preuves, mais sans les problèmes de performance qui peuvent survenir avec un dépôt de preuves important. Étant donné que les problèmes de performance ne se posent pas avec un volume important de Object Storage, il n'est pas nécessaire d'élaguer les éléments de preuve de Object Storage.
Object Storage granularité des seaux
DevSecOps n'ont pas d'opinion sur la granularité des buckets de Object Storage. Techniquement, vous pouvez utiliser un seul seau Object Storage pour l'ensemble de votre organisation. Toutefois, la granularité ne doit pas être inférieure à un inventaire, puisque l'inventaire est le plus petit groupe logique de microservices pouvant être déplacés ensemble.
Dans la pratique, la granularité dépend du modèle opérationnel que votre équipe de conformité souhaite utiliser pour gérer les données de conformité :
- Si l'équipe chargée de la conformité est à l'aise avec la gestion de plusieurs répertoires Object Storage avec des données compartimentées, il s'agit d'un modèle viable.
- S'ils préfèrent gérer un seul grand panier Object Storage avec des données non compartimentées, c'est également possible.
Un point essentiel à prendre en considération : le seau Object Storage (casier à preuves) est destiné à être lisible par le système, et non par l'homme. Il ne prend pas en charge, et ne prendra pas en charge dans un avenir prévisible, les structures de dossiers organisées par référentiel, microservice, produit ou organisation. Il reste une structure aplatie d'actifs et de preuves.
Considérations relatives à la sécurité et à l'accès
Les buckets Object Storage moins granulaires augmentent le rayon d'action en cas de violation de la sécurité (par exemple, exposition d'une clé API Object Storage ). Elle peut également créer des problèmes de visibilité croisée, une verticale de produits pouvant potentiellement lire les données de conformité d'une autre verticale si elles partagent le même panier.
Remarques relatives à la migration
Il existe des moyens de migrer entre les buckets Object Storage si nécessaire. Cela implique généralement de configurer certaines propriétés de l'environnement pour un seau de sauvegarde Object Storage et de reconstruire les composants de l'infrastructure critique. Reportez-vous à cette documentation pour plus d'informations. Toutefois, ces opérations sont destinées à être des activités de migration ponctuelles, et non à faire partie des flux de travail opérationnels quotidiens.
Approche recommandée
Utilisez un godet Object Storage par groupe de produits logique dont les données de conformité doivent être déplacées ensemble. Exemple :
- L'équipe de service A (y compris toutes les escouades qui la composent) partage Object Storage Bucket A
- L'équipe de service B (y compris toutes les escouades qui la composent) partage Object Storage Bucket B
Cette approche permet de concilier la simplicité opérationnelle et les exigences en matière de sécurité et de contrôle d'accès.
Déploiement dans plusieurs environnements
Le déploiement dans plusieurs environnements cible avec le pipeline CD peut être réalisé de plusieurs manières.
Chaque targeted environment doit avoir une branche correspondante dans le référentiel d'inventaire, où les modifications sont promues d'une branche source à une branche target.
Les conceptions facultatives suivantes peuvent s'adapter à votre architecture:
- Utilisez un déclencheur manuel par environnement cible. Dupliquez un déclencheur, puis éditez les propriétés d'environnement pour qu'elles correspondent au nouvel environnement.
- Utilisez un référentiel de configuration Git avec un dossier par environnement cible, dans lequel des paramètres de configuration spécifiques sont stockés dans des fichiers.
Utilisation des scripts par défaut et personnalisés
La plupart des scripts de sécurité et de conformité sont fournis avec des scripts par défaut qui sont exécutés si aucun script personnalisé n'est fourni pour une étape. Il peut parfois être difficile de déterminer quel script est exécuté, où trouver le script source correspondant et comment remplacer les scripts par défaut.
Identifier le script qui est exécuté
Pour identifier le script exécuté pour une étape, ouvrez l'exécution du pipeline (de préférence un pipeline d'EC). Développez une tâche, puis cliquez sur run-stage pour ouvrir les journaux. Le début des journaux run-stage fournit des informations sur les scripts utilisés dans l'étape, y compris le référentiel dans lequel se trouve le script. Dans les journaux, vous pouvez faire défiler la page pour obtenir plus de détails sur les scripts qui ont été exécutés.
Par exemple, la tâche code-compliance-checks peut contenir les informations suivantes dans le journal run-stage, qui inclut les propriétés d'environnement de l'étape:
compliance-checks:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
dind: true
abort_on_failure: false
image_pull_policy: IfNotPresent
script:
#!/bin/sh
"/opt/commons/compliance-checks/run.sh"
Dans cet exemple, le script exécuté est /opt/commons/compliance-checks/run.sh, qui se trouve dans la bibliothèque commune. Utilisez cette bibliothèque
commune comme source pour copier du code qui peut être personnalisé pour des cas de périphérie spécifiques. Dans l'exemple, compliance-checks/run.sh se trouve dans la bibliothèque compliance-commons.
Remplacement des scripts par défaut
Pour remplacer les scripts par défaut, procédez comme suit:
- Dans le journal d'étape, copiez le fragment qui identifie un script par défaut:
compliance-checks:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
dind: true
abort_on_failure: false
image_pull_policy: IfNotPresent
script:
#!/bin/sh
"/opt/commons/compliance-checks/run.sh"
- Collez le fragment dans votre fichier
.pipeline-config.yaml. - Ajoutez votre code personnalisé avant ou après l'appel du script. Cet extrait de code appelle le script de vérification de conformité par défaut
- Modifiez, supprimez ou ajoutez des propriétés selon vos besoins.
L'exemple suivant illustre le script mis à jour dans votre fichier .pipeline-config.yaml:
compliance-checks:
image: icr.io/continuous-delivery/pipeline/pipeline-base-ubi:3.18
dind: true
abort_on_failure: false
image_pull_policy: IfNotPresent
script: |
#!/bin/sh
# run some custom script here
./scripts/my-custom-script1.sh
"/opt/commons/compliance-checks/run.sh"
# then some additional work
./scripts/my-custom-script2.sh
Pour plus d'informations, voir Scripts personnalisés.
Modèles Terraform à utiliserDevSecOps chaînes d'outils en tant que code
Les chaînes d'outils suivantes fournissent du code pour créerDevSecOps Chaînes d'outils CI, CD et CC à l'aide de Terraform :
- TerraformeIBMDevSecOps Chaîne d'outils CI
- TerraformeIBMDevSecOps Chaîne d'outils CD
- TerraformeIBMDevSecOps Chaîne d'outils CC
L'accès anticipé à ces chaînes d'outils Terraform est assuré en l'état. Ces chaînes d'outils étant en cours de développement, les variables et les noms de variable peuvent changer.