Premièrement, la raison non liée à la sécurité:
Workflow de changement de mot de passe
Les mots de passe changent indépendamment du code d'une application logicielle. Si un DBA modifie un mot de passe de base de données, est-il logique que les développeurs doivent mettre à jour le code, obtenir une nouvelle version et une nouvelle mise en production, et essayer de tout chronométrer? Les mots de passe sont un artefact de configuration d'exécution, pas un artefact de développement. Ils doivent être injectés via des fichiers de configuration, des variables d'environnement ou tout autre paradigme de configuration que vous utilisez.
Portée d'autorisation
En général, les systèmes de contrôle de version fournissent un contrôle d'autorisation ainsi seuls les utilisateurs autorisés peuvent y accéder. Mais dans un référentiel, les autorisations sont généralement soit en lecture / écriture, soit en lecture seule, ou peut-être quelques cloches et sifflets comme GitHub fournit. Il est peu probable que vous trouviez des contraintes de sécurité permettant aux développeurs d'obtenir le code source, mais pas des mots de passe. Si vous pouvez cloner un dépôt, vous pouvez cloner un dépôt. Période. Dans de nombreux environnements, les développeurs n'ont pas un accès complet à la production. Parfois, ils ont un accès en lecture seule aux bases de données de production, parfois aucun accès. Que faire si les développeurs ont généralement accès, mais que vous ne voulez pas que tous les stagiaires, les nouvelles recrues, etc. y aient accès?
Environnements
Que faire si vous disposez de plusieurs environnements, comme un environnement de développement, un environnement QA, une mise en scène et une production? Stockeriez-vous tous leurs mots de passe dans le contrôle de version? Comment l'application saurait-elle laquelle utiliser? L'application devrait avoir un moyen de connaître l'environnement, ce qui finirait par être un paramètre de configuration. Si vous pouvez faire du nom d'environnement un paramètre de configuration, vous pouvez faire du mot de passe de la base de données un paramètre de configuration (avec la chaîne de connexion, le nom d'utilisateur, etc.)
Historique
Comme d'autres l'ont mentionné, le contrôle de version est conçu pour préserver l'historique. Les anciens mots de passe seront donc toujours récupérables, ce qui n'est peut-être pas la meilleure chose à faire.
Combien de fois avons-nous vu des manchettes dans les actualités sur le code source d'un produit divulgué dans le monde? Le code source est tout ce qui est dans le contrôle de version. C'est probablement la principale raison pour ne pas mettre les mots de passe dans le contrôle de version!
Cependant ...
Cela dit, les mots de passe doivent être stockés quelque part . Ce à quoi les préoccupations ci-dessus font allusion n'est pas nécessairement qu'elles ne devraient pas du tout être stockées dans le contrôle de version, mais plutôt qu'elles ne devraient pas être stockées dans le référentiel de code source du produit dans le contrôle de version. Avoir un dépôt séparé pour la gestion de la configuration, les opérations, etc. est très raisonnable. La clé est de séparer les opérations du développement en ce qui concerne les informations d'identification de sécurité, pas nécessairement pour éviter complètement le contrôle de version.
De plus, pour les environnements hors production, j'ai stocké les mots de passe et les clés API pour les systèmes externes dans les fichiers de configuration dans le code source du produit par défaut. Pourquoi? Pour rendre les choses faciles lorsqu'un développeur vérifie le code, il peut simplement le construire et l'exécuter sans avoir à aller chercher des fichiers de configuration supplémentaires. Ce sont des informations d'identification qui changent rarement et qui ne mènent à aucun secret commercial. Mais je ne ferais jamais ça avec des secrets de production.
Donc, l'essentiel est ... ça dépend.