Protéger les secrets dans Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Cet article fournit les meilleures pratiques relatives à la protection des secrets dans Azure Pipelines. Un secret est un élément pour lequel vous voulez contrôler étroitement l’accès. Il peut s’agir de clés d’API, de mots de passe, de certificats ou de clés de chiffrement.

Azure Pipelines ne génère pas de valeurs de secret. Toutefois, vous devrez peut-être ajouter un secret à un pipeline pour stocker des données sensibles telles qu’une clé API. Pour plus d’informations sur la définition de variables secrètes, consultez l’article Définir des variables secrètes.

Ne pas utiliser de secrets si une autre méthode est disponible

La meilleure méthode pour protéger un secret n’est pas d’avoir un secret en premier lieu. Vérifiez si votre pipeline peut utiliser une autre méthode plutôt que d’utiliser un secret pour effectuer une tâche.

  • Utilisez les connexions de service :
    • Lorsque vous ciblez Azure ou d’autres services, utilisez des connexions de service au lieu de gérer des secrets dans des variables.
    • Les connexions de service vous permettent de vous connecter en toute sécurité aux services externes sans exposer des informations sensibles directement dans votre configuration de pipeline.
    • Pour plus d’informations, consultez Gérer les connexions de service et se connecter à Microsoft Azure avec une connexion de service Azure Resource Manager.

Pour plus d’informations, consultez Utiliser des principaux de service et des identités managées

Utiliser des variables secrètes

Ne stockez jamais de valeurs sensibles sous forme de texte brut dans un fichier .yml Azure Pipelines.

Les variables secrètes peuvent être utilisées pour des informations privées comme des mots de passe, des ID et d’autres données d’identification que vous ne souhaitez pas exposer dans un pipeline. Nous vous recommandons de définir des variables secrètes avec Azure Key Vault. Vous pouvez également définir des variables secrètes dans l’interface utilisateur ou dans un groupe de variables. Nous vous déconseillons d’utiliser une commande de journalisation pour définir une variable secrète. Lorsque vous définissez un secret avec une commande de journalisation, toute personne qui peut accéder à votre pipeline peut également voir le secret.

Les variables secrètes sont chiffrées et peuvent être utilisées dans des pipelines sans exposer leur valeur. Bien que leurs valeurs ne soient pas exposées, n’effectuez jamais d’écho sortant de secrets et ne transmettez pas de secrets sur la ligne de commande. Au lieu de cela, nous vous suggérons de mapper vos secrets dans des variables d’environnement.

Lorsque vous créez un secret, suivez les instructions de nommage des variables et assurez-vous que votre nom de secret ne divulgue pas d’informations sensibles.

Limiter l’accès aux variables secrètes

Pour limiter l’accès aux secrets dans Azure DevOps, suivez les bonnes pratiques suivantes :

  • Stocker vos secrets dans Azure Key Vault. Avec Azure Key Vault, vous pouvez ensuite utiliser le modèle de contrôle d’accès en fonction du rôle d’Azure pour limiter l’accès à un secret ou à un groupe de secrets.
  • Définir des variables secrètes dans l’interface utilisateur d’un pipeline. Les variables secrètes définies dans l’interface utilisateur des paramètres d’un pipeline sont limitées au pipeline où elles sont définies. Vous pouvez ainsi avoir des secrets qui ne sont visibles que par les utilisateurs ayant accès à ce pipeline.
  • Définir des secrets dans un groupe de variables. Les groupes de variables suivent le modèle de sécurité de la bibliothèque. Vous pouvez contrôler qui peut définir de nouveaux éléments dans une bibliothèque et qui peut utiliser un élément existant.

Ne pas écrire de secrets dans les journaux

Azure Pipelines tente de nettoyer les secrets des journaux dans la mesure du possible, mais ce n’est pas infaillible. Évitez de renvoyer des secrets à la console, de les utiliser dans des paramètres de ligne de commande ou de les journaliser dans des fichiers. Soyez prudent lorsque vous utilisez des commandes Azure CLI qui génèrent des informations sensibles. Utilisez le None output formatfichier et, si vous avez besoin de récupérer un secret à partir d’un appel Azure CLI, Use none output format and retrieve security information to a secret variable.

Ne pas utiliser de données structurées en tant que secrets

Évitez d’utiliser des formats de données structurés tels que JSON, XML ou YAML pour encapsuler des valeurs secrètes, y compris les caractères de contrôle tels que le retour chariot, \ret le flux de ligne.\n Au lieu de cela, créez des secrets individuels pour chaque valeur sensible. Cette approche garantit une meilleure précision de la réaction et réduit le risque d’exposer des données sensibles par inadvertance.

Auditer la façon dont les secrets sont gérés

Pour auditer l’utilisation des secrets dans Azure Pipelines, suivez les bonnes pratiques suivantes :

  • Passez en revue le code source : examinez le code source du référentiel hébergeant le pipeline. Pour vous assurer que les secrets sont gérés correctement, vérifiez les tâches utilisées dans le pipeline. Par exemple, vérifiez que les secrets ne sont pas envoyés par inadvertance à des hôtes inattendus ou explicitement imprimés dans la sortie du journal.
  • Inspectez les journaux d’exécution : après avoir testé des entrées valides et non valides, affichez les journaux d’exécution de votre pipeline. Assurez-vous que les secrets sont correctement supprimés et non exposés. Parfois, les erreurs dans les commandes ou les outils risquent de fuiter par inadvertance des secrets dans les journaux d’erreurs. Bien qu’Azure Pipelines tente de nettoyer les secrets des journaux, la révision manuelle est toujours essentielle.

Auditer et alterner les secrets

Pour auditer et faire pivoter les secrets, suivez les bonnes pratiques suivantes :

  • Passez en revue les secrets inscrits : évaluez régulièrement les secrets inscrits dans vos pipelines. Vérifiez qu’elles sont toujours nécessaires et supprimez celles qui ne sont plus nécessaires, ce qui permet de réduire l’encombrement et les risques de sécurité potentiels.
  • Faire pivoter les secrets : faire pivoter régulièrement les secrets pour réduire la fenêtre de temps pendant laquelle un secret compromis peut être exploité. En modifiant régulièrement les secrets, vous améliorez la sécurité.
  • Choisir la méthode d’authentification appropriée
    • Types de secrets utilisés :
      • Jetons d’accès personnels (PAT) : ces jetons sont utilisés pour l’authentification. Suivez les bonnes pratiques de sécurité lors du choix de la méthode d’authentification appropriée. Vous pouvez gérer les PAT à l’aide de l’API REST.
      • Variables secrètes : utilisez des variables secrètes pour stocker en toute sécurité des informations sensibles telles que des clés API, des mots de passe ou d’autres informations d’identification au sein de votre pipeline.
      • Secrets Azure Key Vault : utilisez Azure Key Vault pour stocker et gérer les secrets en toute sécurité.
      • Connexions de service : ces connexions de service permettent à votre pipeline de se connecter à des services externes (par exemple, Azure, GitHub, Docker Hub). Vérifiez la configuration appropriée et la gestion sécurisée des secrets de connexion de service.

Utiliser des modèles YAML

Au lieu d’inclure des scripts inline avec des paramètres de secret directement dans votre yaML de pipeline, utilisez des modèles. Cette approche améliore la sécurité en extrayant les informations sensibles du pipeline principal.

Pour implémenter cette approche, créez un fichier YAML distinct pour votre script, puis stockez ce script dans un dépôt distinct et sécurisé. Vous pouvez ensuite référencer le modèle et passer une variable secrète dans votre YAML en tant que paramètre. La variable sécurisée doit provenir d’Azure Key Vault, d’un groupe de variables ou de l’interface utilisateur du pipeline. Pour plus d’informations sur l’utilisation de modèles, consultez la référence sur l’utilisation du modèle.

Limiter les secrets avec des stratégies de branche et des autorisations de groupe de variables

Pour vous assurer que les secrets sont liés à la main branche et qu’ils ne sont pas accessibles aux branches aléatoires, vous pouvez utiliser une combinaison d’autorisations de groupe de variables, d’insertion de travaux conditionnels et de stratégies de branche.

Avec les stratégies de branche, vous pouvez appliquer des stratégies de validation de build qui autorisent uniquement les builds à partir de la branche principale. Ensuite, vous pouvez utiliser des autorisations de groupe de variables pour vous assurer que seuls les pipelines autorisés ont accès aux secrets stockés dans votre groupe de variables. Enfin, vous pouvez utiliser une condition dans votre pipeline pour vous assurer que le groupe de variables ne peut être référencé que par un push vers la main branche.

jobs:
- job: ExampleJob
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: echo "This runs only for the main branch"
    displayName: 'Conditional Step'
  variables:
  - group: your-variable-group-name

Étapes suivantes